Forum: Mikrocontroller und Digitale Elektronik "Entprellen" von Interrupts


von Eric (Gast)


Lesenswert?

Hallo Leute,

ich habe folgendes Problem. Ich verwende einen ATmega8 und möchte einen 
PIR anschließen. Sobald der PIR ein HIGH liefert soll ein Interrupt 
ausgelöst werden. Der Controller soll dann einen Transistor 
durchschalten. Ich bin ein wenig ratlos, denn nachdem Schalten des 
Transistors soll für eine gewisse Zeit, z.B. 30 Sekunden "Stille" sein. 
Da zwischenzeitliche Interrupts aber gespeichert werden, würden diese 
nach den 30 Sekunden abgearbeitet werden. Um Strom zu sparen, soll der 
Controller eigentlich immer aus sein, außer für das Interrupthandling 
natürlich.

Habt ihr einen Tipp für mich?

Vielen lieben Dank
Eric

von Peter D. (peda)


Lesenswert?

Eric schrieb:
> Da zwischenzeitliche Interrupts aber gespeichert werden, würden diese
> nach den 30 Sekunden abgearbeitet werden.

Man darf vor dem Enable das Event-Flag löschen.
Achtung AVR-Fallgrube: Löschen = 1 setzen.

von Oldie (Gast)


Lesenswert?

Warum nennst du es Falle?

Flagregister einlesen und wieder rausschreiben = Alle
aufgelaufenen Interruptanforderungen sind im Orkus!
(Gegebenenfalls kann man noch maskieren...)

Reiner Tisch, weiter gehts!

von c-hater (Gast)


Lesenswert?

Eric schrieb:

> ich habe folgendes Problem. Ich verwende einen ATmega8 und möchte einen
> PIR anschließen. Sobald der PIR ein HIGH liefert soll ein Interrupt
> ausgelöst werden. Der Controller soll dann einen Transistor
> durchschalten. Ich bin ein wenig ratlos, denn nachdem Schalten des
> Transistors soll für eine gewisse Zeit, z.B. 30 Sekunden "Stille" sein.
> Da zwischenzeitliche Interrupts aber gespeichert werden, würden diese
> nach den 30 Sekunden abgearbeitet werden. Um Strom zu sparen, soll der
> Controller eigentlich immer aus sein, außer für das Interrupthandling
> natürlich.
>
> Habt ihr einen Tipp für mich?

Wenn du 30 Sekunden "Stille" haben willst, dann mußt du halt diese 30 
Sekunden Stille programmieren. Das Abschalten des Interrupts ist 
trivialster Scheiß, das "löschen" eventuell zwischenzeitlich 
aufgelaufener IRQs vor der Reaktivierung des Interupts ebenfalls.

Etwas komplizierter ist die Messung der 30 Sekunden. Dafür gibt es 
(mindestens) zwei Möglichkeiten: Entweder für diese 30s ein weniger 
tiefer Schlafmodus, um die Benutzung eines normalen Timers für den Zweck 
zu ermöglichen. Oder die Benutzung des Watchdog zur Abmessung dieses 
Zeitraumes, was zwar den tiefsten Schlafmodus in der Wartezeit 
ermöglicht, aber zwischenzeitlich mehrfaches vollständiges Aufwachen 
erfordert, weil der Watchdogtimer wahrscheinlich einfach nicht für einen 
Zeitraum programmierbar ist, der lang genug wäre.

Es soll ja vermutlich wohl vor allem auf minimalen Energieverbrauch in 
der Gesamtbilanz ankommen. Ich würde mir da nicht zutrauen, aus dem 
Stehgreif zu entscheiden, was günstiger wäre.

Mir wäre es aber wahrscheinlich viel zu anstrengend, das alles aus dem 
Datenblatt zusammenzusuchen und durchzurechnen. Ich würde wahrscheinlich 
einfach beide Varianten programmieren und jeweils einen Zyklus 
vermessen, um zu einer Entscheidung zu kommen...

von Peter D. (peda)


Lesenswert?

Oldie schrieb:
> Warum nennst du es Falle?

Weil es
1. wider der Logik ist (alle anderen Bits werden mit 0 gelöscht).
2. Seiteneffekte provoziert. Z.B. muß man für TWCR ein Schattenregister 
anlegen, damit man nicht den Interrupt zu früh löscht.

von spess53 (Gast)


Lesenswert?

Hi

>ich habe folgendes Problem. Ich verwende einen ATmega8 und möchte einen
>PIR anschließen. Sobald der PIR ein HIGH liefert soll ein Interrupt
>ausgelöst werden. Der Controller soll dann einen Transistor
>durchschalten. Ich bin ein wenig ratlos, denn nachdem Schalten des
>Transistors soll für eine gewisse Zeit, z.B. 30 Sekunden "Stille" sein.

Wozu der Controller? Das kann jeder PIR-Sensor mit einem BISS0001.

MfG Spess

von Oldie (Gast)


Lesenswert?

Mit dem Watchdog kommt man auf 8 s.

Wenn 32 s +/- Toleranz des Watchdog-Oszillators kein
Problem sind, reagiert man halt erst auf das 3. Wecksignal.
Ein Register zum Mitzählen sollte sich noch finden lassen...

Die kurzen Wachphasen kosten fast nix.

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Weil es
> 1. wider der Logik ist (alle anderen Bits werden mit 0 gelöscht).

Nein, nicht, wenn man atomar "Ziel = Ziel ODER Flagbit" programmiert. 
Oder besser gleich nur das eine Bit anfaßt, was man tatsächlich anfassen 
will. Asm rules.

Übrigens gibt es derartige Strobe-Bits in der Hardware praktisch seit 
Anbeginn der (digitalen) Zeit. Alles, was in der Schaltplandarstellung 
ein Dreieck als Symbol am Eingang hat, wird üblicherweise so abgebildet, 
wenn man mit Software darauf zugreift. Das hat Atmel nicht erfunden, und 
die Atmel-Hardware ist auch ganz sicher nicht die allerletzte Hardware, 
wie man sowas noch finden kann...

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Nein, nicht, wenn man atomar "Ziel = Ziel ODER Flagbit" programmiert.

Und schon bist Du in die Falle getappt, das ODER darf man eben nicht 
benutzen. Damit verliert man ungewollt auch alle anderen Interrupts in 
dem selben Register.
Richtig wäre:
"Ziel = Ziel UND NOT alle_anderen_interrupt_Bits"

Es ist und bleibt Murks.
Besonders schlimm ist, daß solche Murks-Bits oft mit normalen Bits im 
Register gemischt sind.
Z.B. ein I2C-Multimaster will senden und setzt im Main-Kontext das 
STA-Bit. Zufällig hat ihn aber gerade ein anderer Master als Slave 
adressiert und schon ist der Interrupt durch das OR gelöscht, ohne 
behandelt zu werden.

Durch das Sonderverhalten muß nicht nur der Programmierer mehr 
aufpassen, es ist auch mehr Code nötig, um die Seiteneffekte abzufangen.

von Differentialknilch (Gast)


Lesenswert?

Ein langsames Signal fragt man mit einem Timer ab, nicht mit einem 
Interrupt. Jagt den Troll raus.

von Eric (Gast)


Lesenswert?

Danke Leute für die vielen Infos.

spess53 schrieb:
> Wozu der Controller? Das kann jeder PIR-Sensor mit einem BISS0001.

Danke für die Info!! Aber mir geht es überwiegend darum, dass ich über 
µc-Programmierung dazu lerne. Da kommen mir die Vorschläge von c-hater 
und oldie ganz gelegen ;)

c-hater schrieb:
> Benutzung des Watchdog zur Abmessung dieses
> Zeitraumes, was zwar den tiefsten Schlafmodus in der Wartezeit
> ermöglicht, aber zwischenzeitlich mehrfaches vollständiges Aufwachen
> erfordert

Oldie schrieb:
> Wenn 32 s +/- Toleranz des Watchdog-Oszillators kein
> Problem sind, reagiert man halt erst auf das 3. Wecksignal.
> Ein Register zum Mitzählen sollte sich noch finden lassen...
>
> Die kurzen Wachphasen kosten fast nix.

Mit dem von euch beiden versuch ich mal mein Glück :)

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.