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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren