Forum: Mikrocontroller und Digitale Elektronik AVR64DD28, mEDBG, Studio 7.0 - Fehler beim Schreiben von Fuses


von Johannes T. F. (jofe)



Lesenswert?

Hallo,

ich mache gerade die ersten Schritte mit einem AVR64DD28 auf einer 
kleinen selbstgemachten Experimentierplatine mit Minimalbeschaltung 
(Plan im Anhang).

Das Board läuft gerade mit am Eingang des 7805 angeschlossenen 9 Volt 
vom Labornetzgerät, am Ausgang und damit VDD des AVR liegen gemessene 
5,0 V an.

Angeschlossen am UPDI des AVR64DD28 habe ich ein ATtiny416 Xplained Nano 
mit mEDBG, verbunden mit meinem Windows-PC, auf dem das Microchip Studio 
7.0.2594 läuft. Öffne ich Tools → Device Programming und stelle auf 
AVR64DD28 und mEDBG ein, wird das Device auch korrekt erkannt und die 
Fuses werden erfolgreich ausgelesen, siehe den Screenshot.

Versuche ich nun aber, Fuses zu ändern, erhalte ich die angehängte 
Fehlermeldung. Anscheinend ist das Verifizieren der geschriebenen Fuses 
fehlgeschlagen.

Woran könnte das liegen? Ich habe es bereits an zwei PCs und mehrfach 
mit zwei verschiedenen AVR-Exemplaren versucht, jedesmal erhalte ich die 
Fehlermeldung, und komme einfach nicht weiter ...

Grüße
Johannes

von S. L. (sldt)


Lesenswert?

Zugegeben, die Erfolgswahrscheinlichkeit ist sehr gering, dafür ist aber 
auch der Aufwand ebenfalls minimal (und solange sich kein anderer 
meldet): versuchsweise 100 kOhm von UPDI nach Vdd anschließen.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Zugegeben, die Erfolgswahrscheinlichkeit ist sehr gering, dafür ist aber
> auch der Aufwand ebenfalls minimal (und solange sich kein anderer
> meldet): versuchsweise 100 kOhm von UPDI nach Vdd anschließen.

Habe es gerade ausprobiert, hat leider nicht geholfen.
Trotzdem danke für die Antwort.

Nachtrag: VDDIO2 ist übrigens per Jumper mit VDD=+5V verbunden; das 
hatte ich vergessen zu erwähnen.

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?

Johannes T. F. schrieb:
> ein ATtiny416 Xplained Nano mit mEDBG

Wurde das Tool schon an anderen (kleineren) Targets erprobt?



Johannes T. F. schrieb:
> ...wird das Device auch korrekt erkannt

Woher kommt der rote Rahmen? Das ist ein Diskrepanz-Hinweis.

von Johannes T. F. (jofe)


Lesenswert?

Georg M. schrieb:
> Johannes T. F. schrieb:
>> ein ATtiny416 Xplained Nano mit mEDBG
>
> Wurde das Tool schon an anderen (kleineren) Targets erprobt?

Ja, ich habe es bisher an verschiedenen 1-series-ATtinys erfolgreich 
verwendet (z.B. 3216, 412).

Georg M. schrieb:
> Woher kommt der rote Rahmen? Das ist ein Diskrepanz-Hinweis.

Der rote Rahmen ist irreführend, er war auch da, als das Flashen meiner 
ATtinys erfolgreich verlaufen ist. Scheint ein Bug des Microchip Studios 
zu sein.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Ich habe den leisen Verdacht dass die Programmer Firmware zu alt ist.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Veit D. schrieb:
> Ich habe den leisen Verdacht dass die Programmer Firmware zu alt ist.

Ja, diese Vermutung kam bei mir inzwischen auch schon auf ...

Leider schweigt sich die Dokumentation von Microchip[1][2] scheinbar 
darüber aus, welche Devices genau unterstützt werden, und ob/wie die 
Firmware des auf dem Board vorhandenen „mEDBG“ aktualisiert werden kann. 
Jedenfalls konnte ich eben dazu nichts finden.

[1] https://www.microchip.com/en-us/development-tool/attiny416-xnano
[2] 
https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/UserGuides/ATtiny416-Xpl-Nano-EV-Kit-Users-Guide-DS50002683B.pdf

=====
Nachtrag: ich fand gerade einen Hinweis auf die 
Firmware-Update-Möglichkeit auf einer Seite zu einem ähnlichen Board:
https://onlinedocs.microchip.com/pr/GUID-FC2A0384-AC9D-45B4-951E-5C0DEFE8B2E9-en-US-5/index.html?GUID-E45ECAF4-48D5-4D67-BE87-4DF8AE01358D

Habe das dort aufgeführte Kommando ausgeführt (siehe Screenshot), was 
erstmal erfolgversprechend schien; allerdings wird im 
Device-Programming-Dialog im Studio nachher dieselbe Version wie vorher 
angezeigt (1.0d), und der erneute Versuch, die Fuses des AVR64DD28 zu 
ändern, scheiterte wieder an derselben Fehlermeldung. So war die 
Firmware des mEDBG wohl bereits auf dem letzten Stand …

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

Ist bestimmt die alte Firmware die auf der Platte liegt. Aktuelle gibt 
es hier.

https://packs.download.microchip.com/

Laut älteren Thread soll das Pkob Nano Pack das Passende sein. Guck 
einfach mal rein. Endung. zip anhängen und entpacken.
Ohne Gewähr. Umsichtig agieren.

von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> Laut älteren Thread soll das Pkob Nano Pack das Passende sein.

Dieses enthält allerdings nur "*n*edbg_fw.zip", daher habe ich noch das 
Package "mEDBG support" geladen und geöffnet, darin befindet sich 
"medbg_images.zip". Dieses habe ich erfolgreich in das mEDBG geflasht – 
danach wird aber immer noch Firmware Version 1.0d angezeigt und es kommt 
wieder derselbe Fehler …

Trotzdem danke für den Tipp.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

du hast den ATTINY416 XPLAINED NANO als Programmer, der ist natürlich 
medbg.

https://packs.download.microchip.com/

Ich habe mein AVR128DB48 Curiosity Nano rausgekramt. Darauf ist die 
Firmware Version laut Microchip Studio 1.19 drauf. View > Available 
Microchip Tools > rechts nedbg. Versionsangabe nicht verwechseln mit der 
Pack Version. Microchip Studio und MPLAB IDE wollen die Firmware nicht 
updaten. Das Problem hatte ich schon bei meinem Atmel ICE festgestellt.

!!! Ich beschreibe es für mein Curiosity Nano. Du musst gedanklich und 
praktisch bei medbg bleiben !!!  :-)

Jetzt gibt es 2 Möglichkeiten das manuell zu machen.

a ) Python
Habe ich sowieso installiert. Die Umgebungsvariablen sind auch alle 
eingerichtet.
Man muss "pydebuggerupgrade" nachinstallieren.
https://pypi.org/project/pydebuggerupgrade/

Die Option 'latest' funktioniert nicht. Ich habe das aktuelle PKOB nano 
Pack (Microchip.nEDBG_TP.1.14.751.atpack) runtergeladen. Das ist die 
nedbg Firmware. Zum .zip umbenannt und daraus die Datei nedbg_fw.zip 
rausgezogen und in meinen Windows User Ordner abgelegt. In der 
device_support.xml Datei stehen übrigens alle unterstützten Controller 
drin.

CMD geöffnet und
> pydebuggerupgrade -t nedbg nedbg_fw.zip
eingegeben. Ergebnis:
> Upgrading nedbg (MCHP3372021800000303) to 'nedbg_fw.zip'
> Upgrade to firmware version '1.31.39' successful

In Microchip Studio nachgeschaut, jetzt steht Firmware 1.1F statt vorher 
1.19. mit "Microchip.nEDBG_TP.1.14.751.atpack" (PKOB nano)

b) mit dem Tool atfw.exe

So ein Forum ist gleichzeitig Backup, man muss sich nur erinnern können. 
:-) :-) :-)
Beitrag "Re: ATmega 4809 Curiosity Nano - Firmware Update klappt nicht"

Das Tool liegt im Verzeichnis:
C:\Program Files (x86)\Atmel\Studio\7.0\atbackend\
CMD öffnen:
Verbindungscheck
> atfw.exe -l
Es sollte ein nedbg auftauchen, los gehts
> atfw.exe -t nedbg -a nedbg_fw.zip


Für einen Atmel ICE:
> atfw.exe -a atmelice_fw.zip -t atmelice
Aktuelle Firmware laut Microchip Studio 1.2d mit Pack 
"Microchip.AtmelICE_TP.1.7.796.atpack"

Nachtrag:
In der device_support.xml der medbg Firmware sind die AVRxDD Typen 
gelistet. Noch ein Gedanke. Hast du den Teil "Programmer" vom restlichen 
"ATTINY416 XPLAINED NANO" getrennt? Nicht das der ATtiny416 dazwischen 
funkt, wenn du die fremde Ziel MCU AVRxDD flashen möchtest.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> Hast du den Teil "Programmer" vom restlichen
> "ATTINY416 XPLAINED NANO" getrennt? Nicht das der ATtiny416 dazwischen
> funkt, wenn du die fremde Ziel MCU AVRxDD flashen möchtest.

Ja, die drei Widerstände in der Mitte (UPDI, RxD, TxD) hatte ich kurz 
nach dem Erwerb des Xplained-Nano-Boards (gemäß Manual) ausgelötet. Ich 
hatte es auch nur gekauft, um externe MCUs damit zu flashen. Das hat ja 
wie gesagt auch bisher immer funktioniert, mit mehreren ATtiny412 und 
3216.

Veit D. schrieb:
> In der device_support.xml der medbg Firmware sind die AVRxDD Typen
> gelistet.

Ja, seltsam, habe auch gerade nachgesehen. Dann kann es ja eigentlich 
auch nicht an der Firmware liegen, es sei denn, sie ist buggy …

Ich wüsste aber auch nicht, woran es sonst liegen könnte. Wobei … sind 
die Leitungslängen bzw. Steckverbinder für UPDI irgendwie kritisch? Ich 
verwende da solche billigen 20-cm-Dupont-Jumperkabel. Hat bisher (also 
bei den ATtinys) immer funktioniert.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

woher sind deine Dupont Kabel? Meine Erfahrung mit meinen China Dupont 
sind schlecht. Ich muss alle nachpressen. Ich habe sonst nur 
Kontaktprobleme. Mach mal sachte die schwarze Hülse runter und prüfe ob 
die Litze sauber verpresst ist. Meine sind nur an der Isolierung 
gepresst und die zarte Litze liegt am eigentlichen Crimpkontakt nur zart 
an. Biegen und verwinden des Kabel reicht damit der Kontakt nicht mehr 
da ist. Man kann auch Durchgang messen und am Kabel spielen.

Mein selbstgebautes Kabel vom Atmel ICE ist 30cm lang. Ist altes 80pol. 
IDE Festplattenkabel. Dazu kommen nur wenige Zentimeter Dupontkabel 
inkl. Adapterplatine. Diese Kombination macht keine Probleme. Du kannst 
im Microchip Studio noch notfalls den Takt fürs Flashen reduzieren.

von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> woher sind deine Dupont Kabel?

Zuerst hatte ich sehr billige (aus so einem trennbaren Flachbandkabel, 
von irgendeinem eBay-China-Händler), gerade habe ich sie nochmal durch 
bessere ersetzt (Joy-It, Reichelt), die einen etwas zuverlässigeren 
Eindruck erwecken (kommen aber sicher auch aus China, wie ja so ziemlich 
alles inzwischen). Zudem noch den Takt auf 32 kHz reduziert. Hat aber 
nichts genützt, immer noch derselbe Fehler.

Ich denke, dass es eher nicht daran liegt – zum einen habe ich jetzt 
schon sehr viele verschiedene Jumperkabel benutzt, da müssten ja 
wirklich alle defekt sein, und zum anderen wird ja die MCU am Anfang 
korrekt erkannt und die Fuses werden auch erfolgreich ausgelesen. Es ist 
ja wirklich nur der Schreibvorgang, der irgendwie Probleme macht.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

deine Logik ist für mich erstmal verständlich. Du könntest probieren 
eine harmlose Fuse zu ändern. Um zu sehen ob der Fuse Schreibvorgang 
auch fehlschlägt.
Bspw. EEprom EESAVE ein/ausschalten. Oder BOD Level Spannung ändern aber 
nicht aktivieren. Könnte zur Fehlersuche beitragen. Unabhängig ob man 
die Fuse lesen kann oder nicht. Die Platine haste durchgemessen auf 
Kurzschlüsse an allen Pins o.ä.? Spannung liegt sauber an? Es gibt 
manchmal Effekte, die kann man sich erstmal nicht erklären.
Ansonsten kann ich da aktuell nicht weiterhelfen. Tut mir leid. Da 
müssen andere ran. Könntest noch ein Bild der Platine zeigen? Vielleicht 
fällt  jemanden etwas auf. Kommt Zeit kommt Rat.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Veit D. schrieb:
> Du könntest probieren
> eine harmlose Fuse zu ändern. Um zu sehen ob der Fuse Schreibvorgang
> auch fehlschlägt.

Ja, ich habe mehrfach versucht, allein das BOD-Level zu ändern, ohne 
Erfolg.

Veit D. schrieb:
> Die Platine haste durchgemessen auf
> Kurzschlüsse an allen Pins o.ä.? Spannung liegt sauber an?

Also alles auf Kurzschlüsse geprüft habe ich noch nicht, aber die 
Platine nach dem Löten sehr sorgfältig auf Lotbrücken nach Sicht 
kontrolliert, und die Abstände von Leiterbahnen zu Massefläche hatte ich 
auch relativ groß eingestellt. Kann ja nochmal mit dem Durchgangspiepser 
nachprüfen (nach Herausnehmen des AVR natürlich) ...

Die Betriebsspannung ist sauber, kommt ja direkt aus dem 7805 on-board, 
habe gerade nochmal mein DSO dran gehängt und konnte keine messbare 
Restwelligkeit feststellen, ist also praktisch nicht vorhanden.

Fotos der Platine habe ich mal angehängt – würde keinen Schönheitspreis 
gewinnen, sind noch Flussmittelreste drauf, aber elektrisch sollte es 
eigentlich OK sein. Ist halt einseitig, entsprechend sind die 
Masseverbindungen nicht sooo gut wie man es doppelseitig hinbekommen 
könnte, aber ich denke, das dürfte nicht das Problem sein, oder?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Fuse schreiben geht auch nicht, dann wird das Auslesen nach schreiben 
zum Vergleich fehlschlagen. Es kommt wahrscheinlich nicht das an was 
geschrieben werden soll.
Ich schau mir das Morgen nochmal genauer. Die Flussmittelreste sollten 
jedoch runter. Sieht wie klassisches Kolophonium aus, was Kriechströme 
zwischen den Lötpins zulassen kann. Habe ich alles schon gehabt, gerade 
bei hochohmigen Eingängen und sehr schwach belasteten Ausgängen. Da 
blinkte die "Transistor verstärkte" Nachbar-Led plötzlich mit. Grund 
waren Rückstände vom Löten, hatte nicht richtig sauber gemacht.

von Timo S. (kaffeetas)


Lesenswert?

Funktioniert irgend ein anderes Kommando z.B. Flash auslesen oder chip 
erase?

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Veit D. schrieb:
> Die Flussmittelreste sollten
> jedoch runter. Sieht wie klassisches Kolophonium aus, was Kriechströme
> zwischen den Lötpins zulassen kann.

Hmm, das war „Löthonig“, enthält Kolophonium. War mir noch nicht 
bekannt, dass das Kriechströme verursacht. Werde dann später die Platine 
reinigen – ich habe so eine Dose „Leiterplattenreiniger“ von Kontakt 
Chemie in meiner Haupt-Werkstatt herumstehen, da komme ich allerdings 
erst voraussichtlich übernächstes Wochenende ran (bin gerade an meinem 
Zweitwohnort). Bis dahin muss das also noch warten …

Timo S. schrieb:
> Funktioniert irgend ein anderes Kommando z.B. Flash auslesen oder chip
> erase?

Habe gerade "Erase Chip" ausgeführt, es wurde "OK" zurückgemeldet.

Danach habe ich den Flash ausgelesen – ebenfalls "OK". Das Resultat habe 
ich mal angehängt – ist das plausibel nach einem Chip Erase? Es ist 
jedenfalls nicht alles null (ob das so sein muss, entzieht sich momentan 
meiner Kenntnis, ich habe mich bisher noch nicht mit der genauen 
Flash-Organisation auseinander gesetzt).

Nachtrag: Ich habe jetzt einen AVR64DD28 und 100n-Kerkos aufs Steckbrett 
gesetzt und alle GNDs und VDDs sowie UPDI mit dem Xplained Nano 
verbunden; ich erhalte dasselbe Ergebnis, also diesen Fehlercode 20000 
nach dem Versuch, eine Fuse zu ändern. Es muss also wohl definitiv an 
diesem mEDBG auf dem Xplained Nano Board liegen.

: Bearbeitet durch User
von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Veit D. schrieb:
> In der device_support.xml der medbg Firmware sind die AVRxDD Typen
> gelistet.

Ich würde nicht alles glauben, was diese Verfasser herausgeben.

von Micha W. (blackxiiv)


Angehängte Dateien:

Lesenswert?

Moin,

die Hide-Option hast du auf false gesetzt? Ich habe das gleiche Problem 
bei andern UPDI-AVRs gehabt, als ich den Curiosity Nano Atmega4809 als 
Programmer genutzt habe.
Vllt bringts ja was.

Grüße!

von Johannes T. F. (jofe)


Lesenswert?

Micha W. schrieb:
> die Hide-Option hast du auf false gesetzt?

Bisher noch nicht, hab es eben auf false gesetzt, danach war das 
Device-Eingabefeld mit AVR64DD28 bereits ausgefüllt, was ich bisher 
jedesmal wieder manuell machen musste, und der rote Rahmen ist 
verschwunden.

Trotzdem wieder derselbe Fehler: Error 20000 nach dem Versuch, eine 
harmlose Fuse (BOD-Level) zu ändern.

Ich geb’s jetzt erstmal auf und lasse den AVR-DD ruhen, bis ich mir ein 
UPDI-Programmer-Tool selbst programmiert habe, was ich sowieso schon 
vorhatte.

von S. L. (sldt)


Lesenswert?

Was ich aus dem bisherigen Verlauf nicht herauslesen konnte: haben Sie 
versucht, ein einfaches LED-Blinkprogramm auf den DD zu bekommen? Ich 
meine, der erste Gehversuch mit einem neuen uC-Typen ist normalerweise 
nicht das Ändern der Fuses.

Lässt sich die IDE zwingen, den 'DD' als 'DA' oder 'DB' zu behandeln? 
Memory-Map ist ja gleich.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die Device ID Prüfung umgehen? Wenn die falsch wäre würde die MCU 
Auswahl scheitern. Falls der Programmer in Verdacht steht, dann einmal 
bitte mit PythonUpdi probieren. Zusätzlich ist nur ein Widerstand oder 
Diode notwendig und ein USB Serial Adapter.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich habe den Thread nochmal komplett gelesen und fasse zusammen. Du 
kannst mit dem mEDBG ATtinys flashen aber keine AVR Typen? Welche AVR 
Typen hast du probiert? Probiere auf jeden Fall nochmal einen 
unabhängigen Programmer, den besagten pyupdi, Stichwort pymcuprog.

Am Schaltplan kann ich keine Fehler sehen, diesbezüglich schon gar 
nicht.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> haben Sie
> versucht, ein einfaches LED-Blinkprogramm auf den DD zu bekommen?

Noch nicht – das erste, was ich mit einem fabrikneuen AVR mache, ist 
mittlerweile, den BOD mit einem der Betriebsspannung angemessenen Level 
zu aktivieren. Das kommt bei mir noch vor dem Flashen eines Programms. 
Aber ich kann natürlich auch versuchen, ein Blinkprogramm in den 
AVR64DD28 zu laden – dachte nur, das hätte gar keinen Sinn zu probieren, 
wenn nichtmal die Fuses gesetzt werden können.

S. L. schrieb:
> Lässt sich die IDE zwingen, den 'DD' als 'DA' oder 'DB' zu behandeln?

Hmm, weiß nicht ...

Veit D. schrieb:
> Falls der Programmer in Verdacht steht, dann einmal
> bitte mit PythonUpdi probieren. Zusätzlich ist nur ein Widerstand oder
> Diode notwendig und ein USB Serial Adapter.

Ja, von pyupdi hatte ich schon mal gelesen (aber nicht näher verfolgt, 
da ich eine gewisse Aversion gegenüber Python hege), werde mich aber 
zeitnah darüber informieren und es nochmal damit versuchen.

Veit D. schrieb:
> Du
> kannst mit dem mEDBG ATtinys flashen aber keine AVR Typen?

Ja genau. Zumindest scheinbar keine AVR64DD...

Veit D. schrieb:
> Welche AVR
> Typen hast du probiert?

Bisher nur die zwei AVR64DD28 im DIL-Gehäuse (wurden bei Mouser.de 
gekauft). In meiner Nebenwohnung habe ich noch zwei neue AVR128DB28 
liegen, da komme ich aber erst übernächstes Wochenende wieder ran.

Veit D. schrieb:
> Probiere auf jeden Fall nochmal einen
> unabhängigen Programmer, den besagten pyupdi, Stichwort pymcuprog.

Ja, werde ich demnächst tun; mal sehen, wann ich dazu komme.

Veit D. schrieb:
> Am Schaltplan kann ich keine Fehler sehen, diesbezüglich schon gar
> nicht.

Vielen Dank nochmal für’s drüber schauen.

von S. L. (sldt)


Lesenswert?

> ... wenn nichtmal die Fuses gesetzt werden können
Ich sehe trotzdem eine gewisse Wahrscheinlichkeit, dass ein Programm 
geflasht werden kann - oder zumindest das Verhalten der IDE bei diesem 
Versuch einen weiteren Hinweis auf das eigentliche Problem gibt.

> habe ich noch zwei neue AVR128DB28
Diese könnten eher akzeptiert werden, sind ja (ein oder zwei Jahre) 
älter.

Wie dem auch sei - ich musste beim Einfügen der 'DD'-Reihe in mein 
Selbstbauprogrammiergerät lediglich den Klartext für die ausgelesene 
Signatur ergänzen, ansonsten entsprach alles einem 'DA' oder 'DB'.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

S. L. schrieb:
> Ich sehe trotzdem eine gewisse Wahrscheinlichkeit, dass ein Programm
> geflasht werden kann - oder zumindest das Verhalten der IDE bei diesem
> Versuch einen weiteren Hinweis auf das eigentliche Problem gibt.

Ich habe nun versucht, das angehängte primitive Blinkprogramm zu 
flashen, und habe wieder nach dem (scheinbar erfolgreichen) Chip Erase 
eine Fehlermeldung erhalten und das Flashen wurde abgebrochen; siehe 
angehängte Screenshots.

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Schade; vielleicht sagt die Fehlermeldung Veit Devil etwas. Was mich 
betrifft, so muss ich nun endgültig passen.

PS:
Mit Ihrem Programm lässt mein AVR32DD14 eine LED blinken, mit ca. 220 
ms.

PPS:
Noch etwas zur Aufheiterung (Ähnlichkeiten mit einer gewissen IDE wären 
rein zufällig).

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> Falls der Programmer in Verdacht steht, dann einmal
> bitte mit PythonUpdi probieren. Zusätzlich ist nur ein Widerstand oder
> Diode notwendig und ein USB Serial Adapter.

Ich habe eben auf meinem Raspberry Pi 4 dieses „pymcuprog“-Package zum 
Laufen gebracht (hat eine Weile gedauert, da ich bisher noch keinerlei 
Erfahrung mit „pip“ und allgemein wenig Erfahrung mit Linux habe).

Nachdem ich es geschafft hatte, pymcuprog erfolgreich in der Bash 
aufzurufen, habe ich meinen MCP2221-USB-Serial-Adapter (dessen 
zugewiesene Linux-Device-ID ich ebenfalls geschafft hatte zu finden) 
nach der Anleitung mit einem 1k-Widerstand und UPDI des AVR64DD28 
verbunden und das ping-Kommando von pymcuprog mit entsprechenden 
Parametern (-t uart -u /dev/ttyACM0 -d avr64dd28) aufgerufen. Nach 
einigen Sekunden und Blinken der Rx-/Tx-LEDs am MCP2221 beendete sich 
pymcuprog dann schließlich mit der Fehlermeldung ERROR: UDPI 
initialization failed (oder so ähnlich).

Keine Ahnung, woran das nun wieder liegen könnte. Auch ein Ping-Test an 
einem vorher und nachher funktionierend getesteten ATtiny3216 mit 
gleicher Beschaltung schlug mit derselben Fehlermeldung fehl. 
Verschiedene Taktraten habe ich ebenfalls an beiden MCUs getestet, ohne 
Erfolg. Das (selbstgemachte) MCP2221-Board funktioniert ebenfalls 
einwandfrei, ich habe es nachher nochmal erfolgreich am UART des 
ATtiny3216 getestet.

So langsam vergeht mir die Lust, mich mit mEDBG (und pymcuprog) 
herumzuärgern. Beides bringt mir weder Lern- noch Spaßeffekt. Daher 
werde ich den AVR_DD erst einmal zu den Akten legen und mich dem Studium 
des UPDI-Protokolls widmen, um dann einen UPDI-Programmer selbst zu 
implementieren und dabei auch Programmier-Lernfortschritte zu machen. 
Das hatte ich mir ja wie gesagt ohnehin schon als Projekt vorgenommen.

Trotzdem herzliches Dankeschön für alle gut gemeinten Antworten und 
Vorschläge.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Aufheiterung ist immer gut. Danke.

Habe soeben meinen AVR64EA32 mit pyupdi probiert, funktioniert.
1
pymcuprog.exe write -d avr64ea32 -t uart -u com8 -f blink.hex --erase --verify
1
Connecting to SerialUPDI
2
Pinging device...
3
Ping response: 1E961F
4
Erasing device before writing from hex file...
5
Writing from hex file...
6
Writing flash...
7
Verifying flash...
8
OK
9
Done.

Nach dem Eingangsfehler hatte ich schon gesucht, man findet nicht viel. 
Außer das manche Chip Erase machen was erfolgreich gewesen sein soll. 
Nur ist chip erase vorm flashen Standardeinstellung.
Die letzte Fehlermeldung sagt aus er konnte nicht beschrieben werden. 
Brauchbares findet man dazu auch nicht.
Ganz doof gefragt, Du hast nicht Ausversehen UPDI per Fuse disabled?

