Mam problem z programowaniem ATxmega16D4 przez podróbkę AVRISP mkII na Windows 7 Professional. Podłączam procesor przez interfejs PDI i wywołuję AVRDUDE:
Tu program zawiesza się na półtorej minuty (lub kilkanaście sekund w przypadku AVRDUDE v5.10), a następnie kontynuuje pracę:
Następnie znów się zawiesza i wykonuje kolejną operację, np. programowanie Flasha (przy czym samo programowanie odbywa się normalnie, w ciągu sekundy, bez żadnych opóźnień). Mówiąc w skrócie, AVRDUDE zachowuje się tak, jakby zawieszał się za każdym razem, gdy nawiązuje połączenie z programatorem. Zjawisko to występuje z dwoma programatorami od różnych producentów, ale tylko przy używaniu AVRDUDE na Windowsie. AVR Studio, narzędzie CLI do obsługi programatorów udostępniane przez Atmela, czy nawet AVRDUDE, ale pod Linuksem, sprawują się bez zarzutu (ten sam komputer, ten sam programator, ten sam prototyp).
Czy ktoś ma jakieś pomysły? Dodam, że używam libusb z filtrowaniem (żeby nie gryzło się z AVR Studio), instalowałem też kilka starszych wersji libusb, usuwałem AVR Studio, wgrywałem najnowszy soft LUFA do programatora itp. Jak wspominałem, jedynie przy AVRDUDE 5.10 było o tyle lepiej, że zwiecha następowała tylko na kilkanaście sekund.
Edycja:
Skompilowałem AVRDUDE zgodnie z przykładową instrukcją. W pliku usb_libusb.c zmieniłem timeout w wywołaniu funkcji usb_bulk_read() (wewnątrz funkcji usbdev_recv_frame(), linijka 395). Zamiast
dałem
Zmniejszyło to opóźnienie ze 100s na 300ms. Skrócenie tego czasu do 100ms sprawia, że czasem (raz na kilkanaście prób) całe połączenie z programatorem zostaje przerwane (przy następnej próbie wraca do normy).
Rozwiązanie jest więc raczej prowizoryczne, ale umożliwia pracę. W załączniku program z poprawką, gdyby ktoś chciał porównać działanie.
D:\vmario\Bin\AVRDUDE\avrdude-5.11-Patch7610-win32>avrdude -c avrisp2 -p x16d4 -P usb -vvvv
avrdude: Version 5.11-Patch#7610, compiled on Aug 31 2011 at 08:02:19
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch
System wide configuration file is "D:\vmario\Bin\AVRDUDE\avrdude-5.11-Patch7610-win32\avrdude.conf"
Using Port : usb
Using Programmer : avrisp2
avrdude: usbdev_open(): Found AVRISP mkII, serno: 000200012345
avrdude: usbdev_open(): using read endpoint 0x82
avrdude: Sent: . [01]Tu program zawiesza się na półtorej minuty (lub kilkanaście sekund w przypadku AVRDUDE v5.10), a następnie kontynuuje pracę:
avrdude: Recv: . [01] . [00] . [0a] A [41] V [56] R [52] I [49] S [53] P [50] _
[5f] M [4d] K [4b] 2 [32]
avrdude: stk500v2_getsync(): found AVRISP mkII programmer
AVR Part : ATXMEGA16D4
Chip Erase delay : 0 us
PAGEL : P00
BS2 : P00
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 0
StabDelay : 0
CmdexeDelay : 0
SyncLoops : 0
ByteDelay : 0
PollIndex : 0
PollValue : 0x00
Memory Detail :
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
eeprom 0 0 0 0 no 1024 32 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
application 0 0 0 0 no 16384 256 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
apptable 0 0 0 0 no 4096 256 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
boot 0 0 0 0 no 4096 256 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
flash 0 0 0 0 no 20480 256 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
prodsig 0 0 0 0 no 512 256 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
usersig 0 0 0 0 no 512 256 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
signature 0 0 0 0 no 3 0 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
fuse0 0 0 0 0 no 1 0 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
fuse1 0 0 0 0 no 1 0 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
fuse2 0 0 0 0 no 1 0 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
fuse4 0 0 0 0 no 1 0 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
fuse5 0 0 0 0 no 1 0 0 0
0 0x00 0x00
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max
W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
lockbits 0 0 0 0 no 1 0 0 0
0 0x00 0x00
Następnie znów się zawiesza i wykonuje kolejną operację, np. programowanie Flasha (przy czym samo programowanie odbywa się normalnie, w ciągu sekundy, bez żadnych opóźnień). Mówiąc w skrócie, AVRDUDE zachowuje się tak, jakby zawieszał się za każdym razem, gdy nawiązuje połączenie z programatorem. Zjawisko to występuje z dwoma programatorami od różnych producentów, ale tylko przy używaniu AVRDUDE na Windowsie. AVR Studio, narzędzie CLI do obsługi programatorów udostępniane przez Atmela, czy nawet AVRDUDE, ale pod Linuksem, sprawują się bez zarzutu (ten sam komputer, ten sam programator, ten sam prototyp).
Czy ktoś ma jakieś pomysły? Dodam, że używam libusb z filtrowaniem (żeby nie gryzło się z AVR Studio), instalowałem też kilka starszych wersji libusb, usuwałem AVR Studio, wgrywałem najnowszy soft LUFA do programatora itp. Jak wspominałem, jedynie przy AVRDUDE 5.10 było o tyle lepiej, że zwiecha następowała tylko na kilkanaście sekund.
Edycja:
Skompilowałem AVRDUDE zgodnie z przykładową instrukcją. W pliku usb_libusb.c zmieniłem timeout w wywołaniu funkcji usb_bulk_read() (wewnątrz funkcji usbdev_recv_frame(), linijka 395). Zamiast
Kod: C / C++
dałem
Kod: C / C++
Zmniejszyło to opóźnienie ze 100s na 300ms. Skrócenie tego czasu do 100ms sprawia, że czasem (raz na kilkanaście prób) całe połączenie z programatorem zostaje przerwane (przy następnej próbie wraca do normy).
Rozwiązanie jest więc raczej prowizoryczne, ale umożliwia pracę. W załączniku program z poprawką, gdyby ktoś chciał porównać działanie.