Trigger just one time

OP #4665230
Lesenswert?
• ▲
▼
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 #4665858
Lesenswert?
• ▲
▼
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
#4665959
Lesenswert?
• ▲
▼
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.
Gast #4666082
Lesenswert?
• ▲
▼
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

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