piątek, 4 marca 2016

Moduł I2C 1602 dla wyświetlaczy LCD ze sterownikiem HD4478

Moduł o nazwie I2C LCD1602 jest alternatywą do innego opisywanego przeze mnie modułu sterowania LCD przy użyciu rejestru 74HC164. Oba obsługują wyświetlacze LCD ze sterownikiem HD4478. Natomiast zaletą LCD1602 jest ograniczenie jeszcze bardziej użytych pinów mikrokontrolera, bo do dwóch obsługujących magistralę I2C. Na plus też należy zaliczyć gotowy do użycia układ. Moduł z 74HC164 jest wprawdzie znacznie tańszy, ale z kolei wymaga własnego zrobienia płytki i montażu elementów.
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
Co do uruchomienia, na początek podszedłem lajtowo do sprawy. Korzystając z Arduino Uno i biblioteki LiquidCrystal_V1.2.1 bezproblemowo uruchomiłem układ.


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
  1. Częstotliwość taktowania ATmegi równa 16MHz
    #define F_CPU 16000000UL
  2. Częstotliwość zegara I2C równa 100kHz
    #define SCL_CLOCK 100000L
Plik lcdpcf8574.h
  1. Liczba linii wyświetlacza (w moim wypadku 4, domyślnie było 2)
    #define LCD_LINES   4
  2. 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
  3. 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
Plik pcf8574.h
  1. Zmiana adresu bazowego (domyślnie było można obsługiwać do 8 takich modułów)
    #define PCF8574_ADDRBASE (0x27)
  2. Ograniczenie maksymalnej liczby modułów do jednego
    #define PCF8574_MAXDEVICES 1
  3. Zmiana ścieżki do kodu obsługi I2C
    #define PCF8574_I2CFLEURYPATH "../i2c/i2cmaster.h"

Moduł uruchomiony z ATmegą 8
Na koniec zamieszczam link do kodu użytego do uruchomienia modułu.

1 komentarz:

  1. 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ń