Forum: Mikrocontroller und Digitale Elektronik Fragen zu ATmega8 und Pointern


von der unwissende (Gast)


Lesenswert?

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.

von Carsten (Gast)


Lesenswert?


von der unwissende (Gast)


Lesenswert?

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?

von Klugscheisser (Gast)


Lesenswert?

>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.

von Oliver D. (smasher)


Lesenswert?

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
Noch kein Account? Hier anmelden.