Advertisement
Guest User

Untitled

a guest
May 30th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. #include <msp430.h>
  2. #define TX_ADDR 0x0077
  3. #define BUFFER 256
  4. /*
  5. * main.c
  6. */
  7. unsigned char buffer[BUFFER];
  8. unsigned char exit_buf[BUFFER + 3];
  9.  
  10. int b = 0;
  11.  
  12. void init_ports();
  13. void init_clock();
  14. void init_usart();
  15. void init_dma();
  16. void convert(unsigned char* a, int length);
  17. void send_response(unsigned char tab[], int length);
  18.  
  19. int main(void) {
  20. init_ports();
  21. init_clock();
  22. init_usart();
  23. init_dma();
  24. _BIS_SR(GIE);
  25.  
  26. while(1){
  27. _BIS_SR(CPUOFF);
  28. _NOP();
  29.  
  30. if (b == BUFFER-1) {
  31. send_response("BUFFER OVERFLOW", 15);
  32. }
  33. else convert(buffer, b-1);
  34.  
  35. }
  36. }
  37.  
  38. #pragma vector=USART0RX_VECTOR
  39. __interrupt void receive(void)
  40. {
  41. buffer[b] = U0RXBUF;
  42. if (buffer[b] == 0x0D || b == BUFFER-1) {
  43. LPM0_EXIT;
  44. ME1 &= ~URXE0; //wylacz receive
  45. }
  46. else b++;
  47.  
  48. }
  49.  
  50. #pragma vector=DACDMA_VECTOR
  51. __interrupt void turn_off(void)
  52. {
  53. DMA0CTL &= ~DMAEN;
  54. b = 0;
  55. DMA0CTL &= ~DMAIFG;
  56. }
  57.  
  58. void init_ports() {
  59. WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
  60. P3SEL |= 0x30;
  61. P3DIR |= 0x10;
  62. P4DIR = 0xFF;
  63. P4OUT = 0x00;
  64. }
  65.  
  66. void init_clock() {
  67. BCSCTL2 |= SELM1 + SELS;
  68. }
  69.  
  70. void init_usart() {
  71. U0CTL |= SWRST;
  72. U0CTL |= CHAR + PENA + PEV + SPB;// + LISTEN;
  73. U0TCTL |= SSEL1;
  74.  
  75. U0BR1 = 0x00;
  76. U0BR0 = 64;
  77. U0MCTL = 0x00;
  78.  
  79. ME1 |= UTXE0 + URXE0;
  80. U0CTL &= ~SWRST;
  81. U0TXBUF = '?';
  82. IE1 |= URXIE0;
  83. }
  84.  
  85. void init_dma() {
  86. DMACTL0 |= DMA0TSEL_4;
  87. DMA0CTL |= DMADT2 + DMASRCINCR0 + DMASRCINCR1 + DMADSTBYTE + DMASRCBYTE;
  88. DMA0SA = (unsigned int)exit_buf;
  89. DMA0DA = TX_ADDR;
  90. DMA0SZ = 0;
  91. }
  92.  
  93.  
  94. void convert(unsigned char* a, int length) {
  95. int i=0;
  96. int op=0;//"opóŸnienie" jednego rejestru wzglêdem drugiego
  97. int k = 0;
  98. unsigned char work_buf[BUFFER] = {0};
  99. //printf("wczytano: %s\n",a);
  100.  
  101.  
  102. ///pierwszy znak
  103. if((a[0]>=48 && a[0]<=57) || (a[0]>=65 && a[0]<=90)) work_buf[0]=a[0]; //jak cyfra albo du¿a litera to ok
  104. else if (a[0]>=97 && a[0]<=122) work_buf[0]=a[0]-32; //jak ma³a to zamieñ na du¿¹
  105. else {send_response("ERROR", 5); return;}
  106.  
  107. ///pozosta³e znaki
  108. for (i=1; i<=length-1; i++){
  109.  
  110. //if(a[i]<=0) i=length+3;
  111.  
  112. if((work_buf[i-1-op]==a[i]) || (work_buf[i-1-op]>=65 && work_buf[i-1-op]<=90 && work_buf[i-1-op]==a[i]-32) || (work_buf[i-1-op]>=97 && work_buf[i-1-op]<=122 && work_buf[i-1-op]==a[i]+32)) op++; //jeœli znak siê powtarza, to go ignorujemy
  113.  
  114. if((a[i]>=97 && a[i]<=122) || (a[i]>=48 && a[i]<=57) || a[i]==32) work_buf[i-op]=a[i]; //jak ma³a, spacja albo cyfra to ok
  115.  
  116. else if (a[i]>=65 && a[i]<=90) work_buf[i-op]=a[i]+32; //jak du¿a to zmieñ na ma³¹
  117.  
  118. else if (a[i] == 46 || a[i] == 33 || a[i] == 63 || a[i] == 44){ //jeœli jest to kropka, znak zapytania, przecinek albo wykrzyknik, to musi byæ on po literze albo cyfrze
  119.  
  120. if ((work_buf[i-1-op]>=65 && work_buf[i-1-op]<=90) || (work_buf[i-1-op]>=97 && work_buf[i-1-op]<=122)||(work_buf[i-1-op]>=48 && work_buf[i-1-op]<=57)) {
  121. work_buf[i-op]=a[i]; //po literze albo cyfrze jest ok
  122. if(a[i]!=44) i=length+30; //jesli nie przecinek to koniec zdania
  123. }
  124.  
  125. else if(work_buf[i-1-op]==32){ //jeœli znak jest po spacji, usuwamy spacjê
  126. work_buf[i-1-op]=a[i];
  127. op++;
  128. if(a[i]!=44) i=length+30;
  129. }
  130. }
  131.  
  132. else {send_response("ERROR", 5); return;}
  133. }
  134.  
  135. if (work_buf[0]>=97 && work_buf[0]<=122) work_buf[0]=work_buf[0]-32; //jak by³y powtórki na pocz¹tku to zmienia³o na ma³¹ wiêc idê na ³atwiznê i zmieniam to pod koniec
  136. while(work_buf[k] != 0) k++;
  137. send_response(work_buf, k);
  138. }
  139.  
  140. void send_response(unsigned char tab[], int length) {
  141. int i = 0;
  142. b = 0;
  143. for (; i<length; ++i) exit_buf[i] = tab[i];
  144. exit_buf[i] = '\n';
  145. exit_buf[i+1] = '\r';
  146. exit_buf[i+2] = '?';
  147. DMA0SZ = i+3;
  148. DMA0CTL |= DMAIE;
  149. DMA0CTL |= DMAEN;
  150. U0TXBUF = '>'; //to zainicjuje DMA
  151. ME1 |= URXE0; //wlacz receivera
  152.  
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement