Opisywany moduł LCD1602 |
Na popularnym serwisie aukcyjnym naliczyłem trzy różne warianty tego modułu. Piszę o wyglądzie, bo pod względem elektrycznym (połączeń) może być różnie. Ja posiadam wersję zaprezentowaną na zdjęciu powyżej.
Niestety nie znalazłem w sieci schematu elektrycznego. Do dyspozycji miałem jedynie garść danych z aukcji modułu i dalsze informacje znalezione w sieci. Podstawowe cechy warte odnotowania to:
- moduł oparty na ekspanderze PCF8574T
- zasilanie 5V
- sygnalizacja zasilania LED-em
- regulacja kontrastu zamieszczonym na płytce potencjometrem montażowym
- wpółpraca z wyświetlaczami LED opartymi o sterownik HD44780
- zworki A[2..0] umożliwiające zmianę adresu urządzenia (przez ich zwarcie). Domyślnie zworki są rozwarte, a piny adresowe podciągnięte rezystorami 10k do napięcia zasilania (stan wysoki), co oznacza (zgodnie z dokumentacją) adres 0x27 modułu na magistrali I2C. Potwierdziły to skanery opisane w poście Ustalanie adresów modułów I2C (TWI), gdzie sprawdziłem adres modułu na cztery różne sposoby :)
- zamontowane rezystory 4,7k podciągające linie magistrali I2C
- sterowanie podświetleniem wyświetlacza LCD. Jest też zworka umożliwiająca wyłączenie podświetlania wyświetlacza LCD
Moduł uruchomiony z Arduino |
Z kolei z moim modułem i ATmegą 8 nie było tak wesoło. Sprawdziłem kilka różnych skryptów z sieci, ale z żadnym wyświetlacz nie chciał działać. Trochę światła na problem rzucił podpięty analizator stanów logicznych (tani klon analizatorów Saleae). Okazało się, że po wysłaniu adresu linia zegara przyjmowała stan niski i trwała tak na dobre. Problem był z bajtem w którym wysyłałem adres bez bitu zapisu. Oświeciła mnie pobieżna lektura solidnej biblioteki do I2C, której autorem jest Peter Fleury (opis biblioteki + kod).
Do samej obsługi wyświetlacza LCD skorzystałem z rozwiązania pana o nazwisku Davide Gironi. Na jednej ze stron jego bloga zatytułowanej "An AVR Atmega library for HD44780 based lcd connected through i2c" można znaleźć układ oparty na ATmedze 8 i ekspanderze PCF8574 oraz obsługę napisaną w C. Do obsługi magistrali I2C została użyta wspomniana wcześniej biblioteka Fleury'ego.
Do uruchomienia modułu potrzebna jest zatem tylko odpowiednia konfiguracja. Zwłaszcza, że schemat elektryczny jest różny od tego z opisywanego modułu. W szczególności różnią się połączenia pinów wyjściowych ekspandera z modułem LCD. Trzeba też pamiętać o częstotliwości taktowania ATmegi równej 1MHz (w moim przypadku było to 16MHz) i jej wpływie na częstotliwość taktowania magistrali I2C (szyny SCL).
Dokładnie rzecz biorąc, z kodu dołączonego do wspomnianego artykułu wziąłem na swoje potrzeby jedynie kod z katalogów lcdpcf8574 i pcf8574. Pozostałe katalogi, czyli uart i i2chw mnie nie interesowały, bo pierwszy z wymienionych mi nie był potrzebny. Drugi natomiast (obsługa I2C Fleury'ego) pobrałem sobie już wcześniej.
Konfiguracja opisywanego modułu podłączonego do ATmegi z zegarem 16MHz i sterującego wyświetlaczem czteroliniowym sprowadzała się do modyfikacji stałych z wymienionych poniżej plików.
Plik twimaster.c
- Częstotliwość taktowania ATmegi równa 16MHz
#define F_CPU 16000000UL - Częstotliwość zegara I2C równa 100kHz
#define SCL_CLOCK 100000L
- Liczba linii wyświetlacza (w moim wypadku 4, domyślnie było 2)
#define LCD_LINES 4 - Adresy pierwszego znaku dla 3 i 4-tej linii (okazały się inne niż domyślne - odpowiednio 0x14 i 0x54)
#define LCD_START_LINE3 0x10
#define LCD_START_LINE4 0x50 - Konfiguracja pinów ekspandera (zupełnie inna niż domyślna)
#define LCD_DATA0_PIN 4
#define LCD_DATA1_PIN 5
#define LCD_DATA2_PIN 6
#define LCD_DATA3_PIN 7
#define LCD_RS_PIN 0
#define LCD_RW_PIN 1
#define LCD_E_PIN 2
#define LCD_LED_PIN 3
- Zmiana adresu bazowego (domyślnie było można obsługiwać do 8 takich modułów)
#define PCF8574_ADDRBASE (0x27) - Ograniczenie maksymalnej liczby modułów do jednego
#define PCF8574_MAXDEVICES 1 - Zmiana ścieżki do kodu obsługi I2C
#define PCF8574_I2CFLEURYPATH "../i2c/i2cmaster.h"
Moduł uruchomiony z ATmegą 8 |
Dwa dni intensywnych poszukiwań jak odpalić obsługę wyświetlacza LCD 20x4 z wykorzystaniem gotowego modułu I2C. Twój opis (doświadczenie) kilka chwil i odpaliło wszystko u mnie bez problemów! Zero błędów kompilacji, wszystko jak trzeba. Świetny wpis :)
OdpowiedzUsuń