www.eprace.edu.pl » system-wrzutnikowy » Opis budowy i oprogramowania urządzenia » HD44870 - wyświetlanie buforowane, menu urządzenia

HD44870 - wyświetlanie buforowane, menu urządzenia

Zastosowany w projekcie wyświetlacz alfanumeryczny 2x16 znaków z podświetleniem pracuje w standardowej konfiguracji:

- tryb 4-ro bitowy,

- sygnały RS i E podłączone do mikrokontrolera,

- sygnał RW podłączony do masy.

Ze względu na zaoszczędzenie jednego pinu procesora oraz garści pamięci programu pin RW na stałe podłączony jest do masy. Niestety wymusza to wprowadzenie w plikach nagłówkowych zmiennej SZYBKOŚĆ umożliwiającej dobranie prędkości wysyłania danych do wyświetlacza pod konkretny egzemplarz. Takie podejście do obsługi wyświetlacza skutkuje tym, że funkcja zapisująca do niego dane nie jest tak naprawdę funkcją nie blokującą. Użycie pinu RW pozwoliłoby na rezygnację z wymuszonych opóźnień i zapis do LCD z maksymalną możliwą dla danego egzemplarza szybkością. Takie, a nie inne, podejście do obsługi wyświetlacza podyktowane było brakiem dostępnych pinów IO w mikrokontrolerze. Nie jest ono optymalne z punktu widzenia programowania "pseudowielowątkowego", gdyż przy zapisie danych do wyświetlacza tworzone jest "wąskie gardło" w działaniu programu. Stąd użycie pinu RW wydaje się być jedynym najrozsądniejszym rozwiązaniem. Mimo wszystko przeprowadzone testy dowiodły, że program (przy założeniu rozdzielczości "zegara" taktującego timery programowe na poziome 10ms) działa w pełni poprawnie i płynnie. To właśnie użycie timerów programowych oraz techniki buforowania danych pozwoliło na całkowitą rezygnację z użycia pinu RW.

Podczas tworzenia interfejsu użytkownika nieodzownym stało się opracowanie sposobu wyświetlania danych, animacji, komunikatów informacyjnych i alarmowych bez widocznego migotania ekranu. Działanie tego mechanizmu opiera się na zapisywaniu danych do wyświetlenia w tablicy umieszczonej w pamięci RAM mikrokontrolera, zamiast bezpośrednio do wyświetlacza. Operacje na pamięci takie jak np. czyszczenie zawartości tablicy, podmiana jej zawartości czy przesuwanie są nieporównywalnie szybsze od takich samych operacji wykonywanych na wyświetlaczu (pin RW zwarty do masy). Co zadany interwał czasu (timer programowy T_LcdRefresh) następuje przepisanie bufora do wyświetlacza a następnie jego wyczyszczenie. Niejako przy okazji, opracowany sposób pozwolił na wykluczenie potrzeby nadpisywania nieużywanych na wyświetlaczu miejsc spacjami. Pozwoliło to na całkowitą eliminację "duszków", przekłamań powstających czasami na wyświetlaczach w wyniku zakłóceń takich jak przepięcia w sieci zasilającej, wyładowania atmosferyczne itp. Teksty wyświetlane w ten sposób są bardzo czytelne, gdy patrzy się na wyświetlacz pod dowolnym kątem nie widać na nim żadnego migotania.

Niezwykle ważnym punktem w oprogramowaniu urządzenia jest menu użytkownika umożliwiające zmianę parametrów pracy sterownika i dostosowanie go do aktualnych potrzeb. Przemyślana konstrukcja menu, w której rozdzielone zostały części prezentacyjne (dynamiczne wyświetlanie tekstów o zmiennej długości) od części interakcyjnych (reakcja na naciskanie poszczególnych klawiszy) w połączeniu z wykorzystaniem zmiennych typu wyliczeniowego, pozwoliły na stosunkowo łatwe dodawanie nowych pozycji menu. Dzięki zastosowaniu zmiennych typu wyliczeniowego enum nie ma także najmniejszego problemu ze zmianą kolejności pozycji. Jedynym ograniczeniem obecnej konstrukcji jest problematyczne zbudowanie menu wielopoziomowego. Teoretycznie z wykorzystaniem opracowanego sposobu da się to osiągnąć. Jednak nie będzie to już rozwiązanie tak wydajne, skalowalne i przejrzyste jak to, o którym autor wspomni za chwilę.

