Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.37 KB | None | 0 0
  1.  
  2. //*****************************************************************************
  3. // uart.c
  4. //*****************************************************************************
  5.  
  6. #include <pic.h>
  7. #include "uart.h"
  8. #include "motor_control.h"
  9. #include "lcd.h"
  10.  
  11. uint8_t rx_data[RX_BUFF_SIZE];
  12. uint8_t rx_timeout = 0;
  13. uint8_t rx_cnt = 0;
  14. uint8_t rx_done_flag = 0;
  15. uint8_t rx_cnt_en = 0;
  16. uint8_t tx_data[16];
  17.  
  18. const uint8_t event_set[] = "SET";
  19. const uint8_t event_get[] = "GET";
  20. const uint8_t param_spd[] = "SPD";
  21. const uint8_t param_dir[] = "DIR";
  22. const uint8_t param_run[] = "RUN";
  23.  
  24. #define EVENT_SET   2
  25. #define EVENT_GET   1
  26. #define PARAM_SPD   1
  27. #define PARAM_DIR   2
  28. #define PARAM_RUN   3
  29.  
  30. //called every 23.4ms
  31. void uart_task(void)
  32. {
  33.     if(rx_cnt_en)
  34.     {
  35.         rx_timeout++;
  36.     }
  37.     if(rx_timeout > 1) //about 25-50ms
  38.     {
  39.         //rx done
  40.         rx_timeout = 0;
  41.         rx_done_flag = 1;
  42.         rx_cnt_en = 0;
  43.         rx_cnt = 0;
  44.     }
  45.    
  46.     //process received data
  47.     if(rx_done_flag)
  48.     {
  49.         uart_parse();
  50.         rx_done_flag = 0;
  51.     }
  52. }
  53.  
  54. void uart_parse(void)
  55. {
  56.   /*  uint8_t events[32];
  57.     uint8_t parameters[64];
  58.     int parameter_tmp[2];
  59.     sscanf(rx_data, "[%[^]]]{%[^}]}", &events, &parameters);*/
  60.    
  61.     //had to write very simple parser, as XC8 compiler sucks
  62.     uint8_t str_pointer = 0;
  63.     uint8_t event = 0;
  64.     uint8_t param = 0;
  65.     uint16_t value = 0;
  66.     uint8_t tx_lenght = 0;
  67.    
  68.     uint8_t parse_lock = 2;
  69.    
  70.     //parse event type
  71.     while(str_pointer < 4)
  72.     {
  73.         if(rx_data[str_pointer] == event_set[str_pointer] && parse_lock >= EVENT_SET)
  74.         {
  75.             parse_lock = EVENT_SET;
  76.             if(str_pointer == 2) //if pointer goes thru all 3 chars, then event is valid
  77.             {
  78.                 event = EVENT_SET;
  79.                 break;
  80.             }
  81.         }
  82.         else if (rx_data[str_pointer] == event_get[str_pointer] && parse_lock >= EVENT_GET)
  83.         {
  84.             parse_lock = EVENT_GET;
  85.             if(str_pointer == 2)
  86.             {
  87.                 event = EVENT_GET;
  88.                 break;
  89.             }
  90.         }
  91.         str_pointer++;
  92.     }
  93.     //event not valid, parsing failed
  94.     if(event == 0)
  95.         return;
  96.    
  97.     str_pointer = 0;
  98.    
  99.     //parse param
  100.     while(str_pointer < 4)
  101.     {
  102.         if(rx_data[str_pointer+4] == param_spd[str_pointer])
  103.         {
  104.             if(str_pointer == 2) //if pointer goes thru all 3 chars, then event is valid
  105.             {
  106.                 param = PARAM_SPD;
  107.                 break;
  108.             }
  109.         }
  110.         else if (rx_data[str_pointer+4] == param_dir[str_pointer])
  111.         {
  112.             if(str_pointer == 2)
  113.             {
  114.                 param = PARAM_DIR;
  115.                 break;
  116.             }
  117.         }
  118.         else if (rx_data[str_pointer+4] == param_run[str_pointer])
  119.         {
  120.             if(str_pointer == 2)
  121.             {
  122.                 param = PARAM_RUN;
  123.                 break;
  124.             }
  125.         }
  126.         str_pointer++;
  127.     }
  128.    
  129.     //param not valid, parsing failed
  130.     if(event == 0)
  131.         return;
  132.    
  133.     str_pointer = 0;
  134.    
  135.     //parse value
  136.     value = atoi(rx_data + 8);
  137.    
  138.     //send back info
  139.     if(event == EVENT_GET)
  140.     {
  141.         switch(param)
  142.         {
  143.             case PARAM_SPD:
  144.                 tx_lenght = sprintf(tx_data, "PUSH.SPD:%d\n", motor1.rpm * 10);
  145.                 uart_sendString(tx_data, tx_lenght);
  146.                 break;
  147.             case PARAM_DIR:
  148.                 if(motor1.direction == DIR_FW)
  149.                     tx_lenght = sprintf(tx_data, "PUSH.DIR:FW\n");              
  150.                 else
  151.                     tx_lenght = sprintf(tx_data, "PUSH.DIR:RW\n");              
  152.                 uart_sendString(tx_data, tx_lenght);
  153.                 break;
  154.             case PARAM_RUN:
  155.                 tx_lenght = sprintf(tx_data, "PUSH.RUN:%d\n", motor1.running);
  156.                 uart_sendString(tx_data, tx_lenght);
  157.                 break;
  158.             default:
  159.                 tx_lenght = sprintf(tx_data, "UNRECOGNIZED\n", motor1.running);
  160.                 uart_sendString(tx_data, tx_lenght);
  161.         }
  162.     }
  163.     else if (event == EVENT_SET)
  164.     {
  165.         switch(param)
  166.         {
  167.             case PARAM_SPD:
  168.                 motor1.pwm = map(value,0,1000,120,1023);
  169.                 break;
  170.             case PARAM_DIR:
  171.                 motor1.direction = value;
  172.                 break;
  173.             case PARAM_RUN:
  174.                 motor1.running = value;
  175.                 break;
  176.         }
  177.         motor1.st_change = 1;
  178.     }
  179.  
  180. }
  181.  
  182. void uart_callback(void)
  183. {
  184.     rx_cnt_en = 1; //start timeout counter
  185.     rx_timeout = 0;
  186.     rx_data[rx_cnt] = RCREG;
  187.     rx_cnt++;
  188.     //if(rx_cnt > 31) //TODO
  189.         //buffer overflow
  190. }
  191.  
  192. // init UART for 8MHz
  193. void uart_init(void)
  194. {
  195.     SPBRG = 12; //9600bps, 8MHz
  196.     TXSTAbits.BRGH = 0;
  197.     TXSTAbits.SYNC = 0;
  198.     RCSTAbits.SPEN = 1;
  199.     TXSTAbits.TX9 = 0;
  200.     TXSTAbits.TXEN = 1;
  201.     PIE1bits.RCIE = 1; //enable interrupt for receiver
  202.     RCSTAbits.CREN = 1;
  203.    
  204. }
  205.  
  206. // send one byte by UART
  207. void  uart_putChar(char data)
  208. {
  209.     while(!TXSTAbits.TRMT); //wait if transimt register is full
  210.     TXREG = data;
  211. }
  212.  
  213. void uart_sendString(char* string, int lenght)
  214. {
  215.     int i = 0;
  216.     for (i; i < lenght; i++)
  217.     {  
  218.         uart_putChar(*string);
  219.         *string++;
  220.     }
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement