sobota, 31 grudnia 2011

LCD cz.2 - Nokia 3310 LPC1768 i AVR

Przyszedł czas na opisanie moich dokonań z lcd od nokii 3310. Biblioteka dla AVR na której się wzorowałem umożliwia obsługę programowego jak i sprzętowego SPI. Na stronie autor również umieścił program MicroLCD, który umożliwia tworzenie własnych bitmap do wyświetlenia. Na bazie tej biblioteki można w łatwy sposób przepisać ją na inne platformy.

Moja biblioteka jest przeznaczona dla LPC1768, ale również można ją przekształcić, ta jak wspomnianą wyżej na każdą inną architekturę.Znalazł się w niej plik 3310cfg.h, który służy do konfiguracji całej biblioteki. Wybiera się między innymi czy ma być sprzętowe, czy programowe SPI, oraz które funkcje są nam potrzebne.

LCD 3310 korzysta z interfejsu SPI. W przypadku sprzętowego, wystarczą tak naprawdę dwie linie MOSI oraz SCK, pozostałymi najlepiej sterować programowo. Przy inicjalizacji portów, należy włączyć bezwzględnie wszystkie jako wyjście, nawet też od SPI.

W pliku main.c znajduje się przykład jak należy korzystać z biblioteki.
WriteImage
Funkcja służy do wyświetlania grafik z programu MicroLCD.
WriteBmp
Wyświetla xbm z programu Gimp.
DispLcd(const char *napis, char x, char y)
Funkcja wyświetla string w podanej lokalizacji. Czcionka jest ustawiona na rozmiar 5x7 pikseli, znajduje się ona w tablicy rom_gen. A x i y symbolizują współrzędne znaku w postaci komórki o rozmiarach 5x7 piksela, coś na zasadzie LCD 2x16. Znaki są kodowane zgodnie z kodem ASCII.
WriteChar
Natomiast wyświetla dowolny znak.

Cała biblioteka składa się z 3310.c, 3310.h, 3310cfg.h, cg_rom.h, graph.c, graph.h, main.c, main.h.


AVE

sobota, 24 grudnia 2011

LCD cz. 1 - Wstęp

Przez pewien czas będzie się pojawiał na blogu cykl wpisów na temat wyświetlaczy, w głównym stopniu o graficznych.

W poszukiwaniu informacji na ten temat wypożyczyłem książki "Wyświetlacze graficzne i alfanumeryczne w systemach mikroprocesorowych" oraz "Graficzne wyświetlacze LCD w przykładach". Niestety nie znalazłem tam tylko garść przydatnych informacji. Autorzy robią przegląd powszechnie stosowanych wyświetlaczy graficznych oraz ich komendy, co jest plusem.

Wszystkie wyświetlacze posiadają protokół komunikacji zgodny z SPI. Jednak wszyscy autorzy nie widzieć czemu piszą programy z programową obsługą SPI, skoro mikrokontrolery posiadają przynajmniej zaimplementowany przynajmniej jeden taki protokół.

Kolejne wpisy na temat wyświetlaczy graficznych będą dotyczyły LCD od telefonów NK 3310 i 3510i, gdyż posiadam kilka sztuk do zabawy, oraz matrycy LCD ITM-400160, posiadam cztery sztuki i trzeba kiedyś je odpalić. Postaram się przedstawić porównanie programu ze sprzętową obsługą SPI oraz programową.

Przed zabawą z wyświetlaczami warto zajrzeć na stronę, gdzie są zamieszczone tzw pinout do dużej ilości LCD od telefonów komórkowych. Polecam również muliplatformową bibliotekę libd, obsługuje ona sporą ilość wyświetlaczy i stworzona jest dla AVR oraz ARM, oraz przykładami do książki.


AVE

środa, 21 grudnia 2011

LCD 2x16 i LPC1768

Próbowałem przeportować swoją wspaniałą bibliotekę z AVRów na LPC1768, jednak mi się to nie udało. Napisałem własną od podstaw, posiada ona jednak pewne braki w porównaniu do tej z AVrów. Sterowanie LCD jest za pomocą na sztywno ustawionych czasów a nie przez odpytywanie wyświetlacza jak to miało miejsce. Jednak jak się zbiorę w sobie to poprawię ten błąd. Biblioteka składa się z dwóch plików lcd2x16.c oraz lcd2x16.h. Jedynie funkcja delay znajduje się w pliku głównym programu i w zasadzie też wymaga poprawy. Odmierza czas w ms a oparta jest o timer SysTick. Jej definicja wygląda tak:
void delay(uint32_t interval)
{
 uint32_t start = SysTickCnt;
 while (SysTickCnt - start < interval)
  ;
}
Ustawienie timera wygląda tak:
SysTick_Config(SystemCoreClock / 1000);
Natomiast przerwanie do SysTick:
void SysTick_Handler(void)
{
 SysTickCnt++;
}
LCD jest podpięty do LPC1768 w następujący sposób:
P1.24 - D4
P1.25 - D5
P1.26 - D6
P1.27 - D7
P1.28 - RS
P1.29 - RW
P1.31 - EN

Na chwilę obecną biblioteka posiada następujące funkcje:
 void LcdPinValue(uint32_t pin, uint8_t value)
