Fragen zu ATmega8 und Pointern

Gast #926844
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.
Gast
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?
Gast
>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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.