Hallo zusammen, ich frage mich gerade, wozu eigentlich das RAMPZ-Register notwendig ist. Klar, im Datenblatt meines Atmega1281 steht, dass man ihn benötigt, sobald die Flashgröße 64KByte überschreitet. Das ist auch nachvollziehbar, denn mit den übrigen 16 Bit des Z-Pointers kann man ja höchstens 2^16 Bit also 64K addressieren... aber jetzt das was mich eigentlich verwirrt: der Flash des o.g. Prozessors beträgt 128KByte, also 64K Wörter. Die Pagesize ist 256 Byte also 128 Wörter. Somit passen insgesammt 512 Seiten in den gesamten Flash. Im Datenblatt liest man weiterhin, dass von den 16 Bit des Z-Pointers die ersten 9 (vom MSB ausgehend) zur Adressierung der Seite verwendet werden und die unteren 7 Bits zur Word-Adressierung. An dieser Stelle denke ich mir, dass das doch eigentlich so auch ohne RAMPZ alles passen müsste, da: 9 Bits für Page-Adressierung = 512 Pages möglich 7 Bits zur Word-Adressiierung= 128 Words möglich Wozu also RAMPZ??? Ich hoffe auf Eure Unterstützung! Danke, Stephan
Stephan W. schrieb: > dass das > doch eigentlich so auch ohne RAMPZ alles passen müsste Der ELPM-Befehl adressiert Bytes, dort RAMPZ nötig.
ELPM kann byteweise aufs Flash zugreifen, dabei muss man mit Z auch jedes Byte einzeln adressieren können.
ok, dann ist es klar, er muss 256 Bytes adressieren können, womit es nicht mehr 7 sondern 8 Byte sind... so werden in Summe mehr als 16 Bit benötigt... Ich danke Euch. Ich bin gerade dabei einen Bootloader zu schreiben und habe ein Problem, überhaupt erstmal eine Seite in den Flash zu schreiben. (siehe Beitrag "einfach mal eine Seite in den Flash schreiben."). Ich habe gedacht, dass es irgendwie mit RAMPZ zusammenhängt, aber das ist es wohl nicht... Da mir bisher keiner auf den Beitrag geantwortet hat möchte ich Euch bitten, sich das mal anzuschauen. Bin für jeden Hinweis dankbar! Vielen Dank, Stephan
Stephan W. schrieb:
> er muss 256 Bytes adressieren können
Das ist zu lakonisch um, memoriert, als Richtschnur zu dienen.
Allein stehend ist es schlicht falsch.
Bitte lies nochmal das Datenblatt und die Antworten.
das verstehe ich nicht, der Knackpunkt liegt doch darin, dass die Lesebefehle (LPM) byteweise arbeiten und die Schreibbefehle (SPM) Wortweise. somit war es für mich logisch, dass für das Addressieren von 256 Bytes in einer Seite eben 8 Bit benötigt werden und zum Addressieren von 128 Wörtern nur 7 Byte... Damit ist RAMPZ beim Lesen von Daten aus dem Flash von Bedeutung. Genau das geht doch auch aus den oben stehenden Antworten hervor... Oder übersehe ich da noch etwas? Das Datenblatt hat mir dazu auch keine bessere Auskunft gegeben. vG Stephan
Vielleicht hälst Du meine Einwendung nachher für überflüssig genau, aber der Punkt ist, das Du die Fakten wohl richtig erkannt hast, sie aber nicht richtig und vollständig beschreibst bzw. den Zusammenhang so formulierst das er allgemeingültig klingt obwohl er es nicht ist. Die allgemeine Regel lautet, das ELPM Byteweise addressiert während SPM (im Fall des Speicherns von zu schreibenden Worte) Wortweise,aber in Fall der Programmierung Seitenweise addressiert. So ist es wahr und vollständig. Der Begriff Seitenpuffer wird ausschliesslich in Zusammenhang mit den SPM-Befehlen benutzt. Es macht keinen Sinn eine Eigenschaft des Seitenspeichers in Bezug auf ELPM und SPM zu vergleichen, das dieser nur bei SPM eine Rolle spielt. ELPM sieht den Adressraum als einen kontinuierlichen Bereich. SPM hingegen erlaubt den Zugriff auf den Programmspeicher eben nur Seitenweise und den Zugriff auf den Seitenspeicher nur wortweise. Betrachte also im Lichte dieser Hinweise Deine Aussage > er muss 256 Bytes adressieren können In Bezug auf ELPM Befehl ist das falsch. Den ELPM muss den ganzen Programmspeicher byteweise adressieren. Es gibt soweit ich weiss keinen AVR der nur 256 Bytes Programmspeicher hat. In Bezug auf den SPM Befehl ist es zumindest nur teilweise richtig. Denn mit dem SPM Befehl wird in einer Variante des Befehls der Seitenpuffer geschrieben, aber dies geschieht wortweise . Also 128 Worte. Bytes spielen hier keine Rolle. In einer anderen Variante wird der Programmspeicher programmiert. Dann aber Seitenweise. Ich halte es für wichtig hier genau zu differenzieren und zu formulieren und hoffe diese Hinweise nützen Dir. P.S. > Addressieren von 128 Wörtern nur 7 Byte. Wahrscheinlich ein Flüchtigkeitsfehler von Dir, aber er kommt mehrfach vor. Es handelt sich hier um "Bits" nicht um Bytes.
Datenblatt S323: "The Z-pointer is used to address the SPM commands. The Z pointer consists of the Z-registers ZL and ZH in the register file, and RAMPZ in the I/O space." Und darunter im Bild ist Bit0 von Z immer 0, d.h. es sind nur 15 Bits als Wordadresse verfügbar. Für 64kWords (M1281) und 128kWords (M2561) muß also RAMPZ geladen werden. Nun alles klar? Peter
Ich bin begeistert. Einerseits davon, wie gut du die Zusammenhänge erklären kannst, andererseits konnte ich dadurch gut reflektieren, dass ich das grobe Gerüst doch vertanden habe :-). Ich habe mich nur recht flapsig ausgedrückt und gebe Dir völlig Recht, dass das zu Missverständnissen führen kann und führen musste. Ich werde demnächst darauf achten, wenn ich solche Zusammenhänge hier im Forum oder anderswo diskutiere. Also von dieser Seite her nochmal ein dickes Dankeschön und Respekt für Deine Hilfsbereitschaft. Könntest du mir bitte noch bei meinem eigentlichen Problem helfen, das ich zwei Postings zuvor ("Seite im Flash beschreiben") erwähnt habe? Das Programm ist so banal gestrickt, dass ich einfach verzweifle, weil ich den Fehler nicht finde... ich denke, für Dich ist das nur eine Übung des scharfen Hinsehens... Also nochmals, vielen vielen Dank! vG Stephan P.S.: und natürlich kann man mit 7 Bit 128 Wörter addrssieren und nicht mit 7 Byte ;-) Vertan,...
Hallo Peter, also ehrlich gesagt, habe ich mich vor Deinem Kommentar sicherer gefühlt :-) Willst du mir damit sagen, dass auch beim Schreiben in den Flash beim M1281 RAMPZ doch eine Rolle spielt? Ich habe das bisher so verstanden, dass das Z0-Bit immer (bei SPM-Befehlen) 0 ist, weil das beim Füllen des Seitenpuffers mittels SPM eine Rolle spielt. Dort wird doch wortweise in den Puffer geschrieben, aber byteweise addressiert, womit Z0 eh irrelevant wird, da sich die Byteaddresse immer um 2 erhöhen muss um das nächste Wort in den Puffer zu schreiben. Das Lesen hingegen erfolgt byteweise und somit kommt meiner Meinung nach der Satz über der von Dir genannten Grafik zum Tragen: "The (E)LPM instruction use the Z-pointer to store the address. Since this instruction addresses the Flash byte-by-byte, also bit Z0 of the Z-pointer is used." Damit ist die Welt doch wieder rund, oder? vG Stephan. P.S.: ich habe gelesen, dass du einige Erfahrung mit Bootloadern gemacht hast. Da ich nun auch einen solchen schreiben möchte und zum Test erstmal überhaupt eine Seite in den Flash bekommen möchte, habe ich probiert, eine entsprechende Anwendung aus dem Bootbereich laufen zu lassen. Das hat aber nicht geklappt (siehe Beitrag "einfach mal eine Seite in den Flash schreiben."). Kannst du mir dabei bitte Helfen? Ich komme absolut nicht weiter...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.