Hi, ich möchte mich ein wenig mit den Xmega befassen und hab aus diesem
Grund versucht, avrdude 5.6 unter Ubuntu 9.04 zu installieren.
Zuerst hab ich versucht, ein compiliertes *.deb Paket zu installieren.
Anschließend habe ich versucht, den Code zu compilieren.
Ich hab zuerst versucht, den Code von der Projekthomepage zu
compilieren. Da bekam ich zuerst nur Fehler. Anschließend hab ich den
Code von launchpad.net compiliert. Letztendlich konnte ich beides
compilieren.
Allerdings hatte sowohl die Version aus dem *.deb Paket als auch die
compilierten Versionen das gleiche Problem. Ich kann 3-4 Befehle
ausführen, dann hat sich die USB Verbindung aufgehängt. Ich muss immer
den AVRISP mkII abziehen und wieder einstecken, damit es wieder
funktioniert.
Die Version 5.5 aus den Paketquellen funktioniert einwandfrei. Woran
liegt das? Kann man das Problem irgendwie lösen?
ich habe ein Script geschrieben. Ich programmiere zuerst die drei
Fusebytes und anschließend ein HEX File ins Flash. Nach einem
Tastendruck führe ich noch ein Erase aus.
Aber auch wenn ich manuell arbeite (einzelne Befehle in die
Kommandozeile eingebe passiert das.
Mit avrdude 5.5 aus den Paketquellen funktioniert alles, auch beliebig
oft.
Sehr unglückliche Vorgehensweise. Die USB-basierten Geräte von
Atmel klemmen sich am Ende einer Sitzung erstmal vom Bus ab und
neu wieder an. Damit muss das Betriebssystem sie aus der Liste
der USB-Geräte austragen, anschließend werden sie neu zugeordnet.
Je nach Betriebssystem dauert das unterschiedlich lange, und
zwischendurch ist ggf. dein Gerät gar nicht auffindbar am Bus.
AVRDUDE selbst kann dabei gar nichts tun: der gesamte USB-Zugriff
ist über die libusb abstrahiert. Was dabei im Untergrund genau
passiert, ist für AVRDUDE komplett uninteressant.
Schreib alle Aktionen in eine Kommandozeile (musst du
eigentlich wirklich jedesmal alle Fuses programmieren?). Du
kannst beliebig viele -U-Optionen hintereinander ins Kommando
schreiben, die werden dann alle der Reihe nach abgearbeitet.
OK, ich sehe, dass du zuerst die Fuses für den Takt passend
setzen willst, damit du danach mit einem kleineren -B-Wert
auskommst. In diesem Falle schreib' für alle Fälle ein "sleep 2"
zwischen die beiden Aufrufe. Da ist dann allerdings die Frage,
ob es nicht schneller ist, gleich alles mit -B10 abzuarbeiten...
Zunächst mal hat es nichts mit der Vorgehensweise in dem Script zu tun.
auch wenn ich die Befehle in die Kommandozeile eingebe ist irgendwann
Ende. In dem Script ist es sogar nachvollziehbar so, das nur der letzte
Befehl (Erase) nicht mehr funktioniert, der erst nach einer längeren
Pause ausgeführt wird.
Ich habe im Übrigen auch ein Problem damit, mehrere Fusebytes
hintereinander zu schreiben. Das habe ich hier auch schonmal
Thematisiert
Beitrag "Problem mit avrdude beim Fusebit schreiben"
Ich musste den AVRISP mkII vom USB Port abziehen. Das von Jörg
beschriebene Problem kann es also nicht sein. Das Problem habe ich bei
allen getesteten Varianten von avrdude 5.6 unter Linux, egal ob selbst
compiliert oder als deb Paket, egal ob unter Ubuntu Jaunty oder Karmic
Ich habe es gerade nochmal wiederholt. Beim Erase habe ich etwas
gewartet.
Beide LEDs leuchten grün, die USB LED blinkt ein oder zwei mal. Wenn ich
den Erase Befehl auf ein gelöschtes Device ausführe funktioniert es
sofort. Das ganze lässt sich verifizieren.
Als Referenz habe ich den Test unter windows mit dem AVR Studio gemacht.
Da funktioniert es problemlos.
Interessant ist auch, dass das Problem mir bei einem programmierten Chip
auftritt. Wenn ein Erase einmal durchgeführt wurde kann ich anschließend
beliebig oft löschen, ohne das das Problem auftaucht.
Es liegt auch nicht am Xmega. Habe das gleiche Problem mit einem Mega8.
Hi, ich habe jetzt mal avrdude 5.8 compiliert. Immer noch das gleiche
Problem
Hier ein bei mir nachvollziehbares Beispiel an einem ganz normalen
ATmega32:
1
avrdude -pm32 -cavrisp2 -Pusb -U flash:w:main.hex
Wenn ich diesen Befehl 2x hintereinander ausführen will (mit Pause, zb
weil ich das Programm neu compiliert habe) kommt beim zweiten Aufruf
nach einer gewissen Wartezeit wieder der Fehler
1
avrdude: stk500v2_recv_mk2: error in USB receive
Anschließend führt er den Befehl aber aus. Das Problem habe ich unter
Linux druchgängig seit Version 5.6. In der Version 5.5 funktioniert das
ohne Fehler.
Wenn ich wüsste wo und wie, würde ich ja bei der Fehlersuche helfen.
Aber ich kann nicht bei Null anfangen
So, ich beschreibe das noch einmal genauer. Ich gehe von einem komplett
frisch angeschlossenen Programmer (USB Verbindung vorher getrennt) und
AVR aus.
Der erste Befehl mit -U flash:w:main.hex funktioniert, beim zweiten
tritt der Fehler auf, der dritte funktioniert, der vierte wieder nicht
usw.
Wenn ich als ersten Befehl -U flash:w:main.hex ausführe und dieser ohne
Fehler durchläuft, bekomme ich anschließend auch bei einem Erase Befehl
(-e) den USB Error. Erase wird aber anschließend ausgeführt. Jeder
weitere Erase Befehl erzeugt den Fehler. Ein -U flash erzeugt auch einen
Fehler, ein weiterer läuft wieder fehlerfrei.
Klingt jetzt etwas verwirrend, ist bei mir hier aber beliebig
verifizierbar.
Um andere Fehlerquellen auszuschließen hab ich alles Mögliche
ausprobiert. Anderer AVRISP mkII, anderen Rechner, anderes Kabel,
mit/ohne Hub. Einzige Konstanten sind Linux und avrdude >5.6. avrdude
5.5 hat diesen Fehler nicht. Die Pausen sind mehrere Sekunden lang.
Ich vermute, dass irgend was bei der Initialisierung des USB Port
durcheinander gerät, entweder beim Verbinden am Anfang oder beim Trennen
am Ende eines Befehls.
Ehrlich gesagt: ich habe keinen Plan, was bei dir da schief läuft.
Ich benutze AVRDUDE im wahrsten Sinne des Wortes für die tägliche
Arbeit, und dort auch und gerade unter Linux (zu Hause unter
FreeBSD). Ich habe dein Problem noch nie in diesr Form (geht,
geht nicht, geht, geht nicht -- wenn ich dich recht verstehe)
erlebt.
Einziger Unterschied: bei uns ist das Programmiergerät praktisch
immer ein JTAG ICE mkII, kein AVRISPmkII.
Du kannst mittels -vvvv (viermal die "-v") sehr viel Debuginformation
rausholen, du kannst ja mal schauen, ob es immer beim gleichen Stück
Kommunikation stecken bleibt.
Habe gerade ein JTAGICE mkII im JTAG Mode getestet. Da habe ich das
Problem, dass man nach einer Operation 2-3 Sekunden warten muss, aber
der "error in USB receive" Fehler tritt bisher nicht auf. (Getestt mit
einem ATmega2561)
Wo ich schon dabei war hab ich auch gleich mal den Dragon angeklemmt. Im
ISP Mode gibts einen Segmentation fault. dragon_jtag funktioniert, auch
beliebig oft ohne USB receive Error.
Und weil's so schön war noch JTAGICE mkII im ISP Mode. Da geht soweit
alles.
Markus Burrer schrieb:
> Habe gerade ein JTAGICE mkII im JTAG Mode getestet. Da habe ich das> Problem, dass man nach einer Operation 2-3 Sekunden warten muss, aber> der "error in USB receive" Fehler tritt bisher nicht auf. (Getestt mit> einem ATmega2561)
Hmm, dann muss ich mir das nochmal mit einem AVRISPmkII unter Linux
ansehen. Unter FreeBSD hab' ich's erst vor ein paar Tagen benutzt,
da klappt alles. Das dumme ist:
avrdude: usbdev_recv_frame(): usb_bulk_read(): No error
usb_bulk_read() aus der libusb gibt einen Fehlercode zurück, wenn
man aber den Fehler abfragt, behauptet es "No error". Das verstehe
wer will.
Welche Version der libusb hast du denn? Vielleicht hat ja dort
jemand in letzter Zeit was versaubeutelt. Das AVRISPmkII benimmt
sich ein wenig anders als die anderen Programmer, da man dort kein
zusätzliches Framing hat, aus dem die Anzahl der zu lesenden Bytes
hervorgeht, sondern man muss lesen, bis man vom USB nichts mehr
bekommt. Das würde zumindest den Unterschied erklären (STK600
wäre übrigens ähnlich).
Man könnte natürlich den Fehlerstatus von usb_bulk_read() ignorieren,
wenn der Fehler dann hinterher "No error" ist, aber das wäre 'ne
ziemliche Krücke. Eigentlich müsste man einen Bugreport bei
libusb los werden, aber ich fürchte, dass die an den 1.xer Versionen
nicht mehr viel machen wollen. Leider kommen die 2er Versionen
derzeit überhaupt nicht in Frage, da sie ausschließlich auf Linux
laufen; kein *BSD, kein Windows, kein Solaris.
> Wo ich schon dabei war hab ich auch gleich mal den Dragon angeklemmt. Im> ISP Mode gibts einen Segmentation fault.
Ja, leider bin ich diesen Kuddelmuddel mit den privaten Daten zweier
verschachtelter Programmer (Dragon ist im Prinzip wie ein JTAG ICE
mkII und wird durch diesen Programmer gehandhabt, aber für ISP wird
dann darin ein STK500v2-Protokoll eingschlossen) doch noch nicht los,
das habe ich vor zwei Tagen selbst erst bemerkt. Eigentlich war
dafür die Hau-ruck-Aktion mit dem schnellen Release von 5.8 da,
schade, dass ich da immer noch was übersehen habe.
So, eine (kleine) Entwarnung kann ich geben. Ich habe gerade die Alpha 4
von Ubuntu 9.10 frisch installiert. Da ist avrdude 5.8 schon dabei. Bei
meinem letzten Test mit 9.10 war es noch 5.6.
Bisher konnte ich den Fehler nicht reproduzieren.
Ein Problem, das ich vorher schon hatte, aber noch nicht erwähnt habe,
ist, dass ich keine Xmega programmieren kann.
1
~$ avrdude -px128a1 -cavrisp2 -Pusb -e
2
3
avrdude: AVR device initialized and ready to accept instructions
Double check connections and try again, or use -F to override
10
this check.
11
12
13
avrdude done. Thank you.
gleiches passiert beim ATxmega32A4. Das ist bei 5.6 so weit ich mich
erinnern kann aber schonmal (halbwegs) gegangen. Von Windows mit dem AVR
Studio funktioniert alles.
Nein, Xmega mit AVRISPmkII habe ich noch nicht gemacht. Wenn dir
daran gelegen ist, dann frag Atmel nach entsprechender Doku. Die
ist nämlich leider Mangelware.