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.
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 ;-)
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
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...
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.