Forum: Mikrocontroller und Digitale Elektronik Doppelter Einsprung in die ISR bei einem PCINT verhindern?


von M. G. (ixil96)


Lesenswert?

Hallo!

Ich möchte detektieren, ob ein Ladestecker an meine Schaltung 
angeschlossen wird oder nicht.

Dazu verwende ich einen Spannungsteiler am Eingang und vom 
Spannungsteiler auf den PCINT des ATtiny44.

Wenn ich nun den Powerplug anstecke bzw. abstecke, wird die ISR manchmal 
2x ausgeführt obwohl ich in der ISR den PCINT und alle anderen Interupts 
für ca. 100ms sperre.

Was mache ich falsch?
1
ISR (PCINT0_vect)              // Charger connected
2
{
3
  GIMSK &= ~(1<<PCIE0);          // Disable PCINT [7:0]
4
  cli();                  // Alle Interrupts sperren
5
  
6
  if ( (chargerflag == 0) || (chargerflag == 99) )
7
  {
8
    chargerflag = 1;  
9
  }
10
  else 
11
  {
12
    chargerflag = 0;  
13
  }
14
}

von Peter II (Gast)


Lesenswert?

m. g. schrieb:
> Was mache ich falsch?

Es geht so nicht, du musst das Signal vorher in Software oder Hardware 
en
prellen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

m. g. schrieb:

> Wenn ich nun den Powerplug anstecke bzw. abstecke, wird die ISR manchmal
> 2x ausgeführt obwohl ich in der ISR den PCINT und alle anderen Interupts
> für ca. 100ms sperre.

Während die ISR läuft? Glaube ich nicht. Eine ISR im C-Runtimesystem 
sperrt automatisch alle Interrupts derart, dass ein zweiter 
zwischenzeitlich aufgetretener Interrupt erst nach Beenden der ISR 
zuschlagen kann.

Daher:

>
1
>   GIMSK &= ~(1<<PCIE0);   // grober Unfug, raus!
2
>   cli();                  // grober Unfug, raus!
3
>

Wie Peter schon schrieb: Dein Kontakt ist nicht entprellt. Mechanische 
Kontakte, die manuell geöffnet und geschlossen werden, prellen nunmal. 
Dabei ist es auch eine ziemlich schlechte Idee, die Wechsel über einen 
PCINT zu erfassen. Das führt meist zu einem Eigentor.

Tipp: Lektüre von Entprellung

von Chris L. (kingkernel)


Lesenswert?

Du sperrst zwar die Interrupts für 100ms. Aber wenn in der Zeit was 
passiert, wird das trotzdem erkannt und das entsprechende Bit im IFR 
gesetzt. Wenn du nun die Interrupts wieder freigibst, werden alle in der 
zwischenzeit registrierten Interrupts ausgeführt

von Holger L. (max5v)


Lesenswert?

Hast du mal versucht das Interruptflagregister zurückzusetzen?
Nach der Wartezeit von 100ms und vor dem erneuten aktivieren des 
Interruptes ?

GIFR |= ( 1 << INTF0 );

von Peter II (Gast)


Lesenswert?

Holger L. schrieb:
> Hast du mal versucht das Interruptflagregister zurückzusetzen?
> Nach der Wartezeit von 100ms und vor dem erneuten aktivieren des
> Interruptes ?

warten in der ISR erzeugt nur noch neue Probleme

von Holger L. (max5v)


Lesenswert?

Das steht dort auch nirgendwo, gewartet bzw. die gewünschte Zeit mit dem 
Timer zu erfassen wird natürlich in der Main erledigt.

von Peter II (Gast)


Lesenswert?

Holger L. schrieb:
> Das steht dort auch nirgendwo, gewartet bzw. die gewünschte Zeit mit dem
> Timer zu erfassen wird natürlich in der Main erledigt.

dann kann er gleich dein Eingang In der Main Erfassung und braucht keine 
ISR mehr.

von Holger L. (max5v)


Lesenswert?

Wäre irgendwie ziemlich blöd, schon alleine wegen einem möglichen 
Schlafmodus.

GIFR |= ( 1 << INTF0 ); Das war für INT0 nicht für PCINT : GIFR |= ( 1 
<< PCIF );

von Peter II (Gast)


Lesenswert?

Holger L. schrieb:
> Wäre irgendwie ziemlich blöd, schon alleine wegen einem möglichen
> Schlafmodus.

aufwecken man immer noch mit der ISR - sie muss ja kein Inhalt haben

von Georg (Gast)


Lesenswert?

m. g. schrieb:
> und alle anderen Interupts
> für ca. 100ms sperre.

Wenn die Ereignisse so selten sind, ist es eh am besten, den Eingang in 
einer Timerroutine zu erfassen, z.B alle ms oder auch nur alle 10 ms. 
Dann stellt sich die Frage überhaupt nicht mehr, und auch die 
Entprellung ist ziemlich trivial. Und der Controller kann sich 
anderweitig langweilen.

Georg

von Pandur S. (jetztnicht)


Lesenswert?

Solche Probleme loest man durch eine genaue analyse. Indem man erst man 
einen PIN in der ISR wackelt und mit dem Oszilloskop gleichzeitig das 
externe signal misst

von Peter II (Gast)


Lesenswert?

Oder D. schrieb:
> Solche Probleme loest man durch eine genaue analyse. Indem man erst man
> einen PIN in der ISR wackelt und mit dem Oszilloskop gleichzeitig das
> externe signal misst

was soll man da noch Analysen? Das Kontakte Prellen und der Code damit 
nicht sauber umgehen kann ist doch schon klar.

von Andreas B. (bitverdreher)


Lesenswert?

Oder D. schrieb:
> Solche Probleme loest man durch eine genaue analyse. Indem man erst man
> einen PIN in der ISR wackelt und mit dem Oszilloskop gleichzeitig das
> externe signal misst

Nein, solche Probleme löst an durch nachdenken und lesen des 
Datenblattes.

Gruß
Andreas

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.