Doppelter Einsprung in die ISR bei einem PCINT verhindern?

OP #4492013
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
}
Moderator Persönliche Seite #4492029
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
Gast #4492132
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
Gast #4492160
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren