ich möchte mit NVMCTRL auf die "USER ROW" zugreifen und dort ein paar Werte schreiben und auch lesen. Das Datenblatt des Controllers "sagt" das dies möglich sei. Leider habe ich keinen Beispielcode dazu gefunden.
Ich kapiere auch die Angaben im Datenblatt nicht so richtig.
Ich kann leider nur Assembler auf einem ATmega4809 anbieten, aber solange sich kein anderer meldet ... uC sollte kein Problem sein, die Datenblätter der beiden Controller sehen sehr ähnlich aus, und bei Assembler müssten Sie etwas Phantasie&Intelligenz einsetzen; vielleicht hilft es ja trotzdem:
1
ldiw Z,$1302 ; Testwerte in USERROW (ab $1300) schreiben
2
ldi tmp0,$45
3
st z+,tmp0
4
ldi tmp0,$AB
5
st z+,tmp0
6
ldi tmp0,$CD
7
st z+,tmp0
8
ldi tmp0,$EF
9
st z+,tmp0
10
11
put NVMCTRL_ADDR+0,ZL ; USERROW-Page-Adresse dem NVMCTRL bekanntgeben
12
put NVMCTRL_ADDR+1,ZH
13
14
puti CPU_CCP,CPU_CCP_SPM_gc
15
puti NVMCTRL_CTRLA,$03 ; ERWP Erase and write page (NVMCTRL.ADDR selects which memory)
Das hier läuft bei mir (auf einem ATmega4809) - aber meine C-Kenntnisse sind bestenfalls rudimentär, also bitte nur als ganz grobe Richtungsangabe betrachten:
1
#include"avr/io.h"
2
3
intmain(void)
4
{
5
USERROW.USERROW2=0x34;
6
USERROW.USERROW5=0x56;
7
USERROW.USERROW7=0x78;
8
NVMCTRL.ADDR=4864;// USERROW-Page-Adresse dem NVMCTRL bekanntgeben
9
CPU_CCP=CCP_SPM_gc;
10
NVMCTRL.CTRLA=0x03;// ERWP Erase and write page (NVMCTRL.ADDR selects which memory)
NVMCTRL.ADDR=USER_SIGNATURES_START;// USERROW-Page-Adresse dem NVMCTRL bekanntgeben
5
CPU_CCP=CCP_SPM_gc;
6
NVMCTRL.CTRLA=0x03;// ERWP Erase and write page (NVMCTRL.ADDR selects which memory)
Dann habe ich USERROW7 in eine uint8_t gelesen.
1
i=USERROW.USERROW7;
Super im Debugger ist die 0x56 zu sehen. Funktioniert!
Hast Du das auch schon mal mit dem Flash probiert? Wäre natürlich auch eine Möglichkeit meine Cal Daten ins Fash zu schreiben. Dass EEprom ist ja ziemlich wackelig.
Die Dokumente keen ich, mein Problem ist aber dass ist die Daten nicht vom Programmer mit UPDI sondern vom Controller selbst zur Laufzeit ins Fllash schreben will.
vom Controller selbst zur Laufzeit ins Fllash schreben
Ohne Georg M. vorgreifen zu wollen (der wird's in C können) - Sie müssen erstmal per Fuse einen 'Application Data'-Bereich einrichten, danach sollte es ähnlich wie beim EEPROM gehen.
Ich gebe aber zu bedenken, dass Sie mindestens 256 Bytes Flash dafür opfern müssen, und Sie haben insgesamt nur 4 KiB.
Ohne Georg M. vorgreifen zu wollen (der wird's in C können) - Sie müssen
erstmal per Fuse einen 'Application Data'-Bereich einrichten, danach
sollte es ähnlich wie beim EEPROM gehen.
Ohne Georg M. vorgreifen zu wollen (der wird's in C können) - Sie müssen
erstmal per Fuse einen 'Application Data'-Bereich einrichten, danach
sollte es ähnlich wie beim EEPROM gehen.
Das habe ich mir auch schon angeschaut, was mir aber dabei nicht ganz klar ist ob das NCMCTRL Register eine gemappte Adresse "will". Aber Versuch macht klug ich werde das heute ausbrobieren.
Spielt jetzt vielleicht keine Rolle, aber: siehe Anlage (extra eben
nochmals von Microchip heruntergeladen).
Die spinnen die Römer. Anbei Screenshot der DB-Seite
Mit der Flash NVMCTRL Programmierung bin ich noch nicht weiter gekommen (war ziemlich stressig heute). Über die Fuse Programmierung habe ich eine APPLICATION DATA Section eingerichtet.
Was mich verwirrt: Atmel selbst macht das im NVMCTRL Example völlig anders und benutzt weder im EEprom noch im Flash Beispiel den NVMCTRL(?) sondern hantiert da ziemlich mit Zeigern umher - wo es doch ein NVMCTRL Controller Modul gibt!
Auf AVRFREAKS habe ich auch etwas gefunden das bezieht sich allerdings alles auf den SAMD21. Werde mir das trotzdem mal anschauen - vielleicht funktioniert das ähnlich.
Aber jetzt ist zunächst mal Schluss für heute.
Ciao und danke allen die helfen das Mysterium zu klären.
Jürgen
ist nicht von der DB Serie, sondern auch vom ATtiny. ;-) Egal.
Ich kenne auch mehr BOD Möglichkeiten der megaAVR Serie.
Allen gemein ist das diese vielfältigeren BOD Möglichkeiten nur in den alten (ersten?) Datenblättern der Controller stehen. In nachfolgenden sind diese reduziert. Funktionieren tun die BOD Einstellungen alle noch, hatte ich mal mit ATmega4809 getestet.
Zu deinem EEprom Problem. Wenn du die höchste BOD Stufe konfiguriert hast, was 4,2V sind, und du korrupte Daten feststellst, kann es sein das deine Spannungsversorgung instabil ist? Ist der Controller ordentlich mit allen beschalten? Alle Cs an? Ich würde einfach mit der Seriellen debuggen. Vorm EEprom beackern ein S für Start senden und am Ende ein E für Ende. Und am Anfang des Programmstarts ein R für Reset. Wenn irgendwann im Terminal nach S ein R kommt hat sich der Controller mittendrin resetet. Damit würde ich anfangen. Danach würde ich den Takt auf unter 10MHz senken und die BOD auf 2.7V setzen oder ganz ausschalten und den Test wiederholen. Danach meine Schlüsse daraus ziehen. Irgendwie so in der Art würde ich meinen Test gestalten und mich dann ggf. weiter vortasten. Oder parallel mit Oszi die Spannung triggern.
wegen geänderten BOD Level der megaAVR0 Serie. Findet man nur noch in alten Header Versionen. Hier aus dem ATmega Device Pack. Falls wer damit rumspielen möchte. In den ersten DA/DB Headerfiles habe ich keine gefunden die zu viel sind.
... weder im EEprom noch im Flash Beispiel den NVMCTRL(?) ...
Den nicht-flüchtigen Speicher ohne den non-volatile Memory-Controller bearbeiten? Da kommt auch von mir ein Fragezeichen.
Bei mir funktioniert es (auf dem ATmega4809) für den Application-Data-Bereich wie für das EEPROM; allerdings: das Setzen von NVMCTRL.ADDR muss an den Anfang, also noch vor das Schreiben der eigentlichen Werte, sonst gibt es einen Schreibfehler (NVMCTRL.STATUS=WRERROR).
Nein ist keine grosse Hilfe. Das läuft auf eine grosse Zeiger Operation hinaus, dem Linker muss eine neu Section übergeben werden. Das ganze ist alles ein wenig diffus, ich frage mich wareum bei allen Appnotes diese Zeiger Linker Konstrukt aufgezeigt wird und es keine Appnote für den NCMCTRL existiert dass sich auf das FLAsH bezieht.
Was ich bisher gemacht habe ich habe in den Fuse Bits die Sections definiert wie in DB beschrieben (9.2 Setting up Flash sections) dass Bootend == Append ist.
Mein enstprechnedr C-Code ist jetzt:
1
#define TEST_ADRESS 0x8FD0 // Ich will ganz oben etwas reinschreiben
2
3
NVMCTRL.DATA=0xAA55;
4
NVMCTRL.ADDR=TEST_ADRESS;// Page-Adresse dem NVMCTRL bekanntgeben
5
CPU_CCP=CCP_SPM_gc;
6
NVMCTRL.CTRLA=0x03;
Das einzigte was passiert ist der Emulator abstrzt und ich ihn ein paarmal Ein- und Ausschalten muss das er wieder funktioniert.
Wenn ich dann ins MAPPED_PROGMEN reinschaue (Flash) ist das Pattern 0xAA55 nirgends zu finden.
Bin ziemlich Ratlos jetzt. Das einzige was ich nicht verstehe ist dies:
Kannst Du mir bitte mitteilen wie Du die Fuses (9.2 Setting up Flash Sections) gesetzt hast?
Ich ziehe jetzt schon den Hut vor Dir. Du hast mir bisher sehr geholfen. Ich habe bemerkt das trotz der vielen "Abstürze" mein Eeprom gelöscht aber die "User Row" Daten immer noch richtig gesetzt sind.
Sie müssen mindestens eine 256-Byte-Seite als Appdata-Bereich definieren, das müsste auf dem ATtiny416 z.B. APPEND=BOOTEND= 0x0F sein. Dann sollte mein Programm bei Ihnen laufen.
Liegt das nicht eher daran, dass SYSCFG0.EESAVE nicht gesetzt ist?
ich kann das Flag nicht setzen weil ab und an während des Betriebs die Cal-Daten geändert werden müssen. Oder lässt sich das Flag "On the Fly" Ein- und Ausschalten?
Die Teile werden immer komplexer, und als reiner Autodidakt muss man nicht nur viel Zeit mitbringen, sondern auch eine ausgesprochen hohe Frustrationsschwelle haben.
Statisch, also mit Konstanten funktioniert das super, wie ich ja gestern geschrieben hatte.
aber wenn ich jetzt sage wobei testvar eine "normale" uint8_t Variable ist:
appdata_0 = testvar;
CPU_CCP = CCP_SPM_gc;
NVMCTRL.CTRLA = 0x03; // ERWP Erase and write page (NVMCTRL.ADDR selects which memory)
ist absolut keine Änderung im Flash zu sehen.
Ein weiteres Problem. Durch die Änderung von APPEND=BOOTEND=0x0F konnte keinen Interrupt Einsprung feststellen d.h. ein Breakpoint auf den Interrupt wurde nie angesprungen. Ich habe dann das "IVSEL: Interrupt Vector Select" auf "1 Interrupt vectors are placed at the start of the BOOT section of the Flash" geändert, jetzt kann ich zwar manchmal Interrupts "sehen" aber alles ist völlig instabil d.h. selbst das neu flashen funktioniert manchmal, manchmal nicht. Das Program(teile) macht überhaupt nicht was es soll sprich stürzt ab, obwohl es noch sehr rudimentär ist. Es kann aber nicht am C-Code liegen weil das alles auf Eeprom Basis funktioniert.
Was habe ich wieder einmal übersehen, was mache ich nicht richtig.
generell: wie anfangs gesagt, programmiere ich normalerweise in Assembler, und ich habe zum Testen nur einen ATmega4809. Wenn hier ein C-Programmierer, gar mit einem ATtiny461, mitliest, würde ich gerne an ihn übergeben.
Zu Teil 1: die Festadressen sind ja nur eine Hilfskonstruktion, um nicht bei C-Compiler/Linker mit den diversen Speicherbereichen arbeiten zu müssen. Korrekterweise sollte man die Adresszuordnung eben dem Compiler/Linker überlassen.
Zum IAR-Compiler kann ich rein gar nichts sagen; hier mit dem avr-gcc funktioniert (natürlich) angehängtes Programm, d.h. in USER-ROW steht anschließend das 0x45 auf Adresse 0x1303, ebenso im Flash auf Adresse 0x8F02.
Zu Teil 2: wieder IAR-Compiler - kenne ich nicht. Wenn Ihr Programm wirklich "sehr rudimentär" ist, könnte man versuchen, das erzeugte Assembler-Listing zu analysieren.
PS:
Mag unbefriedigend sein, aber: warum vergessen Sie nicht diese APPDATA-Alternative (d.h. wieder APPEND=BOOTEND=0) und kehren zurück zu USER-ROW oder EEPROM?
Mag unbefriedigend sein, aber: warum vergessen Sie nicht diese
APPDATA-Alternative (d.h. wieder APPEND=BOOTEND=0) und kehren zurück zu
USER-ROW oder EEPROM?
Sie haben im Prinzip schon recht. Aber das ist halt der "Forscherdrang" in mir. Da das Projekz nächste Woche fertig sein sollte wird mir wohl nichts anderes übrig bleiben.
Ich kann allerdings Atmel nicht verstehen das der NVMCTRL so schlecht beschrieben wird. Es scheint mir ein unausgegorenes Feature zu sein. Ganz getreu dem alten IBM-Spruch "Its not a Bug its a Feature".
Ciao und danke zunächst mal sollte ich neue Erkenntnisse haben melde ich mit.
Wahrscheinlich meinst du Microchip, der Attin416 wurde doch schon unter Microchip eingeführt. Ich hatte in der Vergangenheit immer wieder den Eindruck, dass die Datasheets von Microchip doch schon, ich sag mal, sparsamer gehalten waren als die von Atmel. Das war einer der Gründe, warum ich mich seinerzeit für die AVRs und gegen die PICs entschied.
Verschiedene C-Programme unter avr-gcc, nehme ich an?
Flash ... unbezwingbar ... schon interessant ...
Ja, würde mich auch interessieren; könnten Sie etwas (möglichst einfaches) zeigen, was nicht funktionierte? Vielleicht könnte man auf diesem Umweg dann auch /Jürgen/ weiterhelfen.
Tja - funktioniert auf dem ATmega4809: anschließend steht in 0x8F00 (flash gemapped in DATA) sowie in 0x4F00 (nur ATmega4809, original flash) das 0x77.
Tatsächlich. Im Microchip Studio kann ich das Gewünschte im Flash nicht finden, aber indirekt, wenn ich den Speicherinhalt prüfe, dann ist alles in Ordnung:
1
data=*(uint8_t*)0x8F00;
2
if(data==0x77)
3
{
4
data=0;
5
<LEDblink>
6
}
Habe ich immer gesagt: Hauptsache - die LED blinkt!