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
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.
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!
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...
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.
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
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.
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...
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.
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> erfordertOldie 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 :)