Rozpoczynając prace nad projektem autor stworzył menu jednopoziomowe posiadające 14 pozycji. Jednak w trakcie rozbudowy oprogramowania menu rozrosło się aż do 24 pozyji. Nie stanowiło to dla autora problemu, co więcej: dla użytkownika końcowego było łatwiejsze do opanowania. Jednak autorowi - jako programiście nasunęło to myśl o zastosowaniu innych technik tworzenia menu niż wykorzystana. Przede wszystkim poruszanie się po tak długim menu przy użyciu zaledwie 3 klawiszy (bez klawisza cofnięcia do poprzedniej pozycji), okazuje się niezbyt wygodne. Ponadto taka budowa menu powoduje, że w pewnym momencie przestaje ono być podatne na łatwe modyfikacje (nawet pomimo zastosowania zmiennych enum). Rozwiązaniem jest zastosowanie tablicy dwuwymiarowej, w której każdy wiersz przechowuje tablicę opisującą kolejne stany automatu sekwencyjnego oraz możliwe działania wykonywane podczas przebywaniu w konkretnej pozycji. Tak skonstruowane menu pozwala na stworzenie niemal dowolnej ilości poziomów. Ponadto nastawy poszczególnych parametrów pogrupowane tematycznie oraz brak potrzeby przechodzenia przez całe menu po przypadkowym "przeskoczeniu" edytowanej pozycji stwarzają menu bardziej przyjaznym i intuicyjnym dla użytkownika. Niestety z braku miejsca w pamięci FLASH zastosowanego mikrokontrolera, autor zmuszony był porzucić pomysł wdrożenia tego sposobu. Jednak z sukcesami użył go w kolejnych projektach bazujących na zapleczu sprzętowym modułu "SPA - 1n" o których wspomni w podsumowaniu swojej pracy.

Rys. 15 - Algorytm działania menu użytkownika

Oprogramowanie od początku projektowane było z myślą o zabezpieczeniu go na wypadek błędu użytkownika. Stąd jednym z ciekawszych pomysłów wprowadzonych w życie (poza sprawdzaniem integralności pamięci ustawień) było rozdzielenie zmiennych tzw. procesowych (zmiennych globalnych odpowiadających za pracę poszczególnych bloków programowych) od zmiennych używanych podczas zmiany parametrów. Dzięki temu osiągnięta została możliwość edycji parametrów bez obawy o wprowadzenie błędnych nastaw - po zmianie jakiegokolwiek parametru użytkownik musi jawnie wyrazić chęć wprowadzenia nowej wartości do pamięci nieulotnej mikrokontrolera. W przeciwnym razie, po wyjściu z menu urządzenie nadal pracować będzie w oparciu o wcześniejsze ustawienia.

Interakcja z klientem w wielu językach

Podczas tworzenia urządzenia, które ma zostać zainstalowane w ogólnodostępnym miejscu, konieczna stała się realizacja zaawansowanej interakcji z użytkownikami końcowymi - wczasowiczami. O ile obsługa obiektu posiada zarówno instrukcję obsługi urządzenia, jak i przeszkolenie z jego użytkowania - o tyle osoby zażywające kąpieli, turyści takiej wiedzy nie mają. Potrzebne było rozwiązanie, które umożliwiałoby jak największy komfort obsługi przy zachowaniu maksymalnej prostoty. Stąd zrodził się pomysł, aby komunikaty na panelu klienckim wyświetlane były w kilku językach. Przyjęto, że będzie to język polski, angielski, niemiecki i francuski, przy czym administrator systemu ma możliwość zdefiniowania, ile języków będzie wyświetlanych na panelu. Podobnie jak przy budowie menu, do realizacji tej koncepcji autor użył tablic wielowymiarowych przechowujących komunikaty do wyświetlenia:

Listing 2 - Fragment kodu wyświetlania wielu języków

const uint8_t MN09a2[] PROGMEM=" WEZWIJ SERWIS! ";

const uint8_t MN09b2[] PROGMEM="CALL AN SERVICE!";

const uint8_t MN09c2[] PROGMEM="HILFE AUFRUFEN!";

const uint8_t MN09d2[] PROGMEM="unAppelDeService";

const uint8_t *bladWewnetrzny2[4] =

{

MN09a2, MN09b2, MN09c2, MN09d2

};

//**************************************************

const uint8_t MN10a[] PROGMEM=" WCISNIJ START ";

const uint8_t MN10b[] PROGMEM="PUSH START BUTT.";

const uint8_t MN10c[] PROGMEM=" PRESSE START ";

const uint8_t MN10d[] PROGMEM="AppuyezSurStart!";

const uint8_t *wcisnijStart[4] =

{

MN10a, MN10b, MN10c, MN10d

};



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.