Forum: Mikrocontroller und Digitale Elektronik Problem mit avrdude und mysmartusb light


von Christian (chris1)


Lesenswert?

Hallo,

ich habe ein sehr seltsames Problem mit meinem mysmartusb light AVR ISP 
Programmer in Verbindung mit avrdude. Programmieren mittels Tools des 
Sticks funktioniert einwandfrei. Wenn ich es allerdings mit avrdude 
versuche, hängt der Schreibvorgang einige male, welcher anscheinend mit 
100% abgeschlossen wird - die Verifikation am Ende schlägt allerdings 
fehl:

----------------------------------
Writing | #####################                              | 42% 
0.22savrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): found STK500 programmer
Writing | #############################                      | 57% 
21.08savrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): found STK500 programmer
Writing | ####################################               | 71% 
41.92savrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): found STK500 programmer
Writing | ################################################## | 100% 
62.83s

...

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0046
         0xe0 != 0xee
avrdude: verification error; content mismatch
----------------------------------


Das Seltsame ist allerdings folgendes: beschreibe ich den Atmega88 mit 
dem beiliegenden Tool und schreibe danach mit avrdude genau das selbe 
.hex File, funktioniert es. Erstelle ich ein neues .hex File indem ich 
den Code ändere und neu baue, schlägt es mit avrdude wie oben 
beschrieben fehl.

Ich habe bereits den Stick für die Verwendung von avr911/avr910 
konfiguriert und es damit versucht, auch mit und ohne externer 
Stromversorgung, hat nichts geholfen.

Programmiert wird ein Atmega88.

Grüße,
Christian

: Bearbeitet durch User
von Johannes F. (jofe)


Lesenswert?

Christian schrieb:
> mysmartusb light AVR ISP
> Programmer

Hallo,

ich kann zwar gerade keinen Tipp zur genauen Ursache des Problems geben, 
möchte dir aber generell empfehlen, statt dieses Tools einen billigen 
Arduino-Nachbau wie z.B.
https://www.reichelt.de/de/de/shop/produkt/arduino_kompatibles_nano_board_atmega328pb_usb-c-372020 
(derzeit 8,15€)
zu erwerben und darauf eine Open-Source-AVRISPv2-Firmware zu flashen. 
Damit kannst du dann mittels avrdude und dem STK500v2-Protokoll andere 
ISP-AVRs flashen.

Von myAVR hatte ich als AVR-Anfänger zunächst auch einige Produkte 
benutzt (u.a. mySmartUSB mkii), würde aber inzwischen eher davon 
abraten, da ich bei denen schon über zahlreiche Bugs gestolpert bin und 
es mittlerweile sowohl bessere als auch gleichzeitig günstigere Lösungen 
gibt.

: Bearbeitet durch User
von Christian (chris1)


Lesenswert?

Danke für die Info, das ist eine tolle und günstige Alternative!

Ich habe das Problem bereits gefunden. Zum Entwickeln verwende ich 
PlatformIO, und setze unter anderem upload_protocol = stk500v2 in der 
Config. Das ist soweit auch korrekt, allerdings gibt es hier einen 
kleinen Haken: Der Upload Befehl der dafür verwendet wird, beinhaltet 
das Flag -D, welches zur Folge hat, dass der Speicher vor dem Schreiben 
nicht gelöscht wird:

---
 -D                     Disable auto-erase for flash memory
---

Glücklicherweise kann man das Command zum Uploaden in PlatformIO auch 
selbst definieren, damit funktioniert es wieder.

von Johannes F. (jofe)


Lesenswert?

Christian schrieb:
> Danke für die Info, das ist eine tolle und günstige Alternative!

Zufällig arbeite ich übrigens seit einiger Zeit an genau solch einem 
Programm, also versuche quasi ein AVRISPv2 (in Assembler) 
nachzuprogrammieren; bin damit fast fertig (nur noch Details sind zu 
klären, siehe einen aktuellen Thread von mir dazu).

Ich war davon ausgegangen, dass es sowas bereits geben müsste, habe aber 
per Google-Suche auf Anhieb gar kein ähnliches Projekt gefunden. Meinen 
Code werde ich, sobald er ausgereift ist, auf Github veröffentlichen und 
auf verschiedenen AVRs wie auch ATmega328P(B) lauffähig machen (z.Zt. 
nur ATtiny 2-series).

Noch günstiger könnte man unter Verwendung eines Raspberry Pi Pico zum 
Preis von knapp 4 Euro kommen; da bin ich allerdings auf das Problem 
gestoßen, dass mit dem Pico-SDK der USB-UART nur per scanf() lesbar ist 
und somit gezwungenermaßen ASCII-zeilenorientiert arbeitet, was aber im 
Widerspruch zum rohbinären STK500v2-Protokoll steht. Da müsste man ein 
eigenes ASCII-basiertes Protokoll für entwerfen und avrdude entsprechend 
erweitern. Das habe ich in der Zukunft als eines meiner nächsten 
Projekte noch vor.

von Johannes F. (jofe)


Lesenswert?

Johannes F. schrieb:
> Noch günstiger könnte man unter Verwendung eines Raspberry Pi Pico zum
> Preis von knapp 4 Euro kommen; da bin ich allerdings auf das Problem
> gestoßen, dass mit dem Pico-SDK der USB-UART nur per scanf() lesbar ist
> und somit gezwungenermaßen ASCII-zeilenorientiert arbeitet

Diese Aussage muss ich korrigieren – zum byteweisen Lesen von USB-CDC 
stellt das (C-)SDK die Funktion /getchar()/ zur Verfügung. Damit müsste 
es gehen, das STK500v2-Protokoll über USB laufen zu lassen; allerdings 
wäre eine interruptgesteuerte Verarbeitung schöner, die aber, sofern ich 
das richtig sehe, wohl die Umgehung von stdio und damit ein eigenes 
Setup von tinyusb erforderlich macht. Darin muss ich mich erst noch 
einarbeiten. Wollte nur oben zitiertes Statement nicht so falsch im Raum 
stehen lassen.

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.