Programowanie mikrokontrolerów AVR z rodziny ATmega. Materiały pomocnicze Jakub Malewicz jakub.malewicz@pwr.wroc.pl Wszelkie prawa zastrzeżone. Kopiowanie w całości lub w częściach bez zgody i wiedzy autora surowo zabronione. Strona1
Port szeregowy o Charakterystyka Port służący do komunikacji szeregowej, w którym dane wysyłane są bit po bicie. Port może pracować w dwóch trybach: synchronicznym i asynchronicznym. Obecnie używany jest niemal wyłącznie ten drugi. Do podstawowej transmisji wystarczą dwie linie RxD i TxD oraz trzecia masa (GND), stanowiąca poziom odniesienia. RxD służy do odbioru danych TxD służy do transmisji danych Jeżeli chcemy połączyć dwa urządzenia wyposażone w port szeregowy należy linię RxD w jednym urządzeniu połączyć z linią TxD w drugim (wykonać tzw. cross) i analogicznie linię TxD pierwszego urządzenia z RxD drugiego. W porcie szeregowym występują również inne linie: DCD, DTR, DSR, RTS, CTS, RI i służą m.in. do sprzętowego sterowania transmisją kontrola przepływu danych (ang. flow control). W tym miejscu należy wspomnieć, że w układach ATmega16/32 nie występuje sprzętowa obsługa sterowania transmisją, a jedynie możliwa jest jej programowa realizacja. o Budowa ramki danych Jeżeli port jest w stanie spoczynku - nie ma transmisji, na linii TxD jest stan wysoki. Ramka rozpoczyna się od bitu startu (stan niski), a następnie transmitowane są bity danych (5-8), opcjonalny jest bit parzystości (typu parzystego lub nieparzystego). Na końcu występuje bit stopu (stan wysoki), którego długość jest konfigurowalna. Powyższy opis został przedstawiony na rysunku 1. [ ] elementy opcjonalne St bit startu P bit parzystości Sp bit stopu Rysunek 1. Budowa ramki Strona2
o Parametry a. prędkość transmisji b. ilość bitów danych od 5 do 8 c. bit parzystości d. długość bitu stopu e. kontrola przepływu danych 1 o Obsługa portu szeregowego w ATmega16/32 UCSRA rejestr statusowy UCSRB rejestr konfiguracyjny (włączanie poszczególnych układów nadajnika, odbiornika, przerwań) UCSRC - rejestr konfiguracyjny (ustawianie parametrów transmisji) UBRR (UBRRH+UBRRL) rejestr konfiguracyjny, złożony z dwóch 8-bitowych rejestrów, służy do ustawienia prędkości transmisji UDR rejestr odczytu/zapisu danych (fizycznie dwa rejestry), zapis do rejestru powoduje transmisję, odczyt pozwala uzyskać odebrane dane W układach ATmega16/32 nie ma kolejki danych. Jeżeli w rejestrze UDR jest bajt danych i odbiornik otrzyma kolejne dane, wówczas zawartość UDR zostanie nadpisana. Podobnie wygląda sytuacja, jeżeli zapiszemy do UDR nowe dane przed wysłaniem starych - zostaną one nadpisane. 1 Jeżeli używamy tylko dwóch linii, to należy wyłączyć tę opcję. Może być stosowana tylko wtedy, gdy korzystamy z pełnego zestawu sygnałów. W układach ATmega16/32 nie ma takiej możliwości (aby obsłużyć kontrolę sprzętowo). Strona3
GPS o Informacje podstawowe System globalnego pozycjonowania wykorzystywany w wielu gałęziach gospodarki, jak i w celach militarnych. Pozwala na określenie aktualnego położenia, wysokości, prędkości, oraz kierunku ruchu, bieżącego czasu oraz daty. Rodzaj, ilość i dokładność informacji jest zależna od wykorzystywanej wersji i przeznaczenia urządzenia. o Protokół komunikacji z urządzeniami GPS Istnieje wiele różnych protokołów komunikacyjnych, wykorzystywanych przez urządzenia GPS, wśród których obecnie najpopularniejszym jest standard NMEA 0183. Jest to standard komunikacji między morskimi urządzeniami elektronicznymi. Dane w tym protokole są transmitowane w postaci kodów ASCII. Każda ramka danych rozpoczyna się znakiem $, po którym występuje identyfikator typu danych, dane, suma kontrolna, a po niej znak powrotu karetki <CR> i nowej linii <LF>. Powyższe oznacza, że dane z modułu możemy bez problemu odczytać w dowolnym terminalu, obsługującym standard RS232, ustawiając uprzednio odpowiednie parametry transmisji. Ramki różnią się zawartością i organizacją danych. W tabeli 1 przedstawiono identyfikatory wiadomości wraz z krótkim opisem zawartości ramek, natomiast w tabeli 2 przedstawiono przykładową ramkę w standardzie NMEA. Nazwa ramki Ważniejsze informacje w ramce GGA GSA GSV RMC VTG Czas, pozycja Tryb pracy odbiornika, aktywne satelity Ilość widocznych satelit, ich numery identyfikacyjne, azymut Czas, data, pozycja, kierunek, prędkość Kierunek i prędkość Tabela 1. Identyfikatory ramki wraz z opisem zawartości. Strona4
Przykładowa ramka $GPRMC,064951.000,A,2307.1256,N,12016.4438,E,0.03,165.48,260406,,,A*55 Parametr Wartość Jednostka Opis Identyfikator wiadomości $GPRMC Nagłówek protokołu Czas UTC 064951.000 Format hhmmss.sss Status A A dane poprawne, V dane niepoprawne Długość 2307.1256 Format ddmm.mmmm Wskaźnik półkuli N N północ, S - południe Szerokość 12016.4438 dddmm.mmmm Wskaźnik kierunku E E wschód, W - zachód Prędkość pozioma 0.03 Mm/h Azymut 165.48 stopnie Data 260406 ddmmyy Deklinacja magnetyczna stopnie E wschód, W - zachód Tryb A autonomiczny, D dyferencyjny, E - estymowany Suma kontrolna *65 <CR> <LF> Koniec ramki Tabela 2. Przykład ramki w standardzie NMEA wraz z opisem Strona5
Materiały pomocnicze o Prosta obsługa portu szeregowego #define F_CPU 1000000ul #define UART_BAUD 2400ul #define UART_CONST (F_CPU/(16ul*UART_BAUD)-1) #include <avr/io.h> int main(void) DDRD=0xfe; PORTD=0xff; //konfiguracja portu szeregowego UBRRH = (unsigned char)(uart_const>>8); UBRRL = (unsigned char)uart_const; UCSRB = (1<<TXEN); //wlaczony nadajnik while(1) while (!( UCSRA & (1<<UDRE)) ); UDR = 'j'; return 0; Strona6
o Obsługa portu szeregowego zrealizowana na przerwaniach #define F_CPU 1000000ul #define UART_BAUD 2400ul #define UART_CONST (F_CPU/(16ul*UART_BAUD)-1) #include <avr/io.h> #include <avr/interrupt.h> // Funkcja wysylajaca ciag znakow void UART_SEND_string(char *s) do while (!( UCSRA & (1<<UDRE)) ); UDR = *s; while(*s++!='\0'); // Przerwanie wywolane zakonczeniem odbioru ISR(USART_RXC_vect) UDR; UART_SEND_string("To ja, Twoj kontroler :)\n\r"); int main(void) DDRD=0xfe; PORTD=0xff; // wlaczenie przerwan SREG=(1<<SREG_I); //konfiguracja portu szeregowego UBRRH = (unsigned char)(uart_const>>8); UBRRL = (unsigned char)uart_const; UCSRB = (1<<RXEN) (1<<TXEN) (1<<RXCIE); odbioru //wlaczony nadajnik, odbiornik, przerwanie od while(1) return 0; o Dane z modułu GPS $GPGGA,064951.000,2307.1256,N,12016.4438,E,1,8,0.95,39.9,M,17.8,M,,*65 $GPGSA,A,3,29,21,26,15,18,09,06,10,,,,,2.32,0.95,2.11*00 $GPGSV,3,1,09,29,36,029,42,21,46,314,43,26,44,020,43,15,21,321,39*7D $GPRMC,064951.000,A,2307.1256,N,12016.4438,E,0.03,165.48,260406,,,A*55 $GPVTG,165.48,T,,M,0.03,N,0.06,K,A*37 Strona7