środa, 29 kwietnia 2020

Minimalne podłączenie a problemy z AVRDude

Jest to uzupelnienie artykułów z cyklu "Zrób sobie Arduino".


Ostatnio miałem pomysł na mały projekt z użyciem ADC, zacząłem od prototypu na breadboardz'ie. Założyłem że bootloader załaduję z użyciem USBASP i programu AVRDude, a potem będę używał interfejsu FTDI do ładowania programów z poziomu Arduino IDE. Jako bootloader chciałem wykorzystać Optiboot zawarty w projekcie MiniCore.

Schemat

Poniżej naprędce narysowany schemat:

Link do pobrania schematu w formacie Autodesk Eagle. Jak widać prócz przycisku reset mamy diodę LED (LED1), złącze do programowania KANDA przez programator oraz piny JP1 do programowania za pomocą bootloadera.

Sterowniki

Mój system to Windows 10, użyłem Zadig do zainstalowania sterownika libusb-win32 po podłączeniu programatora. Warto sprawdzić w managerze urządzeń czy wszystko jest OK (Windows-R uruchom: devmgmt.msc).

Problem

Niestety miałem spore problemy z programowaniem mikrokontrolera z pomocą chińskich programatorów USBASP:
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: error: program enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x000000
Nic nie pomagało, użyłem także zewnętrznego zasilania (układ prototypowy nie był zasilany z programatora).

Firmware

Rozwiązaniem było flashowanie firmware programatora USBASP opisane na tej stronie . Uwaga: rozwiązanie wymaga drugiego programatora! Zainstalowalem też najnowsze AVRDude (6.3) w lokalizacji C:\Apps\avrdude\avrdude-6.3

Ustawiłem teraz fuse bity na internal oscilator 8MHz i dodałem opcję -B 10 do AVRDude:
c:\apps\avrdude\avrdude-6.3\avrdude.exe -v -patmega328p -cusbasp -Pusb -e \
                                        -Uhfuse:w:0xda:m -Ulfuse:w:0xe2:m \
                                        -Uefuse:w:0x05:m -B 10

Bootloader

Czas na bootloader (pamiętaj o zainstalowaniu w Arduino MiniCore zgodnie z instrukcją na stronie projektu). Bootloaderów jest wiele, trzeba użyć odpowiedniego, w moim przypadku był to bootloader dla Atmegi 328p taktowanym częstotliwością 8000000 Hz i programowany przez UART0 (standard) z szybkością 38400 bodów:
cd C:\Users\xxx\AppData\Local\Arduino15\packages\MiniCore\
hardware\avr\2.0.4\bootloaders\optiboot_flash\bootloaders\atmega328p\8000000L c:\apps\avrdude\avrdude-6.3\avrdude.exe -CC:\Apps\avrdude\avrdude-6.3\avrdude.conf \ -v -p m328p -c usbasp -P usb -v \ -Uflash:w:optiboot_flash_atmega328p_UART0_38400_8000000L_B5.hex:i
Udało się, o czym świadczyła migająca dioda na płytce stykowej.

Projekt

Następnie podpiąłem interfejs FTDI, pamiętając o rezystorze 10K podciągającym RESET do VCC. Zastosowałem także rezystory 100K podciągające RX i TX do VCC.

Sprawdziłem czy flash'uje się przykładowy projekt "Blink" (trzeba najpierw go wyeksportować w środowisku Arduino - CTRL-ALT-S):
cd TwojProjekt
c:\apps\avrdude\avrdude-6.3\avrdude.exe -CC:\Apps\avrdude\avrdude-6.3\avrdude.conf \
                                         -v -p m328p -carduino -PCOM4 -b 38400 -D \
                                         -Uflash:w:Blink.ino_atmega328p_8000000L.hex:i
Udało się. Kolejne flashowania możliwe już były z poziomu Arduino IDE. Należy tylko pamiętać przy korzystaniu z MiniCore o wybraniu odpowiednich parametrów w menu Narzędzia (Tools) jak procesor, płytka, programator, itd.

Warto włączyć pokazywanie szczegółowych informacji podczas wgrywania w opcjach Arduino IDE:


Źródła

Linki jakimi się posiłkowałem:

Brak komentarzy:

Prześlij komentarz