Programowanie ATmega za pomocą pliku hex

Zbiór tutoriali związanych z Arduino.
ODPOWIEDZ
Mateusz88
Młodszy majsterkowicz
Posty: 43
Rejestracja: 16 wrz 2012, 14:41

Programowanie ATmega za pomocą pliku hex

Post autor: Mateusz88 » 22 lis 2012, 12:02

W internecie jest sporo ciekawych projektów, które można zbudować np. programator USBasp http://www.fischl.de/usbasp/ lub Atmega fusebit doctor http://mdiy.pl/atmega-fusebit-doctor-hvpp/ który pozwala odblokować uC. Niestety w Arduino IDE nie da się wgrać takiego programu, bo jest on w formie pliku z rozszerzeniem hex. W tym tutorialu pokaże, jak wgrać taki plik na zewnętrzny uC za pomocą ArduinoISP i programu avrdude. Wszystkie komendy, które będą tu przedstawione są przystosowane dla ATmega168P, dla innych uC należy je odpowiednio zmodyfikować.

1. Wgrywamy ArduinoISP na Arduino
2. Szukamy w katalogu Arduino plików avrdude.exe i avrdude.conf następnie kopiujemy je np. do folderu na pulpicie
3. Uruchamiamy wiersz poleceń cmd i komendą "cd" przechodzimy do folderu do którego skopiowaliśmy pliki z poprzedniego punktu. U mnie to polecenie wygląda tak: "cd C:\Users\Ja\Desktop\avrdude"
4. Wpisujemy "avrdude -c avrisp" i z listy, która się pokaże wybieramy nazwę uC najbardziej zbliżoną do naszego, u mnie "atmega168p"
5. Wpisujemy "avrdude -p atmega168p -c AVRisp -P com3 -b 19200 -U lfuse:r:-:h -U hfuse:r:-:h"
(pamiętajcie zmienić w poleceniu nazwę uC i numer portu com). Wynikiem tego polecenia powinno być coś takiego:

Kod: Zaznacz cały

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.07s

avrdude: Device signature = 0x1e940b
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file "<stdout>"
0xff
avrdude: reading hfuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file "<stdout>"
0xdf

avrdude: safemode: Fuses OK

avrdude done.  Thank you.
Jeśli wynik tego polecenia bardziej przypomina ten poniżej, to w punkcie 4 źle wybraliście nazwę waszego uC

Kod: Zaznacz cały

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.09s

avrdude: Device signature = 0x1e940b
avrdude: Expected signature for ATMEGA168 is 1E 94 06
         Double check chip, or use -F to override this check.

avrdude done.  Thank you.
6. W tym punkcie należy zachować szczególną ostrożność zapis błędnych fusebitów grozi zablokowaniem uC (odblokowanie jest możliwe za pomocą Atmega fusebit doctor, ale ten przecież dopiero budujemy :-) ). Poprawnych fusebitów należy szukać w dokumentacji projektu, który budujemy (zazwyczaj plik readme.txt). "avrdude -p atmega168p -c AVRisp -P com3 -b 19200 -U lfuse:w:0x62:m -U hfuse:w:0xdf:m" (to tylko przykładowe polecenie, które ma pokazać składnie)
7. Teraz możemy już wgrać plik hex, który najlepiej umieścić obok pliku avrdude.exe, unikniemy wtedy wpisywania całej ścieżki do tego pliku, wystarczy sama nazwa, "avrdude -p atmega168p -c AVRisp -P com3 -b 19200 -U flash:w:Blink.hex"

Arduino IDE jest tak naprawdę nakładką na program avrdude, kod który piszemy jest kompilowany i zapisywany na dysku w formie pliku hex i w tej formie wysyłany do uC. Jeśli chcecie przetestować ten tutorial polecam zaopatrzyć się w plik Blink.cpp.hex. Aby go stworzyć należy uruchomić Arduino IDE, wczytać program Blink, wybrać z listy uC który będziemy programować i kliknąć Verify. Po kompilacji wystarczy poszukać na dysku pliku Blink.cpp.hex i przenieść do folderu z avrdude.

Jeśli ktoś już ma programator USBasp to powyższe komendy dla tego programatora będą wyglądać tak:
avrdude -p atmega168p -c usbasp -U lfuse:r:-:h -U hfuse:r:-:h
avrdude -p atmega168p -c usbasp -U lfuse:w:0x62:m -U hfuse:w:0xdf:m
avrdude -p atmega168p -c usbasp -U flash:w:Blink.hex

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


ODPOWIEDZ

Strony partnerskie: