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
}
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.
Hallo Danke für die Antworten Ja das ist richtig nur ich bekomme einen Trigger wenn ich drücke und einen Trigger wenn ich loslasse ich möchte aber nur einen Trigger bearbeiten also einen Trigger nicht berücksichtigen .
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.