Programowanie mikrokontrolerów Marcin Engel Marcin Peczarski 8 listopada 2007
Alfanumeryczny wyświetlacz LCD umożliwia wyświetlanie znaków ze zbioru będącego rozszerzeniem ASCII posiada zintegrowany sterownik sterownik zwykle zgodny z HD44780 komunikacja za pomocą interfejsu równoległego wpisujemy kod znaku do określonej komórki pamięci wyświetlacza przykładowa pamięć obrazu 0 1 2 3 4 5 6 7 8 9 0A 0B 0C 0D 0E 0F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
Interfejs zasilanie: masa i 5 V napięcie regulacji kontrastu linia RS 0 przesyłanie instrukcji 1 przesyłanie danych linia RW, kierunek transmisji 0 zapis 1 odczyt linia E, potwierdzanie zboczem opadającym linie danych D0 do D7 opcjonalnie dwie linie zasilające podświetlanie
Interfejs uproszczony będziemy tylko zapisywać dane linia RW zawsze ustawiona na 0 (zwarta do masy) będziemy stosować interfejs 4-bitowy do transmisji używamy linii D4 do D7 linie D0 do D3 zawsze ustawione na 0 (zwarte do masy) linia kontrastu nie jest sterowana przez µc wyświetlacz nie ma podświetlania
Protokół transmisji jednego bajtu tryb 8-bitowy ustaw rodzaj transmisji na linii RS 0 przesyłanie instrukcji 1 przesyłanie danych ustaw linię E w stan 1 ustaw na liniach D0 do D7 odpowiednio bity 0 do 7 transmitowanego bajtu odczekaj kilka taktów zegara ustaw linię E w stan 0 odczekaj 40 µs
Protokół transmisji jednego bajtu tryb 4-bitowy ustaw rodzaj transmisji na linii RS 0 przesyłanie instrukcji 1 przesyłanie danych ustaw linię E w stan 1 ustaw na liniach D4 do D7 odpowiednio bity 4 do 7 transmitowanego bajtu odczekaj kilka taktów zegara ustaw linię E w stan 0 odczekaj kilka taktów zegara ustaw linię E w stan 1 ustaw na liniach D4 do D7 odpowiednio bity 0 do 3 transmitowanego bajtu odczekaj kilka taktów zegara ustaw linię E w stan 0 odczekaj 40 µs
Inicjalizacja wyświetlacza po włączeniu zasilania jesteśmy w trybie 8-bitowym odczekaj po włączeniu zasilania 40 ms wyślij instrukcję 0x3* odczekaj 4,1 ms wyślij instrukcję 0x3* odczekaj 100 µs wyślij instrukcję 0x3* odczekaj 100 µs włącz interfejs 4-bitowy instrukcja 0x2* odczekaj 40 µs
Konfiguracja wyświetlacza 1-liniowy lub 2-liniowy matryca znaku 5 8 pikseli lub 5 10 pikseli kursor: migający, niemigający, brak przesuwane okno definiowanie własnych znaków
Przetwornik analogowo-cyfrowy (1) procesor ATmega16 ma wbudowany przetwornik analogowo-cyfrowy przetwarza wartość napięcia elektrycznego na liczbę rozdzielczość 10 bitów rozróżnia 1024 wartości pomiar wartość napięcia elektrycznego względem masy układu wartość wyjściowa z przedziału 0 do 1023 określona wzorem V IN 1024 V REF pomiar różnicy wartości dwóch napięć elektrycznych (opcja niedostępna w obudowie DIP40) wartość wyjściowa z przedziału 512 do 511 (kod U2) określona wzorem (V POS V NEG ) GAIN 512 V REF
Przetwornik analogowo-cyfrowy (2) jako wejścia V IN, V POS, V NEG można wybrać nogi portu A współczynnik wzmocnienia GAIN może wynosić 1, 10 lub 200 napiecie odniesienia V REF napięcie zasilania układu wewnętrzne napięcie odniesienia, nominalnie 2,56 V, wartość rzeczywista między 2,3 a 2,7 V zewnętrzne napięcie odniesienia podane na nogę AREF taktowany zegarem od 50 do 200 khz jedno przetwarzanie trwa od 13 do 260 µs przetwarzanie może być wyzwalane jednokrotnie lub automatycznie powtarzane koniec przetwarzania i gotowość do odczytania wyniku może być zgłaszana przerwaniem
Przetwornik analogowo-cyfrowy (3) przed użyciem przetwornik trzeba skonfigurować rejestr ADMUX źródło napięcia odniesienia V REF sposób prezentacji wyniku wybór wejścia V IN, V POS, V NEG współczynnik wzmocnienia GAIN rejestr ADCSR(A) włączenie przetwornika wybór sposobu wyzwalania włączenie obsługi przerwania ustawienie częstotliwości taktowania 3 najstarsze bity rejestru SFIOR wybór źródła automatycznego wyzwalania rejestry ADCL i ADCH zawierają przetworzoną wartość
Rejestr ADMUX (1) 7 6 5 4 3 2 1 0 REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 bity 7:6 REFS1 REFS0 napięcie odniesienia 0 0 zewnętrzne, podane na nogę AREF 0 1 napięcie zasilania 1 0 wartość zarezerwowana 1 1 wewnętrzne 2,56 V bit 5 rozmieszczenie bitów wyniku ADLAR rejestr ADCH rejestr ADCL 0 - - - - - - 9 8 7 6 5 4 3 2 1 0 1 9 8 7 6 5 4 3 2 1 0 - - - - - -
Rejestr ADMUX (2) bity 4:0 wybór wejścia interuje nas tylko pomiar napięcia względem masy układu podajemy numer nogi portu A przykładowy kod ldi r16, (1 << REFS0) (1 << ADLAR) (1 << PA0) out ADMUX, r16
Rejestr ADCSR(A) (1) 7 6 5 4 3 2 1 0 ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 bit 7 włączenie przetwornika bit 6 start konwersji bit 5 włączenie automatycznego trybu wyzwalania bit 4 znacznik przerwania ustawiony, gdy przetwarzanie zakończone bit 3 włączenie przerwania
Rejestr ADCSR(A) (2) bity 2:0 ustalenie częstotliwości taktowania przetwornika ADPS2 ADPS1 ADPS0 współczynnik podziału 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 przykład częstotliwość zegara systemowego 1 MHz przetwornik należy taktować ok. 100 khz (między 50 a 200 khz) wybieramy współczynnik podziału 8
Rejestr ADCSR(A) (3) przykładowy kod ldi r16, (1 << ADEN) (1 << ADSC) (1 << ADIE) (1 << ADPS1) (1 << ADPS0) out ADCSR, r16
Obsługa przerwania (1) ;skok w wektorze przerwań.org ADCCaddr jmp ADC_interrupt ;procedura obsługi przerwania ADC_interrupt: ; odłożenie na stos używanych rejestrów ; i rejestru znaczników push r16 in r16, SREG push r16 push r17 ; wczytanie wartości napięcia in r17, ADCH in r16, ADCL
Obsługa przerwania (2) ; kod korzystający z wczytanej wartości... ; odtworzenie wartości rejestrów ; i rejestru znaczników pop r17 pop r16 out r16, SREG pop r16 ; powrót z przerwania reti
Konfiguracja VMLAB źródła mierzonego napięcia możemy symulować za pomocą suwaków w Control Panel przykład V0 PA0 VSS SLIDER_1(0 5)