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.
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
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!
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.
Das Programmbeispiel: CPI r16,r17 BREQ gleich rcall U2 gleich: rcall U1
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.