Programowanie AVR cz. 7: Mikroprocesorowy sterownik wyświetlacza alfanumerycznego LCD (układ HD44780 lub odpowiednik) z dostępem przez łącze szeregowe.
Podłączenie wyświetlacza alfanumerycznego na układzie HD44780 (lub podobnym) do mikrokontrolera wymaga użycia w najlepszym przypadku sześciu wyprowadzeń. Jeżeli musimy wykorzystać mały mikrokontroler, np. ATtiny2313, stracimy sporo linii, które mogłyby służyć do realizacji innych funkcjonalności. Zasygnalizował mi to swego czasu znajomy, który właśnie m. in. z tego powodu nie przepada za LCD.
Można jednak wykonać małe obejście, które pozwoli na wykorzystanie do połączenia wyświetlacza z mikrokontrolerem dwie linie (czyli dwa wyprowadzenia), przy założeniu istnienia wspólnego obwodu zasilania. Z pomocą przychodzi nam sprzętowy port szeregowy UART, będący na wyposażeniu większości mikrokontrolerów AVR. Ma on ponadto kompletne wsparcie w BASCOMie, a podejrzewam, że jego wykorzystanie w języku C również nie nastręcza problemów.
Założenie projektu, który przedstawiam w tym artykule, jest proste: zrealizować mikroprocesorowy sterownik wyświetlacza, który znaki do wyświetlania oraz zbiór podstawowych komend będzie odbierał od układu "nadrzędnego" (nadającego) przez port szeregowy. W ten sposób zminimalizujemy liczbę linii koniecznych do podłączenia wyświetlacza do układu i przy okazji uprościmy kod programu.
Proszę rzucić okiem na schemat:
Sterownikiem głównym naszego modułu wyświetlacza jest mikrokontroler ATtiny2313. W układzie można wykorzystać dowolny wyświetlacz alfanumeryczny z HD44780 lub jego odpowiednikiem. Na schemacie widzimy wyświetlacz typu 16*2, ale mój program dostosowany jest do wyświetlacza 16*1a (niby jeden wiersz z szesnastoma znakami, ale programuje się go jak dwa wiersze po osiem znaków; tylko takie wyświetlacze posiadam). Oczywiście użycie innego wyświetlacza spowoduje konieczność dostosowania programu. Można też pokusić się o napisanie uniwersalnego programu, dostosowującego się do konkretnego modelu wyświetlacza. Ponieważ odpytywanie sterownika wyświetlacza mogłoby nie dać oczekiwanego rezultatu (szczerze mówiąc nie sprawdzałem, czy istnieje w ogóle taka możliwość), wybór rodzaju wyświetlacza mógłby być dokonywany sprzętowo - np. poprzez użycie wolnych portów mikrokontrolera, tak, jak to ma miejsce przy ustalaniu adresu sprzętowego urządzenia na magistrali I2C. Mielibyśmy wtedy na płytce dodatkową listwę z mikroprzełącznikami.
A oto i program oraz tzw. plik nagłówkowy (nazewnictwo z C - dla wygody i oddania istoty tego pliku):
Plik nagłówkowy należy dołączyć lub przepisać jego zawartość do każdego programu dla mikrokontrolera, który ma docelowo korzystać z naszego modułu wyświetlacza.
Jeżeli do komunikacji z wyświetlaczem będziemy używać domyślnego sprzętowego UART-a (tzw. "pierwszego"), wystarczy do wysłania jakiejkolwiek informacji użyć komendy Print lub Printbin języka BASCOM - dotyczy to zarówno znaków ASCII, jak i komend zdefiniowanych w pliku nagłówkowym (mam nadzieję, że analizując prosty kod programu każdy szybko zauważy, jakie to są komendy). W zasadzie oprócz okienka konfigurującego port szeregowy z poziomu środowiska BASCOMa nie ma potrzeby ustawiania czegokolwiek (związanego z LCD i portem szeregowym) w programie!
Sterownik, jeszcze w fazie prototypowej (na płytce stykowej), testowałem z wykorzystaniem prostego układu z ATmegą (plus ekspander I2C, przycisk i kilka diod LED) jako nadajnikiem (program podobny do prezentowanego w tym blogu wcześniej) - współpraca przebiegała bez zarzutu, jednak konieczne było zastosowanie buforowania transmisji (zwróćcie uwagę na rozmiar pamięci RAM Waszego mikrokontrolera). W razie konieczności, można buforowanie zastosować również w układzie nadajnika, ale nie powinno w tym względzie być większych problemów.
Konfiguracja portu szeregowego wykonana została z poziomu środowiska BASCOMa, jednak parametry transmisji umieściłem w komentarzu do programu (patrz: listing). Myślę, że nie trzeba nikomu tłumaczyć konieczności uzgodnienia w obu układach (nadawczym i odbiorczym) identycznych parametrów transmisji?
Podłączenie wyświetlacza do ATtiny'ego narzucone zostało przez wymogi zastosowanej biblioteki LCD4.LIB (szczegóły), której zadaniem jest m. in. zmniejszenie rozmiaru kodu wynikowego programu i jego optymalizacja.
Dwie rzeczy, o których musimy jeszcze pamiętać, to odpowiednie ustawienie fusebitów w ATtiny - w zależności od sposobu zasilania sterownika i użytego rezonatora kwarcowego (tutaj pomóc może dokumentacja mikrokontrolera), oraz zapewnienie skutecznej filtracji zasilania. Ten ostatni aspekt w przedstawianych dotychczas układach pomijałem, ale jest to rzecz szalenie ważna. Polecam lekturę tych dwóch ciekawych artykułów:
Układ zmontowałem "na gotowo" na płytce uniwersalnej, dostosowując projekt do możliwości zmiany wyświetlacza (wyświetlacz podłączany na "grzebień"). Zdjęcia niżej przedstawiają prawie zmontowany układ i zestaw testowy po wykonaniu próby:
Zalecam stosowanie wspólnego zasilania (mimo wszystko) - już zresztą o tym wspominałem. Zwróćmy również uwagę, że linie portu szeregowego, a w zasadzie przewody, musimy podłączyć pomiędzy odbiornikiem (nasz sterownik) a nadajnikiem (dowolny układ mikroprocesorowy) na krzyż, czyli TxD z RxD. Jeśli chcemy podłączyć moduł wyświetlacza do portu szeregowego w pececie czy innym urządzeniu komputerowym, musimy zadbać o dopasowanie napięć i logiki (układ na tranzystorach lub coś jak MAX232). Pobór prądu przez moduł nie przekraczał 20mA z podłączonym podświetlaniem wyświetlacza (przy zasilaniu z baterii 4,5V).
Po przetestowaniu płytkę z kompletnym już modułem umieściłem na deseczce z filcowymi podkładkami - całość tworzy "klocek elektroniczny" do łatwego testowania i wykorzystania z przeróżnymi układami, które od teraz będę dostosowywał do właśnie szeregowej komunikacji z wyświetlaczem.
Póki co moduł sprawuje się dobrze :)
Jeżeli uważacie, że pomysł i projekt warte są uwagi, zachęcam do montowania i zabawy (wszystko jest free - tylko części musicie nabyć sami ;-)), zadawania pytań i zgłaszania uwag.
Można jednak wykonać małe obejście, które pozwoli na wykorzystanie do połączenia wyświetlacza z mikrokontrolerem dwie linie (czyli dwa wyprowadzenia), przy założeniu istnienia wspólnego obwodu zasilania. Z pomocą przychodzi nam sprzętowy port szeregowy UART, będący na wyposażeniu większości mikrokontrolerów AVR. Ma on ponadto kompletne wsparcie w BASCOMie, a podejrzewam, że jego wykorzystanie w języku C również nie nastręcza problemów.
Założenie projektu, który przedstawiam w tym artykule, jest proste: zrealizować mikroprocesorowy sterownik wyświetlacza, który znaki do wyświetlania oraz zbiór podstawowych komend będzie odbierał od układu "nadrzędnego" (nadającego) przez port szeregowy. W ten sposób zminimalizujemy liczbę linii koniecznych do podłączenia wyświetlacza do układu i przy okazji uprościmy kod programu.
Proszę rzucić okiem na schemat:
Sterownikiem głównym naszego modułu wyświetlacza jest mikrokontroler ATtiny2313. W układzie można wykorzystać dowolny wyświetlacz alfanumeryczny z HD44780 lub jego odpowiednikiem. Na schemacie widzimy wyświetlacz typu 16*2, ale mój program dostosowany jest do wyświetlacza 16*1a (niby jeden wiersz z szesnastoma znakami, ale programuje się go jak dwa wiersze po osiem znaków; tylko takie wyświetlacze posiadam). Oczywiście użycie innego wyświetlacza spowoduje konieczność dostosowania programu. Można też pokusić się o napisanie uniwersalnego programu, dostosowującego się do konkretnego modelu wyświetlacza. Ponieważ odpytywanie sterownika wyświetlacza mogłoby nie dać oczekiwanego rezultatu (szczerze mówiąc nie sprawdzałem, czy istnieje w ogóle taka możliwość), wybór rodzaju wyświetlacza mógłby być dokonywany sprzętowo - np. poprzez użycie wolnych portów mikrokontrolera, tak, jak to ma miejsce przy ustalaniu adresu sprzętowego urządzenia na magistrali I2C. Mielibyśmy wtedy na płytce dodatkową listwę z mikroprzełącznikami.
A oto i program oraz tzw. plik nagłówkowy (nazewnictwo z C - dla wygody i oddania istoty tego pliku):
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' Stałe używane przez sterownik | |
Const Clean = 255 | |
Const Cleft = 254 | |
Const Cright = 253 | |
Const Con = 252 | |
Const Coff = 251 | |
Const Cblink = 250 | |
Const Cnoblink = 249 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' Mikroprocesorowy sterownik wyświetlacza alfanumerycznego typu 16*1a | |
' (układ zgodny z HD44780). | |
' Właściwości: | |
' - komunikacja (wysyłanie danych do wyświetlenia i sterowanie LCD) poprzez UART | |
' - prędkość transmisji: 9600b/s (parametry: 8n1 - domyślne dla ATtiny2313 i innych) | |
' - podstawowe funkcjonalności: | |
' * wyświetlanie tekstu w podstawowym kodzie ASCII (kody od 32 do 126) | |
' * sterowanie wyświetlacza (czyszczenie, sterowanie kursorem) | |
' * ustalenie początku wyświetlania (Locate): | |
' należy wysłać do sterownika informacjępostaci: | |
' &B1100xxxy, gdzie xxx to pozycja-w-wierszu - 1, a y to wiersz - 1, | |
' np. &B11000111 - wiersz 2, pozycja 4 | |
$regfile = "attiny2313.dat" | |
$crystal = 4000000 | |
$hwstack = 40 | |
$swstack = 16 | |
$framesize = 32 | |
$baud = 9600 | |
$lib "LCD4.LBX" | |
$include "sdrv-const.bas" | |
' Konfiguracja LCD zgodnie z wymogiem biblioteki LCD4 | |
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 | |
Config Lcd = 16 * 1a | |
' Buforowanie danych wejściowych - bez tego sterownik gubi znaki | |
Config Serialin = Buffered , Size = 16 | |
Enable Interrupts | |
Dim Znak As Byte | |
Dim Ile_znakow As Byte | |
Dim Poz_y As Byte | |
Dim Poz_x As Byte | |
Dim Linia As Bit | |
Dim Locate_odebrany As Bit | |
Do | |
Znak = Inkey() | |
If Znak = Clean Then | |
Cls | |
Ile_znakow = 0 | |
Linia = 0 | |
Elseif Znak = Cleft Then | |
Shiftcursor Left | |
Elseif Znak = Cright Then | |
Shiftcursor Right | |
Elseif Znak = Con Then | |
Cursor On | |
Elseif Znak = Coff Then | |
Cursor Off | |
Elseif Znak = Cblink Then | |
Cursor Blink | |
Elseif Znak = Cnoblink Then | |
Cursor Noblink | |
Elseif Znak >= 192 And Znak <= 207 Then | |
' Locate na podstawie przekazanych parametrów | |
Locate_odebrany = 1 | |
Poz_x = Znak And &B00001110 | |
Shift Poz_x , Right | |
Poz_x = Poz_x + 1 | |
Poz_y = Znak.0 + 1 | |
Elseif Znak > 31 And Znak < 127 Then | |
If Ile_znakow > 7 Then | |
If Linia = 0 Then | |
Linia = 1 | |
Else | |
Linia = 0 | |
End If | |
Ile_znakow = 0 | |
End If | |
Incr Ile_znakow | |
If Locate_odebrany = 1 Then | |
Locate Poz_y , Poz_x | |
Locate_odebrany = 0 | |
Else | |
Poz_y = Linia + 1 | |
Locate Poz_y , Ile_znakow | |
End If | |
Lcd Chr(znak) | |
End If | |
Loop | |
End |
Jeżeli do komunikacji z wyświetlaczem będziemy używać domyślnego sprzętowego UART-a (tzw. "pierwszego"), wystarczy do wysłania jakiejkolwiek informacji użyć komendy Print lub Printbin języka BASCOM - dotyczy to zarówno znaków ASCII, jak i komend zdefiniowanych w pliku nagłówkowym (mam nadzieję, że analizując prosty kod programu każdy szybko zauważy, jakie to są komendy). W zasadzie oprócz okienka konfigurującego port szeregowy z poziomu środowiska BASCOMa nie ma potrzeby ustawiania czegokolwiek (związanego z LCD i portem szeregowym) w programie!
Sterownik, jeszcze w fazie prototypowej (na płytce stykowej), testowałem z wykorzystaniem prostego układu z ATmegą (plus ekspander I2C, przycisk i kilka diod LED) jako nadajnikiem (program podobny do prezentowanego w tym blogu wcześniej) - współpraca przebiegała bez zarzutu, jednak konieczne było zastosowanie buforowania transmisji (zwróćcie uwagę na rozmiar pamięci RAM Waszego mikrokontrolera). W razie konieczności, można buforowanie zastosować również w układzie nadajnika, ale nie powinno w tym względzie być większych problemów.
Konfiguracja portu szeregowego wykonana została z poziomu środowiska BASCOMa, jednak parametry transmisji umieściłem w komentarzu do programu (patrz: listing). Myślę, że nie trzeba nikomu tłumaczyć konieczności uzgodnienia w obu układach (nadawczym i odbiorczym) identycznych parametrów transmisji?
Podłączenie wyświetlacza do ATtiny'ego narzucone zostało przez wymogi zastosowanej biblioteki LCD4.LIB (szczegóły), której zadaniem jest m. in. zmniejszenie rozmiaru kodu wynikowego programu i jego optymalizacja.
Dwie rzeczy, o których musimy jeszcze pamiętać, to odpowiednie ustawienie fusebitów w ATtiny - w zależności od sposobu zasilania sterownika i użytego rezonatora kwarcowego (tutaj pomóc może dokumentacja mikrokontrolera), oraz zapewnienie skutecznej filtracji zasilania. Ten ostatni aspekt w przedstawianych dotychczas układach pomijałem, ale jest to rzecz szalenie ważna. Polecam lekturę tych dwóch ciekawych artykułów:
Układ zmontowałem "na gotowo" na płytce uniwersalnej, dostosowując projekt do możliwości zmiany wyświetlacza (wyświetlacz podłączany na "grzebień"). Zdjęcia niżej przedstawiają prawie zmontowany układ i zestaw testowy po wykonaniu próby:
Zalecam stosowanie wspólnego zasilania (mimo wszystko) - już zresztą o tym wspominałem. Zwróćmy również uwagę, że linie portu szeregowego, a w zasadzie przewody, musimy podłączyć pomiędzy odbiornikiem (nasz sterownik) a nadajnikiem (dowolny układ mikroprocesorowy) na krzyż, czyli TxD z RxD. Jeśli chcemy podłączyć moduł wyświetlacza do portu szeregowego w pececie czy innym urządzeniu komputerowym, musimy zadbać o dopasowanie napięć i logiki (układ na tranzystorach lub coś jak MAX232). Pobór prądu przez moduł nie przekraczał 20mA z podłączonym podświetlaniem wyświetlacza (przy zasilaniu z baterii 4,5V).
Po przetestowaniu płytkę z kompletnym już modułem umieściłem na deseczce z filcowymi podkładkami - całość tworzy "klocek elektroniczny" do łatwego testowania i wykorzystania z przeróżnymi układami, które od teraz będę dostosowywał do właśnie szeregowej komunikacji z wyświetlaczem.
Póki co moduł sprawuje się dobrze :)
Jeżeli uważacie, że pomysł i projekt warte są uwagi, zachęcam do montowania i zabawy (wszystko jest free - tylko części musicie nabyć sami ;-)), zadawania pytań i zgłaszania uwag.
Komentarze
Prześlij komentarz