Initialisierung mit Schiebeoperator beim AVR

Gast #497074
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…?
#497088
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.
Gast #497110
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren