Hallo,
ich bin gerade dabei, den Atmega328p näher kennenzulernen, indem ich
einen Arduino Uno über einen ISP-Programmer (Diamex) und AVR-Studio 4 in
Assembler programmiere. Es sind meine ersten Gehversuche in Assembler.
Da ich perspektivisch einen kleinen programmierbaren
Kommando-Interpreter (Forth-ähnlich) schreiben möchte, möchte ich auch
die Technik beherrschen, User-Input remanent ins Flash zu schreiben - 1
KB EEPROM ist mir einfach zu wenig. Und je mehr Programmspeicher ein
Atmega hat, desto mehr macht eine solche Möglichkeit auch Sinn.
Ich habe also eine kleine Testroutine geschrieben, die den Temporary
Buffer mit ansteigenden Werten füllt, diesen in die entsprechende, vom
Z-Pointer indizierte Page schreibt und diese Page dann ausliest - für
den Simulator etwas abgespeckt, die Subroutines getbyte und sendbyte
sind hier funktionslos.
Der Simulatorlauf funktioniert, egal wo im 'Flash' spm-execute steht.
Auf dem Controller selbst sieht es anders aus: steht spm-execute in der
Bootloader-Section scheint der Controller dort festzuhängen, denn das
Auslesen der Page funktioniert dann nicht.
Schreibe ich spm-execute einfach irgendwo in die Application-Section
hinein, wird die Seite zwar ausgelesen, aber erkennbar ist der Temporary
Buffer dort vorher nicht hineingeschrieben worden - was ja zu erwarten
war.
Mich interessiert also, warum der Controller in der Bootloader-Section
festhängt. Darf man vom Applikationsbereich nicht einfach eine
Subroutine aufrufen, die in der Bootloader-Section steht?
Für Erklärungen oder Vorschläge wäre ich dankbar.
Viele Grüße
Glenn
1
;------------------------------------ Testprogram for SPM Storage Checking ------------------------------------------------
Das 328/P Datenblatt liefert in
"30. BTLDR - Boot Loader Support – Read-While-Write Self-Programming"
ein paar Hinweise:
SPM wird aus dem Anwendungsspeicher, glaube ich, ignoriert und während
einer Lösch- oder Schreibaktion im RWW-Speicherbereich (i.d.R. der
Anwendungsspeicher) darf darauf nicht zugegriffen werden.
Kurz:
Dieser Teil sollte komplett im NRWW-/Bootloaderbereich laufen (zusammen
mit spm_execute):