
Witam
Tym razem chciałbym zaprezentować programowy projekt zegarka i datownika uruchomionego na sprzęcie: STM32F4Discovery oraz LCD TFT DEM240320E TMH-PW-N(A-Touch) na sterowniku Renesas R61580 (kupiony swego czasu w TME. Obecnie nie mają na stanie, można próbować kupić go tutaj:http://www.soselectronic.pl/?str=371&artnum=104638&name=display-elektronik-dem240320etmh-pw-ntp). Prezentowany projekt będzie częścią bardziej złożonego projektu realizowanego na mikrokontrolerze STM32F407VG, dlatego teraz nie budowałem dedykowanego do tego sprzętu, tylko wykorzystałem gotowa płytkę Discovery i dołączony do niej "na pająka" wyświetlacz LCD.
Program do swojego działania wykorzystuje RTC zawarty w tym mikrokontrolerze. RTC taktowany jest zewnętrznym kwarcem zegarkowym 32768Hz. Skanowanie panelu dotykowego odbywa się poprzez odczytywanie wartości z trzech kanałów przetwornika ADC, do których dołączony jest panel dotykowy. Komunikacja z wyświetlaczem odbywa się poprzez interfejs SPI (dla jednej wersji programu) lub 8-bit interfejs równoległy zrealizowany przy pomocy FSMC (dla drugiej wersji programu). Program tworzyłem najpierw dla interfejsu SPI, po czym przerobiłem go na interfejs równoległy, gdy okazało się, że odświeżanie zawartości ekranu przy przełączaniu widoków jest trochę za wolne.
Program po uruchomieniu wyświetla na wyświetlaczu główny ekran, na którym jest bieżący czas w formacie 24-godzinnym (na niebieskim pasku) i data (na zielonym pasku), przy czym w przypadku niezaprogramowanego wcześniej RTC, liczenie czasu zacznie się od godziny 0:00:00, a data będzie: "Poniedziałek, 1 stycznia 2000r" lub w angielskiej wersji "Monday, 1 January 2000". Poniżej wyświetlanego czasu i daty są ekranowe przyciski służące do ustawiania czasu, daty i zmiany wyświetlanego języka polski <-> angielski. Po naciśnięciu przycisku ustawiania czasu pojawia się niebieskie okno z komunikatem, co trzeba zrobić, poniżej niego pojawia się białe okno edycyjne z kursorem, w którym jest wyświetlany edytowany czas, a poniżej tych dwóch okien pojawia się klawiatura numeryczna. Po wprowadzeniu czasu zatwierdza się zmiany przyciskiem Enter na klawiaturze numerycznej i program powraca do wyświetlania głównego ekranu. Próba wprowadzenia nieprawidłowego czasu podczas edycji (godziny większej od 23, minut i sekund większych od 59) jest ignorowana. Przyciskiem Backspace można przesunąć kursor na już wyedytowane elementy, przez co można je ponownie edytować.
Podobnie jest po naciśnięciu przycisku ustawiania daty, z tą różnicą, że pod klawiaturą numeryczną pojawia się dodatkowo pomoc w wybranym języku, podpowiadająca, jakie wartości należy wprowadzać przy edytowaniu elementów daty. Nieco inaczej natomiast zrobiłem obsługę błędnego wprowadzenia elementów daty (np. próba ustawienia 30 lutego, czy temu podobne). Wtedy po naciśnięciu Enter, okno komunikatu zmienia kolor na czerwony, pojawia się w nim tekst informujący o błędzie w dacie i w konsekwencji porzuceniu bez zapisywania wprowadzonych danych. Ekran ten jest wyświetlany przez 2sek, po czym program powraca do wyświetlania głównego ekranu bez zapisywania źle ustawionej daty. Przyczyną takiego podejścia do problemu możliwości wprowadzenia błędnej daty był fakt, iż w momencie ustawiania dnia miesiąca w przypadku nieprogramowanego wcześniej RTC, domyślnym miesiącem jest styczeń 2000 (a więc przestępnego) roku.
Każdorazowe naciskanie przycisku zmiany języka powoduje zmianę języka w wyświetlanym głównym ekranie, jak również powoduje zmianę języka wyświetlanych ekranów ustawiania czasu i daty.
Wszystkie funkcje graficzne: czyszczenie ekranu, zapalenie piksela, rysowanie okien i przycisków i wypełnianie ich wnętrz, klawiatury, pisanie tekstów napisałem sam, toteż można je dowolnie modyfikować i przerabiać, jak również kopiować. Teksty pisane są czcionką Times New Roman 16 i 18. Bitmapy tej czcionki (również polskich znaków) uzyskałem przy pomocy programu The Dot Factory v.0.1.4. Program napisałem w środowisku Rowley Crossworks 2.0.11.
Na płytce Discovery trzeba było dodatkowo:
1. wlutować kwarc zegarkowy 32768Hz w miejscu X3
2. wlutować kondensatory ceramiczne 6,8pF w miejscach C16 i C27
3. i koniecznie wlutować rezystor 10MΩ między wyprowadzenia kwarcu. Bez tego rezystora generator LSE nie wstawał. Ja wlutowałem ten rezystor między goldpiny PC14 i PC15 (na płytce brak dla niego miejsca).
Ponadto dorobiłem podtrzymanie pracy RTC przy wyłączonym zasilaniu. W tym celu należy:
1. wylutować zworkę (rezystor zerowy) R26 i w jego miejsce wlutować jakąkolwiek diodę SMD katodą w stronę wyprowadzenia VBAT mikrokontrolera (pin 6)
2. wlutować kondensator GoldCap, plusem do wlutowanej w punkcie 1. katody diody, minusem do masy. Ja dałem kondensator 0,22F 5,5V. Kondensator ten ładował mi się do napięcia ok. 2,4V, po ponad dobowej przerwie w pracy, napięcie na nim spadło do ok.2,1V.
Przy programowaniu korzystałem z bibliotek SPL STMicroelectronics, jedynie przy konfigurowaniu portów i zegarów ustawiałem bezpośrednio rejestry. Jednakże natrafiłem już na błąd w tej bibliotece: w funkcji FSMC_NORSRAMInit z pliku stm32f4xx_fsmc.c składnik FSMC_AccessMode struktury konfiguracyjnej nie był przesuwany w lewo o 28 bitów, a musi być, by prawidłowo ustawić pole ACCMOD w rejestrze FSMC_BTR. Jak na razie poza tym błędem nie trafiłem na jakieś inne.
Do napisania procedury obsługi panelu dotykowego wykorzystałem algorytm przedstawiony w artykule "Obsługa rezystancyjnych paneli dotykowych w systemach mikroprocesorowych" z EP 10/2009.
Jedno ze zdjęć przedstawia sposób dołączenia wyświetlacza do pozostałej części elektroniki przy wykorzystaniu płytki uniwersalnej UMSMD516 (również z TME). Wyświetlacz przyklejony jest do płytki za pomocą lepkiej gumki silikonowej. Złącze FFC jest, co prawda, za długie do szerokości taśmy połączeniowej LCD, niemniej jednak do prototypu dało się zastosować.
Pozdrawiam, KT


Cool? Ranking DIY