Opiszę tutaj moje próby zaprogramowania w linuksie Mikrokontrolera ATtiny2313 z wykorzystaniem kompilatora języka C avr-gcc, programatora avrdude oraz Sample Electronics programmer.
Schematów nie dorzucam ponieważ nie bardzo jest sens cały programator to tylko 3 oporniki podłączone do portu LPT do znalezienia w google w każdej chwili, reszta mojego układu testowego składa się z zewnętrznego kwarcu oraz jednej diody podłączonej do portu, stabilizatora no i oczywiście plątaniny kabelków.
Zdjęć nie dorzucam tym bardziej całość jest strasznie polutowane i wstyd najważniejsze że działa
No to zaczynamy po kolei najpierw należy zainstalować następujące pakiety : gcc-avr, binutils-avr, avr-libc, avrdude. Jeśli pakiety już mamy można przystąpić do podłączenia programatora wraz z mikrokontrolerem do portu LPT i tutaj pojawiły się pierwsze schody, większość źródeł podaje jak korzystać z programatora STK200, jednak z tego co ustaliłem avrdude nie bardzo chce współpracować z prostszą wersją programatora bez bufora. Z braku lepszych źródeł próbowałem komunikować się z układem za pomocą polecenia
jednak to generowało poniższy błąd :
Po przeszukaniu google trafiłem najpierw na kilka postów na elektrodzie gdzie ludzie mieli podobny problem STK200 bez bufora lub Sample Electronics programmer niestety rozwiązania brak, jedyna sugestia dorzucenie bufora wtedy musi działać, jednak z racji niedzieli wypad do sklepu z elektroniką był niemożliwy szukałem dalej.
Po dłużycach poszukiwaniach natrafiłem na stronę prowadzoną przez Pana Wojtka Grylewicza grylewicz.pl a dokładnie na artykuł Najprostszy programator AVR za 3zł do mini płytki testowej http://grylewicz.pl/najprostszy-programator-avr-za-3zl-do-mini-plytki-testowej/ okazało się że do avrdudy bez problemu obsługuje Sample Electronics programmer, wystarczy wydać polecenie
dzięki temu oczom moim ukazał się taki oto obrazek :
Procesor gada z programatorem teraz czas na program hello world czyli miganie diodą.
Przykładowy kod programu można znaleźć na stronie http://toxygen.net/avr/ podobnie jak instrukcję kompilacji.
Do pliku wrzucamy prosty kod mrugacza :
I próbujemy kompilować zgodnie z instrukcją dołączoną na stronie :
I tutaj pojawia się pierwszy warning,
jednak zgodnie z dewizą jestem programistą i warningami się nie przejmuję jedziemy dalej :
to polecenie zgodnie z opisem na stronie wyciągnie z pliku formatu ELF binarną sekcję kodu ? Czyli wyciągnie z binakrki program który można wrzucić na mikrokontroler.
Ostatni krok czyli wrzucenie programu program.hex na mikrokontroler wykonujemy to poleceniem :
I tu w wyniku dostajemy poniższy komunikat błędu :
W tym momencie wracamy do google po raz kolejny i ponownie na elektrodzie ktoś wałkował podobny problem, o tutaj: https://www.elektroda.pl/rtvforum/topic1111376.html, w każdym razie chodzi o to że program jest za duży i na kontroleże nie ma wystarczającej liczby miejsca, żeby pomieścić tak duży program ? Trochę to dziwne bo program nie jest zbyt rozbudowany. Autorowi problemu z powyższego linka dzięki pomocy jednego z forumowiczów problem udało się rozwiązać, niestety nie pochwalił się jak tego dokonał dał tylko znać że jemu już działa i że problem leży w optymalizacji kodu, dobre i to przynajmniej miałem jakiś punkt zaczepienia. Kilka kolejnych zapytań w google i okazało się że program należy kompilować z opcją -O i parametrem 1,2 lub 3. Opcja ta mówi że kod należy optymalizować, brat mój który z C miał styczność na studiach doznał w tym momencie olśnienia i twierdzi że doktor prowadzący wykłady kazał ustawiać kompilację na max 2 poziom, poziom 3 może powodować problemy, doktorowi wierzymy dla tego ustawiłem poziom -O2 program skompilował się tym razem bez warninga, następnie avr-objcopy oraz wysyłka na mikrokontroler tym razem zakończona powodzeniem diodka zaczęła radośnie mrugać sukces.
A tutaj jeszcze zamieszce różnicę w programie z optymalizacją i bez :
No i wysyłka na Attiny2313 :
No i mruga !
Kolejny etap polegał na znalezieniu programu który umożliwił by komunikację z RS232. Ważną rzeczą jest aby nie podłączać uarta z mikrokontorlera bezpośrednio pod RS232 w komputerze, trzeba to zrobić za pomocą układu MAX232, ja użyłem gotowej przejściówki kupionej kiedyś za grubą gotówkę na allegrze.
Przykładowe programy można znaleźć tutaj :
http://www.avrprojects.net/index.php?option=c...=49:avr-c-programming-projects-&Itemid=69
Oraz tutaj:
http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=2
I tu należy się chwilkę zatrzymać użyta została tutaj ciekawa konstrukcja autor przekierował standardowe wyjście do strumienia połączonego z funkcją USART_Transmit dzięki temu korzystając z printf można wysłać tekst bezpośrednio na port RS232. Zmodyfikowana wersja powyższych programów i jeszcze kilku innych zamieszczam tutaj:
Przygotowanie programu na bazie już istniejących gotowców nie stanowi żadnego problemu, trochę wywalić trochę wkleić i działa każdy to potrafi, program kompiluje się bezbłędnie wysyła na mikrokontroler bez problemu jednak w terminalu RS232 widać krzaki, męczyłem się z tym straszliwie przez 2 dni program przerobiłem kilkanaście razy zgodnie z uwagami znalezionymi w sieci jednak w terminalu cały czas te same krzaki. W desperacji wpadłem na pomysł żeby przerobić zasilanie z 5V na 3,3 dolutowałem do płytki przetwornik jednak w terminalu dalej krzaki kolejny dzień szukania, ostatnią rzeczą jaka mogła sprawiać były fusebity, kontroler był kiedyś wykorzystywany więc kwarc zewnętrzny 8MHz był już zaprogramowany w związku z tym częstotliwość wylicza była na pewno dobrze a mimo to krzaki, aby mieć 100% pewności że fusebity są ustawione dobrze chciałem je odczytać poszukałem chwilkę w google i okazało się że avrdudy uruchomiony z parametrem :
Może bez problemu odczytać fusebity i to od razu w formie szesnastkowej.
Korzystając ze strony http://www.engbedded.com/fusecalc/ sprawdziłem że kontroler jest na pewno odpowiednio skonfigurowany do pracy z zewnętrznym kwarcem, szukamy w google dalej okazuje się że może być włączone coś takiego jak CKDIV8 i to może powodować problem, szybki odczyt fusebitów raz jeszcze, kontrola na załączonej wyżej stronie i okazuje się że CKDIV8 mam włączony, za pomocą polecenia :
zmieniłem fusebity i niemalże natychmiast po tym oczom moim na terminalu RS232 zamiast krzaczorów ukazał się napis DZIALA
Źródła kolejność podawania przypadkowa:
http://www.embedds.com/programming-avr-usart-with-avr-gcc-part-1/
http://www.avrprojects.net/index.php?option=c...=49:avr-c-programming-projects-&Itemid=69
http://toxygen.net/avr/
http://www.robotyka.net.pl/category/artykuly-praktyczne/avr/
http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=8
https://www.elektroda.pl/rtvforum/topic1111376.html
http://grylewicz.pl/najprostszy-programator-avr-za-3zl-do-mini-plytki-testowej/
http://www.engbedded.com/fusecalc/
http://www.ladyada.net/learn/avr/avrdude.html
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=36404
Plus cała masa for które przewaliłem szukając rozwiązań poszczególnych mniejszych i większych problemów.
Mam nadzieję że komuś się to przyda i zaoszczędzi sporo czasu.
Pozdrawiam.
Schematów nie dorzucam ponieważ nie bardzo jest sens cały programator to tylko 3 oporniki podłączone do portu LPT do znalezienia w google w każdej chwili, reszta mojego układu testowego składa się z zewnętrznego kwarcu oraz jednej diody podłączonej do portu, stabilizatora no i oczywiście plątaniny kabelków.
Zdjęć nie dorzucam tym bardziej całość jest strasznie polutowane i wstyd najważniejsze że działa
No to zaczynamy po kolei najpierw należy zainstalować następujące pakiety : gcc-avr, binutils-avr, avr-libc, avrdude. Jeśli pakiety już mamy można przystąpić do podłączenia programatora wraz z mikrokontrolerem do portu LPT i tutaj pojawiły się pierwsze schody, większość źródeł podaje jak korzystać z programatora STK200, jednak z tego co ustaliłem avrdude nie bardzo chce współpracować z prostszą wersją programatora bez bufora. Z braku lepszych źródeł próbowałem komunikować się z układem za pomocą polecenia
avrdude -c stk200 -p t2313jednak to generowało poniższy błąd :
avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you. Po przeszukaniu google trafiłem najpierw na kilka postów na elektrodzie gdzie ludzie mieli podobny problem STK200 bez bufora lub Sample Electronics programmer niestety rozwiązania brak, jedyna sugestia dorzucenie bufora wtedy musi działać, jednak z racji niedzieli wypad do sklepu z elektroniką był niemożliwy szukałem dalej.
Po dłużycach poszukiwaniach natrafiłem na stronę prowadzoną przez Pana Wojtka Grylewicza grylewicz.pl a dokładnie na artykuł Najprostszy programator AVR za 3zł do mini płytki testowej http://grylewicz.pl/najprostszy-programator-avr-za-3zl-do-mini-plytki-testowej/ okazało się że do avrdudy bez problemu obsługuje Sample Electronics programmer, wystarczy wydać polecenie
avrdude -c bascom -p t2313dzięki temu oczom moim ukazał się taki oto obrazek :
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e910a
avrdude: safemode: Fuses OK
avrdude done. Thank you. Procesor gada z programatorem teraz czas na program hello world czyli miganie diodą.
Przykładowy kod programu można znaleźć na stronie http://toxygen.net/avr/ podobnie jak instrukcję kompilacji.
Do pliku wrzucamy prosty kod mrugacza :
Kod: C / C++
I próbujemy kompilować zgodnie z instrukcją dołączoną na stronie :
avr-gcc -mmcu=attiny2313 program.c -o programI tutaj pojawia się pierwszy warning,
In file included from led.c:7:0:
In file included from led.c:7:0:
/usr/lib/gcc/avr/4.7.2/../../../avr/include/util/delay.h:95:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" [-Wcpp] jednak zgodnie z dewizą jestem programistą i warningami się nie przejmuję jedziemy dalej :
avr-objcopy -O ihex program program.hexto polecenie zgodnie z opisem na stronie wyciągnie z pliku formatu ELF binarną sekcję kodu ? Czyli wyciągnie z binakrki program który można wrzucić na mikrokontroler.
Ostatni krok czyli wrzucenie programu program.hex na mikrokontroler wykonujemy to poleceniem :
avrdude -c bascom -p t2313 -U flash:w:program.hexI tu w wyniku dostajemy poniższy komunikat błędu :
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "led.hex"
avrdude: input file led.hex auto detected as Intel Hex
avrdude: ERROR: address 0x0810 out of range at line 129 of led.hex
avrdude: read from file 'led.hex' failed
avrdude: safemode: Fuses OK
avrdude done. Thank you. W tym momencie wracamy do google po raz kolejny i ponownie na elektrodzie ktoś wałkował podobny problem, o tutaj: https://www.elektroda.pl/rtvforum/topic1111376.html, w każdym razie chodzi o to że program jest za duży i na kontroleże nie ma wystarczającej liczby miejsca, żeby pomieścić tak duży program ? Trochę to dziwne bo program nie jest zbyt rozbudowany. Autorowi problemu z powyższego linka dzięki pomocy jednego z forumowiczów problem udało się rozwiązać, niestety nie pochwalił się jak tego dokonał dał tylko znać że jemu już działa i że problem leży w optymalizacji kodu, dobre i to przynajmniej miałem jakiś punkt zaczepienia. Kilka kolejnych zapytań w google i okazało się że program należy kompilować z opcją -O i parametrem 1,2 lub 3. Opcja ta mówi że kod należy optymalizować, brat mój który z C miał styczność na studiach doznał w tym momencie olśnienia i twierdzi że doktor prowadzący wykłady kazał ustawiać kompilację na max 2 poziom, poziom 3 może powodować problemy, doktorowi wierzymy dla tego ustawiłem poziom -O2 program skompilował się tym razem bez warninga, następnie avr-objcopy oraz wysyłka na mikrokontroler tym razem zakończona powodzeniem diodka zaczęła radośnie mrugać sukces.
A tutaj jeszcze zamieszce różnicę w programie z optymalizacją i bez :
avr-gcc -mmcu=attiny2313 led.c -o led.o
avr-objcopy -O ihex led.o led.hex
ls -lh
-rwxr-xr-x 1 root root 8,0K maj 11 17:29 led.o
-rw-r--r-- 1 root root 9263 maj 11 17:29 led.hex
avr-gcc -mmcu=attiny2313 led.c -o led.o -O2
avr-objcopy -O ihex led.o led.hex
ls -lh
-rwxr-xr-x 1 root root 3697 maj 11 17:44 led.o
-rw-r--r-- 1 root root 308 maj 11 17:44 led.hex No i wysyłka na Attiny2313 :
avrdude -c bascom -p ATtiny2313 -U flash:w:led.hex
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "led.hex"
avrdude: input file led.hex auto detected as Intel Hex
avrdude: writing flash (102 bytes):
Writing | ################################################## | 100% 0.04s
avrdude: 102 bytes of flash written
avrdude: verifying flash memory against led.hex:
avrdude: load data flash data from input file led.hex:
avrdude: input file led.hex auto detected as Intel Hex
avrdude: input file led.hex contains 102 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.02s
avrdude: verifying ...
avrdude: 102 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you. No i mruga !
Kolejny etap polegał na znalezieniu programu który umożliwił by komunikację z RS232. Ważną rzeczą jest aby nie podłączać uarta z mikrokontorlera bezpośrednio pod RS232 w komputerze, trzeba to zrobić za pomocą układu MAX232, ja użyłem gotowej przejściówki kupionej kiedyś za grubą gotówkę na allegrze.
Przykładowe programy można znaleźć tutaj :
http://www.avrprojects.net/index.php?option=c...=49:avr-c-programming-projects-&Itemid=69
Oraz tutaj:
http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=2
I tu należy się chwilkę zatrzymać użyta została tutaj ciekawa konstrukcja autor przekierował standardowe wyjście do strumienia połączonego z funkcją USART_Transmit dzięki temu korzystając z printf można wysłać tekst bezpośrednio na port RS232. Zmodyfikowana wersja powyższych programów i jeszcze kilku innych zamieszczam tutaj:
Kod: C / C++
Przygotowanie programu na bazie już istniejących gotowców nie stanowi żadnego problemu, trochę wywalić trochę wkleić i działa każdy to potrafi, program kompiluje się bezbłędnie wysyła na mikrokontroler bez problemu jednak w terminalu RS232 widać krzaki, męczyłem się z tym straszliwie przez 2 dni program przerobiłem kilkanaście razy zgodnie z uwagami znalezionymi w sieci jednak w terminalu cały czas te same krzaki. W desperacji wpadłem na pomysł żeby przerobić zasilanie z 5V na 3,3 dolutowałem do płytki przetwornik jednak w terminalu dalej krzaki kolejny dzień szukania, ostatnią rzeczą jaka mogła sprawiać były fusebity, kontroler był kiedyś wykorzystywany więc kwarc zewnętrzny 8MHz był już zaprogramowany w związku z tym częstotliwość wylicza była na pewno dobrze a mimo to krzaki, aby mieć 100% pewności że fusebity są ustawione dobrze chciałem je odczytać poszukałem chwilkę w google i okazało się że avrdudy uruchomiony z parametrem :
avrdude -c bascom -p ATtiny2313 -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:hMoże bez problemu odczytać fusebity i to od razu w formie szesnastkowej.
Korzystając ze strony http://www.engbedded.com/fusecalc/ sprawdziłem że kontroler jest na pewno odpowiednio skonfigurowany do pracy z zewnętrznym kwarcem, szukamy w google dalej okazuje się że może być włączone coś takiego jak CKDIV8 i to może powodować problem, szybki odczyt fusebitów raz jeszcze, kontrola na załączonej wyżej stronie i okazuje się że CKDIV8 mam włączony, za pomocą polecenia :
avrdude -c bascom -p ATtiny2313 -U lfuse:w:0xE4:m
avrdude -c bascom -p ATtiny2313 -U hfuse:w:0xDH:mzmieniłem fusebity i niemalże natychmiast po tym oczom moim na terminalu RS232 zamiast krzaczorów ukazał się napis DZIALA
Źródła kolejność podawania przypadkowa:
http://www.embedds.com/programming-avr-usart-with-avr-gcc-part-1/
http://www.avrprojects.net/index.php?option=c...=49:avr-c-programming-projects-&Itemid=69
http://toxygen.net/avr/
http://www.robotyka.net.pl/category/artykuly-praktyczne/avr/
http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=8
https://www.elektroda.pl/rtvforum/topic1111376.html
http://grylewicz.pl/najprostszy-programator-avr-za-3zl-do-mini-plytki-testowej/
http://www.engbedded.com/fusecalc/
http://www.ladyada.net/learn/avr/avrdude.html
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=36404
Plus cała masa for które przewaliłem szukając rozwiązań poszczególnych mniejszych i większych problemów.
Mam nadzieję że komuś się to przyda i zaoszczędzi sporo czasu.
Pozdrawiam.
