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.
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
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.....