Forum: Mikrocontroller und Digitale Elektronik Doppelregister(Pointer)


von Karsten S. (scottyrebel)


Lesenswert?

Hallo,
es gibt ja die Pointer-Register(beim ATMega32 zumindest X, Y und Z). 
Kann man sich solche Pointer selber definieren? Ich meine das so, das 
ich bspw. die Register R20 und R21 hernehme und daraus ein Pointer 
erstelle. Die Funktionalität sollte dann so sein wie bei standardmäßigen 
Pointern, sprich wenn das Low-Register nach einer Erhöhung "überläuft", 
dass dann automatisch das High-Register erhöht wird.

Danke für jeden Tipp.
--
Gruß Scotty

von Karl H. (kbuchegg)


Lesenswert?

Karsten Sosna schrieb:

> es gibt ja die Pointer-Register(beim ATMega32 zumindest X, Y und Z).
> Kann man sich solche Pointer selber definieren?

Nein

> Ich meine das so, das
> ich bspw. die Register R20 und R21 hernehme und daraus ein Pointer
> erstelle. Die Funktionalität sollte dann so sein wie bei standardmäßigen
> Pointern, sprich wenn das Low-Register nach einer Erhöhung "überläuft",
> dass dann automatisch das High-Register erhöht wird.

Du kannst dir natürlich ein Makro bauen, welches das erledigt. Ist ja 
auch nicht weiter tragisch zu realisieren, zumal ja der AVR Assembler 
die Instruktion ADIW für kleine Konstanten zur Verfügung stellt.

Allerdings: den wesentlichen Vorteil der Pointer Variablen, indirekte 
Zugriffe realisieren zu können, kriegt man damit nicht.

von Karsten S. (scottyrebel)


Lesenswert?

> Allerdings: den wesentlichen Vorteil der Pointer Variablen, indirekte
> Zugriffe realisieren zu können, kriegt man damit nicht.

Hallo Karl Heinz,
das habe ich mir schon fast gedacht. Na dann muss ich das anders 
realisieren, mir fehlt nämlich genau ein Pointer. Da muss ich halt ein 
paar mal mehr pushen und popen.
--
Gruß Scotty

von Martin V. (oldmax)


Lesenswert?

Hi
Ich kenn zwar deinen Code nicht, aber schau mal nach, ob du nicht 
fehlende Adressregister damit erschlagen kannst, indem du einen Offset 
benutzt..
1
Z.B.     LDS  Cnt_Reg, 55           ; Größe der Tabelle
2
         LDS  Dis_Reg, Distanz      ; Abstand der Tabellen -1   
3
         LDI  Zero_Reg, 0  
4
         LDI  ZH,High(Tabelle_1)   ; Anfang Tabelle
5
         LDI  ZL,Low(Tabelle_1)    ; Adresszeiger auf 1. Kanal
6
   Loop_Dec:            ; Schleife zum übertragen 
7
         LD   Temp, Z+          ; laden und erhöhen
8
         Push ZH
9
         Push ZL
10
         ADD  ZL, Dis_Reg          ; Abstand auf die Adresse addieren
11
         ADC  ZH, Zero_Reg
12
         ST Z, Temp
13
         POP ZL
14
         POP ZH
15
         DEC Cnt_Reg
16
    BRNE Loop_Dec

So kommst du für eine Kopierfunktion mit nur einem Adressregister 
aus....
Gruß oldmax

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.