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.
Ein langsames Signal fragt man mit einem Timer ab, nicht mit einem Interrupt. Jagt den Troll raus.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.