Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <msp430.h>
- #define TX_ADDR 0x0077
- #define BUFFER 256
- /*
- * main.c
- */
- unsigned char buffer[BUFFER];
- unsigned char exit_buf[BUFFER + 3];
- int b = 0;
- void init_ports();
- void init_clock();
- void init_usart();
- void init_dma();
- void convert(unsigned char* a, int length);
- void send_response(unsigned char tab[], int length);
- int main(void) {
- init_ports();
- init_clock();
- init_usart();
- init_dma();
- _BIS_SR(GIE);
- while(1){
- _BIS_SR(CPUOFF);
- _NOP();
- if (b == BUFFER-1) {
- send_response("BUFFER OVERFLOW", 15);
- }
- else convert(buffer, b-1);
- }
- }
- #pragma vector=USART0RX_VECTOR
- __interrupt void receive(void)
- {
- buffer[b] = U0RXBUF;
- if (buffer[b] == 0x0D || b == BUFFER-1) {
- LPM0_EXIT;
- ME1 &= ~URXE0; //wylacz receive
- }
- else b++;
- }
- #pragma vector=DACDMA_VECTOR
- __interrupt void turn_off(void)
- {
- DMA0CTL &= ~DMAEN;
- b = 0;
- DMA0CTL &= ~DMAIFG;
- }
- void init_ports() {
- WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
- P3SEL |= 0x30;
- P3DIR |= 0x10;
- P4DIR = 0xFF;
- P4OUT = 0x00;
- }
- void init_clock() {
- BCSCTL2 |= SELM1 + SELS;
- }
- void init_usart() {
- U0CTL |= SWRST;
- U0CTL |= CHAR + PENA + PEV + SPB;// + LISTEN;
- U0TCTL |= SSEL1;
- U0BR1 = 0x00;
- U0BR0 = 64;
- U0MCTL = 0x00;
- ME1 |= UTXE0 + URXE0;
- U0CTL &= ~SWRST;
- U0TXBUF = '?';
- IE1 |= URXIE0;
- }
- void init_dma() {
- DMACTL0 |= DMA0TSEL_4;
- DMA0CTL |= DMADT2 + DMASRCINCR0 + DMASRCINCR1 + DMADSTBYTE + DMASRCBYTE;
- DMA0SA = (unsigned int)exit_buf;
- DMA0DA = TX_ADDR;
- DMA0SZ = 0;
- }
- void convert(unsigned char* a, int length) {
- int i=0;
- int op=0;//"opóŸnienie" jednego rejestru wzglêdem drugiego
- int k = 0;
- unsigned char work_buf[BUFFER] = {0};
- //printf("wczytano: %s\n",a);
- ///pierwszy znak
- 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
- else if (a[0]>=97 && a[0]<=122) work_buf[0]=a[0]-32; //jak ma³a to zamieñ na du¿¹
- else {send_response("ERROR", 5); return;}
- ///pozosta³e znaki
- for (i=1; i<=length-1; i++){
- //if(a[i]<=0) i=length+3;
- 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
- 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
- else if (a[i]>=65 && a[i]<=90) work_buf[i-op]=a[i]+32; //jak du¿a to zmieñ na ma³¹
- 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
- 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)) {
- work_buf[i-op]=a[i]; //po literze albo cyfrze jest ok
- if(a[i]!=44) i=length+30; //jesli nie przecinek to koniec zdania
- }
- else if(work_buf[i-1-op]==32){ //jeœli znak jest po spacji, usuwamy spacjê
- work_buf[i-1-op]=a[i];
- op++;
- if(a[i]!=44) i=length+30;
- }
- }
- else {send_response("ERROR", 5); return;}
- }
- 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
- while(work_buf[k] != 0) k++;
- send_response(work_buf, k);
- }
- void send_response(unsigned char tab[], int length) {
- int i = 0;
- b = 0;
- for (; i<length; ++i) exit_buf[i] = tab[i];
- exit_buf[i] = '\n';
- exit_buf[i+1] = '\r';
- exit_buf[i+2] = '?';
- DMA0SZ = i+3;
- DMA0CTL |= DMAIE;
- DMA0CTL |= DMAEN;
- U0TXBUF = '>'; //to zainicjuje DMA
- ME1 |= URXE0; //wlacz receivera
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement