mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Registerwert zu 16Bit Pointer addieren AVR Assembler


Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei Unterprogramm für eine Displayansteuerung in 
Assembler schreiben. Am Ende des Programms habe ich einen Datenbereich 
zu stehen, in dem die Texte stehen, die auf dem Display angezeigt werden 
sollen.
Nun bin ich auf das Problem gestoßen, dass ich den z-Vektor beim 
Aufrufen des Unterprogramms auf die ensprechende Stelle zeigen lassen 
muss. Dazu möchte ich einen Registerwert zu dem Z-Pointer addieren. 
Dieser Registerwert muss beim Aufruf des Unterprogramms mit übergeben 
werden.

Nun finde ich aber keinen Befehl, der einen Registerwert direkt zu dem 
z-Pointer addiert. Wie muss es dann aussehen wenn man den einfachen 
Add-Befehl nimmt?

Die Einsprungmarke für den Datenbereich beim Aufruf des Unterprogramms 
mit zu übergeben wird wohl nicht gehen. Wäre halt nur ne Idee, wenn es 
gehen würde, könnte man für jeden Text eine eigene Einsprungmarke 
definieren und bräuchte die dann nur noch aufzurufen ohne dass man 
nachzählen muss um wieviel der z-Pointer verbogen werden muss.

Ich hoffe ich hab mich verständlich ausgedrückt, Ziel ist es einfach, 
dass man das UP aufrufen kann einen Text definert und ein paar Werte mit 
übergibt.

Gibts sonst noch alternative Vorschläge?

Gruß, pacer

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ pacer (Gast)

>Nun finde ich aber keinen Befehl, der einen Registerwert direkt zu dem
>z-Pointer addiert.

Dann suchst du schlecht.

AVR Arithmetik
AVR-Tutorial: Mehrfachverzweigung

>Die Einsprungmarke für den Datenbereich beim Aufruf des Unterprogramms
>mit zu übergeben wird wohl nicht gehen.

Warum? Das geht prima.

MfG
Falk

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die schnelle Antwort.
Bei der Addition würde ich einen 8Bit-Wert auf ein 16bit-Register 
addieren.
Laut Tutorial wird aber ein 16Bit-Wert addiert
add   r16, r20
adc   r17, r21

in meinem Unterprogramm steht folgendes:
ldi     ZL,low(Sprungtabelle*2)
ldi     ZH,high(Sprungtabelle*2)
Nun müsste ich aber je nach Aufruf des Unterprogramms den Platzhalter 
Sprungtabelle durch die richtige Marke ersetzen. Wie würde man das 
anstellen, ich habe keinen Plan?

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also das mit der Addition hab ich jetzt gefunden:
add     ZL,r16
ldi     r16,0
adc     ZH,r16
müsste dann so funktionieren, gell?

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jep.

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
supi, hab es jetzt zum laufen bekommen, würde mich aber interessieren 
wie das mit Labeln funktionieren soll.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>supi, hab es jetzt zum laufen bekommen, würde mich aber interessieren
>wie das mit Labeln funktionieren soll.

??? oder meinst du so etwas:
ldi ZL,Low(Label)
ldi ZH,High(Label)  ?

MfG Spess

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yep, genau das hab ich in meinem Unterprogramm drinstehen.
Wenn ich das Unterprogramm aber aufrufe, muss ich das Label anpassen 
können.
Ich weiß nur nicht wie

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  pacer (Gast)

>yep, genau das hab ich in meinem Unterprogramm drinstehen.

Was schon mal falsch ist.

>Wenn ich das Unterprogramm aber aufrufe, muss ich das Label anpassen
>können.
>Ich weiß nur nicht wie

Das Zauberwort heisst Parameter. Der Z-Pointer wird vor dem Aufruf 
geladen. Dort schreibt man immer die jeweiligen Labels rein.

So.

http://www.mikrocontroller.net/articles/AVR-Tutori...
]
    ldi     ZL,low(Tabelle*2)  
    ldi     ZH,high(Tabelle*2)
    rcall   meine_Funktion     
]

MFG
Falk

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eine vor mir öfter genutzte Variante:

Du übergibst in YL eine Funktionsnummer, anhand dieser wird in der 
Tabelle der passende Text gesucht und dessen Start nach X geholt und die 
Funktion mit ijmp aufgerufen. Die Funktione kehrt dann mit ret zur 
Aufrufstelle von ca__funktion zurück.

Eine Funktion hat immer eine Aufrufadresse in der Tabelle funktionen und 
einen Text in der Tabelle texte.

call_funktion:         // YL enthält die Funktionsnummer, benutzt X, Y, 
Z
  ldi ZL,low(texte*2)
  ldi ZH,high(texte*2)

  clr YH
  lsl YL               // * 2, da Adressen 16 Bit sind
  rol YH
  add ZL,YL
  adc ZH,YH            // Z zeigt jetzt auf den Platz der Adresse Text

  lpm XH,Z+            // in X ist jetzt der Zeiger auf den Text
  lpm XL,Z

  ldi ZL,low(funktionen*2) // in Y ist immernoch der Offset der 
Menünummer
  ldi ZH,high(funktionen*2)
  add ZL,YL
  adc ZH,YH            // Z zeigt jetzt auf den Platz der Adresse 
Funktion

  mov ZH,YH            // Startadresse der Funktion jetzt nach Z
  mov ZL,YL
  ijmp                 // indirekt jmp (Z) zur Funktion

  die Funktionen müssen mit ret enden

funktionen:
 .dw  funktion_1, funktion_2, funktion_3

texte:
 .dw  text_1, text_2, text_3

text_1:
 .db "Das ist Text 1",0

text_2:
 .db "Das ist Text 2",0

text_3:
 .db "Das ist Text 3",0

Gruß aus Berlin
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.