Przejdź do głównej zawartości

Programowanie AVR cz. 10: Modyfikacja mikroprocesorowego sterownika wyświetlacza alfanumerycznego LCD (układ HD44780 lub odpowiednik) z dostępem przez łącze szeregowe (i błędy!)

Błędy zdarzają się nawet w najprostszym kodzie, niestety. Program sterownika do wyświetlacza szeregowego, o którym pisałem jakiś czas temu, też się błędów nie ustrzegł. Przy okazji zmodyfikowałem ten program w celu poprawnej obsługi wyświetlacza 16*2. Dotychczas wykorzystywałem dwa odzyskane ze złomu wyświetlacze jednowierszowe o fizycznej organizacji 16*1, ale logicznie każdy z nich składał się z dwóch wierszy po osiem znaków - stąd konieczność wprowadzenia udziwnionego polecenia mapowanego na bascomowskiego Locate'a i stąd błędy, które się przemknęły podczas testów. Być może wzięło się to z rzadko wykorzystywanego w jednowierszowym wyświetlaczu pozycjonowania tekstu.
W każdym razie, po zmianie wyświetlacza na model o bardziej popularnym formacie prezentacji tekstu, program wymagał kilku przeróbek, dlatego też i błędy zostały wyłapane i poprawione.

Oto poprawiony i zmodyfikowany program (BASCOM):

' 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
Const Cupline = 248
Const Cdownline = 247
view raw slcddrv.bas hosted with ❤ by GitHub
' Mikroprocesorowy sterownik wyświetlacza alfanumerycznego typu 16*2
' (dwa wiersze po szesnaście znaków; 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:
' &B110xxxxy, gdzie xxxx 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 "slcddrv.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 * 2
' Buforowanie danych wejściowych - bez tego sterownik gubi znaki
Config Serialin = Buffered , Size = 32
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
Cls
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 = Cupline Then
If Linia = 1 Then
Upperline
Linia = 0
End If
Elseif Znak = Cdownline Then
If Linia = 0 Then
Lowerline
Linia = 1
End If
Elseif Znak >= 192 And Znak <= 223 Then
' Locate na podstawie przekazanych parametrów
Locate_odebrany = 1
Poz_x = Znak And &B00011110
Shift Poz_x , Right
Linia = Znak.0
Ile_znakow = Poz_x
Poz_x = Poz_x + 1
Poz_y = Znak.0 + 1
Elseif Znak > 31 And Znak < 127 Then
If Ile_znakow > 15 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
Warto przetestować ten zmodyfikowany wyświetlacz - szczególnie funkcjonalność, która dotychczas sprawiała problemy, czyli Locate. Poniżej prezentuję listing "latającej małpy" w implementacji na Arduino Leonardo (opis podłączeń w komentarzach). Warto zwrócić uwagę na prostą funkcję locate_xy, która ukrywa przed nami wyliczanie formatu odpowiedniej komendy wysyłanej do sterownika wyświetlacza (opis formatu w prezentowanym wcześniej listingu).

/*
Latająca małpa ;-)
Klasyka...
(http://wileczeknet.blogspot.com/2012/04/programowanie-mikrokontrolerow-avr-cz-1.html)
Programik do testowania modułu wyświetlacza szeregowego 16*2.
Dodatkowy sprzęt:
- moduł szeregowego wyświetlacza alfanumerycznego (http://wileczeknet.blogspot.com/2013/01/programowanie-avr-cz-7-mikroprocesorowy.html)
Podłączenie modułu:
- piny zasilania (+5V, GND) modułu do odpowiednich gniazd Arduino;
- RxD i TxD modułu do Tx1 i Rx1 (Digital1 i Digital0) Arduino.
Prędkość transmisji:
- 9600b/s
Pozostałe parametry portu UART - wartości domyślne.
*/
// Stałe używane przez mikroprocesorowy szeregowy sterownik wyświetlacza LCD
#define Clean 255
#define Cleft 254
#define Cright 253
#define Con 252
#define Coff 251
#define Cblink 250
#define Cnoblink 249
#define Cupline 248
#define Cdownline 247
// LED pin 13 (na płytce)
#define Led 13
// Locate w sposób przyjazny
// -- x przyjmuje wartości od 1 do 16
// -- y przyjmuje wartości od 1 do 2
void locate_xy(byte x = 1, byte y = 1) {
if ((x <= 16) && (y <= 2)) {
byte pos = 192 + (x - 1) * 2 + (y - 1);
Serial1.write(pos);
}
else {
Serial1.write(192);
}
}
void show_monkey(byte x, byte y, byte time) {
locate_xy(x,y);
Serial1.print("@");
delay(time);
locate_xy(x,y);
Serial1.print(" ");
}
void setup() {
// Inicjalizacja sprzętowego portu UART ATmegi
Serial1.begin(9600);
// Pin 13 jako wyjście
pinMode(Led, OUTPUT);
// Czyszczenie wyświetlacza, wyłączenie kursora i wyświetlenie nagłówka
Serial1.write(Clean);
Serial1.write(Coff);
delay(100);
locate_xy(1,1);
Serial1.print("Latajaca");
locate_xy(9,2);
Serial1.print("malpa!!!");
delay(2000);
}
void loop() {
// zapalenie LED
digitalWrite(Led, HIGH);
for (byte i = 1; i <= 16; i++) {
show_monkey(i,1,170);
}
// zgaszenie LED
digitalWrite(Led, LOW);
for (byte i = 16; i >= 1; i--) {
show_monkey(i,2,170);
}
}
view raw flying.ino hosted with ❤ by GitHub
Myślę, że nie od rzeczy będzie, gdy napiszę jakąś prostą bibliotekę (dla Arduino i BASCOM-a) do obsługi wyświetlacza, żeby nie zmuszać użytkownika do niskopoziomowych operacji na łączu szeregowym. Najpierw zadbam o Arduino :-)


