AVR Befehle Grundverständnis Problem

Gast #338021
Lesenswert?
• ▲
▼
Hi

Ich arbeite mich zur Zeit in die AVR programmierung ein und stehe vor
folgendem Problem.

Wie arbeitet man mit dem Befehl CPI Rd,K?
als Funktion steht da: Rd - k
Das verstehe ich noch, da man ja die beiden Werte vergleichen möchte.
Jetzt zu meiner Frage, wo steht das Ergebnis?

Ich glaube ihr könntet mir am besten weiterhelfen, wenn ihr mir das an
einem Beispiel erklären könntet.

Ich möchte die Register 16 und 17 vergleichen, wenn sie gleich sind,
soll das Unterprogramm "1" aufgerufen werden, wenn sie verschieden
sind soll das Unterprogramm "2" aufgerufen werden.

Ich würde mich freuen wenn ihr mir weiterhelfen könntet.
Gast #338022
Lesenswert?
• ▲
▼
Intern ist ein Vergleich das selbe wie eine Subtraktion, nur dass das
Ergebnis nicht abgespeichert wird, sondern nur die Flags gesetzt
werden.
CPI macht einen direkten Vergleich mit einer (im Programm festgelegten)
Konstanten, das ist nicht, was Du willst.

Du brauchst den CP Rd,Rr Befehl.
Such Dir mal das "8bit AVR Instruction Set" DOC0856.pdf
#338023
Lesenswert?
• ▲
▼
Schau mal in der 0856.pdf von Atmel auf Seite 60.

Da steht, dass Z im SREG gesetzt wird, wenn Rd - Rr gleich Null ist. -
soll ein Minuszeichen sein!

Mit BREQ(Branch if equl oder Z==1) kannst du dann zum Unterprogramm
springen, aber nur +/- 64 Instruktionen weit!
Gast #338024
Lesenswert?
• ▲
▼
Hallo.

Das Ergebnis von Rd - K steht nirgendwo, aber die Status-Bits im SREG
werden entsprechend der Berechnung gesetzt. Um auf Gleichheit zu
testen, musst Du das Z(ero)-Bit testen, also breq bzw. brne.
Gast #338026
Lesenswert?
• ▲
▼
Das Unterprogramme Aufrufen funktioniert dann über
BREQ (Branch if equal)
BRNE (Branch if not equal)
BRLO (Branch if lower)
BRSH (Branch if same or higher)

Gibt auch noch andere Branch-befehle, aber die kannst du ja selbst auch
nachschaun.

Das ergebnis des Vergleichs ist in den Flags gespeichert. Hinter jedem
Befehl steht im "Instructio Set Summary" ja auch welche Flags
geändert werden.

CPI vergleicht übrigens ein Register mit einer Konstanten. Du willst ja
soweit ich das verstanden hab zwei Register vergleichen. Dann brauchst
du CP

Sebastian
Gast #338028
Lesenswert?
• ▲
▼
Vielen Dank für die schnelle Hilfe!!!

Ich habs jetzt verstanden ;-) Ich wusste nicht wie man mit den Flags
arbeiten muss. (Dass es dafür extra Befehle gibt)

Also nochmals vielen Dank
Gruß Ralf

Antwort schreiben

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.

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.