Forum: Mikrocontroller und Digitale Elektronik Initialisierung mit Schiebeoperator beim AVR


von Danilo (Gast)


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…?

von Falk (Gast)


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

von johnny.m (Gast)


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.

von Mike R. (thesealion)


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.

von Mike R. (thesealion)


Lesenswert?

Mist, da hab ich wohl zu langsam getippt :-)

von johnny.m (Gast)


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.

von Danilo (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.