Ansonsten wenn ich es nicht genauer wüßte, würde ich vermuten der DD ist 
defekt, ist unwahrscheinlich aber möglich. Mach bitte nächste Woche noch 
einen Versuch mit deinem DB. Wenn immer noch nichts funktioniert, kannst 
du mir gern einen zusenden und ich teste den. Schicke ich dir auch 
zurück wenn du willst. Schreib mir eine PN dafür. Außer du hast jemanden 
in der Nähe mit Atmel ICE o.ä. wo du hingehen kannst. Dann wüßte man 
erstmal gesichert liegt es am DD oder doch an etwas anderem.

Zugegeben die Situation ist komisch, ich denke wir können dich alle 
verstehen.

: Bearbeitet durch User
von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Johannes T. F. schrieb:

> (...) und mich dem Studium
> des UPDI-Protokolls widmen, um dann einen UPDI-Programmer selbst zu
> implementieren und dabei auch Programmier-Lernfortschritte zu machen.

So ähnlich hab' ich's auch gemacht, basierend auf dem FT230x und mich 
von diesem Projekt inspirieren lassen, da ich C favorisiere:
https://github.com/Polarisru/updiprog

Grüßle,
Volker

von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> Ganz doof gefragt, Du hast nicht Ausversehen UPDI per Fuse disabled?

Nein, ich bin wirklich nur an die BOD-Fuses ran gegangen, alles andere 
habe ich nicht berührt. Und die DDs kamen frisch von Mouser.

Veit D. schrieb:
> Ansonsten wenn ich es nicht genauer wüßte, würde ich vermuten der DD ist
> defekt, ist unwahrscheinlich aber möglich.

Hmm, ist schon ziemlich unwahrscheinlich, dass wirklich beide Exemplare 
defekt sind … Aber wer weiß.

Ich verstehe auch nicht, dass pymcuprog selbst meinen ATtiny3216, der 
eindeutig OK ist, nicht erfolgreich pingen kann – da muss irgendwas im 
Argen liegen. Kann mir nicht vorstellen, wo da der Fehler liegt. MCU 
i.O., USB-Serial-Adapter OK, … Aber irgendwie muss es ja an mir bzw. 
meinem Equipment liegen, wenn es bei anderen Usern funktioniert.

Naja, halb so wild, ich werde schon irgendwann der Ursache auf die 
Schliche kommen, da bin ich ziemlich sicher. Ich melde mich dann auf 
jeden Fall hier in diesem Thread wieder und werde berichten.

Volker B. schrieb:
>> (...) und mich dem Studium
>> des UPDI-Protokolls widmen, um dann einen UPDI-Programmer selbst zu
>> implementieren und dabei auch Programmier-Lernfortschritte zu machen.
>
> So ähnlich hab' ich's auch gemacht, basierend auf dem FT230x und mich
> von diesem Projekt inspirieren lassen, da ich C favorisiere:
> https://github.com/Polarisru/updiprog

Danke für den Link, werde ich mir ansehen. Ich persönlich ziehe 
Assembler bei AVRs vor, weil es mir Spaß macht, zu wissen, was genau die 
CPU mit welchen Registern etc. tut. Bei der 8-bit-AVR-Architektur ist 
das auch noch ziemlich gut zu überblicken, finde ich. Aber das ist halt 
Geschmackssache. Für den RP2040 bspw., mit dem ich auch noch vorhabe 
mich zu beschäftigen, werde ich auch in C programmieren.

: Bearbeitet durch User
von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> Nein, ich bin wirklich nur an die BOD-Fuses ran gegangen,
> alles andere habe ich nicht berührt.

Wenn, warum auch immer, die ursprüngliche Version der IDE SYSCFG0 mit 
einem Default-Wert einer älteren Version geschrieben hat und sich dabei 
an "Note: When writing the fuses, all reserved bits must be written to 
‘0’." hielt, ist nun UPDI gesperrt (und nur mit "Applying an HV pulse on 
RESET will reconfigure the UPDI pin to UPDI function mode, thereby 
overriding the configuration in the SYSCFG0 fuse" freizugeben) - was hat 
sich Microchip bei "Value 0: GPIO UPDI pin is configured as GPIO" bloß 
gedacht?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

für pyupdi hast du auch alles Notwendige

> pip install pymcuprog
> pip install pip
> pip install intelhex
> pip install pylint
> pip install pyserial   (Nicht 'serial'!)

installiert?

Wenn damit auch ein funktionierender ATtiny nicht ansprechbar ist, dann 
ist am "Setup" was faul. Masseverbindungen vorhanden? Problem mit 3,3V 
<> 5V? Viel mehr kann ich aus der Ferne nicht machen. Ich wünsche 
maximale Erfolge. Wenn der Fehler gefunden wurde kannst du ihn gern 
kundt tun.

S. L. schrieb:
> ... was hat sich Microchip bei "Value 0: GPIO UPDI pin is configured
> as GPIO" bloß gedacht?

Das ist in der Tat unlogisch ausgerechnet dafür Default '1' zu wählen.

Wir hoffen das Beste für den TO. Hat zur Zeit zu viele Baustellen 
gleichzeitig.

von S. L. (sldt)


Lesenswert?

> Das ist in der Tat unlogisch
Yô, und meinereiner war natürlich prompt darauf hereingefallen: wollte 
nur mal schnell, wie üblich, EESAVE setzen, versehentlich das AVR128DB28 
Datenblatt erwischt, und schon durfte ich anschließend das 12 
V-Platinchen hervorkramen.
  Okay, zugegeben, mein Fehler, und die HV-Rettung ist ja geradezu 
bequem geworden, verglichen mit den älteren Controllern, trotzdem: so 
unnötig wie ein Kropf.

von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> für pyupdi hast du auch alles Notwendige
> […]
> installiert?

Habe gerade nochmal meinen Raspi hochgefahren und gecheckt, es war alles 
bis auf 'pylint' bereits installiert. Nachdem dann auch dieses noch 
installiert wurde, habe ich nochmals den Versuch unternommen, meinen 
ATtiny3216 zu pingen – wieder scheiterte es mit folgender Meldung:
1
./pymcuprog ping -t uart -u /dev/ttyACM0 -d attiny3216
2
Connecting to SerialUPDI
3
pymcuprog.pymcuprog - ERROR - Operation failed with PymcuprogSerialUpdiError: UPDI initialisation failed

Veit D. schrieb:
> Masseverbindungen vorhanden? Problem mit 3,3V <> 5V?

Massen sind verbunden, USB-UART und ATtiny3216 hängen an den +5V aus 
demselben 7805, daran kann es also nicht liegen.

Veit D. schrieb:
> Wir hoffen das Beste für den TO. Hat zur Zeit zu viele Baustellen
> gleichzeitig.

Vielen Dank! Ja, ich arbeite tatsächlich abwechselnd auch noch an 
anderen Projekten, z.B. designe ich gerade eine Platine für meinen 
künftigen Ätzküvetten-Temperaturregler mit einem ATtiny3227 (meine erste 
doppelseitige LP, zur Fertigung bei JLCPCB). Deshalb ist es nicht so 
tragisch, wenn ich hier erstmal nicht weiterkomme.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Hallo,

inzwischen habe ich ein kleines Programm (siehe Anhang) für einen 
ATtiny3216 zustande gebracht, das via UPDI den System Information Block 
eines angeschlossenen AVRs ausliest und über UART ausgibt.

Nun möchte ich im nächsten Schritt die Fuses des Ziel-AVRs lesen und 
schreiben. Allerdings finde ich in den Datenblättern von AVR64DD28 und 
ATtiny416 (den ich ebenfalls momentan noch als Testobjekt liegen habe) 
wenig bzw. keine für mich eindeutigen Angaben zu den absoluten Adressen 
der Fuses im Flash. Auf [1], S. 46, steht „0x1280 | FUSES | 
Device-specific fuses“, wobei ich mir unsicher bin, ob sich das wirklich 
auf den Flash bezieht, oder auf die Register im RAM, in die während 
RESET die Fuse-Werte kopiert werden. Und an anderen Stellen werden nur 
Offsets für die Fuse-Bytes angegeben.

Ich habe bisher noch nicht direkt mit Lesen/Schreiben des 
Flash-Speichers gearbeitet und kenne mich da noch nicht aus. Daher würde 
ich mich über Tipps freuen, wo genau ich die Adressen finde, die ich 
beim Lesen und Schreiben der Fuses via UPDI verwenden muss. Komme da 
momentan einfach nicht weiter …

[1] 
https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/ATtiny212-214-412-414-416-DataSheet-DS40002287A.pdf

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> Nun möchte ich im nächsten Schritt die Fuses des Ziel-AVRs lesen

Die Fuses stehen ab 0x1050 im Data-space und werden mit dem UPDI-Befehl 
LDS gelesen.
  (Bei den ATtinys (und z.B. dem ATmega4809) ab 0x1280)


PS:
> an anderen Stellen werden nur Offsets für die Fuse-Bytes angegeben

Mais non - z.B. AVR32DD28def.inc:
1
;*************************************************************************
2
;** FUSE - Fuses
3
;*************************************************************************
4
5
.equ FUSE_WDTCFG = 0x1050                ; Watchdog Configuration
6
.equ FUSE_BODCFG = 0x1051                ; BOD Configuration
7
.equ FUSE_OSCCFG = 0x1052                ; Oscillator Configuration
8
.equ FUSE_SYSCFG0 = 0x1055               ; System Configuration 0
9
.equ FUSE_SYSCFG1 = 0x1056               ; System Configuration 1
10
.equ FUSE_CODESIZE = 0x1057              ; Code Section Size
11
.equ FUSE_BOOTSIZE = 0x1058              ; Boot Section Size

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

Vielen Dank für die schnelle Antwort.

In der …def.inc hatte ich zwar auch schon nachgesehen, aber ich dachte 
irgendwie, dass diese Adressen sich auf den RAM beziehen … Weiß auch 
nicht, wie ich darauf komme.

Nun denn, dann schaue ich jetzt mal, was ich meinen beiden AVR64DD28 so 
entlocken kann.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

um einmal das Schema F der Register im Manual näher zu bringen.
In allen Kapiteln sind für die Register immer nur die Offsetwerte für 
die Adresse angegeben. Die Basisadresse der Hardwareeinheiten stehen 
hier im Kapitel 9 - Seite 64. Die Fuses im Bsp. Seite 65 haben die 
Basisadresse 0x1050. Dann geht man ins Fuse Kapitel o.a. und addiert die 
Offsets der gewünschten Register.

Das mag auf den ersten Blick verkompliziert sein. Ist es aber auf dem 2. 
Blick nicht mehr. Wenn man die aktuellen Serien vergleicht, sind die 
Offsets fast immer gleich, ich lege jetzt nicht die Hand ins Feuer, aber 
es ist ziemlich offensichtlich. Man kann sehr einfach Libs für eine 
Serie schreiben und passt für eine andere Serie nur die Basisadresse an.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Hallo Veit, danke für die Erläuterung – mir ist nun klar, wie die 
Adressen strukturiert sind. Ich hatte irgendwie Tomaten auf den Augen.

Inzwischen habe ich geschafft, die Fuses aus dem ATtiny416 meines 
Xplained-Nano-Boards auszulesen; siehe den angehängten Screenshot. Das 
Lesen aus dem AVR64DD28 scheiterte allerdings – an den Adressen der 
Fuses wurde überhaupt keine Antwort zurückgegeben, an ungültigen 
Adressen ("Reserved"-Block) lieferte das UPDI scheinbar zufällige Bytes 
als Antwort auf die LDS-Anweisung.

Mir kam infolgedessen nun der Verdacht auf, dass meine beiden AVR64DD28 
eventuell LOCKED sind. Das würde ja die fehlende Antwort und die 
Fehlermeldung beim Verifizieren der Fuses erklären. Ich werde gleich mal 
probieren, einen CHIPERASE durchzuführen, und melde mich dann nochmal, 
ob das was gebracht hat …

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

Zum Locken müßte man laut Manual einen ungültigen Wert in das Lock.Key 
Register schreiben. Adresse 0x1040. Kann das zufällig passiert sein? Ein 
einziger gültiger Wert zum unlocken ist 0x5CC5C55C, alles andere sind 
ungültige Werte. Seite 58-61.
Von Configuration Change Protection dafür lese ich auch nichts. Seite 
41.
Kannst du das Lock-Key Register im gesperrten Zustand auslesen?
Chip Erase soll entsperren, ich weiß aber nicht ob das Lock Key Register 
dabei automatisch auf Default "entsperrt" gesetzt wird. Oder man das 
selbst machen muss.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Veit D. schrieb:
> Kannst du das Lock-Key Register im gesperrten Zustand auslesen?

Laut Datenblatt des AVR64DD28, S. 58 (s. Anhang): nein.

Veit D. schrieb:
> Chip Erase soll entsperren, ich weiß aber nicht ob das Lock Key Register
> dabei automatisch auf Default "entsperrt" gesetzt wird.

Hmm, gute Frage: Aus dem Datenblatt des AVR64DD28, S. 564: "After a 
successful chip erase, *the lock bits will be cleared,* and the UPDI 
will have full access to the system." Das suggeriert ja erstmal, dass 
LOCK.KEY einfach nur auf 0x0000_0000 gesetzt wird? Dann müsste man noch 
manuell den Valid Key schreiben. Ich werde das ausprobieren; momentan 
bin ich noch dabei, meinen Code aufzuräumen, um die Handhabung zu 
verbessern …

von S. L. (sldt)


Lesenswert?

> ... Oder man das selbst machen muss.

Wie sollte das gehen? Der Controller wäre ja noch immer gesperrt, 
folglich hätte UPDI keinen Zugriff auf die Lock-Bytes.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
>> ... Oder man das selbst machen muss.
>
> Wie sollte das gehen? Der Controller wäre ja noch immer gesperrt,
> folglich hätte UPDI keinen Zugriff auf die Lock-Bytes.

Ja, ich finde es auch seltsam, aber ich dachte, vielleicht merkt sich 
der AVR irgendwie, dass ein Chip Erase durchgeführt wurde und erlaubt 
bis zu einem Reset oder so den Zugriff auf die Lock-Bytes.

Oder es ist nur ein Formulierungsfehler im Datenblatt. Wird sich 
hoffentlich nachher herausstellen.

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> Formulierungsfehler

Ich halte es eher für den üblichen Sprachgebrauch, siehe das 'cleared' 
im Anhang. Im Gegensatz zu 'Lock set'.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Ich halte es eher für den üblichen Sprachgebrauch, siehe das 'cleared'
> im Anhang. Im Gegensatz zu 'Lock set'.

OK, danke für die Info – dann wird es wohl so sein, dass in LOCK.KEY 
nach dem Chip Erase der Entsperr-Schlüssel geschrieben wird. Ergibt ja 
auch Sinn.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich verstehe den gezeigten Text von Seite 564 so, dass mit "cleared" das 
Register auf Default, also unlocked gesetzt wird. Der Nachsatz
"... and the UPDI will have full access to the system."
unterstreicht das. Die ungültigen lock bits werden gelöscht.

Ansonsten wäre das in der Tat wie S.L. schreibt unlogisch und man würde 
sich im Kreis drehen. Was mich nur wundert ist, du hast doch bei den 
früheren Programmierversuchen immer chip erase durchgeführt. Der 
Controller sollte eigentlich entsperrt sein.  'grübel'

von Johannes T. F. (jofe)


Lesenswert?

Leider muss ich nochmals eine Frage zu den Adressen stellen:
Wo finde ich denn die Basis-Adresse der UPDI-Register im RAM, vom 
UPDI-Adressraum aus gesehen? Die kann ich weder im Datasheet noch in der 
…def.inc finden.

Ich würde im Zuge des Chip Erase gern die Register UPDI.ASI_KEY_STATUS, 
UPDI.ASI_RESET_REQ und UPDI.ASI_SYS_STATUS lesen bzw. schreiben. Dazu 
sind unter "UPDI Register Description" natürlich wieder die Offsets 
angegeben, jedoch bin ich mir über die Basisadresse im Unklaren.

Wo ich z.B. jene der FUSEs finde, weiß ich nun – aber unter "Peripheral 
Address Map" gibt es keine Zeile "UPDI".

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

> ... Basis-Adresse der UPDI-Register ...

Gibt es nicht, bzw. ist 0. Die Zeile "Offset: ..." unter UPDI- 'Register 
Summary' ist etwas irreführend. Es handelt sich um Register innerhalb 
von UPDI, und auch nur innerhalb ansprechbar mit LDCS bzw. STCS.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Gibt es nicht, bzw. ist 0.

Aha, super, vielen Dank für die schnelle Antwort!

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Hallo nochmal an alle,

ich habe in der Zwischenzeit viel Zeit mit dem Herumexperimentieren mit 
meinem UPDI-Testprogramm verbracht; was nun funktioniert, ist das 
Auslesen des System Information Blocks, das Lesen von UPDI-Registern mit 
dem LDCS-Befehl sowie (scheinbar) das Durchführen eines Chip Erase, 
wobei letzteres zwar einen ASI_SYS_STATUS von 0x20 am Ende liefert (d.h. 
LOCKSTATUS == 0), der AVR64DD28 danach aber trotzdem nicht auf 
LDS-Befehle antwortet (ebenso wie mein ATtiny416).

Der Soft-UART, den ich nach den Datenblatt-Spezifikationen des UPDI 
geschrieben habe, funktioniert; zumindest werden die Sendungen, die mein 
Programm erzeugt, vom angeschlossenen u. UPDI-entsprechend 
konfigurierten Oszilloskop richtig decodiert – ein Screenshot von einer 
LDS-0x1100-Anweisung ist angehängt.

Auf diese LDS-Anweisungen folgt leider keine Antwort, weder vom 
AVR64DD28 noch vom ATtiny416, mit dem ich ebenfalls teste. Ich kann mir 
nun einfach nicht erklären, warum. Der Empfang des SIB funktioniert ja: 
ich erhalte
1
AVR     P:2D:1-3
vom AVR64DD28 und
1
tinyAVR P:0D:0-3
vom ATtiny416.

Da das Problem ja scheinbar nur bei den Anweisungen besteht, die aus 
mehr als einem Byte (ohne SYNCH) bestehen, habe ich bereits zwischen den 
einzelnen Bytes Abstände von zwei Idle-Bits oder sogar einem ganzen 
IDLE-Frame (also 12 High-Bits) eingefügt – ohne Erfolg. Ich weiß einfach 
nicht weiter, was noch das Problem sein könnte. Den derzeitigen Stand 
meines (hoffentlich hinreichend kommentierten) Assembler-Codes habe ich 
mal angehängt. Ich würde mich sehr über Hinweise freuen, was ich falsch 
gemacht haben könnte.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Ich habe noch ein paar Fehler beseitigt, die aber nichts mit dem 
LDS-Problem zu tun hatten. Den korrigierten Code habe ich angehängt.

Gerade habe ich auch noch mit einem ebenfalls nagelneuen AVR128DB28 von 
Mouser.de getestet: selbes Ergebnis, Ein-Byte-Anweisungen funktionieren, 
dagegen keine Antwort auf LDS-Instruktion. :(

von Frank K. (fchk)


Lesenswert?

Hmm - ich habe bislang immer zu den Tools des Herstellers gegriffen und 
bin dahin immer gut gefahren. Das ist zwar nicht die billigste Methode, 
aber die effizienteste, wenn das Zeugs laufen muss und man Geld damit 
verdient.

In Deinem Fall wäre das ein PICKIT 5 mit MPLABX. Ja, ich weiß, dass das 
in der AVR Community unbeliebt ist, aber das ist eben das, was Microchip 
aktuell anbietet und auch weiter pflegen wird. Das Studio ist EOL.

fchk

von Johannes T. F. (jofe)


Lesenswert?

Frank K. schrieb:
> In Deinem Fall wäre das ein PICKIT 5 mit MPLABX.

Ja, das ist schon eine Überlegung wert für mich, mir das anzuschaffen. 
Ist ja auch gar nicht soo teuer. Obwohl das alles für mich „nur“ Hobby 
ist und ich keinerlei Geld damit verdiene.

Mir geht’s allerdings momentan vorrangig darum, das UPDI-Protokoll zu 
verstehen und herauszufinden, wo der Fehler in meinem Code ist. Der 
Fehler muss ja bei mir liegen, denn die drei z.T. fabrikneuen AVRs 
können ja nicht alle kaputt sein ...

von Adam P. (adamap)


Lesenswert?

Johannes T. F. schrieb:
> Versuche ich nun aber, Fuses zu ändern, erhalte ich die angehängte
> Fehlermeldung. Anscheinend ist das Verifizieren der geschriebenen Fuses
> fehlgeschlagen.

Hab das gleiche Problem mit SAM4E16E & SAMC21.
Egal ob mit SEGGER SAM-ICE oder ATMEL-ICE Programmer.

Klickst du "Program" scheint alles gut zu sein, klickst du dann "Verify" 
kommt deine Fehlermeldung.

Nutzt du jedoch die JLink.exe oder atprogram.exe und setzt die Fuses per 
Befehl direkt über die Konsole, dann funktioniert es.

Fazit:
Ich glaube da stimmt was mit dem Studio nicht.
Mal funktionierts und dann wieder ganz oft nicht.

von S. L. (sldt)


Lesenswert?

an Johannes T. Fechner:

Das Programm ist mir zu komplex, um es rein gedanklich nachvollziehen zu 
können.
  Um es aber laufen zu lassen, fehlt mir (neben den Makros) die 
Hardware, ich habe hier aus der 'tinyAVR® 1-series'-Reihe nur den 
ATtiny1614, und der hat keinen PORTC. Bei den AVRmxyn fehlt mal PORTB, 
mal TCA. Kurzum: wenn Sie Ihr Programm so ändern, dass es auf dem 
ATtiny1614 läuft (u.a. PORTC -> PORTA), will ich mich gerne mit Ihrem 
LDS-Problem befassen.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

S. L. schrieb:
> Kurzum: wenn Sie Ihr Programm so ändern, dass es auf dem
> ATtiny1614 läuft (u.a. PORTC -> PORTA), will ich mich gerne mit Ihrem
> LDS-Problem befassen.

Hier die für den ATtiny1614 geänderte Version im Anhang, nun als 
kompletter Microchip-Studio-Projektordner incl. Build – ich hoffe, so 
ist es evtl. einfacher.

Die Datei /macros.asm/ ist nun auch mit dabei, hatte ich letztes Mal 
vergessen, sorry.

Vielen Dank an S. Landolt, dass Sie sich damit beschäftigen möchten.

Die Datei /updi.asm/ enthält die Timer-ISR für den Software-UART, sowie 
die Pin-Sense-ISR, welche nach einem Sendevorgang aktiviert wird und 
dann bei fallender UPDI-Flanke den Empfang auslöst. Zudem noch die 
Routine updi_tx, die das Senden der im UPDI-Puffer gespeicherten Bytes 
anstößt.

Die Datei /main.asm/ enthält das Programmgrundgerüst zur Kommunikation 
über UART mit einem PC-Terminal; die Hauptschleife ruft updi_tx entweder 
direkt oder über Subroutinen auf und liest dann das Empfangene aus dem 
Puffer.

Ich hoffe, der Code ist in Verbindung mit den Kommentaren so 
verständlich.

von Georg M. (g_m)


Lesenswert?

Ich habe jetzt festgestellt:
weder AVR16DD14 noch AVR16EB14 wollen mit dem mEDBG programmiert werden.

Es ist Zeit für einen nEDBG.

von S. L. (sldt)


Lesenswert?

an Johannes T. Fechner:

Gibt es hardwaremäßig etwas zu beachten?
  Ich habe UPDI an PORTA_1 angeschlossen (per 1 kOhm, wie vorgegeben); 
zuvor das Programm auf interne 20 MHz umgestellt. Gebe '1' für '(1) Read 
SIB' und erhalte nach 5.2 s die Meldung "Error: Timeout while waiting 
for UPDI answer." (ebenso bei '2'), sowohl bei einem AVR16EB28 als auch 
bei einem ATtiny412. U= 3.3 V.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Gebe '1' für '(1) Read
> SIB' und erhalte nach 5.2 s die Meldung "Error: Timeout while waiting
> for UPDI answer." (ebenso bei '2'), sowohl bei einem AVR16EB28 als auch
> bei einem ATtiny412. U= 3.3 V.

Habe gerade die Ursache gefunden: Zeile 42 in "main.asm" muss
1
.equ TARGET_UPDI_PINCTRL = PORTA_PIN1CTRL
lauten. Ich hatte vergessen, dort die Pin-Nummer von 0 auf 1 zu ändern 
(Target UPDI war bei mir PC0). Damit wurde der Pin Change Interrupt 
nicht ausgelöst und daher der Empfang nicht getriggert.

BTW, gibt es eigentlich irgendeine Möglichkeit, diese .equ-Direktiven 
beim Microchip-Assembler avrasm2 so zu gestalten, dass man bei mehreren 
Port-Register-Definitionen bzw. Pin-Zuweisungen diese Buchstaben/Zahlen 
nur einmal definiert und dann daraus die verschiedenen Symbole wie 
PORTX_VOUT, PORTX_VDIR, PORTX_PINYCTRL etc. automatisch ableitet? Ich 
hatte das schonmal erfolglos mit Makros versucht. Das würde zumindest 
solche Flüchtigkeitsfehler wie den obigen vermeiden helfen.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

Ich hatte früher einmal etwas mit den Operatoren 'Stringification (#)' 
und 'Concatenation (##)' versucht, das hatte auch funktioniert, aber es 
war mir, um ehrlich zu sein, auf Dauer zu kompliziert bzw. es 
widerstrebte meiner gewohnten Denkweise.

PS:
So, nun erhalte ich schon mal bei '1' "tinyAVR P:0D:0-3" für den 
ATtiny412 - jetzt geht es an '3'. Das kann aber eine Weile dauern: 
"alter Mann ist kein D-Zug", sagten wir in der Mittelstufe und lachten; 
heute, nach vielen Jahrzehnten, ist mir das Lachen darüber vergangen.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

Ein Fehler liegt in der Übergabe der Adresse: wenn ich statt 
'temp1,temp0' z.B. YH,YL verwende, erhalte ich meist das richtige 
Ergebnis: "Address: 1101 Data: 92" oder auch "Address: 1285 Data: F7". 
Aber nur meist - manchmal kommt noch immer Timeout, und es ist mir noch 
nicht klar, unter welchen Umständen.

von Johannes T. F. (jofe)


Lesenswert?

Hmm, das ist aber merkwürdig ...
Klingt erstmal danach, als wenn ich vergessen hätte, die Register temp0 
und temp1 z.B. in der Timer-ISR zu retten. Habe ich aber gemacht – 
gerade noch mal alles kontrolliert.

von S. L. (sldt)


Lesenswert?

Vergessen Sie dies erstmal, es könnte auch an meiner Hilfsausgabe 
liegen.
  Das vordringliche Problem ist ohnehin das Timeout: vorhin trat es 
generell nicht mehr auf, nach Strom aus- und wieder einschalten ist es 
nun permanent da - ich arbeite dran, ich arbeite dran ...

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> ich arbeite dran, ich arbeite dran ...

Vielen vielen Dank noch einmal für Ihre Mühe!

Adam P. schrieb:
> Nutzt du jedoch die JLink.exe oder atprogram.exe und setzt die Fuses per
> Befehl direkt über die Konsole, dann funktioniert es.

Habe gerade mal versucht, atprogram.exe direkt aufzurufen – auch hierbei 
trat der Fehler auf:
1
C:\Program Files (x86)\Atmel\Studio\7.0\atbackend>atprogram -t medbg -i updi -d avr128db28 write -fs -o 0x1051 --values E0 --verify
2
Firmware check OK
3
[ERROR] An error occurred executing a command (write): Verification of write failed. Memory could not be read.

Nachtrag: Nun noch einmal einen Chiperase scheinbar erfolgreich 
durchgeführt,
1
C:\Program Files (x86)\Atmel\Studio\7.0\atbackend>atprogram -t medbg -i updi -d avr128db28 chiperase
2
Firmware check OK
3
Chiperase completed successfully
und danach noch einmal o.g. Kommando ausgeführt: es erscheint wieder 
dieselbe Fehlermeldung.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

Probieren Sie Folgendes in main.asm:
1
loop_readByte:
2
...
3
...
4
; Enable Target UPDI:
5
  rcall  updi_enable
6
7
rcall systemReset  ; <=============== SLdt 2406201909
8
9
; Send LDS instruction:
10
  rcall  sendLds
11
...

von S. L. (sldt)


Lesenswert?

1
Address: 1080 Data: 1E
2
Address: 1081 Data: 94
3
Address: 1082 Data: 3F
4
Und der geneigte Leser erkennt einen AVR16EB28.
5
6
Address: 1100 Data: 1E
7
Address: 1101 Data: 92
8
Address: 1102 Data: 23
9
Das war ein ATtiny412.
10
11
Address: 1100
12
Error: Timeout while waiting for UPDI answer.
13
Und der Landolt blicket stumm
14
auf dem ganzen Tisch herum.
15
Bzw. auf den fabrikneuen AVR16DD28.
16
17
Dabei bringt dieser bei '1' "AVR     P:2D:1-3"

Nachtrag:
Dasselbe bei einem neuen AVR32EA28 (mit '1' "AVR     P:3D:1-3").
  Ich setze mich morgen nochmals an Ihr Programm und melde mich, falls 
die beiden Letztgenannten auch erkannt werden.
  Leider ist ein Vergleich mit meinem eigenen Programm schwierig, es hat 
eine völlig andere Struktur.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

S. L. schrieb:
> rcall  updi_enable
> rcall systemReset  ; <=============== SLdt 2406201909
> ; Send LDS instruction:

Habe ich probiert – leider ohne Erfolg, bei mir kam bei keinem meiner 
Versuche eine Antwort vom AVR128DB28.

Ich habe nun auch noch versucht, die „Start-Sequenz“ des mEDBG (UPDI low 
für ca. 50ms, high ca. 100ms, nochmal low ca. 50ms, danach das 
SYNCH-Frame), die ich auf meinem Oszi bemerkt habe, nachzuahmen – 
ebenfalls ohne Erfolg. :,(

Ich kann mir einfach nicht erklären, warum die AVRs auf den von meinem 
Programm gesendeten LDS-Befehl keine Antwort liefern – der Befehl wird 
ja von meinem Oszi korrekt decodiert … Weiß einfach nicht, was da falsch 
läuft. Zumindest die Signature-Bytes werden ja offenbar vom mEDBG 
korrekt ausgelesen und im Studio angezeigt. Sehr mysteriös, dass das mit 
meinem Programm nicht klappt.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

> bei keinem meiner Versuche eine Antwort vom AVR128DB28.
Aha, interessant; ein älterer zeigt bei mir:
1
AVR     P:2D:1-3
2
Address: 1100 Data: 1E
3
Address: 1101 Data: 97
4
Address: 1102 Data: 0E

von Johannes T. F. (jofe)


Lesenswert?

Ja, zumindest dem ATtiny416 konnte ich mit meinem Programm mal u.a. die 
Fuse-Werte per LDS entlocken. Dann hatte ich einiges im Code 
umstrukturiert – „verbessert“, so dachte ich … – und nun geht es nicht 
mehr.

Ich kann mir aber beim besten Willen nicht erklären, woran das liegt. 
Habe den Code schon dutzende Male nach irgendwelchen Fehlern 
durchforstet … zumal das Software-UART-Output ja auf dem Oszi das 
gewüschte Ergebnis liefert …

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

Schon richtig, aber bei LDS wird die Grenze zwischen ASI und dem 
eigentlichen Controller überschritten; die Zustände Beider müssen 
zueinander passen.

Wie gesagt, ich setze mich morgen nochmals dran (halte mich an Edwin C. 
Bliss: 'Few problems resist an all-out-attack'); und schließlich habe 
ich selbst ja auch einen gewissen Erkenntnisgewinn.

von S. L. (sldt)


Lesenswert?

an Johannes T. Fechner:
Probieren Sie Folgendes in main.asm:
1
loop_readByte:
2
...
3
...
4
; Enable Target UPDI:
5
  rcall  updi_enable
6
7
rcall sendNvmProgKey   ; <=== SLdt 2406211020
8
rcall systemReset      ; <=== SLdt 2406201909
9
10
; Send LDS instruction:
11
  rcall  sendLds
12
...

Mit dieser Änderung lässt sich, zumindest bei mir, die Signatur auslesen 
von ATtiny412, ATmega4809, AVR128DB28, AVR16DD28, AVR32EA28 und 
AVR16EB14.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Probieren Sie Folgendes in main.asm:

Gerade an einem AVR128DB28 getestet: es funktioniert bei mir genau jedes 
zweite Mal, dazwischen wieder Timeout (getestet mit den 
Signature-Byte-Adressen 0x1100, 0x1101, 0x1102).

Aber immerhin schon ein Fortschritt. Vielen Dank für den Hinweis!

von S. L. (sldt)


Lesenswert?

> an einem AVR128DB28 getestet
Bei meinem geht es, Date-code 2037K94; welchen hat Ihrer?

Nachtrag:
Also gut, nächster Versuch:
1
rcall systemReset       ; <=== SLdt 2406211132
2
rcall sendNvmProgKey    ; <=== SLdt 2406211020
3
rcall systemReset       ; <=== SLdt 2406201909

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
>> an einem AVR128DB28 getestet
> Bei meinem geht es, Date-code 2037K94; welchen hat Ihrer?

Meiner hat den Code 2242WVR.

S. L. schrieb:
> Also gut, nächster Versuch:

Mit dem AVR128DB28 scheint es so zu funktionieren. Mehrfach nacheinander 
wurden die Signaturbytes erfolgreich gelesen.

Leider geht es aber mit meinem ATtiny416 gar nicht, da kommt nie eine 
Antwort … Mysteriös. Kann sein, dass der eventuell geLOCKt ist. 
Allerdings bekomme ich ebenfalls bei der ChipErase-Sequenz ein Timeout.

: Bearbeitet durch User
von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> Allerdings bekomme ich ebenfalls bei der ChipErase-Sequenz ein Timeout.

Okay, kommt bei mir auch, siehe Anhang, und ist erstmal zwar hässlich, 
trotzdem wirkungsvoll - bei Ihnen nicht?

PS:
Andererseits: warum sollte Ihr ATtiny416 überhaupt gesperrt sein?

PPS:
> ATtiny416 gar nicht, da kommt nie eine Antwort
Auch nicht bei '(1) Read SIB'?
  Dann wäre vermutlich SYSCFG0.RSTPINCFG[1:0] gesetzt, und es hülfe nur 
ein HV-Reset.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Okay, kommt bei mir auch, siehe Anhang, und ist erstmal zwar hässlich,
> trotzdem wirkungsvoll - bei Ihnen nicht?

Leider nicht, auch nach dem Menüpunkt ChipErase kommt bei mir nur 
"Timeout" beim Versuch, die Signature-Bytes auszulesen.

S. L. schrieb:
> PS:
> Andererseits: warum sollte Ihr ATtiny416 überhaupt gesperrt sein?

Als das Auslesen mittels LDS mit meinem Programm noch funktionierte, 
wollte ich mal versuchsweise den ATtiny sperren, indem ich mittels des 
Menüpunkts "(4) Write fuse byte" irgendeinen Wert in LOCKBIT ungleich 
0xC5 schrieb. Ich kann mich nicht mehr erinnern, ob das Entsperren 
danach geklappt hat. Gerade habe ich den ATtiny aber nochmal ans mEDBG 
geklemmt, welches die Signatur auslesen konnte. Demnach war der ATtiny 
also nicht gesperrt.

S. L. schrieb:
> Auch nicht bei '(1) Read SIB'?

Doch, das Lesen des SIB klappt bei mir immer.

Ich habe mir nun vorgenommen, den Quellcode des pymcuprog von 
Microchip[1] zu studieren, um hoffentlich mehr Einsichten in die 
Funktionsweise von UPDI zu gewinnen – was die Datenblätter nicht so 
richtig hergeben, wie ich finde. Mal sehen, inwieweit mir das mit meinen 
bescheidenen Python-Kenntnissen gelingt.
[1] https://github.com/microchip-pic-avr-tools/pymcuprog

Zumindest kommt dieses Programm ja wohl offiziell vom Hersteller und 
sollte damit ja die eigenen Spezifikationen erfüllen …

von S. L. (sldt)


Lesenswert?

Nun, ich hatte wie Sie angefangen, nämlich mit dem Auslesen des SIB, 
damals noch auf einem ATmega1284P, TX und RX über diese 
Widerstand-Diode-Kombination an UPDI angeschlossen. Alles anhand des 
Datenblattes. Bald auf AVR128DA28 umgestiegen, und dort LBME und ODME 
der USARTs genutzt; was mir Ihre Einzelbitverarbeitung ersparte. Und ja, 
trotz Datenblatt war einiges nur durch Ausprobieren (neudeutsch: 
trial&error) zu meistern, sodass ich, wie Sie jetzt, Hilfe auf github 
suchte - und nur Unbrauchbares oder zu Kompliziertes fand; ist aber 
schon Jahre her, das mag heute anders aussehen.

Mit dem aktuellen Stand meines Programmes bin ich ganz zufrieden, und 
vielleicht baue ich demnächst noch das HV-Reset ein, obwohl ich es nicht 
benötige.

Ihnen wünsche ich viel Erfolg auf dem weiteren Weg zum eigenen Programm 
(und auch viel Glück, ich fürchte, Sie werden es brauchen), und 
verabschiede mich ...

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Nun, ich hatte wie Sie angefangen, nämlich mit dem Auslesen des SIB,
> damals noch auf einem ATmega1284P, TX und RX über diese
> Widerstand-Diode-Kombination an UPDI angeschlossen. Alles anhand des
> Datenblattes. Bald auf AVR128DA28 umgestiegen, und dort LBME und ODME
> der USARTs genutzt; was mir Ihre Einzelbitverarbeitung ersparte.

Ja, ich dachte auch schon daran, dass ein Controller mit mehr als einem 
Hardware-USART vorteilhaft wäre – ich habe bereits viele ATmega328PB auf 
Lager, allerdings fehlt mir momentan noch ein 
Breakout-/Experimentier-Board für deren TQFP-32-Gehäuse (ist in Planung, 
werde ich demnächst bei JLCPCB fertigen lassen); somit blieb mir nur die 
Software-Lösung, die aber m.E.n. auch relativ straight-forward gemacht 
ist.

S. L. schrieb:
> Und ja,
> trotz Datenblatt war einiges nur durch Ausprobieren (neudeutsch:
> trial&error) zu meistern, sodass ich, wie Sie jetzt, Hilfe auf github
> suchte - und nur Unbrauchbares oder zu Kompliziertes fand; ist aber
> schon Jahre her, das mag heute anders aussehen.

Inzwischen bin ich – nach einigem Suchen im Dateiendschungel – fündig 
geworden, was die für mich interessanten Teile des pymcuprog-Sourcecodes 
betrifft:
1
• pymcuprog-main\pymcuprog\serialupdi\application.py
2
• pymcuprog-main\pymcuprog\serialupdi\constants.py
3
• pymcuprog-main\pymcuprog\serialupdi\link.py
4
• pymcuprog-main\pymcuprog\serialupdi\nvmp[0,2,3,4,5].py
Habe diese kurz überflogen und denke, dass ich dort finde, was ich 
brauche.

S. L. schrieb:
> Ihnen wünsche ich viel Erfolg auf dem weiteren Weg zum eigenen Programm
> (und auch viel Glück, ich fürchte, Sie werden es brauchen), und
> verabschiede mich ...
Dankeschön, sowohl für die guten Wünsche als auch für Ihre gewohnt 
wertvolle Hilfe! :)

von Johannes T. F. (jofe)


Lesenswert?

Sooo, das LDS-Problem ist gelöst. Ich habe nach dem updi_enable eine 
Wartezeit von 25 ms eingefügt (nach einer LDCS-Anweisung, damit die 
Target-MCU nicht ihr UPDI per Timeout gleich wieder deaktiviert):
1
loop_readByte:
2
[...]
3
    rcall   updi_enable
4
; Send LDCS instruction, to keep UPDI alive:
5
    clr     tmp0
6
    rcall   sendLdcs
7
; Wait for answer bytes from Target UPDI:
8
loop_readByte_waitLdcs:
9
    sbrc    updiFlags, UPDI_FLAGS_TIMEOUT_bp
10
    rjmp    loop_timeout
11
    sbrs    updiFlags, UPDI_FLAGS_RXC_bp
12
    rjmp    loop_readByte_waitLdcs
13
; Give the target MCU a bit of time:
14
    rcall   updi_wait25ms
15
; Send LDS instruction:
16
    rcall   sendLds
17
; Read answer byte from Target UPDI:
18
[...]
Der Controller war direkt nach dem UPDI-Enable wohl einfach noch nicht 
bereit für den Speicherzugriff.

Auch die Chip-Erase-Prozedur funktioniert nun, nach dem Einfügen von 
25-ms-Warteroutinen zwischen Issue_System_Reset und Clear_System_Reset, 
sowie in der sich anschließenden readLockStatus-Schleife.

Schade, dass diese Timing-Bedingungen nicht im Datenblatt erwähnt 
werden. Das hätte mir so einige Frustration erspart ...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

du hast meinen vollen Respekt!

von S. L. (sldt)


Lesenswert?

> ... Wartezeit ...

Oh ja, ich erinnere mich: ich musste damals auch einige waits einbauen, 
5 ms bspw., manchmal reichten schon 10 us.
  Und jetzt ärgere ich mich, dass mir das nicht mehr einfiel und ich es 
nicht gleich vorschlagen konnte.

von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> du hast meinen vollen Respekt!

Danke :D Ich war aber auch ehrlich gesagt schon kurz vor dem Aufgeben. 
Der pymcuprog-Code liefert mir leider nicht wirklich neue Erkenntnisse, 
scheint auch einfach nur das zu machen, was ich schon tue …

Ich überlege auch hin und wieder, zu PIC-Controllern zu wechseln, in der 
Hoffnung, dass deren Programmier-Interface zuverlässiger bzw. einfacher 
zu handhaben ist als UPDI. Dafür müsste ich mich aber natürlich erstmal 
in PIC einarbeiten, da gibt es ja scheinbar größere Unterschiede zu AVR. 
Zu „In-Circuit Serial Programming“ habe ich anhand einer flüchtigen 
Google-Suche lediglich eine AppNote von 2003 gefunden, im Datenblatt des 
PIC16F1454 ist das ICSP nicht wirklich dokumentiert. Was die Frage 
aufwirft, ob die PIC-Programmier-Schnittstellen überhaupt öffentlich 
dokumentiert sind, also zum Selbst-Implementieren hinreichend, oder 
unter Verschluss gehalten, sodass man auf die käuflichen Programmer 
angewiesen wäre?

Johannes T. F. schrieb:
> Sooo, das LDS-Problem ist gelöst. Ich habe nach dem updi_enable eine
> Wartezeit von 25 ms eingefügt

Ganz so einfach war es doch nicht – ich hatte zunächst nur mit dem 
ATtiny416 getestet; als ich vorhin nochmal den 64DD28 ansteckte, wollte 
der mir nun partout wieder nicht auf die LDS-Anweisung antworten. 
Scheinbar will der wirklich unbedingt vorher noch den NVMProg-Key sehen, 
wie von Herrn Landolt vorgeschlagen. Also habe ich diese Passage (inkl. 
Reset vor- und nachher) wieder eingebaut. – Für den 64DD28 war das gut, 
der gab mir nun wieder die Signature Bytes heraus … Danach nochmal der 
Test mit dem tiny416 – und wieder Timeout, keine Antwort mehr auf LDS. 
–.–

Glücklicherweise haben tinyAVR 1-series und AVR-DD verschiedene 
NVM-Versionsziffern (0 bzw. 2), sodass man davon abhängig verschieden 
verfahren kann. Das habe ich nun in meinen Code eingebaut: vor dem LDS 
wird zunächst das SIB gelesen und nach der NVM-Version verzweigt; 
Version 0 bekommt einfach nur 25 ms Wartezeit, Version 2 dagegen erhält 
die komplette Reset–NVM-Key–Reset-Prozedur. So funktioniert es nun 
immerhin mit beiden AVR-Typen.

Nun mache ich mich an das Schreiben von Fuse Bytes. Das funktioniert bis 
jetzt nämlich noch nicht, seltsamerweise erhalte ich nach dem Senden des 
NVM-Prog-Keys einen ASI_KEY_STATUS von 0x00 – warum auch immer, vor dem 
LDS funktioniert es ja …

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Johannes T. F. schrieb:

> Ich überlege auch hin und wieder, zu PIC-Controllern zu wechseln, in der
> Hoffnung, dass deren Programmier-Interface zuverlässiger bzw. einfacher
> zu handhaben ist als UPDI. Dafür müsste ich mich aber natürlich erstmal
> in PIC einarbeiten, da gibt es ja scheinbar größere Unterschiede zu AVR.
> Zu „In-Circuit Serial Programming“ habe ich anhand einer flüchtigen
> Google-Suche lediglich eine AppNote von 2003 gefunden, im Datenblatt des
> PIC16F1454 ist das ICSP nicht wirklich dokumentiert. Was die Frage
> aufwirft, ob die PIC-Programmier-Schnittstellen überhaupt öffentlich
> dokumentiert sind, also zum Selbst-Implementieren hinreichend, oder
> unter Verschluss gehalten, sodass man auf die käuflichen Programmer
> angewiesen wäre?

Das Problem ist, dass es nicht "das ICSP" gibt. Hardwaretechnisch ist 
das ziemlich einheitlich. Clock, Data, GND, VTarget und ein MCLR/Reset, 
der aber auch höhere Spannungen erzeugen können muss (9V, 12.5V,...).

Das Protokoll ist jedoch unterschiedlich, abhängig davon ob Du einen 12 
Bit, 14 Bit oder 16 Bit Core hast, oder PIC24/dsPIC, und bei PIC32 wird 
das MIPS EJTAG durchgetunnelt. Oftmals wird auch noch ein Programming 
Executive runtergeladen, der weitere Funktionen implementiert. Das alles 
zu implementieren macht irgendwie keinen Sinn, da kauft Du einen 
PICKIT5, der das alles plus PDI/UPDI/..., ARM SWD etc kann, und gut ist.

Es sei denn, Du hast kein wirkliches Leben und nichts andere zu tun. 
Aber das frage ich mich bei diesen Thread eh.

fchk

PS: Und debuggen kannst Du dann immer noch nicht. Bei Dir ist alles noch 
Fire and Forget. Auch unbefriedigend.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

Frank K. schrieb:
> Das Protokoll ist jedoch unterschiedlich, abhängig davon ob Du einen 12
> Bit, 14 Bit oder 16 Bit Core hast, oder PIC24/dsPIC, und bei PIC32 wird
> das MIPS EJTAG durchgetunnelt. Oftmals wird auch noch ein Programming
> Executive runtergeladen, der weitere Funktionen implementiert. Das alles
> zu implementieren macht irgendwie keinen Sinn, da kauft Du einen
> PICKIT5, der das alles plus PDI/UPDI/..., ARM SWD etc kann, und gut ist.

OK, danke für die Info. Das wäre mir dann auch zu kleinteilig/aufwendig.

Frank K. schrieb:
> Es sei denn, Du hast kein wirkliches Leben und nichts andere zu tun.
> Aber das frage ich mich bei diesen Thread eh.

Tja, was ist „das wirkliche Leben“? Mir macht es halt Spaß, mich mit 
solchen Low-Level-Dingen und Assembler zu befassen. Dass das nicht 
jedermanns Sache ist, weiß ich. Andere gucken jeden Tag drei Stunden 
Fußball. So what.

Aber das hier ist ja ein Forum, also niemand muss jeden Thread lesen, 
der ihn nicht interessiert, … und es gibt hier mindestens einen, bei dem 
ich mir ziemlich sicher bin, dass er die Vorliebe für diese Thematik 
teilt und Interesse an meinen eventuellen Fortschritten hat.

Frank K. schrieb:
> PS: Und debuggen kannst Du dann immer noch nicht. Bei Dir ist alles noch
> Fire and Forget. Auch unbefriedigend.

Was ich bis jetzt habe, ist natürlich nur ein „primitives“ Testprogramm 
für mich, um etwas mit UPDI herumzuspielen und zu sehen, inwieweit es 
mir möglich ist, dass vielleicht mehr daraus wird.

Davon abgesehen, an Debugging hat mir persönlich (bei meinen bisher noch 
sehr einfachen Assemblerprogrammen) UART-Ausgabe und Pin-Wackeln immer 
gereicht. Ich bin halt auch Hobbyist und kein Profi.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

lass dich nicht entmutigen und dir den Spaß nicht nehmen. Solche 
Aussagen

> Es sei denn, Du hast kein wirkliches Leben und nichts andere zu tun.
> Aber das frage ich mich bei diesen Thread eh.

sind einfach nur dumm und unüberlegt. Wenn Frank AVR programmiert wird 
er sicherlich den avr-gcc und avrdude verwenden. Rate mal wieviel Leute 
daran arbeiten und ihre Freizeit dafür opfern. Einige davon sind hier im 
Forum dabei. Die fühlen sich bei solchen Aussagen bestimmt unwohl.

Also, ignorieren und weitermachen solange es Spass macht.

von Johannes T. F. (jofe)


Lesenswert?

Veit D. schrieb:
> lass dich nicht entmutigen und dir den Spaß nicht nehmen.

Hallo, danke für die Bestätigung.

Nach langem letztlich erfolglosen Herumprobieren habe ich die Sache mit 
UPDI jetzt aber doch endgültig aufgegeben. Es ist für mich einfach nur 
ahnungsloses Stochern im Dunkeln; ich bekomme auf STS-Instruktionen 
keine 'ACK'-Antwort, auch wenn ich genauso vorgehe, wie mymcuprog es 
tut, und an allen möglichen Stellen Verzögerungen einbaue. Nun ist mir 
die Lust daran vergangen und ich werde mich anderen Dingen widmen, und 
irgendwann halt mal so ein PICKIT 5 kaufen.

von S. L. (sldt)


Lesenswert?

> ... endgültig aufgegeben ... die Lust daran vergangen ...

Kann ich verstehen, kann ich sogar sehr gut verstehen - war schließlich 
auch einige Male soweit.
  Nun aber würde mich Ihr derzeitiger Stand interessieren, rein für 
mich, wenn Sie also so gut sein würden und ihn hier einstellten, so wäre 
ich sehr verbunden.
  "Man lernt an allem etwas", wie Gottfried Keller seinen grünen 
Heinrich sagen lässt.

PS:
> STS-Instruktionen keine 'ACK'-Antwort
Mit welchen Adressen haben Sie es versucht?

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Veit D. schrieb:
> Wenn Frank AVR programmiert wird
> er sicherlich den avr-gcc und avrdude verwenden.

Wenn. Ich habe mich vor über 10 Jahren von AVR verabschiedet und zu 
PIC24, PIC32 und ARM gewechselt. Da habe ich fürs Geld einfach mehr 
Leistung und vor allem deutlich bessere Peripherie bekommen. Gut, die 
modern AVRs haben da inzwischen etwas aufgeholt, aber trotzdem. Und mehr 
als MPLABX, XC16/XC32 und ein PICKIT braucht man dafür nicht.

Und es ist ja nicht so, dass der TE damit etwas wirklich neues 
aufregendes erschaffen halt - es wurde nur versucht, bestehendes zu 
duplizieren.

fchk

: Bearbeitet durch User
von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

S. L. schrieb:
> Nun aber würde mich Ihr derzeitiger Stand interessieren, rein für
> mich, wenn Sie also so gut sein würden und ihn hier einstellten, so wäre
> ich sehr verbunden.

Bitteschön, angehängt ist der letzte, an den tiny1614 angepasste Stand. 
Der Code ist nicht schön, ich hätte ihn noch stark aufgeräumt, wenn sich 
Erfolg eingestellt und mich der Spaß daran nicht verlassen hätte.

S. L. schrieb:
> Mit welchen Adressen haben Sie es versucht?

Ich hatte versucht, auf dem 64DD28 die BOD-Fuse an Adresse 0x1051 mit 
dem Wert 0x10 (harmlose Änderung der Sample-Frequenz) zu schreiben. 
Schon beim ersten STS kam keine ACK zurück, obwohl vorher der 
NVM-Prog-Schlüssel erfolgreich erkannt wurde (NVMPROG in ASI_KEY_STATUS 
war 1, und PROGSTART in ASI_SYS_STATUS ebenso).

Frank K. schrieb:
> Ich habe mich vor über 10 Jahren von AVR verabschiedet und zu
> PIC24, PIC32 und ARM gewechselt. Da habe ich fürs Geld einfach mehr
> Leistung und vor allem deutlich bessere Peripherie bekommen.

Kann ich gut verstehen, ich habe auch öfters mal überlegt, zu PIC18 und 
höher zu wechseln.

Frank K. schrieb:
> Und es ist ja nicht so, dass der TE damit etwas wirklich neues
> aufregendes erschaffen halt

Das ist mir klar, siehe oben. seufz

Frank K. schrieb:
> es wurde nur versucht, bestehendes zu
> duplizieren.

Mitnichten – es wurde versucht, Freude am Hobby und Erfolgserlebnisse zu 
haben und dabei meine Programmierkenntnisse auszubauen ...

von S. L. (sldt)


Lesenswert?

an Johannes T. Fechner:

Danke für die Vorbereitung des Programmes auf meinen ATtiny1614.
  Erwarten Sie irgendwelche Kommentare von meiner Seite, oder haben Sie 
dieses Projekt endgültig ad acta gelegt?

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Erwarten Sie irgendwelche Kommentare von meiner Seite, oder haben Sie
> dieses Projekt endgültig ad acta gelegt?

Wenn Ihnen z.B. etwas Verdächtiges auffällt, dürfen Sie mir das gern 
mitteilen – ich würde mich schon freuen, wenn es vielleicht doch noch 
mal funktionieren sollte. Ich meinte nur, dass ich nicht weiter ohne 
konkrete Anhaltspunkte herumprobieren werde.

von S. L. (sldt)


Lesenswert?

Okay, dann vorab nur soviel: Sie sind einem fatalen, wenngleich durchaus 
verständlichen Irrtum aufgesessen (war mir in der Anfangsphase auch mal 
passiert): Sie haben sozusagen den Zielcontroller aus den Augen 
verloren! Das NVMCTRL_CMD_FUSEWRITE_gc ist das des ATtiny3216, für den 
AVR64DD28 ist es gar nicht definiert! Das 0x07 ist dort bestenfalls 
reserved, schlechtestenfalls hat es irgendeine üble Wirkung.

Alles Weitere, wenn ich mehr Zeit habe - vielleicht.


PS:
Und wenn ich mir die Bemerkung erlauben darf: Ihre Fixierung (um nicht 
zu sagen Obsession) auf die Fuses verstehe ich nicht - fangen Sie doch 
mit dem weniger kritischen EEPROM an, Fuses machen in der Anfangsphase 
nur Ärger.

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?

Johannes T. F. schrieb:
> Ja, ich habe es bisher an verschiedenen 1-series-ATtinys erfolgreich
> verwendet (z.B. 3216, 412).

Kann man mit dem mEDBG den ATtiny3216 auch debuggen, oder nur 
programmieren?

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Das NVMCTRL_CMD_FUSEWRITE_gc ist das des ATtiny3216, für den
> AVR64DD28 ist es gar nicht definiert!

Ahja, danke für den Hinweis, ich hatte nur NVMCTRL_ADDR, NVMCTRL_DATA 
und NVMCTRL_CTRLA in den ...def.inc-Dateien verglichen (die 
übereinstimmen) und dann blind darauf vertraut, dass der Rest bei den 
NVM-Controllern auch gleich ist.

Aber müsste ich dann nicht dennoch wenigstens bei den ersten drei 
STS-Instruktionen, die ja nur in die o.g. NVM-Register schreiben, 
ACK-Antworten bekommen? Denn bereits daran ist es ja gescheitert.

S. L. schrieb:
> Ihre Fixierung (um nicht
> zu sagen Obsession) auf die Fuses verstehe ich nicht - fangen Sie doch
> mit dem weniger kritischen EEPROM an, Fuses machen in der Anfangsphase
> nur Ärger.

OK, die Fuses waren halt der Auslöser für meine Beschäftigung mit UPDI 
(weil das mEDBG ja daran bei dem AVR-DD versagt hat). Deshalb diese 
„Obsession“. :D
Aber OK, dann werde ich, falls es nochmal dazu kommt, mich am EEPROM 
zunächst versuchen.

von Johannes T. F. (jofe)


Lesenswert?

Georg M. schrieb:
> Kann man mit dem mEDBG den ATtiny3216 auch debuggen, oder nur
> programmieren?

Das weiß ich nicht, ich habe ehrlich gesagt noch nie Debugging per UPDI 
verwendet. Bei meinen bisherigen, noch ziemlich simplen Programmen 
reichte mir UART-Ausgabe und ggf. Pin-Wackeln fürs DSO.

von S. L. (sldt)


Lesenswert?

> ACK-Antworten bekommen
Also wenn es nur um das ACK geht: fügen Sie einfach in §sendSts nach dem 
ersten 'rcall updi_tx' (an das ich mich nie gewöhnen werde) ein Warten 
mit 10 us ein.

PS:
> dass der Rest bei den NVM-Controllern auch gleich ist
Die Mechanismen im NVM unterscheiden sich teilweise erheblich: megaAVR® 
0-series, tinyAVR® n-series, AVRmxyn.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Also wenn es nur um das ACK geht: fügen Sie einfach in §sendSts nach dem
> ersten 'rcall updi_tx' (an das ich mich nie gewöhnen werde) ein Warten
> mit 10 us ein.

Also so wie folgt?
1
sendSts:
2
    push    [...]
3
; Wait for any previous transmission or reception to be completed:
4
sendSts_waitBusy:
5
    sbrc    updiFlags, UPDI_FLAGS_BUSY_bp
6
    rjmp    sendSts_waitBusy
7
; Send instruction code and address:
8
    [...]
9
    rcall   updi_tx
10
    rcall   wait10us
11
; Wait for first 'ACK' from Target UPDI:
12
sendSts_wait0:
13
    sbrc    updiFlags, UPDI_FLAGS_TIMEOUT_bp
14
    rjmp    sendSts_timeout
15
    sbrs    updiFlags, UPDI_FLAGS_RXC_bp
16
    rjmp    sendSts_wait0
17
; updiUartData_ram now contains the received byte.
18
    lds     tmp0, updiUartDataBuf_ram
19
    cpi     tmp0, UPDI_ACK
20
    brne    sendSts_invAnswer
21
; Send data byte:
22
    [...]
23
    rcall   updi_tx
24
; Wait for second 'ACK' from Target UPDI:
25
sendSts_wait1:
26
    [...]

Ohne es ausprobiert zu haben: Wie könnte das denn etwas ändern – nach 
dem Aufruf von updi_tx wird ja ohnehin nur gewartet, nämlich bis das 
RXC-(oder Timeout-)Flag von der Timer-ISR gesetzt wird? Da würde es doch 
nichts ausmachen, wenn die Flag-Warteschleife erst 10 µs später beginnt. 
Oder habe ich etwas falsch verstanden?

S. L. schrieb:
> 'rcall updi_tx' (an das ich mich nie gewöhnen werde)

Da würde ich jetzt aber gern genauer wissen, was der Grund dafür ist. ;)

Kritisieren Sie ruhig, wenn an der Subroutine oder der Struktur meines 
Programmes im Allgemeinen etwas mangelhaft ist. Ich bin immer noch ein 
Anfänger in Assembler und Programmierung im Allgemeinen und lerne immer 
gerne dazu. Das Programm ist in seiner Gestaltung halt meinem bisherigen 
(Un-)Wissensstand geschuldet. Also ich freue mich wirklich jederzeit 
sehr über jegliche konstruktive Kritik und Verbesserungsvorschläge, die 
mich weiterbringen.

von S. L. (sldt)


Lesenswert?

Es ist einfach nur ungewohnt, und erscheint mir unnötig kompliziert. Mag 
daran liegen, dass ich schon immer für UPDI-Kommunikation einen 
Hardware-USART verwendete, und ein Byte immer gleich dann ausgab, wenn 
es zur Verfügung stand.

Zum Wait: ich hatte heute morgen lediglich meine Hilfsausgabe an dieser 
Stelle eingebaut, und dann lief es. Danach hatte ich die Hilfsausgabe 
durch ein wait10us ersetzt, und es lief noch immer durch, wenn auch mit 
unsinnigem Resultat.
  Und jetzt muss ich mich erstmal von der Bergtour erholen - später 
melde ich mich vielleicht noch mal.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Es ist einfach nur ungewohnt, und erscheint mir unnötig kompliziert. Mag
> daran liegen, dass ich schon immer für UPDI-Kommunikation einen
> Hardware-USART verwendete, und ein Byte immer gleich dann ausgab, wenn
> es zur Verfügung stand.

