[początkujący] Problem z zaprogramowaniem atmega8a

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
wszak
Młodszy majsterkowicz
Posty: 2
Rejestracja: 23 cze 2014, 21:24
Lokalizacja: Poznań

[początkujący] Problem z zaprogramowaniem atmega8a

Post autor: wszak » 23 cze 2014, 22:11

Dzień dobry. To mój pierwszy post tutaj. Piszę tu, bo widziałem tu kilka postów na ten temat, ale niestety żaden nie był w stanie pomóc w rozwiązaniu mojego problemu.

W skrócie - mam 2x atmega8a-pu kupione na allegro. Chce na tym uruchomić najprostsza migającą diodę.
Drobne utrudnienie, że działam spod linuxa, ale to chyba nie powinno mieć wpływu. Programator mam usbAsp.

Podłączyłem sobie wszystko wg. schematów dostępnych w sieci, z uwzgl. pinów mojego procka. W Arduino IDE załadowałem projekt/schemat Blink - tj migająca dioda. Pierwsza próba wysłania na procek - "udana". Tj były jakieś warningi, ale nic poza tym. Niestety dioda nie zaczęła migać. To sobie pomyślałem, że skoro to program korzystający z bibl. Arduino, to pewnie trzeba najpierw wgrać bootloader Arduino. To i wgrałem ten bootloader. Z tym, że w ArduinoIDE nie ma Atmega8a, więc wybrałem "Arduino NG or older w/ atmega8" sugerując się opinią z neta, że 8 i 8a są właściwie takie same. Niestety dostałem wtedy komunikat błedu:

Kod: Zaznacz cały

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: error: programm enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
Od tego czasu już dostawałem ww komunikat - czy chciałem wysłac program czy bootloader na procka.
Zastanawiałem się w czym rzecz i wymyśliłem, że w schemacie Blink, domyślnie led miał mrugać na pinie 13. Ja podłączyłem diodę do pinu 13 ale fizycznego (tj. 13. nóżki uC) i być może dlatego nie mrugała dioda. A pin 13 to pin SCK czyli ten o którym mówi powyższy komunikat błedu. Więc sobie wymyśliłem, że może przeprogramowałem uC (znaczy ten pin) tak, że teraz już się go nie da więcej przeprogramować, bo zamiast funkcji "sck" teraz ten pin będzie zawsze mrugał diodą ;) (tak na chłopski rozum) Ale i tak nie mruga.

Więc... wziąłem drugi uC i tym razem pomyślałem, że najpierw wgram bootloader a potem schemat Blink ze zmienionym pinem led na 2. No ale sytuacja powtórzyła się tj. po wgraniu BL (BootLoadera) dostaję ten sam komunikat.

Odpalając avrdude z linii poleceń, z param. -F dostaję:

Kod: Zaznacz cały

avrdude -p atmega8 -c usbasp -F
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: error: programm enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0xc8f761
avrdude: Expected signature for ATmega8 is 1E 93 07
Ten 0xc8f761 jest zmienny - inny za każdym wywołaniem.


Teraz wypadałoby spróbowac wgrać sam zmodyfikowany Blink bez BL, ale nie mam już 3-ciego uC...

Żeby nie było że to może wina linuxa, podmapowałem ten programator USB do Windowsa XP działającego w wirtualnej maszynie. Odpaliłem tam też mkAvrKalkulator odpowiednio skonf. ale dalej jest ten sam błąd - z tą różnicą, że jego wersja avrdude powiada, że Device signature = 0x000000.

Więc pomyślałem, że może zbrikowałem moje uC wgrywając ten bootloader. Sprawdzam konfig Arduino IDE (dla "Arduino NG or older w/ atmega8") i tam widzę, że jako fusebity on ma wpisane

Kod: Zaznacz cały

atmega8.bootloader.low_fuses=0xdf
atmega8.bootloader.high_fuses=0xca
atmega8.bootloader.unlock_bits=0x3F
atmega8.bootloader.lock_bits=0x0F
Wpisałem te wartości (df ca) do mkAvrKalkulator żeby zobaczyć co one znaczą. I ten pokazuje, że przy tych fusebitach nie jest ustawiona żadna częstotliwość zegara - ani wewn. ani zewn. Nie wiem w ogóle jak to możliwe, że się tak da, no ale możecie sami zobaczyć.

Potem znalazłem na stronach tego forum konfig dla atmegi8a, no ale to już trochę za późno.

Więc pytanie moje jest takie:
Czy możliwe, że faktycznie wina leży po stronie tych fusebitów? Że to te ustawienia powodują takie właśnie zachowanie uC?
Może ma ktoś niepotrzbny uC i chce to sprawdzić? :->
A może jednak to jest coś innego i mam szukać dalej?
Co radzicie w ogóle zrobić? Próbować z zewn. zegarem? Nie mam kondensatorów 22pF, więc jak już to będę musiał kombinować z jakimś innym generatorem np ne555 - ale na jaką częstotliwość go ustawić?

