Atmel SAM L21 Xplained Pro – Część I – HD44780

9Przy poznawaniu każdej nowej platformy są stałe punkty gry. Wiadomo na początku migamy, bawimy się przyciskami, podpinamy moduły… Drugą rzeczą którą wziąłem na tapetę, jest podłączenie wyświetlacza alfanumerycznego HD47780. Bibliotek nie było (albo po prostu źle szukałem), ale dla nauki i udowodnienia sobie, że potrafię, sam sobie je przygotowałem.

character_2x16_modules_lcd_display_hd44780_controller_black_on_yg
Artykułów na temat sterownika HD44780 jest dość sporo, jednak zdecydowałem sie przeportować działającą bibliotekę pasującą pod AVR’y na badane przeze mnie Atmel SAM L21 Xplained Pro. Zasada działania jest bardzo prosta i jeśli zrozumiemy podstawę przesyłu danych do wyświetlacza, reszta roboty to jest przepisanie tych samych komend, dopasowanie funkcji opóźniających czas itd. itd. Zdecydowałem się na najczęściej stosowany scenariusz podpięcia HD44780 – 4-bitowy przesył danych z pinem RW podłączonym na stałe do GND. Komunikacja najniższego poziomu z wyświetlaczem sprowadza do jednej, no dwóch funkcji:

static inline void lcd_sendHalf(uint8_t data){
if (data & 0x01) port_pin_set_output_level(LCD_D4, 1);
else port_pin_set_output_level(LCD_D4, 0);
if (data & 0x02) port_pin_set_output_level(LCD_D5, 1);
else port_pin_set_output_level(LCD_D5, 0);
if (data & 0x04) port_pin_set_output_level(LCD_D6, 1);
else port_pin_set_output_level(LCD_D6, 0);
if (data & 0x08) port_pin_set_output_level(LCD_D7, 1);
else port_pin_set_output_level(LCD_D7, 0);
}

void _lcd_write_byte(unsigned char _data){
data_dir_out();
port_pin_set_output_level(LCD_E, 1);
lcd_sendHalf(_data >> 4);
port_pin_set_output_level(LCD_E, 0);
port_pin_set_output_level(LCD_E, 1);
lcd_sendHalf(_data);
port_pin_set_output_level(LCD_E, 0);
delay_us(50);
}
Ramka zawierająca dane albo komendy w HD44780 ma 8 bitów. Ze względu na to, że chcemy oszczędzić na wyjściach mikrokontrolera, korzystamy z możliwości rozbicia tej ramki na dwie, 4 bitowe. Funkcja _lcd_write_byte wykonuje kolejno operacje:
  • na początku ustawia pin ENABLE – informacja dla sterownika w stylu „hej zaczynam do Ciebie nadawać”
  • wysyła do wyświetlacza pierwszą część ramki, zawierającą 4 najstarsze bit
  • zatwierdza je wyzerowaniem pinu ENABLE „hej dostarczyłem pierwszą część paczki”
  • analogicznie przesyła drugą część paczki

Dzięki dopasowaniu powyższych operacji I/O na wyświetlaczu możemy w zasadzie przeportować taką bibliotekę na każdą inną dowolną platformę mikrokontrolerową. Bułka z masłem, polecam przećwiczyć sobie taką operacje każdemu, zwłaszcza że dzięki niej możemy zrozumieć jak działa sterownik w danym wyświetlaczu (i nie tylko wyświetlaczu).

IMG_20160409_200724

Jak użyć biblioteki?
W plikach jest gotowy projekt do odpalenia, który odpalimy bezpośrednio w środowisku Atmel Studio. Jednak aby dodać je do swojego projektu, wystarczy dodać dwa pliki (hd44780.c hd44780.h) i załączyć nagłówek w pliku main. Piny, do których podpinamy wyświetlacz ustawiamy w hd44780.h. W zasadzie to tyle, celowo wyciąłem niepotrzebne dodatki, aby wszystko wyglądało w miarę przejrzyście. Można ją rozwijać, dodawać nowe znaki do LCD itd… Jednak ze swojej praktyki widzę że przeważnie bajerów się nie używa i cała komunikacja z wyświetlaczem ogranicza się do 5 funkcji:
lcd_init();
lcd_str("Tekst");
lcd_int(123);
lcd_locate(0,0);
lcd_cls();
Gotowy projekt do przetestowania: Projekt MirrorOneDrive
Same biblioteki: Biblioteki MirrorOneDrive
Wyświetlacz alfanumeryczny HD44780 był, oraz zapewne będzie podstawową poza diodą LED formą kontaktu z mikrokontrolerem, dlatego te biblioteki zapewne jeszcze nieraz mi się przydadzą 🙂
Dziękuję za uwagę,
Marcin Popko
P.S. Na koniec króciutka ankieta, z góry dzięki za wypełnienie 🙂