www.mikrocontroller.net

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


Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tal Umb (talumb)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tal Umb (talumb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programmbeispiel:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tal Umb (talumb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Programmbeispiel soll es CP statt CPI heißen

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.