mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR, Assemblerbefehle


Autor: Valentin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend zusammen

Ich beschäftige mich seit ein paar Wochen mit Assembler, und verstehe 
den Sinn mancher Befehle nicht so ganz. Das AVR-Tutorial hier im 
mikrocontroller.net habe ich mir durchgelesen. Wieso gibt es aber 
mehrere identische Befehle, wie BRCS und BRLO, die den gleichen Opcode 
haben, und beide den Carry-Bit testen?! Und wieso gibt es die 16 
Befehle, mit denen man alle Bits im Statusregister setzen und löschen 
kann, wenn die beide Befehle BSET und BCLR vorhanden sind?! Außerdem ist 
mir unklar, wie man mit dem Befehl SBI, Bits in den 64 I/O-Registern 
setzen kann, wenn für A 5 Bits im Opcode zu verfühgung stehen?!

Ich wäre jedem sehr Dankbar der mich aufklären könnte.

Autor: Marvin M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die doppelten Mnemonics sind eigentlich nur zur besseren Lesbarkeit da. 
Einen tieferen Sinn hat das nicht.
Wo steht geschrieben, dass mit SBI 64 I/O-Register beeinflusst werden 
können? In meiner Befehlsreferenz steht 0 <= A <= 31.
Bei AVRs, die mehr als 32 I/O-Register haben, geschieht der Zugriff auf 
die oberen ganz normal über Speicherzugriff.

Autor: Valentin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort Marvin.

Also in dem Anhang unter dem Befehl SBI steht auch irgendwas über 32 
I/O-Register, aber bei meinem ATmega16 habe ich 64. Ich habe im 
Datenblatt nachgesehen, dass manche von ihnen nur lesbar sind, aber die 
meisten sind auch beschreibbar. Also frage ich mich, wie soll das gehen, 
wenn im Opcode nur 32 I/O-Register adressiert sind.
Was du mit Speicherzugriff meinst, verstehe ich nicht.

Autor: M. V. (-_-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Also frage ich mich, wie soll das gehen,
>wenn im Opcode nur 32 I/O-Register adressiert sind.

Ganz einfach:
Es geht eben nicht.
Bei diesen Registern, bei denen diese speziellen Bit-Setz/Lösch/Test 
Befehle nicht funktionieren, muss man einen kleinen Umweg über die 
General-Purpose-Register machen. Also das Ggesamte IO-Register in ein 
solches kopieren, dann dort die entsprechenden Operationen durchführen 
und danach zurückkopieren.

Bei AtMega16:
Datenblatt Seite 21 und 331.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Valentin (Gast)

>I/O-Register, aber bei meinem ATmega16 habe ich 64. Ich habe im

Und nicht nur der.

>meisten sind auch beschreibbar. Also frage ich mich, wie soll das gehen,
>wenn im Opcode nur 32 I/O-Register adressiert sind.

Dann muss man halt andere Befehle nutzen. Z.B.
    in  r16, TIMSK        ; SFR laden
    ori r16, 0b00101000   ; Bits setzen
    out TIMSK,r16         ; zurückschreiben

Sieh auch Bitmanipulation
MIt sbi/cbi kann man alle Register mit Adresse 0..31 ansprechen. Mit den 
in/out Befehlen kann man alle Register von 0..63 ansprechen. Einige 
grosse AVRs haben sogar NOCH mehr als 64 Register. Dort muss man dann 
alle mit der Adresse>63 über die Befehle sts/lds ansprechen. Und um die 
Sache noch einwenig zu komplizieren, muss man dann aufpassen, dass 
sts/lds mit RAM-adressen arbeiten, in/out aber mit I/O Adressen, wobei 
gilt

RAM-Adresse = I/O Adresse + 0x20

Allerdings hat Atmel das schon in den Definitionsdatein ???def.inc 
berücksichtigt. Also z.B wird dann auf den gröseren AVRs das Register 
TIMSK5 so angesprochen

    lds  r16, TIMSK5      ; SFR laden
    ori r16, 0b00101000   ; Bits setzen
    sts TIMSK5,r16        ; zurückschreiben

Die Registernamen dürfen und können dann nicht mehr mit in/out Befehlen 
verwendet werden.

Alle Klarheiten beseitigt? ;-)

MFg
Falk

P.S. Ist alles halbsowild.

Autor: Valentin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jemand

Jetzt verstehe ich das alles besser.

MfG

Autor: Oilaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
mir geht es gerade genau so wie Valentin (Gast), schreibe auch gerade 
das erste Programm in AVR-Assembler. Wenn man, wie ich, vom 8051 kommt, 
dann empfindet man AVR-Assembler an vielen Stellen als Zumutung. Aber es 
gibt auch positives zu berichten, wenn man z.B. zwei 16 bit-werte ohne 
Tranferbefehl von einander abziehen kann.

Gruß Oilaf

Autor: Valentin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich Danke auch dir Falk Brunner für die super gute Aufklärung.

Ich merke schon, dass ich richtig Englisch lernen muss, um das ganze 
Verstehen zu können!

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.