Krzysztof Wesołowski » Programowanie http://kwesoly.net Programowanie, elektronika, automatyka - doświadczenia i projekty Wed, 07 Sep 2011 14:03:29 +0000 pl-PL hourly 1 Zapisywanie ustawień aplikacji – QSettings w QT http://kwesoly.net/programowanie/cpp/zapisywanie-ustawien-aplikacji-qsettings-w-qt/ http://kwesoly.net/programowanie/cpp/zapisywanie-ustawien-aplikacji-qsettings-w-qt/#comments Sun, 09 May 2010 18:13:28 +0000 http://kwesoly.net/?p=466 Kontynuując tradycję rzadkich wpisów o ciekawych rzeczach które warto poznać/wykorzystać chciałbym wam przybliżyć trochę klasę QSettings. Do tej pory większość moich aplikacji nie potrafiło sensownie obsługiwać pamiętania różnych drobiazgów między uruchomieniami. Często najważniejsze rzeczy zapisywano w jakimś "własnym" typie plików, podczas gdy cała reszta była resetowana po każdym uruchomieniu.

Klasa QSettings rozwiązywała część tych problemów - pozwalając skierować grupę ustawień do pliku/rejestru. Niestety, pierwszy wymyślony sposób ich użycia stał się bardzo szybko uciążliwy - zapisywanie setek ustawień w jednym miejscu, pilnowanie aby odczyt zgadzał się z zapisem - jak łatwo się domyślić szybko stało się to nie do opanowania.

Niedawno czytając dokumentację, i stając przed podobnym problemem znalazłem sensowniejsze podejście - wraz z dostarczonymi metodami pozwalające zminimalizować nakład pracy.

Zacznijmy od samego początku naszego programu, dostarczając parę istotnych informacji:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QApplication::setOrganizationName("RainLabs");
QApplication::setOrganizationDomain("rainlabs.pl");
QApplication::setApplicationName("Orbi Eye");
QApplication::setApplicationVersion("0.2 alpha");

AutoPhotoAdvanced b;
b.setWindowTitle(QApplication::applicationName()+" v"+QApplication::applicationVersion());
b.show();
return a.exec();

}

Po takim wywołaniu każda klasa potrzebująca skorzystać z ustawień może to zrobić niezwykle szybko i wygodnie - np. w konstruktorze/destruktorze, za pomocą:

QSettings settings;
settings.setValue(....) / settings.value(...)

dzięki takiemu podziałowi każde ustawienia są niezależne, zaś dokonane na początku ustawienia aplikacji pozwalają korzystać z domyślnego konstruktora, co ułatwia ich używanie w całym programie, nie uciekając się do kopiowania kawałka kodu tam i z powrotem lub co gorsza pamiętania jakie argumenty przekazać za każdym razem konstruktorowi.

]]>
http://kwesoly.net/programowanie/cpp/zapisywanie-ustawien-aplikacji-qsettings-w-qt/feed/ 0
Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3 http://kwesoly.net/programowanie/cpp/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/ http://kwesoly.net/programowanie/cpp/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/#comments Sat, 27 Feb 2010 01:28:49 +0000 http://kwesoly.net/?p=458 Na blogu znajomego zamieściłem wpis na temat związany z nowoczesnymi mikrokontrolerami z którymi ostatnio miałem doczynienia - zapraszam do lektury.

Link: Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3

]]>
http://kwesoly.net/programowanie/cpp/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/feed/ 0
System sprzedaży biletów na Bal Elektryka 2010 http://kwesoly.net/programowanie/web/system-sprzedazy-biletow-na-bal-elektryka-2010/ http://kwesoly.net/programowanie/web/system-sprzedazy-biletow-na-bal-elektryka-2010/#comments Tue, 02 Feb 2010 10:22:41 +0000 http://kwesoly.net/?p=451 W okresie grudnia uczyłem się trochę Symfony (akurat było to 1.4.1 i Doctrine). Wynikiem i powodem zabawy był system sprzedaży biletów na tegoroczny Bal Elektryka.

potwierdzenie_rejestracji panel_sprzedawcy strona_glowna rejestracja_goscia

Główną inspiracją był system Balsit, stworzony przez Rafała Bednarza na Bal w roku 2009. W przypływie nadmiernej chęci do pacy stwierdziłem, że można go napisać od nowa, rozbudowując niektóre możliwości/zmieniając funkcjonalność.

System składa się z front-endu do rejestracji gości - każdy chcący kupić bilet rejestrował się na komputerze, członek naszego samorządu sprawdzał poprawność wpisanych danych. Użytkownik otrzymywał unikalny numer, potrzebny zaraz przy następnym stanowisku.

Sprzedawca obsługiwał system sprzedaży - kupujący wybierał miejsce, wpłacał należność i otrzymywał wypisany bilet. Relacje tworzone były automatycznie, system ułatwiał sprzedaż biletu parom.

Całościowo  umożliwił osiągnięcie tempa powyżej 2 biletów na minutę :)

Sam system nie wykorzystywał innowacyjnych pomysłów - po prostu wykorzystywał wielkie możliwości frameworka :)

