Forum: Mikrocontroller und Digitale Elektronik AVR Befehle Grundverständnis Problem


von Ralf A (Gast)


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.

von Profi (Gast)


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

von Tal U. (talumb)


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!

von Thorsten (Gast)


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.

von Tal U. (talumb)


Lesenswert?

Das Programmbeispiel:

CPI r16,r17
BREQ gleich
rcall U2
gleich:
rcall U1

von Sebastian (Gast)


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

von Tal U. (talumb)


Lesenswert?

Im Programmbeispiel soll es CP statt CPI heißen

von Ralf A (Gast)


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

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.