Forum: Mikrocontroller und Digitale Elektronik Interrupt freigeben


von Mr.Blubb (Gast)


Lesenswert?

Schönen guten Abend alle zusammen.
ich habe da mal eine Anfängerfrage. Ich will bei meinem Timer_1 den 
Interrupt für einen Compare A Match freigeben. Wie genau mache ich das 
in Assembler?

Dazu muss ich wenn ich das richtig verstanden habe ja im SREG das I-Bit 
auf 1 setzen. Kann ich das so machen?

ldi r16,1000000
out SREG,r16

Oder ist das vollkommen falsch?

von (prx) A. K. (prx)


Lesenswert?

sei

Abgesehen davon ist 1000000 eine Million. Auch in Assembler.

von holger (Gast)


Lesenswert?

>ldi r16,1000000
>out SREG,r16

>Oder ist das vollkommen falsch?

Ja, r16 hat nur 8Bit;)

von Mr.Blubb (Gast)


Lesenswert?

Hups, schwerer fehler...
ich meinte natürlich

ldi r16,0b1000000

von Falk B. (falk)


Lesenswert?

@  Mr.Blubb (Gast)

>Interrupt für einen Compare A Match freigeben. Wie genau mache ich das
>in Assembler?

Passende Register setzen.

>Dazu muss ich wenn ich das richtig verstanden habe ja im SREG das I-Bit
>auf 1 setzen. Kann ich das so machen?

>ldi r16,1000000
>out SREG,r16

>Oder ist das vollkommen falsch?

Nicht vollkommen, aber ausreichend falsch. Es gib den schönen Befehl

sei

;-)

von Mr.Blubb (Gast)


Lesenswert?

Wie jetzt,
ich kann mir das ganze in Register schreiben sparen indem ich nur

sei

an stelle von meinem falschem asm code schreibe? Und das gilt dann auch 
direkt für meinen Compare A Match? Oder muss da noch was dazu?
Bin etwas verwirrt, weil im Datenblatt das sei auch einfach so in 
quelltext auftaucht.

von (prx) A. K. (prx)


Lesenswert?

Gibt bei Atmel nicht nur Datasheet sondern auch Befehlssatzbeschreibung. 
Lesen!

von Falk B. (falk)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Mr.Blubb schrieb:
> Wie jetzt,
> ich kann mir das ganze in Register schreiben sparen indem ich nur
>
> sei
>
> an stelle von meinem falschem asm code schreibe? Und das gilt dann auch
> direkt für meinen Compare A Match? Oder muss da noch was dazu?
> Bin etwas verwirrt, weil im Datenblatt das sei auch einfach so in
> quelltext auftaucht.


sei schaltet alle Interrupts, die freigegeben wurden auch tatsächlich 
frei.

Ein Interrupt muss spezifisch aktiviert (freigegeben) werden und mittels 
sei lässt man dann die tatsächliche Bearbeitung zu.

AVR-Tutorial

von Spess53 (Gast)


Lesenswert?

Hi

>Hups, schwerer fehler...
>ich meinte natürlich

>ldi r16,0b1000000

Endlich mal jemand, der mit diesem 'tmp'-Gedödel verseucht ist.

Aber auch Assembler ist komfortabel:

ldi r16,1<<OCIE1A
...

>Wie jetzt,
>ich kann mir das ganze in Register schreiben sparen indem ich nur

Nein. Einmal den entsprechenden Interrupt aktivieren und global (sei) 
Interrputs erlauben.

Und lies dir in Ruhe mal die Hilfe zu AVR-Assembler/AVR-Assembler2 
durch.

MfG Spess

von Mr.Blubb (Gast)


Lesenswert?

Um das gesamte Tutorial zu lesen fehlt mir leider die zeit (Wird aber in 
den nächsten Ferien gemacht), außerdem ist es ja schon spät... Aber ich 
glaube ich habs jetzt raus:

ldi r16 0b00010000
out TIMSK,r16 ;Enable von OCIE1A
ldi r16,0b1000000
out SREG,r16 ;I-Bit auf 1 setzen
sei ;Interrupts erlauben


Ich hoffe das stimmt jetzt, wenn nicht wäre es super nett wenn wer die 
Lösung hat.... sonst mache ich mir wieder die ganze Nacht gedanken 
darüber und kann nicht schlafen ;)

von Karl H. (kbuchegg)


Lesenswert?

Mr.Blubb schrieb:

> Ich hoffe das stimmt jetzt,


Das ist jetzt doppelt gemoppelt.

Auf der einen Seite setzt du selber das I-Bit im SREG. Auf der anderen 
Seite ist das genau das, was sei macht.
Lass das SREG in Ruhe! Es gibt (zunächst) keinen Grund sich dort an den 
Einzelbits zu vergreifen!
1
   ldi r16, 1<<OCIE1A
2
   out TIMSK, r16
3
4
   sei

> Um das gesamte Tutorial zu lesen fehlt mir leider die zeit
Die wirst du dir aber nehmen müssen! Und zwar jetzt. Denn genau solcher 
Code kommt dort massenhaft vor. Spätestens nach dem Kapitel mit den 
Timern gibt es kaum ein Kapitel, in dem kein sei vorkommt (oder Setzen 
von Einzelbits in einem Register. Und zwar per Namen und nicht per 
Bitabzählen)

von Spess53 (Gast)


Lesenswert?

Hi

>Ich hoffe das stimmt jetzt, wenn nicht wäre es super nett wenn wer die
>Lösung hat.... sonst mache ich mir wieder die ganze Nacht gedanken
>darüber und kann nicht schlafen ;)

Gewöhne nicht dir nicht solchen Unsinn an:

>ldi r16 0b00010000

Siehe Beitrag "Re: Interrupt freigeben"

ldi r16,0b1000000
out SREG,r16 ;I-Bit auf 1 setzen

ist fast identisch mit 'sei'. Nur mit 'sei' überschreibst du die anderen 
Flags nicht.

MfG Spess

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.