Forum: Mikrocontroller und Digitale Elektronik Arduino Atmega328P : Wakeup durch INT0 Interrupt bei Power Down


von Chris J. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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.

von Chris J. (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Einer K. (Gast)


Lesenswert?

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.

von Chris J. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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

von Chris J. (Gast)


Angehängte Dateien:

Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

Dann eben einen anderen - der ATmega328P hat auf jedem I/O-Pin einen 
PCINTnn.

von Einer K. (Gast)


Lesenswert?

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.

von Chris J. (Gast)


Lesenswert?

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.

von Chris J. (Gast)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.