logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATtiny2313 zewnętrzny kwarc 8 MHz, RS232 i avr-gcc

piroaa 11 Maj 2013 20:09 2688 3
  • #1 12296139
    piroaa
    Poziom 11  
    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 :D

    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 t2313

    jednak 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 t2313

    dzię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++
    Zaloguj się, aby zobaczyć kod

    I próbujemy kompilować zgodnie z instrukcją dołączoną na stronie :
    avr-gcc -mmcu=attiny2313 program.c -o program

    I 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.hex

    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 :
    avrdude -c bascom  -p t2313 -U flash:w:program.hex

    I 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++
    Zaloguj się, aby zobaczyć kod

    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:-:h

    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 :
    avrdude -c bascom -p ATtiny2313 -U lfuse:w:0xE4:m 
    avrdude -c bascom -p ATtiny2313 -U hfuse:w:0xDH:m

    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.
  • #2 12297322
    dondu
    Moderator na urlopie...
    Zamiast opracowywać własny wzór obliczania parametrów prędkości transmisji, wystarczy wykorzystać setboud.h:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Stosowanie pullingu flagi UDRE i wstrzymywanie w pętli mikrokontrolera, jest stratą mocy obliczeniowej.
    Wystarczy wykorzystać przerwania: http://mikrokontrolery.blogspot.com/2011/03/rs-232-atmega8-komputer-terminal.html

    I drobna uwaga - nie definiuj F_CPU w kodzie z tych powodów: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html
  • #3 12308504
    piroaa
    Poziom 11  
    Dzień dobry.
    Dziękuje za porady na pewno się przydadzą.
    Co do wzoru na prędkość transmisji to nie jest mój wynalazek, wyciągnąłem go z datasheeta, kilka osób na których się wzorowałem robiło dokładnie w ten sam sposób a widziałem nawet sposób taki w którym wpisuje się do rejestrów UBRRH i UBRRL odpowiednie wartości wyciągnięte z datasheeta.
    Makro pozwoliłem sobie wytestować działa dobrze kod wynikowy nie rośnie w żaden sposób więc myślę że będę z niego korzystać jest wygodne.
    Co do F_CPU zapoznałem się i jeśli dobrze rozumiem problem dotyczy tylko sytuacji w której program zawarty jest w kilku plikach. Tak na wszelki wypadek kompiluję teraz tak :
    avr-gcc -mmcu=attiny2313 led.c -o led.o -O2 -DF_CPU=8000000UL

    Jest to o tyle wygodne że zmieniając kwarc nie muszę zmieniać nic w plikach programu.
    Natomiast za nic nie mogę zrozumieć o co chodzi z flagą UDRE. Gdyby mógł pan napisać coś więcej ...
    Pozdrawiam.
  • #4 12311620
    dondu
    Moderator na urlopie...
    Ty stosujesz tzw. pulling, czyli sprawdzanie flagi w tym wypadku w pętli:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    czyli CPU kręci się w pętli i czeka na to, aż flaga da znać, że można dać następny bajt do transmisji.

    Wskazałem Ci link do artykułu pokazującego jak wykorzystać przerwania, by mikrokontroler zwolnić z ciągłego sprawdzania flagi UDRE.
REKLAMA