Przy użyciu tej funkcji ustawia się wybraną wartość na konkretny jeden pin wyświetlacza a następnie wartość ta jest zabezpieczana za pomocą maski, więc nie można zmienić wartości tego pinu bez zdjęcia maski. Powstała ona z myślą o ustawianiu wartości dla pinów RS, RW oraz EN.
 void LcdWriteCmd(uint8_t command)
Fynkcja odpowiadająca za wysyłanie komend na wyświetlacz, dodatkowo w bibliotece znajdują się makra z dostępnymi komendami dla wyświetlacza.
 void LcdInit(void)
Standardowa funkcja inicjująca wyświetlacz. Na jej końcu znajdują się funkcje wysyłające komendy takie jak wyłączenie kursora, przesuwanie tekstu itp.
 void LcdPrint(const char *s)
Funkcja odpowiadająca za wyświetlenie stringu na LCD.
 void LcdPrintChar(char ch)
Ta wyświetla tylko pojedynczy znak.
 void LcdGoToXY(uint8_t x, uint8_t y)
Funkcja która przesuwa kursor do dowolnego miejsca na wyświetlaczu. Wiersz pierwszy to y=0;
 void LcdPrintXY(uint8_t x, uint8_t y, char *s)
Funkcja wyświetla string w wybranych współrzędnych. Zasady obowiązują tak jak wyżej.

Gdyby ktoś miał problem ze znalezieniem poprawnych plików startowych to je zamieszczam: LPC17xx.ld, Makefile, startup_LPC17xx.c, startup_LPC17xx.d.

Na koniec załączam jeszcze bibliotekę dla AVRów lcd2x16.clcd2x16.h.

poniedziałek, 19 grudnia 2011

Versaloon i Debian amd64

Z racji zamiłowania do elektroniki i programowania mikrokontrolerów udało mi się znaleźć w sieci dość ciekawy projekt. Nazywa się on Versaloon, jest on całkowicie open-source. Jest to dosłownie kombajn, a wygląda on tak


Niestety w czasie próby uruchomienia go pojawiło się mnóstwo problemów. Dostępne w repozytorium OpenOCD nie wspiera aktualnego firmware tego programatora. Na swojej stronie autor zamieszcza patch, jednak nie udało mi się go poprawnie odpalić na moim sidzie.

Po długich poszukiwaniach znalazłem działający patch. Nie obyło się bez problemów ale poradziłem sobie z tym. Oto sposób rozwiązania.

Pobrane archiwum należy rozpakować w nowym folderze. Następnie w konsoli przejść do tego katalogu i wydać polecenie
 chmod +x openocd_update 
Następnie instalujemy brakujące pakiety:
 apt-get install automake autoconf libtool libusb libusb-dev jimsh 
Po tej operacji odpalamy skrypt
 ./openocd_update 
Prawdopodobnie odpalanie skryptu nie przeszło pomyślnie, ale nic straconego, wpisujemy w konsoli kolejno
 cd openocd
 ./bootstrap
 ./configure --enable-vsllink --enable-maintainer-mode 
 make
Jeżeli posiadasz ubuntu może się okazać konieczne dodanie repozytorium debiana. Robi się to przez dopisanie do pliku /etc/apt/sources.list lini
 deb http://ftp.de.debian.org/debian/ testing main contrib non-free 
Teraz pozostało tylko zaktualizować repozytorium.
Po skompilowaniu openocd należy zawartość katalogu tcl skopiować do katalogu src. Dodatkowo aby mieć możliwość uruchomienia versaloona w trybie SWD bądź JTAG warto zapisać skrypt vsllink_swd.cfg oraz vsllink_jtag.cfg w katalogu src/interface.
W przypadku próby uruchomienia na windowsie warto zapoznać się z tematem na elektrodzie. Autor zamieścił wersję skompilowaną na system windows, jednak posiada ona tylko pliki konfiguracyjne dla stm32 i versaloona.


AVE

Eclipse OpenOCD i toolchain ARM

Długo męczyłem się z odpaleniem toolchaina dla ARM'ów na linuksie. Jednak się udało!! Chciałbym się podzielić moimi spostrzeżeniami.

Konfigurując własnego Eclipse korzystałem z tutoriala ze strony Freddiego Chopina. Autor dobrze rozpisał sposób konfiguracji całego środowiska, jednak pozostało małe ale, taki brak pewnych informacji. Na stronie czwartej tutorialu jest opisane konfigurowanie projektu na systemie windows. Warto dodać że w przypadku Linuksa w to miejsce należy wpisać make. A powinno wyglądać to tak:


Kolejną rzeczą z którą walczyłem była to konfiguracja debugowania. Na stronie niestety nie było żadnego obrazka do tego, więc poniżej znajduje się taki, który pokazuje poprawną konfigurację.


Warto nadmienić też co robią te polecenia, otóż resetują i zatrzymują rdzeń procesora. W najnowszej wersji OpenOCD nie trzeba już korzystać z polecenia load tylko z obu opcji Load tak jak to przedstawia screen. Warto nadmienić iż jest to konfiguracja do mikrokontrolera LPC1768.


AVE

niedziela, 18 grudnia 2011

Krótki wstęp

Postanowiłem stworzyć bloga aby dodawać do niego wpisy i traktować go jako coś w ramach notatnika. Znajdować się na nim będą głównie opisy techniczne fragmenty kodów.


AVE