mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Initialisierung mit Schiebeoperator beim AVR


Autor: Danilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oft (auch hier im Tutorial) findet man zum Initialisieren von Registern 
bzw. Ports  folgende Befehlssequenz:

LDI  R16, 1<<TOIE0
OUT   TIMSK, R16

Mein Verständnis ist, dass in der ersten Zeile das Register R16 mit dem 
Wert 0b00000001 geladen wird (wenn man mal von einem ATMEGA8 ausgeht). 
In der zweiten Zeile wird dieser Wert dann ins TIMSK geschrieben und 
TOIE0 gesetzt. Alle anderen Bits im TIMSK werden aber gelöscht was 
vielleicht gar nicht gewünscht ist.

Richtig ist doch die Sequenz:

IN  R16, TIMSK
ORI  R16, 0b00000001
OUT  TIMSK, R16

Oder habe ich da was falsch verstanden…?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Danilo

>TOIE0 gesetzt. Alle anderen Bits im TIMSK werden aber gelöscht was
>vielleicht gar nicht gewünscht ist.

Du siehs das vollkommen richtig.

MfG
Falk

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Prinzip sind Deine Annahmen korrekt. Wenn Du unten das "ORI R16, 
0b00000001" durch "ORI R16, (1 << TOIE0)" ersetzt, ist es auch noch 
lesbarer.

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

vorausgesetzt TOIE0 liegt auf Bit 0 ist deine Überlegung richtig.

Das mit dem Schieben ist aber in sofern praktisch (und auch besser) weil 
der Code besser lesbar bleibt (man sieht, welches Bit gesetzt wird) und
auc heinfacher auf andere Controller zu übertragen ist.

Häufig wird die erste Befehlssequenc zum initalisieren nach einem Reset 
verwendet und dann ist es sogar gewünscht alle Bits auf einen 
festgelegten zustand zu setzten. Oder man möchte gezielt alles anderen 
auf Null haben.

Wenn man nur ein einzelnes Bit ändern will, dann ist deine Überlegung 
schon richtig. Allerdings würde ich bei einem Bit direkt den sbi befehl 
verwenden.

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, da hab ich wohl zu langsam getippt :-)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mike:
Dafür hast Du es aber schön ausführlich geschrieben...;-)

> würde ich bei einem Bit direkt den sbi befehl verwenden.
Das TIMSK liegt aber afaik bei keinem AVR im bitadressierbaren Bereich. 
Das geht dann nicht mit sbi. sbi kann nur die I/O-Register bis einschl. 
Adresse 0x1F.

Autor: Danilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke allen.
Vor allem der Tip von johnny.m mit dem ORI R16, (1<<TOIE0) hat mir 
weitergeholfen.

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.