Forum: Mikrocontroller und Digitale Elektronik Freigeben und sperren von IRQs


von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich programmiere AVR-MEGAs mit dem Codesvision.

Beim aktuellen Projekt verwende ich den 16-Bit
Timer 1 des ATMEGA2561.

Wenn ich jetzt z.B. das 16-Bit OCR1A-Register
beschreiben möchte sieht das so aus.
OCR1AH=0x10;
OCR1AL=0xFE;

Der 16-Bit Wert wird erst übernommen wenn der zweite
Befehl durch ist.
Zwischen den beiden Befehlen darf laut Datenblatt,
so wie ich das verstanden habe, kein IRQ auftreten,
da sonst der gesamte 16-Bit Wert nicht geschrieben werden
kann.

Die einzige Möglichkeit besteht nun darin, die IRQs zu sperren.
Dies mach ich mit:
#asm("CLI")
OCR1AH=0x10;
OCR1AL=0xFE;
#asm("SEI")

Nun könnte es aber in diesem Fall sein, dass der IRQ von einer
übergeordneten Funktion, aus welchen Gründen auch immer, bereits
gesperrt wurde und von dieser Timerwertzuweisung nicht freigegeben
werden darf.
Wie kann ich feststellen, ob die IRQs bereits gesperrt sind oder
nicht?

Danke für eure Antworten.
Tut mir leid, bin leider noch nicht ganz so sattelfest.

Tschüss
Martin

von ArminD (Gast)


Lesenswert?

Hallo,

man kann über das I-Bit des Registers SREG
feststellen ob Interrupts gesperrt sind
oder nicht:
I = 1: Interrupts freigegeben
I = 0: Interrupts gesperrt

Gruss,
Armin

von Peter D. (peda)


Lesenswert?

Einfach das SREG sichern und statt sei() wieder zurück schreiben.


Allerdings ist mir kein einziger Fall bekannt, wo Interrupts längere
Zeit gesperrt werden, da dies zu sehr den Programmablauf
durcheinanderbringen würde.

Nach der Initialisierung gibts ein einmaliges sei() und dann läuft das
Programm.


Peter

von Martin (Gast)


Lesenswert?

Danke.
Tschüss Martin

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.