Załączam skompresowane źródła, włącznie z użytym Symfony 1.4.1: balsit 0.8.

]]>
http://kwesoly.net/programowanie/web/system-sprzedazy-biletow-na-bal-elektryka-2010/feed/ 0
OpenCV 2.0 + Windows http://kwesoly.net/programowanie/cpp/opencv-2-0-windows/ http://kwesoly.net/programowanie/cpp/opencv-2-0-windows/#comments Fri, 13 Nov 2009 19:51:34 +0000 http://kwesoly.net/?p=414 Ze względu na kolejny projekt, w który się zaangażowałem, potrzebowałem działającej, sprawnej biblioteki do przetwarzania obrazu. Wybór padł na OpenCV, zaś strona projektu zaskoczyła nas wydaniem we wrześniu tego roku wersji 2.0. Niestety, próba kompilacji okazała się być podwójnie nieudana :) Zamieszczam więc krótki opis jak zmusić OpenCV do współpracy.

Linkowanie bibliotek - ustawienia linkera

Pierwszym problemem z jakim się zetknęliśmy było linkowanie bibliotek - rzut oka do katalogu z bibliotekami utwierdził nas w przekonaniu, że tutorial, którego używamy jest przeznaczony dla OpenCV1.0 lub 1.1. Tak czy inaczej w ustawieniach linkera należy dodać uzupełnione w stosunku do poprzedniej wersji wywołania:

-lopencv200 -lcxcore200 -lcvaux200 -lml200 -lcxts200 -lhighgui200

Zaś jako ścieżkę bibliotek (-L) domyślnie:  C:\OpenCV2.0\lib

Taka modyfikacja wywołania pozwoli linkować nasze programy. Ważniejsze jest jednak rozwiązanie problemów związanych z samą kompilacją.

Używanie headerów

Kolejna rzecz, która przebiega sama w sobie bez niespodzianek, to dodanie katalogu z plikami *.h i *.hpp do wywołań kompilatora:

-IC:\OpenCV2.0\include\opencv

Rozwiązanie problemu z kompilacją

Niestety, pomimo iż biblioteka o tym jawnie nie wspomina, nie została ona dobrze przygotowana do pracy z obecną, stabilną wersją GCC. Aby uniknąć kłopotów przy kompilacji (kłopot==nie działa:)) Najlepiej wybrać nowszą wersję GCC. Pod systemem Windows jednym z lepszych wyborów jeśli chodzi o instalację kompilatora c++, narzędzi do budowania etc. jest pakiet MinGW. Do tej pory korzystałem z oficjalnego wydania MinGW, które "niestety" zawiera oficjalną wersję kompilatora GCC. Świetnie radził sobie on np. z kompilacją programów z biblioteką Qt. Będąc zmuszonym do rezygnacji z tego rozwiązania, a jednocześnie nie chcąc instalować ręcznie całej otoczki (make, binutils, etc.) skorzystałem z strony http://www.tdragon.net/recentgcc/.  Najlepiej wybrać najnowszą wersję w wersji Bundled - nie ma wtedy ryzyka, że któraś z paczek zniknęła z serwera. Po instalacji nowego "pseudo" MinGW (która jest bardzo bezproblemowa) kompilacje z użyciem OpenCV rusza bez problemu.

Warto również zwrócić uwagę, iż Qt 4.5.3 również świetnie działa z GCC 4.4.1, zaś nowsze, "niestabilne" wersje GCC są coraz częściej używane (np pakiet GNU ARM używa GCC serii 4).

]]>
http://kwesoly.net/programowanie/cpp/opencv-2-0-windows/feed/ 0
Konwersje BIN/BCD w ASM 8051 http://kwesoly.net/programowanie/konwersje-binbcd-w-asm-8051/ http://kwesoly.net/programowanie/konwersje-binbcd-w-asm-8051/#comments Wed, 04 Nov 2009 23:06:03 +0000 http://kwesoly.net/?p=412 Kilka prostych procedur napisanych dla znajomych z innego kierunku:

Listing:
  1. ;poniższy kod można podmienić na prezentujący inna z załączonych procedurę.
  2.  
  3. mov R0,#0x14 ;przykladowa liczba do konwersji
  4. mov R1,#0x38 ;druga czesc liczby
  5.  
  6. lcall BCD2BIN2BYTES ;procedura konwertujaca
  7.  
  8. FINISH: ;petla zapobieajaca wykonywaniu dalszej części programu.
  9.     LJMP FINISH


Konwersja 2 bajtowa:

Listing:
  1. BCD2BIN2BYTES:
  2.     ;liczba jest w R0 i R1
  3.     ;bardziej znaczacy w R0, mniej w R1
  4.     ;wynik również tam umieścimy.
  5.     mov A,R0
  6.     lcall BCD2BIN1BYTE ;konwertujemy pierwszy
  7.     mov B, #100
  8.     MUL AB         ; wynik został pomnożony razy 100
  9.     mov R2, B
  10.     mov R3, A      ; wynik mnożenia zachowany
  11.  
  12.     mov A, R1
  13.     lcall BCD2BIN1BYTE ; konwersja mniej znaczącej części
  14.     CLR C             ; dodawania z przeniesieniem
  15.     ADDC A, R3
  16.     mov R3, A
  17.     mov A, R2
  18.     ADDC A, #0
  19.     mov R0,A
  20.     mov A,R3
  21.     mov R1, A
  22. RET
Listing:
  1. BIN2BCD1BYTE: ;konwersja BIN2BCD na jednym bajcie - pochodzi z datasheetu - proste i zrozumiałe
  2.     mov B, #10
  3.     DIV AB
  4.     SWAP A
  5.     ADD A, B
  6. RET
  7.  
  8. BCD2BIN1BYTE: ; i w druga stronę
  9.     mov R7, A
  10.     ANL A,#0xF0   ; zostawiamy tylko cyfrę dziesiątek
  11.     SWAP A
  12.     mov B, #10
  13.     MUL AB
  14.     XCH A, R7       ; zamiana miejscami
  15.     ANL A, #0x0F  ; cyfra jedności
  16.     ADD A, R7
  17. RET

Komentarze wyjaśniają mniej typowe rzeczy, zaś działanie pozostałych sprowadza się praktycznie do opisu działania instrukcji. W razie niezrozumienia jakiegoś szczegółów można zapytać na mailu komentarzu.

]]>
http://kwesoly.net/programowanie/konwersje-binbcd-w-asm-8051/feed/ 2
Symulacja działania mikrokontrolera opartego o rdzeń 8051 http://kwesoly.net/programowanie/symulacja-mikrokontrolera-rdzen-8051/ http://kwesoly.net/programowanie/symulacja-mikrokontrolera-rdzen-8051/#comments Wed, 04 Nov 2009 21:40:56 +0000 http://kwesoly.net/?p=409 Do samodzielnych eksperymentów z wspomnianym uC (nie na sprzęcie w laboratorium czy własnej płytce) przyda się nam jeszcze symulator rdzenia 8051. Z wielu dostępnych symulatorów, w większości jednak starych lub nie w pełni funkcjonalnych wybrałem moim zdaniem najlepszy, napisany w Javie, pozwalający od razu przetestować współpracę w podstawowej konfiguracji sprzętowej (P1 podłączony do linijki diodowej/wyświetlacza 7-segmentowego). Ponadto umożliwia on pisanie bezpośrednio w oknie kodu ASM, a ewentualne błędy wskazuje znacznie celniej niż stare programy asemblujące kod.

Wadą symulatora jest fakt, iż znalazłem go w formacie JAR, co czasem sprawia problemy z uruchomieniem (kilka osób zgłaszało iż  musiało zainstalować od nowa JRE).

Symulator rdzenia '51

Wkrótce zamieszczę proste programy napisane w tym symulatorze, będzie wtedy okazja dokładniej zerknąć w akceptowaną przez niego składnię.

]]>
http://kwesoly.net/programowanie/symulacja-mikrokontrolera-rdzen-8051/feed/ 0
Assembler 8051 – materiały do nauki, pierwsze sprawozdanie. http://kwesoly.net/programowanie/assembler-8051-materialy-nauka-sprawozdanie/ http://kwesoly.net/programowanie/assembler-8051-materialy-nauka-sprawozdanie/#comments Wed, 04 Nov 2009 21:30:11 +0000 http://kwesoly.net/?p=404 W ramach przedmiotu Technika Mikroprocesorowa (czy coś podobnego:)) na zajęciach zaczęliśmy zabawę z uC opartym o rdzeń '51, produkowany przez firmę Atmel. Ze względu na małą ilość spójnych informacji na temat programowania i działania tego uC którą udało się znaleźć postanowiłem zebrać i opublikować informację umożliwiające "rozpoczęcie przygody" :).

Po pierwsze jako źródło informacji na temat samego rdzenia poza książkami (np. dobrą pozycją pana Rydzewskiego) polecam:
Atmel 8051 Microcontrollers Hardware Manual (oryginalny plik na serwerze Atmela)
Atmel 8051 Microcontrollers Hardware Manual (lokalna kopia na tej stronie)

Zaś więcej szczegółów na temat konkretnych mikrokontrolerów można znaleźć w Datasheetach producentów. Dla dostępnych w budynku b1, s. 315 płytek deweloperskich sa to układy AT89S51 Atmela:
AT89S51 Datasheet (oryginalny plik na serwerze Atmela)
AT89S51 Datasheet (lokalna kopia na tej stronie)

Poniżej zamieszczam link do sprawozdania z  drugiego ćwiczenia (pierwsze polegało na mruganiu diodą w pętli głównej, niestety nie byłem na nim obecny). Zawiera ono pierwszy program, przygotowany koncepcyjnie/na symulatorze przeze mnie i Kubę Tutro (ale napisany na zajęciach), oraz drugi napisany już na zajęciach prezentujący działanie PWM w celu regulacji jasności świecenia diod. Oba programy pisałem na zajęciach wspólnie z Pawłem Górką, on również uzupełnił komentarze i przygotował sprawozdanie w formacie PDF.

Sprawozdanie z laboratorium 8051. Paweł Górka, Krzysztof Wesołowski

]]>
http://kwesoly.net/programowanie/assembler-8051-materialy-nauka-sprawozdanie/feed/ 0
Program prezentujący działanie algorytmów działających na grafach http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/ http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/#comments Tue, 06 Oct 2009 22:01:06 +0000 http://kwesoly.net/?p=390 Tworzenie grafu Algorytm Minty'ego

Przy okazji podnoszenia jednej oceny powstał prosty program prezentujący 3 algorytmy operujące na grafach. Pozwala on wprowadzić dowolny graf, o rożnych wagach a następnie prezentuje jego rozwiązanie krok po kroku.

Program powstawał  przy mniejszej lub większe niechęci przez wakacje. Pierwsza część programu to edycja i implementacja struktur grafowych.  Klasy tam zaimplementowane pozwalają zaprojektować graf, zapisać go/wczytać i uruchomić fragment prezentujący dany algorytm. Drugą częścią jest abstrakcyjna klasa AbstractSolver, ułatwiająca pisanie klas rozwiązujących o spójnym wyglądzie i funkcjonalności. Właśnie te 3 przykładowe algorytmy stanowią drugą cześć, stworzoną już nie przeze mnie ale przez Jakuba Tutro i Pawła Górkę.

W tym projekcie najbardziej zadowala mnie rozplanowanie jego działania, i zaprojektowanie klas,  które choć zapewne nie jest idealne, umożliwiło jasny podział pracy, zminimalizowało ilość kodu i zwiększyło elastyczność takiego rozwiązania.

Program powstawał przy równoczesnej pracy, dlatego do jej synchronizacji wykorzystałem darmowy serwis http://www.assembla.com/, a konkretnie udostępniony przez niego serwer SVN. Zainteresowani mogą pobrać projekt prosto z repozytorium: http://subversion.assembla.com/svn/graph-algorithms.

Dla nie potrafiących korzystać z SVN, lub tylko chcących zerknąć na efekt prac zamieszczam tutaj gotowy instalator z potrzebnymi plikami DLL (całość opiera się o biblioteki QT4.5).

Instalator: Instalator programu Grafy-Algorytmy

Pliki: Pliki wykonywalne i skrypt instalatora

Źródła: Źródła programu Grafy-Algorytmy

]]>
http://kwesoly.net/programowanie/cpp/program-grafy-minty-dijkstra-fleury/feed/ 0
Relacje 1:1 w Propel – unikanie błędu z primaryKey http://kwesoly.net/programowanie/web/relacje-w-propel-unikanie-bledu/ http://kwesoly.net/programowanie/web/relacje-w-propel-unikanie-bledu/#comments Tue, 06 Oct 2009 02:05:15 +0000 http://kwesoly.net/?p=388 Przeglądając trochę internetu w poszukiwaniu informacji jak zdefiniować relacje 1:1 za pomocą plików scheme.yml natrafiłem na wiele sugestii, mówiących aby nie tylko pole id, ale i drugie pole (będą właśnie w relacji 1:1 z polem id w innej tabeli) oznaczyć jako primary key. W prostej linii doprowadziło to do niezrozumiałego błędu:

Warning: Illegal offset type in symfony\plugins\sfPropelPlugin\lib\widget\sfWidgetFormPropelChoice.class.php on line 103

Rozwiązaniem generującym odpowiednie metody, zgodnym z informacją znalezioną np tutaj, było zrezygnowanie z primaryKey, i użycie klucza unikalnego.

]]>
http://kwesoly.net/programowanie/web/relacje-w-propel-unikanie-bledu/feed/ 0
Obsługa interfejsu I2C/TWI w mikrokontrolerach AVR na przykładzie DS1338 http://kwesoly.net/programowanie/avr/obsluga-twi-i2c-ds1338-avr/ http://kwesoly.net/programowanie/avr/obsluga-twi-i2c-ds1338-avr/#comments Wed, 09 Sep 2009 18:44:00 +0000 http://kwesoly.net/?p=385 Interfejs TWI/I2C

To dwa określenia dotyczące tej samej magistrali. Jej twórcą była firma PHILIPS, która do teraz jest właścicielem znaku handlowego I2C. Dlatego też inne implementacje tego standardu są często określane w inny sposób - np.  Atmel nazywa ten interfejs TWI. Na połączenie składają się dwie linie, zegarowa (oznaczana najczęściej SCK/SCL) i danych (oznaczana SDA), łącząca wszystkie urządzenia na danej magistrali. Więcej o samym sposobie działania i podłączania można przeczytać w internecie.

Obsługa interfejsu I2C w mikrokontrolerach AVR

Zakładam, że korzystamy z mikrokontrolera posiadającego sprzętowe wsparcie dla tego interfejsu. Pozwala nam to obsługiwać ten interfejs na poziomie bajtów, z prędkościami nieosiągalnymi przy emulacji za pomocą zmian stanów portów (bitbang). Przykład, który tutaj zamieszczam został sprawdzony na uC ATmega8, jednak powinien być w pełni przenośny na każdy mikrokontroler AVR ze sprzętowym wsparciem I2C.

Program obsługuje zegar czasu rzeczywistego Maxim/Dallas,DS1338. Ze względu na stosunkowo rzadkie odczyty zrezygnowałem z trudniejszej obsługi za pomocą przerwań - odczyty i zapisy blokują pracę mikrokontrolera. Obsługę podzielono na dwa fragmenty:

  • twi_basics.c, twi_basics.h, zawierające funkcje odnoszące się bezpośrednio do rejestrów kontrolnych (TWCR) i danych (TWDR) oraz oczekujące na ukończenie operacji.
  • ds1338.c,ds1338.h, zawierające funkcje do bezpośredniej obsługi podłączonego zegara, odczyt/zapis czasu, wykorzystanie pozostałych 56bajtów NVRAM.

