Hallo, also folgendes. In den tutorials liest man ja häufig über Pointer. Bisher habe ich nur den Stackpointer genutzt und zwar mir push, pop, rcall und ret. Sonst nicht. Nun ließt man öfters von pointern und X,Y und Z Registern. Da ist die Rede vom Z-Pointer etc.... Irgendwie verstehe ich das ganze nicht. Ich habe Arbeitsregister in die ich Werte hineinkopieren kann. Klar. Aber wodrauf greifen diese Pointer zu? Gibt es vielleicht eine Seite auf der ausführlich erklärt ist, wie das funktioniert, auf welche speicher diese zugreifen und wo einfache Anwendungsbeispiele dabei sind? Ich würds gern verstehen habe aber keine gute Seite gefunden, wo das erklärt wird. Vielleicht ists ja ganz einfach und schnell erklärt? Danke für Hilfestellungen.
Hi, jo das habe ich mir schon durchgelesen, verstehs aber nicht richtig. (Oder bin mir nicht sicher ob ichs richtig verstanden habe) Also werden die Pointer nur genutzt um auf Speicherzellen zu zeigen? Und 2x8Bit haben sie, weil man mit 8 bit ja nur 2^8 bit adressieren kann, neuere AVRs aber schon 2^16 haben?
>Bisher habe ich nur den Stackpointer genutzt und zwar mir push, pop, >rcall und ret. Genau. der Stackpointer zeigt auf eine Stelle im RAM aus denen er bei pop und ret Werte liest, bei call und rcall Werte schreibt. Soweit OK. Analog geht es beim ATMEGA8 (und bei vielen anderen Modellen von Atmel) mit den sogenannten X, Y und Z Register. Das sind jeweils zwei 8-Bit Register die bei manchen Befehlen als 16 Bit Register betrachtet werden. Es gibt Befehle die auf das FLASH als auch solche die auf das RAM zugreifen und dabei diese X, Y, und Z-Register benutzen. (Zusätzlich kommt bei grossem Speicher noch eines von zwei weiteren Zeigerregistern hinzu). Siehe etwa LD, LDS ST, STS, für das RAM, IJMP, ICALL, LPM für das Programm-Flash. Ganz allgemein formuliert kann man damit auf Speicherstellen zugreifen die man bei der Programmerstellung noch nicht genau festlegen will Z.B. wenn man auf die Elemente eines Arrays zugreifen will. Dann würde man eines der Register X, Y, Z mit der Adresse des ersten Elementes laden und das Register dann immer entsprechend inkrementieren (oder auch dekrementieren). Beim Flash geht das entsprechend und hat in der Harvard-Architektur einige Einschränkungen. Entweder kann man das FLASH garnicht oder nur indirekt über einen weiteren Befehl oder Ähnliches beschreiben. Oft angewendet wird aber die Methode eine Konstante aus dem Flash in ein Register zu laden. Hat man wiederrum ein Array von Konstanten geht das genau so wie oben beschrieben. Schau Dir am besten mal die Beschreibung der Befehle LD, LDS ST, STS, für das RAM, IJMP, ICALL und LPM an. Dann sollte es klarer werden.
Ok danke! Hast du das jetzt selber geschrieben oder von einer website? So eine erklärung fehlt doch in jedem avr tutorial (auch hier auf uC.net ).
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.