(nalepka pochodzi z zestawu dostarczonego w oryginalnym pudełku razem z moim Arduino, nie została tu umieszczona w żadnym konkretnym celu oprócz ozdobnego - zresztą jest to mój prywatny elektroniczny klocek, nie na sprzedaż ;-))

---------------------

Szczegóły na temat projektu szeregowego sterownika wyświetlacza alfanumerycznego dostępne w artykule:

Programowanie AVR cz. 7: Mikroprocesorowy sterownik wyświetlacza alfanumerycznego LCD (układ HD44780 lub odpowiednik) z dostępem przez łącze szeregowe. 

Komentarze

Popularne posty z tego bloga

Niesamowicie prosty czujnik zmierzchowy.

Tym razem zero programowania, będzie natomiast nostalgiczno-wspomnieniowy układzik, lekko zmodyfikowany. Otóż kilka dni temu rozmawialiśmy w gronie znajomych o różnego rodzaju czujnikach zmierzchowych i czujnikach ruchu. Ponieważ należę do tych wariatów, co to hołdują jeszcze owej przestarzałej i kompletnie odrealnionej dziś zasadzie: "po co kupować, gdy można zrobić", stwierdziłem, że poskładam takie coś (czujnik zmierzchowy; sensor ruchu faktycznie lepiej nabyć, choćby ze względu na rozmiary ;)) i być może podłączę do jakiegoś mikrokontrolera. Przypomniało mi się też przy okazji, że znalazłem ostatnio w elektronicznych śmieciach stary fotorezystor (dla niewtajemniczonych: element zmieniający rezystancję, czyli opór elektryczny, pod wpływem działania strumienia światła) RPP130, jeden z kilku pozostałych po montowanych wieki temu układach tranzystorowych do zdalnego sterowania pracą urządzeń za pomocą latarki... No OK, nie było to specjalnie rozbudowane zdalne sterowanie ;) ...

Aktualizacja oprogramowania układowego w ESP-01 do najnowszej wersji NodeMCU

Oprogramowanie i projekt NodeMCU cieszą się niesłabnącym zainteresowaniem świata konstruktorów urządzeń IoT, zatem co jakiś czas warto odświeżyć sobie firmware w naszych płytkach ESP. Osobiście jestem przeciwnikiem zmienienia czegoś, co dobrze działa, tylko dla zasady czy z chęci cieszenia się świadomością posiadania najnowszej wersji, ale tym razem chodzi jednak o coś innego – zwiększenie funkcjonalności i zapewnienie poprawnego działania oraz kompatybilności z najnowszymi projektami i bibliotekami. W tytule tego artykułu jest mowa o najprostszych płytkach z układem ESP8266 – ESP-01 . To właśnie w oparciu o ten model opracowałem płytkę prototypową, o której pisałem w poprzednim rozdziale. Dotychczas wszystkie moje płytki ESP miały na pokładzie oprogramowanie NodeMCU w wersji 0.9.5 . Zorientowani choć trochę w temacie od razu zauważą (Google? Bing?), że wersja ta ma już co najmniej dwa lata... Najwyższy czas zatem na aktualizację.

Płytka prototypowa na bazie ESP8266 (ESP-01)

To nie jest kolejny artykuł traktujący od początku do... nieco dalej (bo na pewno nie do końca) o płytkach ESP8266 . Żeby się dowiedzieć, co to takiego, odwiedźcie proszę np. tę stronę (oraz wiele innych – poproście o pomoc Waszą ulubioną wyszukiwarkę): http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family . No ale żeby nie było, ESP8266 to układ zawierający na pokładzie wydajny mikrokontroler z rdzeniem RISC-owym, taktowany zegarem 40MHz (wersja, o której jest ten wpis) lub 80MHz, 512KB pamięci flash i podsystem komunikacji przez sieć WiFi . Jest powszechnie wykorzystywany jako swego rodzaju karta sieciowa do połączeń bezprzewodowych naszych urządzeń IoT , które budujemy w zaciszu domowych laboratoriów (i nie tylko). Układ montowany jest na płytkach występujących w kilku wersjach, różniących się przede wszystkim liczbą wyprowadzeń uniwersalnych, czyli GPIO – im większa liczba, tym większe możliwości wykorzystania układu (więcej urządzeń peryferyjnych itp.). Są też pewne ...