Forum: Mikrocontroller und Digitale Elektronik gezielt Interrupts bei Bedarf deaktivieren


von Ronny Schulz (Gast)


Lesenswert?

Hallo,
ich möchte zwecks Drehzahlmessung (mhere Lüfter) die externen
Interrupts nutzen. Allerdings hat der Mikrocontroller noch einiges mehr
zu schaffen und deshalb möchte ich ihn nicht ständig fordern, indem er
nur Drehzahlen misst. Deshalb würde ich diese externen IRQs bei Bedarf
deaktivieren. Geht das gezielt und wenn ja wie?

P.S.: Ich arbeite mit WinAVR.

von Thomas Burkhardt (Gast)


Lesenswert?

Hi,

die AVR's haben doch Interrupt Control Register (beim Mega8  z.B. das
GICR), damit werden die externen Interrupts gesteuert.

Wenn du sie nutzen wolltest, musstest du sei doch überhaupt erst einmal
aktiviert haben ;-)

von Andi (Gast)


Lesenswert?

Am einfachsten geht das, wenn kurzzeitg kein IRQ sein darf in ASM mit

 CLI       ;Clear Global Interrupt Flag.
 .... sonstiger Code
 SEI       ;Set Global Interrupt Flag.

Sollte wärend der Deaktivierung der Interrupts eines der einzelnen
IRQ-Flags z. B. für Int0 oder Pin-Change gesetzt sein wird der
Interrupt nach SEI sofort "nachgeholt".

Gruß
Andi

von ...HanneS... (Gast)


Lesenswert?

Hi...

Und wenn der Int "nachgeholt" wird, ist der Messwert für die Katz...

Vielleicht ist ja Polling doch die bessere Messmethode? Das Programm
macht einfach seine Arbeit, wenn es dann wieder mal einen Messwert
brauch, dann ruft es ein UP auf, in welchem per Polling der
Impulsabstand (also die Drehzahl) am betreffenden Eingang (muss kein
INT sein) gemessen wird.

In ASM würde ich Timer0 (mit Int) rotieren lassen, der mir den
PWM-Zähler erhöht und bei jedem PWM-Zähler-Überlauf ein Flag setzt,
damit das Hauptprogramm eine Messung (mit Timer1, aber ohne Int)
ausführen kann...

...HanneS...

von Christof Krüger (Gast)


Lesenswert?

Solange die Int-Ausblendung nicht zu lange dauert, ist das eigentlich
egal, da ja keine extakten Zeiträume gemessen werden sollen, sondern
die Anzahl der Impulse im Schnitt.

von Ronny Schulz (Gast)


Lesenswert?

@Christof:
Hmm .. also hilft nur probieren. Da die Anzahl der Impulse ja auch
nichts so sehr hoch ist, könnte das evtl. klappen. Bei 4 Lüftern sind
das 2 Impulse pro Umdrehung und vielleicht 2000 max. 5000 U/min. Das
sind dann max. 170 Impulse pro Sekunde. Das werde ich mal probieren,
wenn alles zusammengebaut ist.

@Thomas:
Guter Tipp! Bei ATmega128 habe ich das auch gefunden. im Register EIMSK
kann man die Interrupts maskieren. Da gibt es dann noch etliche Register
die steuern, wann ein IRQ ausgelöst wird. Steht aber alles in den Dokus,
wenn man jetzt endlich weiß wo. ;)

@Hannes:
Die Idee mit dem Poll ist zwar gut wie einfach. Aber die IRQs habe ich
ohnehin da. Denn kann ich die ja auch irgendwie nutzen. Letztendlich
war die Auswertung dieser ohnehin mit der Timerfunktion geplant. Also
Timer wird gestartet und wenn ich mal "Zeit habe" zum messen werden
sämtliche gezählte IRQs ausgewertet.

@All:
Nett gemeint. Aber mit CLI kann ich nicht wirklich gezielt IRQs
deaktivieren. Das geht ja dann leider nur global.

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.