Trigger just one time

OP #4665230
Hallo

Ich rufe Ein Port Change Interrupt auf und
bekomme ChgBtn =0x8000 Button down und ChgBtn = 0x8000 Button up
also der Event wird zwei mal getriggert.
Wie kann ich es anstellen das der Aufruf nur einmal ausgeführt wird?

void __ISR(_CHANGE_NOTICE_VECTOR, ipl5AUTO) CNInterruptHandler(void)
{

Nop() ;
IFS1bits.CNBIF = 0;
//__delay_ms(20);

 NewBtn = PORTReadBits(IOPORT_B, (BIT_8 | BIT_9 | BIT_15 ));

 ChgBtn = WhatBitChanged(NewBtn , OldBtn);

if  (ChgBtn & 0x8000)
 printf("Button -- %x ", ChgBtn ); // <-- Zum Testen später Hier 
Function Ausführen
}
(Firma: Ucore Fotografie www.ucore.de) Persönliche Seite
Hallo Martin Michael,

um welchen Controller handelt es sich denn eigentlich?

Martin M. schrieb:
> Ich rufe Ein Port Change Interrupt auf

Gibt es bei dem von dir verwendeten Controller nur einen "Port Change 
Interrupt", oder gibt es auch "Pin Change Interrupts" (also für jeden 
einzelnen Pin eines Ports einen Interrupt)?

Es gibt oft noch zusätzliche Bits (je nach Controller), mit denen man 
einstellen kann: Interrupt AUS, Interrupt nur bei steigender Flanke, 
Interrupt nur bei fallender Flanke, Interrupt bei beliebiger Flanke. 
Gibt es so etwas bei dem von dir verwendeten Controller?

Viele Grüße,
Alex
Martin M. schrieb:
> Ich rufe Ein Port Change Interrupt auf

Was meinst du damit? ISRs ruft man nicht auf, die werden automatisch 
ausgeführt, wenn die Interrupt-Bedingung wahr wird.

Martin M. schrieb:
> bekomme ChgBtn =0x8000 Button down und ChgBtn = 0x8000 Button up
> also der Event wird zwei mal getriggert.

Nun, wenn du den Interrupt durch drücken eines Buttons auslöst, klingt 
das doch nicht falsch. Du drückst ihn einmal und lässt ihn einmal wieder 
los.
Nun, dann hast du zwei Möglichkeiten: Den nicht gewünschten einfach 
ignorieren (anscheinend erkennst du den ja), oder deinen geheimen 
Controller  - sofern möglich - so umkonfigurieren, dass er nur für eine 
der beiden Flanken einen Interrupt auslöst.
Gast
Deswegen heisst der auch Pin_CHANGE-Int. weil er bei jedem Wechsel des 
Zustandes triggert.

Du musst eben innnerhalb der Int-Routine ausschliessen, dass der Code 
ausgeführt wird, wenn der jetzige Tastenzustand  "nicht gedrückt" ist. 
Dazu musst du eben innerhalb der IR den aktuellen Tastenzustand 
abfragen...

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.