Cała obsługa sprawdza wartości zwracane przez magistralę i informuje o wyniku operacji za pomocą kodów błędu zdefiniowanych w plikach nagłówkowych. Ułatwia to znajdowanie ewentualnych problemów,  nie eliminuje niestety wszystkich możliwych problemów.

Obsługę innych urządzeń można łatwo skonstruować korzystając z funkcji zawartych w twi_basics, dodając tylko interfejs do danego układu. Dla wielu urządzeń istniejąca biblioteka ds1338 będzie wymagała tylko niewielkich zmian, gdyż filozofia dostępu do danych jest identyczna.

Do samych plików dołączam przykład ilustrujący działaniem wystarczający do zrozumienia jej wykorzystania. Zachęcam do samodzielnego studiowania źródeł, zarówno tych jak i innych spotykanych w internecie, w celu lepszego zrozumienia problemu.

Załącznik:

Biblioteka DS1338, oparta o TWI

]]>
http://kwesoly.net/programowanie/avr/obsluga-twi-i2c-ds1338-avr/feed/ 0
Usuwanie nieużywanych funkcji z programu http://kwesoly.net/programowanie/avr/usuwanie-nieuzywanych-funkcji-z-programu/ http://kwesoly.net/programowanie/avr/usuwanie-nieuzywanych-funkcji-z-programu/#comments Mon, 17 Aug 2009 18:37:05 +0000 http://kwesoly.net/?p=380 W trakcie tworzenia biblioteki do obsługi wyświetlacza 7 segmentowego (7 segmentów+kropka) doszedłem do wniosku,  że  najbardziej eleganckie rozwiązanie to stworzenie osobnego pliku C dla tej biblioteki, wraz z nagłówkami z prototypami funkcji jak i z konfiguracją. Niestety napisanie kilku funkcji ustawiających liczbę na wyświetlaczu spowodowało znaczny rozrost programu - nieużywane funkcje, często bardzo obszerne, trafiły do pliku *.o a następnie do wygenerowanego HEXa zajmując miejsce, pomimo iż nie wszystkie były używane.

Po przetrząśnięciu kawałka internetu znalazłem rozwiązanie, którego efekty są naprawdę znaczące (usunięcie zbędnych funkcji potrafi zaoszczędzić dużo miejsca gdy korzystamy z bibliotek zawierających funkcje na każdą okazję), i w związku z tym warte powtórzenia w wielu innych programach - pozwoli to uniknąć ręcznego usuwania nieużywanego kodu z "biblioteki".

Ustawienie kompilatora

Okno Project Properties z dodanym poleceniem ffunctions-sections

Okno Project Properties z dodanym poleceniem ffunctions-sections

Aby móc usuwać nieużywane funkcje, muszą one w pliku wynikowym kompilatora być odrębnymi częściami. Zachowanie takie wymusza dodatkowy argument w poleceniu kompilatora:

-ffunction-sections

Dodanie takiej komendy w projekcie przy użyciu Makefile:

CFLAGS += -ffunction-sections

Przy korzystaniu z Środowiska Eclipse dla AVR należy z kolei polecenie dodać w ustawieniach projektu.

Z menu Eclipse wybieramy Project -> Properties,
następnie odnajdujemy C/C++ build -> Settings.
I przy wybranym configu Release, w zakładce Tool Settings wybieramy Optimizations z zakładki AVR Compiler. W polu Other Optimizations flag dopisujemy nasze "-ffunction-sections"

Ustawienia linkera

Ustawienia projektu - włączenie gc-sections

Okno Project Properties z dodanym poleceniem gc-sections

Poprzednio dodane polecenie umieści każdą funkcję w osobnej części pamięci - sekcji. Teraz pozostaje poinformowanie linkera, iż sekcje nie używane mają zostać usunięte - umożliwia to polecenie przekazane do linkera -gc-sections (gc od garbage collector). Tego również można dokonać poprzez plik Makefile lub ustawienia projektu.

Dla Makefile wystarczająca modyfikacja to

-Wl,-gc-sections

Z kolei w Eclipse będąc już w Project -> Properties-> C/C++ build -> Settings ->(Release) Wchodzimy w zakładkę AVR C Linker->General, i dodajemy polecenie "-Wl,-gc-sections"

U mnie taka modyfikacja ustawień pozwoliła na przykład usunąć jedyną funkcję używającą arytmetyki zmiennoprzecinkowej, zamieniając 2,5kB programu w 600bajtów.

]]> http://kwesoly.net/programowanie/avr/usuwanie-nieuzywanych-funkcji-z-programu/feed/ 2 Prosta aplikacja układu FT232R firmy FTDI http://kwesoly.net/programowanie/avr/aplikacja-ukladu-ft232r-ftdi/ http://kwesoly.net/programowanie/avr/aplikacja-ukladu-ft232r-ftdi/#comments Wed, 05 Aug 2009 21:00:49 +0000 http://kwesoly.net/?p=361 Po co taki układ?