Hmm OK, sicher ist das alles durch den Software-UART noch komplizierter 
als nötig. Ich werde diese Angelegenheit also erstmal ruhen lassen, bis 
ich einen Controller mit zwei USARTs auf einer Experimentierplatine 
untergebracht habe. Bis dahin werde ich mich jetzt erst einmal mit dem 
„guten alten“ ISP beschäftigen (da ich noch eine größere Zahl älterer 
AVRs besitze und mir gerne dafür weitere Programmer – neben dem einen 
kommerziellen, den ich habe – anfertigen möchte).

S. L. schrieb:
> Und jetzt muss ich mich erstmal von der Bergtour erholen - später
> melde ich mich vielleicht noch mal.

Ja dann, gute Erholung, und hoffentlich bis später!

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Johannes T. F. schrieb:
> Das weiß ich nicht, ich habe ehrlich gesagt noch nie Debugging per UPDI
> verwendet.

Einfach in den Speicher schauen. Beim ATtiny1614 funktioniert es mit dem 
mEDBG.

(Beim ATtiny824 schon nicht mehr - nur programmieren)

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Da haben Sie wohl etwas missverstanden im Bereich NVM:
 Mit diesen Korrekturen kann ich, von meinem ATtiny1614 aus, das EEPROM 
meines AVR16DD28 schreiben (und lesen; 1400..14FF). Es sieht etwas 
unordentlich aus, meiner derzeitigen Verfassung geschuldet, aber Sie 
kommen sicher zurecht. Ob damit auch die Fuses erreichbar sind, 
überlasse ich Ihnen.
  So Sie denn überhaupt noch wollen und nicht schon bei den älteren AVR8 
mit dem SPI-Programming sind.

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Hier noch, wie der entsprechende Programmteil bei mir aussieht - nur 
damit Sie einen rein optischen Eindruck bekommen.

Bei Ihnen ist das abschließende NO CMD offenbar nicht nötig, vermutlich 
wegen des Nachlaufs in Ihrem Programm.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Da haben Sie wohl etwas missverstanden im Bereich NVM:

Ohja, habe gerade nochmal ins Datenblatt geschaut ...

S. L. schrieb:
> Hier noch, wie der entsprechende Programmteil bei mir aussieht

Vielen Dank, bin gerade dabei, mein Programm zu korrigieren und 'Fuse' 
durch 'EEPROM' zu ersetzen. Mal sehen, ob sich dann etwas tut ...

Nachtrag 19:17 Uhr: Nach dem Einfügen der 1-ms-Wartezeit vor dem Senden 
der zweiten STS-Hälfte bekomme ich nun die ACK-Antworten und das 
Schreiben des EEPROM-Bytes (0x1400, Wert 0x55) scheint zunächst 
erfolgreich gewesen zu sein.
Wenn ich danach per LDS die Adresse 0x1400 lese, erhalte ich jedoch 
immer noch 0xFF zurück, wie vorher, und nicht 0x55 ...

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

Das Register NVMCTRL_STATUS enthält nach dem Schreibversuch 0x10, also 
Error Code 'Invalid Command'. Bleibt nun noch herauszufinden, woran das 
nun wieder liegt ...

von S. L. (sldt)


Lesenswert?

> Bleibt nun noch herauszufinden ...
Stellen Sie das aktuelle main.asm hier ein, zum Vergleichen wird's bei 
mir gerade noch reichen.

Bei mir funktioniert es:
1
(3) Read byte from UPDI address space
2
(4) Chip erase
3
(5) Write fuse byte
4
3
5
Address: 1400
6
NVM version number: 2
7
LDS returned: 56
8
9
(1) Read SIB
10
(2) Read UPDI register
11
(3) Read byte from UPDI address space
12
(4) Chip erase
13
(5) Write fuse byte
14
5
15
Address: 1400 Data: AB Confirm (y/n): y
16
NVM version number: 2
17
Entering NVM Programming key...
18
ASI KEY STATUS: 10
19
ASI SYS STATUS: 28
20
Sending STS no. 1/4 ... Issuing System Reset...
21
22
(1) Read SIB
23
(2) Read UPDI register
24
(3) Read byte from UPDI address space
25
(4) Chip erase
26
(5) Write fuse byte
27
3
28
Address: 1400
29
NVM version number: 2
30
LDS returned: AB
31
32
(1) Read SIB
33
(2) Read UPDI register
34
(3) Read byte from UPDI address space
35
(4) Chip erase
36
(5) Write fuse byte

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Pardon, also das dauert mir jetzt zu lange. Im Anhang das main.asm, wie 
es bei mir läuft - wait1ms und wait5ms müssen Sie sich selbst 
dazustricken.

Im übrigen ist es vermutlich mein Fehler, wahrscheinlich hatte ich nicht 
alle Korrekturen mitgeteilt.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

S. L. schrieb:
> Pardon, also das dauert mir jetzt zu lange.

Sorry, ich war noch damit beschäftigt, meinen Code etwas aufzuräumen, 
damit ich und evtl. auch Sie besser durchblicken.

S. L. schrieb:
> Im Anhang das main.asm,

Vielen Dank schonmal, ich schaue es mir an und vergleiche ...

Nachtrag: habe jetzt noch die 25-ms-Wartezeiten zwischen den 
STS-Befehlen eingefügt (statt 5 ms, das dürfte ja unkritisch sein). 
Gleiches Ergebnis: ASI_SYS_STATUS == 0x10 --> "Invalid Command". Den 
relevanten Code-Ausschnitt habe ich angehängt. Da muss irgendwo noch ein 
Fehler sein ...

Nachtrag 2: Ich glaube, ich habe den Fehler gefunden, und zwar in der 
STS-Routine ... melde mich gleich wieder.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Die Fehler in der STS-Routine (irrige push/pop-Verwendung) und auch in 
der 'loop_writeEeprom'-Sequenz (versehentlich 'lds' statt 'ldi' – 
Copy-and-Paste-Leichen) sind nun beseitigt. Habe auch noch mal mit Ihrer 
main.asm verglichen. Dennoch bekomme ich am Ende NVMCTRL_STATUS == 0x10, 
und der Schreibversuch war ohne Effekt:
1
Sending STS ...
2
04:55 44 00 10
3
02:55 13
4
OK
5
Sending STS ...
6
04:55 44 00 14
7
02:55 AB
8
OK
9
Waiting while NVMCTRL is busy ...
10
04:55 04 02 10
11
NVMCTRL_STATUS: 10
12
Issuing System Reset ...
In 'updi_tx' habe ich noch zur Kontrolle die Bytes ausgeben lassen, die 
gesendet werden (Anzahl_Bytes_hex:Byte0_hex Byte1_hex ...). Nach meinem 
Ermessen stimmen die – ich weiß mir nun wieder mal keinen Rat, was nun 
das Problem ist.

