Forum: Mikrocontroller und Digitale Elektronik Trigger just one time


von Martin M. (ats3788)


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
}

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


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

von Rolf M. (rmagnus)


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.

von Martin M. (ats3788)


Lesenswert?

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 .

von Rolf M. (rmagnus)


Lesenswert?

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.

von Simpel (Gast)


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...

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
Noch kein Account? Hier anmelden.