Hallo, nach stundenlangem Fummeln, mangels Debugger und mit vielen debugln("...) frage ich nun lieber, wie es sich genau nun verhält. Viel Spielraum habe ich nicht, da das Gerät fertig gebaut ist. Ich muss zwingend den Power Down oder ähnliche Modes verwenden, da Batteriebetrieb. Der Sensor erzeugt bei Triggerung einen LOW-HIGH-LOW Durchgang, der das Gerät aufwecken muss. Im Normalbetrieb habe ich den INT0 auf RISING stehen per attachInterrupt(......, RISING). LOW kann ich nicht brauchen, LOW ist der Pin immer im Ruhezustand. CHANGE auch nicht nützlich. Der WDT ist auf 8S eingestellt, springt die wdt_ISR an, die auch als kleine Uhr dient, nicht genau aber ausreichend. Frage: Wacht der WDT aus seinem 8S Schlaf auch auf, wenn man Pin-CHANGE Benutzt? Oder will der zwingend einen LOW Level sehen im attachInterrpt(....., LOW); Setzt man vor den sleep_mode() ein cli() wacht er gar nicht mehr auf, seltsam für einen WDT ISR, dachte der wäre nicht verhinderbar. Kann da mal jemand etwas Licht rein bringen, wie man ein L-H-L Signal zum Aufwecken benutzen kann? Gruss, Christian
Dem WDT ist es völlig egal, was an Pin 0 passiert. Der WDT schläft nicht. Bei den meisten Arduinos ist Pin 0 teil der seriellen Verbindung. Da können dann also durchaus viele Interrupts/Pegeländerungen auftreten. Und einen Sensor da anzuschließen ist bei normalen Arduinos eine eher schlechte Idee. Chris J. schrieb: > Kann da mal jemand etwas Licht rein bringen, wie man ein L-H-L Signal > zum Aufwecken benutzen kann? Du könntest auch den PCINT nutzen.
Pin 0 gibt es nicht. Habe es auch gefunden im Datenblatt, kein RISING FALLING, CHANGE INT funktioniert, wenn die I/O Clocks aus sind. Dann ist nur der Idle Mode möglich, der leider auch durch millis() aufgeweckt wird. Weisst Du wie man millis abschalten kann? Ich benutze sowieso keine Arduino Libs. Auf welchem Timer basiert es? Sonst bleibt nur noch die Clocks runter zu fahren auf 32 khz oder etwas mehr in der Hauptschleife. Hoffe mal, dass die Serial das verkraftet, die verschluckt sich auch nach sleep gerne, wenn man sie nicht beendet mit serial.end() edit: ok, ich habs.Problem erledigt.
1 | /* s = 0 - Millis INT aus
|
2 | s = 1 - Millis INT an */
|
3 | void CntrlMillis(int s) { |
4 | |
5 | cli(); |
6 | switch (s) { |
7 | |
8 | case 0: TIMSK0 = TIMSK0 & ~(1 << T0IE); |
9 | break; |
10 | case 1: TIMSK0 = TIMSK0 | (1 << T0IE); |
11 | break; |
12 | }
|
13 | sei(); |
14 | }
|
Chris J. schrieb: > Pin 0 gibt es nicht. Natürlich gibt es den Arduino Pin 0! Du nutzt allerdings Int0, mein Irrtum. Chris J. schrieb: > Habe es auch gefunden im Datenblatt, kein RISING FALLING, CHANGE INT > funktioniert, wenn die I/O Clocks aus sind. Das gilt nicht für PCINT, soweit mir bekannt. Chris J. schrieb: > Weisst Du wie man millis abschalten kann? setup() und loop() weglassen und eine main() einführen. Chris J. schrieb: > Auf welchem Timer basiert es? Timer0 in der Regel.
Arduino Fanboy D. schrieb: > Das gilt nicht für PCINT, soweit mir bekannt. Doch, steht doch da. Die Flankenerkennung braucht ein Clock-Werk, damit sie funktioniert. Die Pegelerkennung aber nicht. Was meinst du mit PCINT? Es gibt viele davon. Aber nur zwei INTn beim 328P. Bin jetzt etwas verwirrt..... > Chris J. schrieb: >> Weisst Du wie man millis abschalten kann? > setup() und loop() weglassen und eine main() einführen. Cool..... auf die Idee bin ich noch nicht gekommen. Das sind wohl so Konstrukte, die einiges dazu packen, was man nicht sieht. Ist ja schon seltsam mit den Prototypen: Es kompiliert endlos lange durch, auf einmal will er Prototypen Deklarationen haben. das war lange vorher nicht so. Habe jetzt Header eingeführt.
> Die Flankenerkennung braucht ein Clock-Werk, damit sie funktioniert.
Schon, bei INT0; aber nicht bei PCINT18:
"Pin change interrupts on PCINT23...0 are detected asynchronously. This
implies that these interrupts can be used for waking the part also from
sleep modes other than Idle mode."
Ok, aber INT0 ist PCINT18..... mal für Blöde, wie stellt man dann mit dem Arduino kram diesen Pin ein? Damit er aus Power Down aufwacht? Oder soll ich lieber einen anderen Pin nehmen als den INT0? Darüber sind schon andere gestolpert: http://forum.arduino.cc/index.php?topic=247310.0
Dann eben einen anderen - der ATmega328P hat auf jedem I/O-Pin einen PCINTnn.
Chris J. schrieb: > Doch, steht doch da. Die Flankenerkennung braucht ein Clock-Werk, damit > sie funktioniert. Die Pegelerkennung aber nicht. Du redest von Int0 und Int1. Und ich rede von PCINT ! > Pin change interrupts on PCINT23...0 are detected > asynchronously. This implies that these interrupts > can be used for waking the part also from sleep > modes other than Idle mode. Also? Ja, mit den Prototypen kommts schon mal durcheinander, wenn du exotische Funktionsdefinitionen hast. Eigentlich bauts die selber... Chris J. schrieb: > Doch, steht doch da.
Glaube ich habe da was: https://playground.arduino.cc/Main/PinChangeInt Oder ich mache es eben manuell über die Register. Die ISR heissen dann ja PCINT0_vect usw. Ist vielleicht besser als wieder über eine Lib zu gehen, die als Black Box gebaut ist. So, wie ich es aktuell gemacht habe scheint es aber falsch gewesen zu sein mit attachInterrupt(PinToINT(..),ISR,CHANGE) es sei denn er ist so clever und erkennt, ass ich dann eben die PCINT Eigenschaft nutzen will und nicht die External Int.
Nur so als Info: Wer SoftwareSerial verwendet kann sich jegliche nPCINT klemmen. Die Lib beansprucht alle Vektoren für sich, auch wenn nur 2 Pins gebraucht werden. Und eine Änderung traue ich mir da nicht drin zu. Blöd.....
Tja, so kann es kommen, wenn die Anforderungen per Salamitaktik ausgebreitet werden.
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.