Kiedy próbujemy stworzyć oprogramowanie na uC stajemy często przed problemem wymiany danych z naszym komputerem PC.  Sposobów na połączenie własnego układu z komputerem PC jest przynajmniej kilka:

  • Port LPT
    Możliwość niezależnego manipulowania bitami sprawia że to jedno z najprostszych rozwiązań. Poza zwykłym równoległym przekazywaniem informacji można również emulować interfejsy szeregowe. Obecnie laptopy bardzo rzadko posiadają taki interfejs, a nawet jeśli, są to często modele droższe od powszechnie spotykanych.
  • Port COM
  • Powszechny interfejs szeregowy. Poza podstawowymi liniami służącymi do transmisji i odbioru danych zawiera też linie sterujące przepływem danych. Pod względem sposobu transmisji do komunikacji wystarczy połączenie naprzemiennie sygnałów Tx<->Rx portu COM i mikrokontrolera. Niestety, w warstwie fizycznej całkiem inne poziomy napięć nie pozwalają na takie połączenie. Powstało wiele układów służących do konwersji napięć między poziomem uC a portu COM. Często więc na płytce montowało/montuje się po prostu MAX232 do konwersji napięć podpięty pod odpowiednie nóżki mikroprocesora, i łączony z portem COM komputera. Stety/niestety porty COM też należą już do laptopowej rzadkości. Rozwiązanie polegające na używaniu przejściówek USB<->COM wraz z takimi układami jest często spotykane, pomimo wiążącego się z tym narzutu - dwukrotna konwersja napięć nie ma sensu.
  • Port USB
    Jeśli odrzucimy to czego w laptopie nie ma, i zrezygnujemy z przejściówek pozostaje nam po prostu użycie portu  USB, który zadomowił się w komputerach już na dobre.  Tutaj też mamy kilka możliwości:

    • Emulacja interfejsu USB za pomocą uC.
      Niestety programowa realizacja interfejsu USB utrudnia wykonywanie innych zadań, dlatego maksymalna wydajność takiego rozwiązania nie jest oszałamiająca. Mikro kontroler musiałby zajmować się wyłącznie obsługą USB, lub zrezygnować z wykonywanych przez siebie czynności. Urządzenia tak działające często komunikują się programowo z USB i np. przesyłają dane dalej przez wspierane sprzętowo interfejsy (np. UART, SPI)
    • Wykorzystanie specjalizowanego układu
      Sama firma FTDI produkuje kilka układów umożliwiających komunikacje za pomocą UART, użytym rozwiązaniem jest najprostszy z nich FT232RL. Umożliwia on w pełni sprzętowe przejście USB<->UART, wraz z dodatkowymi liniami (sterującymi przepływem, pochodzącymi z portu COM) oraz dodatkowymi 4 portami, które można zastosować jako dowolne wejścia wyjścia. Układ posiada również bardzo dobre wsparcie producenta: sterowniki pod większość systemów operacyjnych, biblioteki ułatwiające programowanie komunikacji czy też przykłady zastosować w nocie katalogowej (możliwe aplikacje układu). Poza przedstawionym tutaj zastosowaniem istnieje wiele wiele innych - wystarczy przejrzeć dokumentacje: na http://www.ftdichip.com/Documents/DataSheets/DS_FT232R.pdf

Wykonany układ

Opierając się właśnie na wspomnianych notach aplikacyjnych, i materiałach samemu przejrzanych jak i konsultacjach z bardziej doświadczonymi kolegami, zaprojektowałam układ będący interfejsem Komputer PC <-> mikrokontroler. Główne zalety wykonanego urządzenia:

  • Sprzętowy, niezawodny i wydajny interfejs.
  • Współpraca z urządzeniami zasilanymi praktycznie dowolnym napięciem - za pomocą zworki do wyboru 3.3 jak i 5 volt, ewentualnie możliwość podpięcia własnego napięcia VCCIO do układu.
  • Dodatkowe 4 porty GPIO, które można kontrolować z poziomu aplikacji pisanych z wykorzystaniem bibliotek dostarczonych przez FTDI.
  • Dodatkowe wyprowadzenia zasilania, poza wspólną masą dodatkowo 2 linie 3.3V o łącznej wydajności prądowej 50mA i 6 linii 5V pochodzących z portu USB o wydajności ograniczonej komputerem/standardem USB - w moim przypadku komputer jest w stanie dostarczyć tyle prądu, limitem jest więc standardowe 500mA.
  • Sygnalizacja transmisji jak i poprawnego zasilania za pomocą diod LED.

Poniżej kilka zdjęć wykonanego układu:

usb2uart_01 usb2uart_02 usb2uart_03

Oraz schemat urządzenia:

usb2uart-schemat

Układ przynajmniej pod względem poprawności połączeń i transmisji UART przetestowany wraz z prezentowanym poprzednio mikrokontrolerem.

]]>
http://kwesoly.net/programowanie/avr/aplikacja-ukladu-ft232r-ftdi/feed/ 6
Prosta płytka prototypowa dla ATmega162 http://kwesoly.net/programowanie/avr/prosta-plytka-prototypowa-dla-atmega162/ http://kwesoly.net/programowanie/avr/prosta-plytka-prototypowa-dla-atmega162/#comments Fri, 24 Jul 2009 01:25:14 +0000 http://kwesoly.net/?p=353 Jakiś czas temu opisałem proces konfiguracji środowiska Eclipse + WinAVR + AVRStudio Debuger

