Możliwość przesyłania danych do komputera i ich odbierania przez mikrokontroler czy to bezpośrednio w programie terminalowym czy też przy pomocy specjalnie napisanego oprogramowania wizualizującego odebrane dane jest bardzo, ale to bardzo przydatna i pożyteczna podczas pracy z mikrokontrolerami.
Nieważne czy używamy AVR czy też PIC czy MSP430 – praca z UARTEM jest przyjemna , przydatna i pozwala na realizacje wielu pomysłów od sterowania urządzeniami po budowę mierników, analizatorów, w których dane odebrane przez UART są wizualizowane przez oprogramowanie na systemie komputerowym. Opanowanie UARTU na płytce Launchpad jest wyjątkowo proste co przedstawię w tym artykule.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
****************************************************************************** * MSP-EXP430G2-LaunchPad Software UART Transmission * ******************************************************************************/ #include "msp430g2231.h" #define TXD BIT1 // TX na P1.1 #define Bitime 104 //9600 Baud, SMCLK=1MHz (1MHz/9600)=104 unsigned char BitCnt; // Licznik bitów uzywany podczas transmisji unsigned int TXByte; // Definicje funkcji void Transmit(void); void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT unsigned int uartUpdateTimer = 10; // Petla wysyłania unsigned int i = 0; // Licznik przesyłu danych BCSCTL1 = CALBC1_1MHZ; // Ustawienie zakresu DCOCTL = CALDCO_1MHZ; // SMCLK = DCO = 1MHz P1SEL |= TXD; // P1DIR |= TXD; // __bis_SR_register(GIE); // właczenie przerwań /* Pętla główna */ while(1) { if ((--uartUpdateTimer == 0)) { TXByte = i; Transmit(); i++; uartUpdateTimer = 10; } } } // Funkcja przesyłu znaku dla TXByte void Transmit() { CCTL0 = OUT; TACTL = TASSEL_2 + MC_2; // SMCLK, tryb wysyłania non stop BitCnt = 0xA; // ładowanie licznika bitów, 8 bitów + ST/SP CCR0 = TAR; CCR0 += Bitime; // Ustawienie czasu wysłania 1 bitu TXByte |= 0x100; // Bit STOP dla TXByte (dla logicznego 1) TXByte = TXByte << 1; // Bit START dla TXByte (dla logicznego 0) CCTL0 = CCIS0 + OUTMOD0 + CCIE; // Set signal, intial value, enable interrupts while ( CCTL0 & CCIE ); // Oczekiwanie na zakonczenie Wysyłania (TX) TACTL = TASSEL_2; // SMCLK, timer off (dla oszczedzania energi) } // Timer A0 -- przerwania #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { CCR0 += Bitime; // dodanie Offsetu do rejestru CCR0 if ( BitCnt == 0) // Jesli wszystko wysłane , wyłaczenie przerwań CCTL0 &= ~ CCIE ; else { CCTL0 |= OUTMOD2; // TX rozmiar if (TXByte & 0x01) CCTL0 &= ~ OUTMOD2; // TX Znacznik TXByte = TXByte >> 1; BitCnt --; } } |
Powyższy kod jest prosty i chyba nie wymaga omówienia , a komentarze są jednoznaczne , jeśli jednak potrzebujesz wyjaśnienia części kodu czy też całości pisz śmiało poniżej . Dokładniej omówię użycie USI jako UART w następnej części gdzie opisze używanie UARTU w trybie HALFDUPLEX . a to już trudniejsze niż wysyłanie określonej liczby bitów.
….. wysokich transferów. :)