Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.53 KB | None | 0 0
  1. #define F_CPU 4000000
  2. #define addr 0x68
  3. #define TRUE 1
  4. #define FALSE 0
  5.  
  6. #include <avr/io.h>
  7. #include <avr/delay.h>
  8. #include <avr/signal.h>
  9. #include <avr/interrupt.h>
  10. #include <avr/wdt.h>
  11. #include <stdio.h>
  12. #include <stdarg.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include "lcd.h"
  16. #include "serial.h"
  17. #include "printf.h"
  18. #include "mydefs.h"
  19. //#include "General.h"
  20. //#include "TWI_Master.h"
  21.  
  22. /****************************************************************************
  23.   TWI State codes
  24. ****************************************************************************/
  25. // General TWI Master staus codes                      
  26. #define TWI_START                    0x08  // START has been transmitted  
  27. #define TWI_REP_START                0x10  // Repeated START has been transmitted
  28. #define TWI_ARB_LOST                0x38  // Arbitration lost
  29.  
  30. // TWI Master Transmitter staus codes                      
  31. #define TWI_MTX_ADR_ACK                0x18  // SLA+W has been tramsmitted and ACK received
  32. #define TWI_MTX_ADR_NACK            0x20  // SLA+W has been tramsmitted and NACK received
  33. #define TWI_MTX_DATA_ACK            0x28  // Data byte has been tramsmitted and ACK received
  34. #define TWI_MTX_DATA_NACK            0x30  // Data byte has been tramsmitted and NACK received
  35.  
  36. // TWI Master Receiver staus codes  
  37. #define TWI_MRX_ADR_ACK                0x40  // SLA+R has been tramsmitted and ACK received
  38. #define TWI_MRX_ADR_NACK            0x48  // SLA+R has been tramsmitted and NACK received
  39. #define TWI_MRX_DATA_ACK            0x50  // Data byte has been received and ACK tramsmitted
  40. #define TWI_MRX_DATA_NACK            0x58  // Data byte has been received and NACK tramsmitted
  41.  
  42. // TWI Slave Transmitter staus codes
  43. #define TWI_STX_ADR_ACK                0xA8  // Own SLA+R has been received; ACK has been returned
  44. #define TWI_STX_ADR_ACK_M_ARB_LOST    0xB0  // Arbitration lost in SLA+R/W as Master; own SLA+R has been received; ACK has been returned
  45. #define TWI_STX_DATA_ACK            0xB8  // Data byte in TWDR has been transmitted; ACK has been received
  46. #define TWI_STX_DATA_NACK            0xC0  // Data byte in TWDR has been transmitted; NOT ACK has been received
  47. #define TWI_STX_DATA_ACK_LAST_BYTE    0xC8  // Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
  48.  
  49. // TWI Slave Receiver staus codes
  50. #define TWI_SRX_ADR_ACK                0x60  // Own SLA+W has been received ACK has been returned
  51. #define TWI_SRX_ADR_ACK_M_ARB_LOST    0x68  // Arbitration lost in SLA+R/W as Master; own SLA+W has been received; ACK has been returned
  52. #define TWI_SRX_GEN_ACK                0x70  // General call address has been received; ACK has been returned
  53. #define TWI_SRX_GEN_ACK_M_ARB_LOST    0x78  // Arbitration lost in SLA+R/W as Master; General call address has been received; ACK has been returned
  54. #define TWI_SRX_ADR_DATA_ACK        0x80  // Previously addressed with own SLA+W; data has been received; ACK has been returned
  55. #define TWI_SRX_ADR_DATA_NACK        0x88  // Previously addressed with own SLA+W; data has been received; NOT ACK has been returned
  56. #define TWI_SRX_GEN_DATA_ACK        0x90  // Previously addressed with general call; data has been received; ACK has been returned
  57. #define TWI_SRX_GEN_DATA_NACK        0x98  // Previously addressed with general call; data has been received; NOT ACK has been returned
  58. #define TWI_SRX_STOP_RESTART        0xA0  // A STOP condition or repeated START condition has been received while still addressed as Slave
  59.  
  60. // TWI Miscellaneous status codes
  61. #define TWI_NO_STATE                0xF8  // No relevant state information available; TWINT = “0”
  62. #define TWI_BUS_ERROR                0x00  // Bus error due to an illegal START or STOP condition
  63.  
  64. #define TWIM_READ    1
  65. #define TWIM_WRITE   0
  66.  
  67. /*******************************************************
  68.  Public Function: TWIM_Init
  69.  
  70.  Purpose: Initialise the TWI Master Interface
  71.  
  72.  Input Parameter:
  73.      - uint16_t    TWI_Bitrate (Hz)
  74.  
  75.  Return Value: uint8_t
  76.      - FALSE:    Bitrate too high
  77.      - TRUE:        Bitrate OK
  78.  
  79. *******************************************************/
  80. uint8_t TWIM_Init (uint32_t TWI_Bitrate)
  81.     {
  82. /*
  83. ** Set TWI bitrate
  84. ** If bitrate is too high, then error return
  85. */
  86.     TWBR = ((F_CPU/TWI_Bitrate)-16)/2;
  87.     if (TWBR < 11) return FALSE;
  88.  
  89.     return TRUE;
  90.     }
  91. /*******************************************************
  92.  Public Function: TWIM_Start
  93.  
  94.  Purpose: Start the TWI Master Interface
  95.  
  96.  Input Parameter:
  97.      - uint8_t    Device address
  98.      - uint8_t    Type of required Operation:
  99.                 TWIM_READ: Read data from the slave
  100.                 TWIM_WRITE: Write data to the slave
  101.  
  102.  Return Value: uint8_t
  103.       - TRUE:        OK, TWI Master accessible
  104.      - FALSE:    Error in starting TWI Master
  105.  
  106. *******************************************************/
  107. uint8_t TWIM_Start (uint8_t Address, uint8_t TWIM_Type)//1 = read, 0 = write
  108.     {
  109.     uint8_t        twst;
  110. /*
  111. ** Send START condition
  112. */
  113.     TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  114. /*
  115. ** Wait until transmission completed
  116. */
  117.     while (!(TWCR & (1<<TWINT)));
  118. /*
  119. ** Check value of TWI Status Register. Mask prescaler bits.
  120. */
  121.     twst = TWSR & 0xF8;
  122.     if ((twst != TWI_START) && (twst != TWI_REP_START)) return FALSE;
  123. /*
  124. ** Send device address
  125. */
  126.     TWDR = (Address<<1) + TWIM_Type;
  127.     TWCR = (1<<TWINT)|(1<<TWEN);
  128. /*
  129. ** Wait until transmission completed and ACK/NACK has been received
  130. */
  131.     while (!(TWCR & (1<<TWINT)));
  132. /*
  133. ** Check value of TWI Status Register. Mask prescaler bits.
  134. */
  135.     twst = TWSR & 0xF8;
  136.     if ((twst != TWI_MTX_ADR_ACK) && (twst != TWI_MRX_ADR_ACK)) return FALSE;
  137.  
  138.     return TRUE;
  139.     }
  140. /*******************************************************
  141.  Public Function: TWIM_Stop
  142.  
  143.  Purpose: Stop the TWI Master
  144.  
  145.  Input Parameter: None
  146.  
  147.  Return Value: None
  148.  
  149. *******************************************************/
  150. void TWIM_Stop (void)
  151.     {
  152. /*
  153. ** Send stop condition
  154. */
  155.     TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
  156. /*
  157. ** Wait until stop condition is executed and bus released
  158. */
  159.     while (TWCR & (1<<TWINT));
  160.     }
  161. /*******************************************************
  162.  Public Function: TWIM_Write
  163.  
  164.  Purpose: Write a byte to the slave
  165.  
  166.  Input Parameter:
  167.      - uint8_t    Byte to be sent
  168.  
  169.  Return Value: uint8_t
  170.       - TRUE:        OK, Byte sent
  171.      - FALSE:    Error in byte transmission
  172.  
  173. *******************************************************/
  174. uint8_t TWIM_Write (uint8_t byte)
  175.     {
  176.     uint8_t   twst;
  177. /*
  178. ** Send data to the previously addressed device
  179. */
  180.     TWDR = byte;
  181.     TWCR = (1<<TWINT)|(1<<TWEN);
  182. /*
  183. ** Wait until transmission completed
  184. */
  185.     while (!(TWCR & (1<<TWINT)));
  186. /*
  187. ** Check value of TWI Status Register. Mask prescaler bits
  188. */
  189.     twst = TWSR & 0xF8;
  190.     if (twst != TWI_MTX_DATA_ACK) return 1;
  191.  
  192.     return 0;
  193.     }
  194. /*******************************************************
  195.  Public Function: TWIM_ReadAck
  196.  
  197.  Purpose: Read a byte from the slave and request next byte
  198.  
  199.  Input Parameter: None
  200.  
  201.  Return Value: uint8_t
  202.       - uint8_t    Read byte
  203.  
  204. *******************************************************/
  205. uint8_t TWIM_ReadAck (void)
  206.     {
  207.     TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  208.     while (!(TWCR & (1<<TWINT)));    
  209.  
  210.     return TWDR;
  211.     }
  212. /*******************************************************
  213.  Public Function: TWIM_ReadAck
  214.  
  215.  Purpose: Read the last byte from the slave
  216.  
  217.  Input Parameter: None
  218.  
  219.  Return Value: uint8_t
  220.       - uint8_t    Read byte
  221.  
  222. *******************************************************/
  223. uint8_t TWIM_ReadNack (void)
  224.     {
  225.     TWCR = (1<<TWINT)|(1<<TWEN);
  226.     while(!(TWCR & (1<<TWINT)));
  227.    
  228.     return TWDR;
  229.     }
  230.  
  231. void TWIM_WriteRegister(char reg, char value)
  232. {
  233.     TWIM_Start(addr, TWIM_WRITE); // set device address and write mode
  234.     TWIM_Write(reg);
  235.     TWIM_Write(value);
  236.     TWIM_Stop();
  237. }
  238.  
  239. char TWIM_ReadRegister(char reg)
  240. {
  241.     TWIM_Start(addr, TWIM_WRITE);
  242.     TWIM_Write(reg);
  243.     TWIM_Stop();
  244.  
  245.     TWIM_Start(addr, TWIM_READ); // set device address and read mode
  246.     char ret = TWIM_ReadNack();
  247.     TWIM_Stop();
  248.     return ret;
  249. }
  250. double MPU6050_ReadAccel(int axis)//x = 0; y = 1; z = 2
  251. {
  252.   char reg = axis * 2 + 59;
  253.   char AFS_SEL = TWIM_ReadRegister(28);
  254.   double factor = 1<<AFS_SEL;
  255.   factor = 16384/factor;
  256.   int val = 0;
  257.   double double_val = 0;
  258.   char ret = 0;
  259.  
  260.   ret = TWIM_ReadRegister(reg);
  261.   val = ret << 8;
  262.     _delay_ms(2000);
  263.   ret = TWIM_ReadRegister(reg+1);  
  264.   val += ret;
  265.  
  266.   if (val & 1<<15)
  267.   val -= 1<<16;
  268.  
  269.   double_val = val;
  270.  
  271.   double_val = double_val / factor;
  272.  
  273.   return double_val;
  274. }
  275.  
  276. double MPU6050_ReadGyro(int axis)//x = 0; y = 1; z = 2
  277. {
  278.   char reg = axis * 2 + 67;
  279.   char FS_SEL = TWIM_ReadRegister(27);
  280.   double factor = 1<<FS_SEL;
  281.   factor = 131/factor;
  282.   int val = 0;
  283.   double double_val = 0;
  284.   char ret = 0;
  285.  
  286.   ret = TWIM_ReadRegister(reg);
  287.   val = ret << 8;
  288.     _delay_ms(2000);
  289.   ret = TWIM_ReadRegister(reg+1);  
  290.   val += ret;
  291.  
  292.   if (val & 1<<15)
  293.   val -= 1<<16;
  294.  
  295.  
  296.   double_val = val;
  297.  
  298.   double_val = double_val / factor;
  299.  
  300.   return double_val;
  301. }
  302. void delay_led (unsigned char d)
  303. {
  304.     unsigned char nDelay;
  305.     for (nDelay = 0; nDelay < d; nDelay++)
  306.     {
  307.         _delay_ms (1000);
  308.     }
  309. }
  310.  
  311. int main(void)
  312. {
  313.         char a[10];
  314.         char b[10];
  315.         char c[10];
  316.         TWIM_Init(25);
  317.         TWIM_WriteRegister(107,0);
  318.         DDRG  |= _BV(LED);
  319.        
  320.         ser_init();                         //init serial port
  321.        
  322.         sei();                              //enable interrupt
  323.  
  324.         LED_PORT  &= ~_BV(LED);         //off led
  325.         while(1)
  326.         {
  327. _delay_ms(300000);
  328. _delay_ms(300000);
  329. _delay_ms(300000);
  330. _delay_ms(300000);
  331. _delay_ms(300000);
  332. _delay_ms(300000);
  333. _delay_ms(300000);
  334. _delay_ms(300000);
  335. _delay_ms(300000);
  336. _delay_ms(300000);
  337. _delay_ms(300000);
  338. _delay_ms(300000);
  339. _delay_ms(300000);
  340.             double x = (double)MPU6050_ReadGyro(0);
  341.             double y = (double)MPU6050_ReadGyro(1);
  342.             double z = (double)MPU6050_ReadGyro(2);
  343.  
  344.             //ret = ret * 100000;
  345.             itoa((int)x,a,10);
  346.             itoa((int)y,b,10);
  347.             itoa((int)z,c,10);
  348.             init_lcd ();
  349.             lcd_gotoxy (1,1);
  350.             lcd_printf (a);
  351.             lcd_printf ("  ");
  352.             //lcd_printf ("test");
  353.             //lcd_printf (b);
  354.             lcd_printf ("  ");
  355.             //lcd_printf (c);
  356.             lcd_printf ("  ");
  357.             //lcd_gotoxy (2,1);
  358.             //lcd_printf (a);
  359.             _delay_ms(300000);
  360.             _delay_ms(300000);
  361.             _delay_ms(300000);
  362.             _delay_ms(300000);
  363.             _delay_ms(300000);
  364.             _delay_ms(300000);
  365.             _delay_ms(300000);
  366.             _delay_ms(300000);
  367.             _delay_ms(300000);
  368.             _delay_ms(300000);
  369.         }
  370.         while (1)
  371.         {
  372.             LED_PORT ^= _BV(LED);
  373.             delay_led (10);
  374.         }
  375.        
  376.         while (1);
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement