Pokazywanie postów oznaczonych etykietą mikrokontrolery. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą mikrokontrolery. Pokaż wszystkie posty

poniedziałek, 19 sierpnia 2013

Budujemy OpenOCD dla Versaloon'a

Na co dzień jestem użytkownikiem debiana, gdyż do pracy bardziej wolę używać linuxa, uważam iż jest ona przyjemniejsza niż na windowsie. Niestety na debianie jest nieco ciężko z niszowymi programami, do których zaliczam OpenOCD. Na chwile obecną w testingu jest wersja 0.5.0-1, a od niedawna w dystrybucji unstable pojawiła się w miarę nowsza wersja a mianowicie 0.7.0-2. Jednak w porównaniu do rozwoju tego programu jest to znacznie opóźnione. Z tego powodu pojawił się pomysł aby samemu skompilować sobie OpenOCD.

Mimo iż jestem zaawansowanym użytkownikiem linuksa wiele problemów sprawiło mi poprawne skompilowanie tego problemu ze źródeł. Pierwszy problem był taki, że wraz z każdą zmianą wersji OpenOCD zmieniał się sposób w jaki należało na versaloon odpalić SWD, nigdy nie wiedziałem gdzie znaleźć taką informację. Dlatego też dużo szperałem i szukałem, udało się mi to osiągnąć, owocem tego było również odpalenie SWD na st-linkV2 i programowanie przy jego pomocy innych mikrokontrolerów.

W pierwszej kolejności należy pobrać źródła i rozpakować je.

Kolejnym krokiem jest obranie patcha do OpenOCD aby nie było problemów z jego konfiguracją. Znajduje się on na blogu Nemui Trinomius a pobrać go można z tego linku. zapisujemy i rozpakowywujemy archiwum. Nas najbardziej interesuje patch openocd_20130701_nemui.patch i kopiujemy go do katalogu w którym rozpakowaliśmy źródła OpenOCD.

Następie patchujemy źródła poprzez wpisanie w konsoli
patch -p1 < openocd_20130701_nemui.patch

Po tej czynności należy przeprowadzić konfigurację, piszemy np:
./configure --enable-maintainer-mode --disable-werror --disable-shared --enable-stlink --enable-vsllink

Oczywiście można dodać więcej programatorów, ja wybrałem te z których najczęściej korzystam.
Teraz możemy przejść do kompilacji:
make

Ważna uwaga, mimo iż mam wielordzeniowy procesor to wykorzystanie wielu wątków w procesie kompilacji nie zawsze jest wskazane, miewałem przypadki w których kompilacja nie przebiegła w pełni poprawnie i występowały błędy w programie.

Po zakończonej kompilacji można cieszyć się w pełni działającym OpenOCD :)
warto też pobrać od Nemui Trinomius różne configi

To by było na tyle.


AVE

czwartek, 29 listopada 2012

EmbSysRegView - czyli pomoc w debugowaniu pod eclipse

Ostatnio w poszukiwaniu ułatwienia w procesie debugowania programów na mikroklocki pod eclipse natknąłem się na bardzo ciekawy projekt a mianowicie EmbSysRegView. 

EmbSysRegView jest wtyczką pod eclipse przestawiającą mapę pamięci procesora w postaci bardziej przejrzystej dla zwykłego użytkownika. Jest ona bardzo prosta w obsłudze i użytkowaniu. Więcej informacji o niej można znaleźć na stronie domowej projektu bądź na sourceforge.net. 

Dane na temat rejestrów przetrzymywane są w odpowiednio przygotowanym pliku xml którego edycja jest bardzo prosta.

Obecnie pracuję nad zrobieniem pełnego opisu do tej wtyczki dla LPC1768. Obecnie nie jest jeszcze ukończony ale najnowszą wersję znajdziecie zawsze pod tym linkiem. Informację o ukończeniu opisu zamieszczę na pewno na blogu.

Już niebawem powinien pojawić się kolejny opis postępu prac z budowy stacji pogodowej ;) 


AVE.

niedziela, 24 czerwca 2012

Itm-400160 i LPC1768 - drugie starcie

I nadejszło ostatnie, już finałowe starcie z matrycą Itm-400160 i LPC1768, i w końcu się udało, na reszczcie wszystko bangla i to lepiej niż się spodziewałem, zwracam honor LPC. Ale ostrzegam przed zbytnim zaufaniu bibliotekom do obsługi Standard Peripherals od NXP zawiera ona bardzo dużo bugów. W moim przypadku procesor zawieszał się przy wchodzeniu w przerwanie i nie działał poprawnie. A na koniec parę dowodów na to iż działa ;)



Już niedługo relacja z budowy stacji pogodowej.

Mały smaczek na temat wyświetlacza.



AVE.

poniedziałek, 18 czerwca 2012

LPC1768 - DS1820, SD i FatFS

Teraz kolejna przydatna garść informacji.

Łatwa w użyciu biblioteka do obsługi popularnego DS18S20. Bazuje ona na znalezionym w sieci przykładzie, jednak została dość mocno zmodyfikowana, w zasadzie została sam szkielet i algorytmy. Została dołożona funkcja inicjująca DS wraz z jego wykryciem, oraz funkcja zwracająca odczytaną wartość w postaci bitowej. ds18b20.c i ds18b20.h.

Długo też szukałem jak odpalić odczyt SD na mikroklocku, z pomocą przyszła biblioteka FatFs, oraz niezbędne plik z konfiguracją i obsługą SD. Obsługa działa na SSP0. SD.c, SD.h, SDHal.c, SDHal.h

Kilka istotnych uwag:
- w przerwaniach RTC warto ustawiać same flagi a nie wywoływać funkcje (jak się może okazać w praktyce, warto ustawić ręcznie rejestry, a wywołanie funkcji też się uda ;))
- przy użytkowani FatFs warto zwracać uwagę na typy bo przez to lubi się wysypywać funkcja.

LPC1768 mimo iż jest nie do końca "juzerfrendli" to po dobrze przygotowanej konfiguracji śmiga jak marzenie ;)


AVE.

wtorek, 20 marca 2012

Itm-400160 i LPC1768 - raport

Po długiej walce z uruchomieniem matrycy itm-400160 na mikrokontrolerze LPC1768 odniosłem porażkę. Mimo iż procesor teoretycznie powinien wyciągać taktowanie rdzenia na poziomie 100MHz to jedyne co mi się udało uzyskać to tylko i wyłącznie "płynąca" w dół linia pikseli.

Doszedłem również do wniosków iż LPC1768 jest bardzo zabugowanym mikrokontrolerem albo w bibliotekach od NXP jest masa błędów. Jednak po własnych doświadczeniach skłaniam się do drugiej wersji, czyli błędów w bibliotekach.


AVE

wtorek, 10 stycznia 2012

LCD cz.3 - Nokia 3510i LPC1768 i AVR

I przyszedł czas na opisanie wyświetlacza do Nokii 3510i. Na wstępie warto wspomnieć że jest on obsługiwane przez SPI przy czym ramka danych jest 9-bitowa, więc niestety wykorzystując do tego celu mikrokontrolery 8-bitowe należy obsługiwać go programowo. W porównaniu do lcd od 3310, jest on podpięty do układu sterującego tylko za pomocą czterech linii: RES, CS, DATA i CLK, więc odpadła linia D/C od wyboru Danych/Komendy. Funkcja ta jest realizowana natomiast jest za pomocą pierwszego bitu wysyłanej ramki w taki sam sposób jak dotychczas. Czyli 0 oznacza komendę a 1 dane.

Tworząc bibliotekę do tego lcd stworzyłem dokumentację w doxygen, pdf oraz html. Zachowane są wszystkie podobieństwa jak w przypadku biblioteki do 3310. Mianowicie jest plik konfiguracyjny. Dodatkowo zamieszczone i opisane zostały wszystkie dostępne komendy dla tego wyświetlacza.

Lcd jest obsługiwany przy użyciu SSP (Synchronous Serial Port), posiada on możliwość pracy jako SPI. Przy jego uruchamianiu należy pamiętać o wywołaniu funkcji
SSP_Cmd(SSPx, ENABLE)
Z biblioteki od SSP.

Otrzymane efekty są następujące:

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

ś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.c i lcd2x16.h.