Jako, że tematyka tych małych i tanich procesorów wciąż jest dla mnie interesująca zamieszczam schemat i wzór płytki PCB oraz opisu dla małego urządzenia, które wykonałem w ostatnim czasie.

Na początek kilka zdjęć finalnej wersji płytki:

ATmega162_01 ATmega162_02 ATmega162_03 ATmega162_04 ATmega162_05 ATmega162_06

Płytka umożliwia proste budowanie układów dzięki wyprowadzeniu wszystkich złącz na goldpiny. W przeciwieństwie jednak to prostych modułów rozprowadzających wszystkie nóżki na pary goldpinów, tutaj zintegrowano również podstawowe, przydatne funkcjonalności:

  • Zintegrowany kwarc 16 MHz, pozwalający korzystać z największej teoretycznie możliwej prędkości tego mikro kontrolera.
    Za pomocą fusebitów możemy ten zegar podzielić przez 8 lub też z niego zrezygnować na rzecz wewnętrznego generatora RC.
  • Zintegrowany kwarc 32768Hz, wpięty do pinów przeznaczonych na taki kwarc/służących jako zwykłe IO.
    Podwójny Dipswitch umożliwia jego odcięcie w przypadku chęci skorzystania raczej z portu IO.
  • Wyprowadzone złącze do ISP, 10 pinowa zgodne z standardem KANDA. Zamiast zwykłych goldpinów zastosowano Gniazdo, co ułatwia poprawne wpięcie programatora.
  • Wyprowadzono 10 pinowe złącze JTAG, zgodne z JTAG ICE.
  • Przycisk umożliwiający ręczne zresetowanie procesora.
  • I oczywiście zasilanie wraz z kondensatorami.

Do wpisu załączam schemat, w razie potrzeby proszę o kontakt mailowy- podeślę  pozostałe pliki.

Schemat płytki prototypowej

]]>
http://kwesoly.net/programowanie/avr/prosta-plytka-prototypowa-dla-atmega162/feed/ 3
Zintegrowany sterownik silników krokowych A3977 http://kwesoly.net/programowanie/avr/zintegrowany-sterownik-silnikow-krokowych-a3977/ http://kwesoly.net/programowanie/avr/zintegrowany-sterownik-silnikow-krokowych-a3977/#comments Sat, 06 Jun 2009 09:00:45 +0000 http://kwesoly.net/?p=342 W ramach chęci rozwinięcia ciekawych umiejętności i podniesienia oceny powstał niedawno artykuł/referat na temat wymienionego w tytule układu. Na jego podstawie Jakub Tutro zbudował sterownik, do którego wspólnie napisaliśmy program testowy. Zamieszam go, gdyż zawiera wiele ciekawych informacji na temat ogólnej idei sterowania takimi silnikami .

Silniki_krokowe - pobierz

]]>
http://kwesoly.net/programowanie/avr/zintegrowany-sterownik-silnikow-krokowych-a3977/feed/ 0
Eclipse + WinAVR + AVRStudio Debuger http://kwesoly.net/programowanie/avr/eclipse-winavr-avrstudio-debuger/ http://kwesoly.net/programowanie/avr/eclipse-winavr-avrstudio-debuger/#comments Sun, 22 Feb 2009 19:11:02 +0000 http://kwesoly.net/?p=313 Jako, że postanowiłem spróbować programowania w znanym mi języku, ale na całkiem innej platformie - procesorach  AVR, postaram się opisać niektóre fragmenty moich doświadczeń. Dziś jedno z pierwszych - konfiguracja tytułowego zestawu. Używanie takiej konfiguracji upraszcza pracę, pozwalając przerzucić odpowiedzialność za plik makefile na środowisko programistyczne, co jest z reguły wygodniejsze i efektywniejsze niż ręczna edycja. Poza tym korzystamy  z wygodnego edytora, ze znanymi już funkcjami, skrótami klawiszowymi etc.

Instalacja WinAVR

Pierwszą częścią zestawu, niezbędną w pracy będzie kompilator WinAVR, dostępny pod adresem http://winavr.sourceforge.net/. Nie będę się rozpisywał na jego temat, gdyż przekracza to zakres tego wpisu, w dodatku jest bardzo szeroko opisane w internecie. Sama strona pobierania WinAVR na SourceForge.net znajduje się tutaj.

W trakcie instalacji najlepiej nie zmieniać domyślnej ścieżki, i pozwolić na dopisanie jej do zmiennej systemowej PATH, zwłaszcza jeżeli nie używamy innych kompilatorów korzystających z make (jeśli używamy, warto skorzystać np. ze skryptu wsadowego do odpalania środowisk tak, aby zmienną PATH modyfikować dynamicznie, i zawsze odpalać właściwy make, gdyż często różne wersje dołączane do aplikacji nie są ze sobą kompatybilne). Jeśli zamierzamy używać Eclipse, warto odznaczyć również instalacje Programmers Notepada.

Po instalacji warto uruchomić ponownie komputer tak, aby dopiski do zmiennej PATH zaczęły działać.

Instalacja i konfiguracja Eclipse

Podstawowym  środowiskiem edycyjnym będzie Eclipse, wraz z narzędziami do programowania w języku C/C++ rozprowadzany jako Eclipse CDT. Jego instalacja jest prosta, opisałem ją zresztą jakiś czas temu tutaj.

Po zainstalowaniu Eclipse, będziemy potrzebowali jeszcze dodatkowej wtyczki, która ułatwia tworzenie projektów, zarządzanie nimi, pisanie kodu jak i jego kompilacje.

Wtyczka ta jest dostępna pod adresem http://avr-eclipse.sourceforge.net, konkretnie na stronie pobierania. Najprostsza droga instalacji to skorzystanie z menedżera pakietów dostępnego w Eclipse, ją tez krótko opiszę.

  1. Uruchamiamy Eclipse, ewentualnie tworzymy już nowy Workspace na projekty AVR.
  2. Wybieramy z menu Help->Software Updates.
  3. W zakładce Available Software wybieramy Add Site...
  4. Wpisujemy/wklejamy adres znaleziony na stronie pobierania, w moim wypadku to http://avr-eclipse.sourceforge.net/updatesite/.
  5. Na liście, która prawdopodobnie automatycznie się rozwinie, zaznaczamy oba pola, czyli w praktyce całą stronę wklejoną wcześniej.
  6. Klikamy Install, i po przejściu przez prostą procedurę instalacji w stylu Next, Accept, Next i zamknięciu okienka Software Updates nastąpi instalacja zakończona propozycją ponownego uruchomienia środowiska Eclipse.

Po zakończeniu powyższych czynności dysponujemy już zarówno kompilatorem, jak i środowiskiem edycyjnym.

Instalacja AVRStudio

Pomimo wielu prób stworzenia symulatora z możliwością debugowania programów napisanych na mikrokontrolery, wciąż najlepszym rozwiązaniem (ze znanych mi w tej chwili) pozostaje oryginalny debugger zintegrowany z AVRStudio, pozwalający na symulację i debugowanie programów na uC AVR.

Pobierania AVR Studio należy rozpocząć tutaj: http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725. Niestety, sam doświadczyłem niekompatybilności najnowszej wersji (4.15 przy poprzedniej instalacji), z moim system Windows XP sp3 PL, dlatego w razie problemów należy spróbować użyć innej wersji (4.14 zadziałała wtedy, 4.16 też już działa).

Samo pobieranie wymaga wyjątkowo denerwującej rejestracji- Atmel nie tworzy nam konta, tylko pyta o te same dane przy każdym pobieraniu. Dlatego nie warto skrupulatnie wypełniać rubryczek, zwłaszcza, że zawierają szczegółowe dane o naszej osobie.

Instalacja przebiega bezproblemowo, AVR Studio gotowy do pracy.

Pierwszy projekt w Eclipse

Utworzę teraz nowy projekt, oraz podpowiem jak go skonfigurować, aby możliwa była współpraca z ww debugerem. W tym celu uruchamiamy Eclipse, i wykonujemy nastepujące kroki:

  1. Z menu File->New wybieramy "C Project".
  2. Uzupełniamy jego nazwę, i w Project Type wybieramy "AVR Cross Target Application".
  3. Przechodzimy dalej (Automatycznie zaznaczył nam się jedyny dostępny Toolchain).
  4. Na następnej stronie pozostawiamy zaznaczone obie konfiguracje, wchodzimy w Advanced Settings.
  5. W zakładce AVR ustawiamy typ docelowego procesora, jego częstotliwość oraz ewentualnie konfigurujemy programator (opiszę to przy następnej okazji).
  6. Wchodzimy w zakładkę "C/C++ build", w część Settings.
  7. Widzimy teraz listę ustawień kompilatora, linkera etc, w dodatku możemy modyfikować ją dla obu konfiguracji kompilatora, wybierając Debug/Release u góry okna.
  8. Aby debugować kod w AVR Studio potrzebujemy posiadać niezbędne informację w pliku elf, w tym celu w wyżej wymienionych ustawieniach, w sekcji Debugging, zarówno dla AVR Assembler jak i AVR Comiler ustawiamy Debug info format  na dwarf-2.
  9. Akceptujemy wszystkie ustawienia klikając OK i przechodzimy do następnego etapu.
  10. W następnym oknie ponownie wybieramy docelowy MCU oraz wpisujemy jego częstotliwość.

Utworzony projekt jest pusty, dlatego musimy jeszcze dodać przynajmniej jeden plik źródłowy, klikając na File, New, C Source File i wypełniając go treścią. Ja wykorzystałem listing pochodzący z kursu programowania mikroprocesorów w C z czasopisma "Elektronika dla wszystkich":

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	DDRD=0x7c;
	for(;;)
	{
		PORTD=0x7c;
		_delay_loop_2(0xffff)
		PORTD=0;
		_delay_loop_2(0xffff);
	}
	return 0;
}

Po zapisaniu pliku pozostaje zbudowanie pliku, za pomocą menu Project->Build.

W katalogu Debug, wewnątrz naszego projektu powstanie m.in. plik nazwaprojeku.elf, który można symulować wraz z podglądem źródeł w AVR Studio.

]]>
http://kwesoly.net/programowanie/avr/eclipse-winavr-avrstudio-debuger/feed/ 12