Doppelter Einsprung in die ISR bei einem PCINT verhindern?

OP #4492013
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
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
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
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.