Z góry dziękuję za pomoc!

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: [początkujący] Problem z zaprogramowaniem atmega8a

Post autor: v-cu » 24 cze 2014, 13:53

Znowu kolejny temat z atmegą8 -.-
Kurcze, programowałem już ich chyba z 5. Jeszcze jedną mam nową w zapasie. Ja robiłem tak:
Wchodziłem w mkavrcalculator ustawiałem uC na zew. oscylowanie 8mhz, podpinałem kwarc 8mhz. Potem wchodziłem w arduino ide wgrywałem podstawowego blinka i wszystko grało. Jeszcze plik konfig z tego forum wystarczyło wgrać do boards i już. Opisywałem już to chyba w 2 postach...
Z drugiej strony na majsterkowie pojawił się niedawno poradnik o atmedze8 i tam też był plik konfig..
Pozdrawiam
Artur997
Majsterkowicz
Posty: 101
Rejestracja: 23 paź 2013, 20:22

Re: [początkujący] Problem z zaprogramowaniem atmega8a

Post autor: Artur997 » 24 cze 2014, 20:24

Ale namieszaliście :-)

Po kolei:
1) po pierwsze najważniejsze jest odpowiednie przypisanie pinów. Ten obrazek mówi wszystko:
Obrazek
czyli migająca dioda na pinie 13 Arduino to pin nr 19 Atmegi. Więc dioda (+rezystor) do nóżki nr 19.
2) żeby programować przez USBasp, trzeba odpowiednio kabelki połączyć. Te kabelki to MOSI, MISO, SCK, RESET oraz daw zasilania (VCC i GND). Kabelkologia:
Obrazek
3) Mając podpięte kabelki próbujemy dogadać się z ATmegą. Nie pamiętam składni avrdude, używam graficznej nakładki avrdudess (http://blog.zakkemble.co.uk/avrdudess-a ... r-avrdude/). Po podłączeniu wybieram programator (USBasp) a potem klikam "Detect" i powinno wykryć model podpiętego mikrokontrolera.

Oczywiście w 90% go nie wykryje (błędy typu "unknown signature" albo "expected signature"), bo to by było zbyt proste :-D

W 99% problemem są fusebity, a dokładniej niewłaściwa konfiguracja zegara.

Najprościej użyć tego kalkulatora online: http://www.engbedded.com/fusecalc. Wybieramy z listy mikrokontroler i widać, że domyślne ustawienia dla ATmego8A to E1 D9, które definiują wewnętrzny zegar na 1MHz.

Krok pierwszy to wymuszenie niższej częstotliwości programowania. Nie wiem jak to będzie z linii komend, ale w avrdudess wybieram zamiast 1.5MHz coś niższego, chociażby 1kHz. O, mam, trzeba wpisać "avrdude -c usbasp -p m16 -B 750.0" (1kHz), albo "-c usbasp -p m16 -B 2.0" (375kHz)

Jak to nie pomogło, to zapewne kwarcu brakuje. I jest to najczęstszy problem, wgrywając bowiem bootloader z Arduino od razu fusebity się przestawiły (stąd też "działało, ale tylko raz"). Rada prosta: do pinów 9 i 10 podłączamy kwarc 8-16MHz. Podłączamy USBasp i powinno zaskoczyć od razu. Ew na płytce stykowej można dodać 2 kondensatory 22pF od pinów 9 i 10 do masy.

Jeżeli te dwa sposoby zawiodą - o, to dopiero jest problem. Są spore szanse że układ jest zbrickowany, najlepiej poszukać kogoś kto ma stary, zewnętrzny programator. Spotkałem też takie cudo: http://mdiy.pl/atmega-fusebit-doctor-hvpp/ ponoć daje radę.

Podpowiedzi:
w boards.txt musi być wpis typu:
atmega8A.build.mcu=atmega8
wtedy Arduino IDE będzie kompilowało pod ATmegę8(A)

Komunikat "avrdude: warning: cannot set sck period. please check for usbasp firmware update." spokojnie można zignorować, o ile nie podłącza się Atmegi do kwarcu poniżej 32kHz.

I no panic, sam zbrockowałem ATmegi ze 30 razy, wszystkie przywróciłem do życia :-)
wszak
Młodszy majsterkowicz
Posty: 2
Rejestracja: 23 cze 2014, 21:24
Lokalizacja: Poznań

Re: [początkujący] Problem z zaprogramowaniem atmega8a

Post autor: wszak » 25 cze 2014, 17:29

Rzeczywiście, okazało się, że wgrywając bootloader ustawiał on fusebity tak, że uC oczekiwał zewnętrznego zegara/kryształu (którego nie miałem). Dopiero jak podłączyłem zewn. zegar wszystko ruszyło. Bardzo dziękuje za pomoc!
ODPOWIEDZ

Strony partnerskie: