Forum: Mikrocontroller und Digitale Elektronik avrdude 5.6 unter Linux spinnt


von Markus (Gast)


Lesenswert?

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?

von Markus (Gast)


Lesenswert?

Ich habe gerade mal die Version 5.7 aus dem SVN Archiv compiliert. Mit 
dem gleichen Ergebnis

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Was sind denn für dich ,,3-4 Befehle''?

(Mir ist deine Arbeitsweise noch nicht klar.)

von Markus (Gast)


Lesenswert?

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.
1
#!/bin/sh
2
avrdude -pm128 -cavrisp2 -Pusb -B10.0 -U lfuse:w:0xFF:m
3
avrdude -pm128 -cavrisp2 -Pusb -B10.0 -U hfuse:w:0x89:m
4
avrdude -pm128 -cavrisp2 -Pusb -B10.0 -U efuse:w:0xFF:m
5
avrdude -pm128 -cavrisp2 -Pusb -B1.0 -U flash:w:M128_16.hex:i
6
echo Press Enter to delete Device
7
read FOO
8
avrdude -pm128 -cavrisp2 -Pusb -B10.0 -e

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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...

von Markus (Gast)


Lesenswert?

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"

von Markus (Gast)


Lesenswert?

Also ich habe gerade das gleiche Problem manuell gehabt. Ich habe ein 
Hex File auf den Controller geladen. Das hat funktioniert.
1
avrdude -px128a1 -cavrisp2 -Pusb -U flash:w:port_example.hex

Anschließend wollte ich den Controller wieder löschen
1
avrdude -px128a1 -cavrisp2 -Pusb -e
2
avrdude: stk500v2_recv_mk2: error in USB receive
3
avrdude: usbdev_send(): wrote 0 out of 1 bytes, err = No error
4
avrdude: stk500_send_mk2(): failed to send command to serial port

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.
1
avrdude -px128a1 -cavrisp2 -Pusb -e
2
avrdude: stk500v2_recv_mk2: error in USB receive
3
avrdude: stk500v2_recv_mk2: error in USB receive
4
5
avrdude: AVR device initialized and ready to accept instructions
6
7
Reading | ################################################## | 100% 0.01s
8
9
avrdude: Device signature = 0x1e974c
10
avrdude: erasing chip
11
12
avrdude: safemode: Fuses OK
13
14
avrdude done.  Thank you.

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.

von Markus (Gast)


Lesenswert?

Hat keiner eine Idee? Ich komm hier nicht weiter

von MarkusB (Gast)


Lesenswert?

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

von MarkusB (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Markus B. (Firma: Embedit Mikrocontrollertechnik) (_mb_)


Angehängte Dateien:

Lesenswert?

Habe die Ausgabe mal als Textdatei angehängt. Der entscheidende Teil ist 
wohl dieser
1
         Using Port                    : usb
2
         Using Programmer              : avrisp2
3
avrdude: usbdev_open(): Found AVRISP mkII, serno: 0000B0004318
4
avrdude: usbdev_open(): using read endpoint 0x82
5
avrdude: Sent: . [01] 
6
avrdude: usbdev_recv_frame(): usb_bulk_read(): No error
7
avrdude: stk500v2_recv_mk2: error in USB receive
8
avrdude: Sent: . [01] 
9
avrdude: Recv: . [01] . [00] . [0a] A [41] V [56] R [52] I [49] S [53] P [50] _ [5f] M [4d] K [4b] 2 [32]

von Markus B. (Firma: Embedit Mikrocontrollertechnik) (_mb_)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Markus B. (Firma: Embedit Mikrocontrollertechnik) (_mb_)


Lesenswert?

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
4
5
Reading | ################################################## | 100% 0.00s
6
7
avrdude: Device signature = 0x000000
8
avrdude: Yikes!  Invalid device signature.
9
         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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Markus B. (Firma: Embedit Mikrocontrollertechnik) (_mb_)


Lesenswert?

Hö, ich dachte, das geht schon seit 5.6 ?!?! Deshalb mach ich doch die 
ganze Aktion überhaut. Und wie du weiter oben schon siehts ging es 
schonmal

1
avrdude -px128a1 -cavrisp2 -Pusb -e
2
avrdude: stk500v2_recv_mk2: error in USB receive
3
avrdude: stk500v2_recv_mk2: error in USB receive
4
5
avrdude: AVR device initialized and ready to accept instructions
6
7
Reading | ################################################## | 100% 0.01s
8
9
avrdude: Device signature = 0x1e974c
10
avrdude: erasing chip
11
12
avrdude: safemode: Fuses OK
13
14
avrdude done.  Thank you.

Bis auf den USB receive Error ging das schonmal

von Markus B. (Firma: Embedit Mikrocontrollertechnik) (_mb_)


Lesenswert?

So, der Fehler ist dank Jörgs Hilfe gefunden und behoben. Der Patch 
findet sich im SVN Repository

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.