von Johannes T. F. (jofe)


Angehängte Dateien:

Lesenswert?

Anbei noch der aktuelle Stand meines Quellcodes.
Ich habe ihn etwas aufgeräumt und auf mehr Dateien verteilt, um die 
Handhabung zu vereinfachen.

Werde dann erst heute Nachmittag voraussichtlich ab 15 Uhr wieder Zeit 
haben, um weiterzumachen.

Grüße
Johannes

von Frank K. (fchk)


Lesenswert?

Johannes T. F. schrieb:

> Ermessen stimmen die – ich weiß mir nun wieder mal keinen Rat, was nun
> das Problem ist.

Ein PICKIT5 zu kaufen, per MPLABX IPE das EEPROM zu programmieren und 
dabei mit einem Logic Analyzer mitzuprotokollieren, was da auf der 
Leitung passiert, ist wohl zu einfach, oder?

fchk

von S. L. (sldt)


Lesenswert?

Warum nur, bitte, bauen Sie mitten in STS ein SYNCH ein, im Widerspruch 
zum Datenblatt (und Ihren früheren Versionen)?:
1
Sending STS ...
2
04:55 44 00 10
3
02:55 13

Werfen Sie das raus:
1
    brne    updi_sts_invAnswer
2
; Got first ACK. Send data byte:
3
    rcall   wait1ms
4
    sts     updiUartDataCount_ram, zero
5
    ldi     tmp0, UPDI_SYNCH
6
;   rcall   updi_appendBuf ; <=== SLdt 2406251318
7
    mov     tmp0, tmp2              ; Data byte to be written.
1
Sending STS ...
2
04:55 44 00 10
3
01:13
und schon funktioniert es.

Ich meine, im früheren sendSts stand doch auch nur:
1
; Send data byte:
2
    sts     updiUartDataBuf_ram, tmp2       ; Data byte to be written.
3
    ldi     tmp3, 1
4
    sts     updiUartDataCount_ram, tmp3 ; Transfer block size.
5
    rcall   updi_tx

Sie kennen Reinhard Meys 'Annabelle'?

PS:
> Dennoch bekomme ich am Ende NVMCTRL_STATUS == 0x10
Ja, genau: 'INVALIDCMD The selected command is not supported' - seien 
Sie froh, dass im AVR64DD28-Datenblatt unter NVMCTRL.CTRLA.CMD nicht 
steht: '0x55 CONTFIRE  set the controller on fire'.

: Bearbeitet durch User
von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Warum nur, bitte, bauen Sie mitten in STS ein SYNCH ein, im Widerspruch
> zum Datenblatt (und Ihren früheren Versionen)?

Das wird schludriges Copy&Paste von mir gewesen sein, anders kann ich es 
mir nicht erklären. Und ich hatte Tomaten auf den Augen, dass ich das 
nicht an der UART-Ausgabe der Befehle bemerkte. Ich bitte vielmals 
inständigst um Verzeihung.

S. L. schrieb:
> seien
> Sie froh, dass im AVR64DD28-Datenblatt unter NVMCTRL.CTRLA.CMD nicht
> steht: '0x55 CONTFIRE  set the controller on fire'.

Wie gut, dass ich hier einen Feuerlöscher in der Nähe habe ...

von S. L. (sldt)


Lesenswert?

Dann können Sie jetzt ja endlich die Fuses schreiben - also bei mir 
funktioniert das.
  Trotzdem wäre ich damit vorsichtig: schnell ist versehentlich SYSCFG0 
erwischt, mit einem unglücklichen Wert.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Dann können Sie jetzt ja endlich die Fuses schreiben

Ja, das habe ich noch vor zu testen. Werde auch vorsichtig sein.

Im Moment bin ich aber noch dabei, mit meinem zum UPDI-Sniffer 
abgespeckten Programm den Datenverkehr mitzulesen, den mein mEDBG beim 
(erfolgreichen) Lesen der Signature Bytes meines ATtiny416 erzeugt – 
letzterer weigert sich nämlich (seit einem vermutlich gescheiterten Chip 
Erase), auf jene LDS-Anfragen meines Programmes zu antworten, im 
Gegensatz zum 64DD28. In der Hoffnung, das dies mir Erleuchtung darüber 
verschafft, was der mEDBG anders macht als ich ...

Nachtrag: Es funktioniert leider so einfach nicht, wie ich naiverweise 
dachte. Da müsste ich mehr Aufwand treiben, auf den ich aber gerade 
keine Lust habe (um den UART-Rx bitsynchron zu bekommen). Ich schaue mir 
stattdessen noch mal den mymcuprog-Quelltext an ...

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

> ATtiny416 ... weigert sich ... auf jene LDS-Anfragen ...
> im Gegensatz zum 64DD28.

Na, dreimal dürfen Sie raten ...
1
; Branch according to NVM version:
2
  cpi    tmp0, '0'
3
;  breq  loop_readByte_nvm0  <=== SLdt 2406261335
4
; NVM version number != 0, e.g. AVR_DB and AVR_DD.
5
; These devices apparently need a more complicated procedure:

PS:
Dass das STS dann noch nicht läuft auf dem ATtiny, steht auf einem 
anderen Blatt.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

> STS dann noch nicht läuft auf dem ATtiny

Warum dieses?:
1
; Hold target device in reset:
2
  rcall  updi_applyReset
Mit einem anschließenden 'rcall updi_releaseReset' (und passenden waits) 
ist 'ASI KEY STATUS: 10'.

Dass dann noch immer nicht geschrieben wird, ist auch klar:
1
; EEERWR - EEPROM Erase and Write Enable:
2
  ldi    tmp0, low(NVMCTRL_CTRLA)
3
  ldi    tmp1, high(NVMCTRL_CTRLA)
4
  ldi    tmp2, 0x13
NVMCTRL.CTRLA.CMD ist beim ATtiny416 nur von 0 bis 7 definiert.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Warum dieses?:
>   ; Hold target device in reset:
>   rcall  updi_applyReset

Das habe ich von 'pymcuprog' abgeguckt, ich zitiere aus 
pymcuprog/serialupdi/application.py:
1
    def enter_progmode(self):
2
        """
3
        Enters into NVM programming mode
4
        """
5
        # First check if NVM is already enabled
6
        [...]
7
        # Hold part in reset
8
        self.reset(apply_reset=True)
9
        # Put in the key
10
        self.readwrite.write_key(constants.UPDI_KEY_64, constants.UPDI_KEY_NVM)
11
        # Check key status
12
        [...]
13
        # Toggle reset
14
        self.reset(apply_reset=True)
15
        self.reset(apply_reset=False)
16
        # And wait for unlock
17
        [...]
18
        # Check for NVMPROG flag
19
        [...]
20
        self.logger.debug("Now in NVM programming mode")
21
        return True
Ich hatte mich zwar ob des "Hold in reset" auch gewundert, dachte aber, 
„die werden es schon wissen.“

S. L. schrieb:
> NVMCTRL.CTRLA.CMD ist beim ATtiny416 nur von 0 bis 7 definiert.

Ja, diese Passage muss ich noch aktualisieren bzw. MCU-spezifisch 
machen. Habe STS auch, seit ich weiß, dass die NVM-Controller 
unterschiedlich sind, nicht mehr beim ATtiny416 verwendet.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
>> ATtiny416 ... weigert sich ... auf jene LDS-Anfragen ...
>> im Gegensatz zum 64DD28.
>
> Na, dreimal dürfen Sie raten ...

Ich habe gemäß Ihrem Vorschlag das betreffende 'breq' auskommentiert, 
sowie noch die darauffolgende Sequenz wie folgt geändert:
1
rcall  updi_applyReset
2
rcall  wait5ms
3
rcall  updi_releaseReset
4
rcall  wait5ms
5
rcall  updi_enterNvmProgKey
6
rcall  wait5ms
7
rcall  updi_applyReset
8
rcall  wait5ms
9
rcall  updi_releaseReset
10
rcall  wait5ms
11
rjmp  loop_readByte_lds ; updi_lds folgt.
Trotzdem antwortet mein ATtiny416 nicht:
1
Address: 1100
2
02:55 E5
3
NVM version number: 0
4
03:55 C8 59
5
03:55 C8 00
6
0A:55 E0 20 67 6F 72 50 4D 56 4E
7
03:55 C8 59
8
03:55 C8 00
9
04:55 04 00 11
10
11
Error: Timeout while waiting for UPDI answer.
Er ist aber nicht defekt – mit dem mEDBG findet die Kommunikation 
problemlos statt.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

> sowie noch die darauffolgende Sequenz wie folgt geändert
Das ist vermutlich der Fehler - ich hatte nur das breq auskommentiert 
und konnte anschließend auf meinem ATtiny412 das EEPROM lesen.

Allerdings fürchte ich, wir kommen auf diese Art auf keinen grünen 
Zweig. Sie "stochern herum", um Ihren eigenen Ausdruck zu gebrauchen, 
und ich übe mich zwar in der Fehlersuche fremder Programme, habe aber 
eigentlich mit den eigenen genug zu tun.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Das ist vermutlich der Fehler

Also ich habe nun den Zustand von vorher wiederhergestellt, bis auf das 
auskommentierte 'breq', und immer noch funktioniert es nicht. Es muss 
einen Unterschied zwischen meinem tn416 und Ihrem tn412 hinsichtlich des 
Verhaltens bei LDS-Instruktionen geben. So wie es offenbar einen 
Unterschied zwischen meinem tn416 und dem 64DD28 gibt – der antwortet 
mir nämlich brav auf die LDS ausgehend von demselben Code. Warum das so 
ist, kann ich mir einfach nicht erklären. Früher hat ja mein Code auch 
mal mit dem(selben) ATtiny416 funktioniert.

Überhaupt finde ich es seltsam, dass der AVR64DD28 scheinbar den 
NVM-Prog-Key sehen will, bevor er eine LDS-Instruktion akzeptiert (ohne 
diesen tut er bei mir nichts). Das wird doch im Datenblatt so nicht 
gefordert, wenn man nur per LDS lesen, nicht schreiben will?

von S. L. (sldt)


Lesenswert?

> Also ich habe nun den Zustand von vorher wiederhergestellt, bis auf ...

Sicher? Zeigen! main.asm als Anhang.

> wenn man nur per LDS lesen ... will
Dazu kann ich nur sagen, dass ich darüber auch gestolpert war, vor 
langer Zeit, damals war der AVR128DA28 gerade herausgekommen.

von Johannes T. F. (jofe)


Lesenswert?

S. L. schrieb:
> Sicher? Zeigen! main.asm als Anhang.

Asche auf mein Haupt, ich hatte wohl doch irgendeine Kleinigkeit anders 
als vorher – gerade nochmal mein letztes ZIP heruntergeladen und die 
fragliche Passage von dort kopiert – nun funktioniert es:
1
Address: 1100
2
02:55 E5
3
NVM version number: 0
4
03:55 C8 59
5
03:55 C8 00
6
0A:55 E0 20 67 6F 72 50 4D 56 4E
7
03:55 C8 59
8
03:55 C8 00
9
04:55 04 00 11
10
LDS returned 1E

Vielen Dank nochmals für Ihre beständige und geduldige Hilfe ... ich 
muss mir angewöhnen, in manchen Belangen sorgfältiger zu arbeiten; es 
schleichen sich immer wieder Schludrigkeitsfehler durch Unachtsamkeit 
bei mir ein. Daran muss ich arbeiten ...

von Johannes T. F. (jofe)


Lesenswert?

Das probeweise Schreiben der BOD-Fuse auf den Wert 0x10 (Änderung der 
Sample-Frequenz) auf dem AVR64DD28 hat nun auch funktioniert. Damit ist 
bewiesen, dass der 64DD28 intakt ist, und dass der *Fehler somit beim 
mEDBG bzw. dem Programming Tool vom Microchip Studio* liegt. Das ist nun 
auch mein Fazit aus diesem Thread.

Das MPLAB IPE v6.20 habe ich übrigens mittlerweile auch probiert; dieses 
verweigert aber von vornherein die Benutzung des mEDBG mit dem AVR64DD28 
(und auch dem ATtiny3216, also wahrscheinlich mit allem außer dem auf 
dem Xplained Nano Board befindlichen ATtiny416).

Ungeklärt ist noch, warum auch 'pymcuprog' bei mir mit der Fehlermeldung 
"UPDI initialization failed" versagt (sowohl beim 64DD28 als auch beim 
tiny416). Zumindest blinken kurz die Rx- und Tx-LEDs meines 
MCP2221-USB-UART-Adapters, also war zumindest das korrekte Port 
ausgewählt. Vermutlich liegt das Problem irgendwo bei meinem 
Python-Toolchain-Setup, aber das ist wieder ein anderes Thema.

Ich werde nun dazu übergehen, den Weg von SerialUPDI zu beschreiten, 
d.h. ein PC-Programm entwickeln, das mit dem Ziel-AVR über eine 
virtuelle COM-Schnittstelle und einen USB-UART-Adapter kommuniziert.

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.