Forum: Mikrocontroller und Digitale Elektronik Change Notification Interrupt


von Creo_123 (Gast)


Lesenswert?

Hallo, nur eine kurze Frage am Sonntag Morgen..

Kann ich beim "Change Notification Interrupt" in der Interrupt-Routine 
abfragen, welcher CN-Pin für das Auslösen verantwortlich war?

Ich möchte über sechs Taster sechs verschiedene Funktionalitäten 
auslösen. Dazu müsste ich ja wissen welcher Taster gedrückt wurde. Oder 
kann ich davon ausgehen, dass der Interrupt so schnell ausgeführt wird, 
dass der entsprechende Pin noch auf High ist, wenn die Routine 
ausgeführt wird?


Danke und viele Grüße:)

von Detlef K. (adenin)


Lesenswert?

Im Horoskop steht dazu heute: Du könntest Pech haben, wenn die Taste 
prellt.

von Max H. (hartl192)


Lesenswert?

Ob das per Hardware geht, also einfach in irgendeinem Register steht, 
weiß ich nicht, in Software würde es so gehen:

z.B. für PORTB
1
ISR()
2
{
3
  PORTB_new=PORTB;
4
  flankeB=PORTB_new^PORTB_old;
5
  PORTB_old=PORTB_new;
6
  .
7
  .
8
  .
9
  if(flankeB&(1<<5)
10
  {
11
    //Wird ausgeführt, wenn sich RB5 seit dem letzten
12
    //Change Notification Interrupt verändert hat.
13
  }
14
}

Wenn man das "flankeB=PORTB_new^PORTB_old;" durch
1
  flankeB=~PORTBnew;
2
  flankeB=flankeB&PORTBold;
ersetzt, wir nur auf die fallende Flanke reagiert.

Creo_123 schrieb:
> Interrupt so schnell ausgeführt wird,
> dass der entsprechende Pin noch auf High ist, wenn die Routine
> ausgeführt wird?
Ich weiß nicht welchen µC du verwendest, beim PIC24 hättest du eine 
Interrupt Latenz Zeit von 4 Taktzyklen, ich glaube kaum, dass jemand die 
Taste so schnell drücken kann. Du hast aber vllt. das Problem, dass die 
Taste in dieser Zeit noch Prellt, und deshalb nicht sicher gedrückt ist.

: Bearbeitet durch User
von Creo_123 (Gast)


Lesenswert?

Ich würde natürlich versuchen den Taster mittels RS-FlipFlop zu 
entprellen.. Habe aber ehrlich gesagt nicht daran gedacht, dass der 
Interrupt dann natürlich auch beim Loslassen des Tasters ausgelöst wird. 
Eventuell wechsle ich dann jetzt doch noch zum PORTB-Interrupt.. da kann 
man ja angeben ob er auf eine steigende oder fallende Flanke reagieren 
soll. Sofern dann mein Signal wirklich noch auf High ist, wenn ich es im 
Interrupt abfrage, sollte das ja die einfachste Möglichkeit sein.

Danke für die Tipps:)

von Peter D. (peda)


Lesenswert?

Creo_123 schrieb:
> Kann ich beim "Change Notification Interrupt" in der Interrupt-Routine
> abfragen, welcher CN-Pin für das Auslösen verantwortlich war?

Das sollte im Datenblatt des unbekannten MC stehen.
Z.B. beim AT89LP6440 wird das entsprechende Bit im GPIF Register 
gesetzt.

Allgemein ist aber der Timerinterrupt die mit Abstand beste Methode, 
Tasten abzufragen und zu entprellen.
Die externen Interrupts nimmt man nur dazu, um die CPU aus dem 
Tiefschlaf zu holen.

von Creo_123 (Gast)


Lesenswert?

Hi..

ich nutze einen dcPIC33. Konnte im Datenblatt leider keine Bits finden, 
die mir das anzeigen. Ich dachte so eine CN- bzw PORTB-Interrupt ist am 
besten, da mein PIC dann nur damit beschäftigt ist, wenn der Interrupt 
wirklich auftritt..

von Max H. (hartl192)


Lesenswert?

Du kannst auch ein externes Interrupt verenden, du solltest aber in der 
ISR so lange warten, dass der Taster nicht mehr prellt, bis du den PORT 
für die Flankenerkennung abfragst. Sonst kann es dir passieren, dass du 
den PORT in dem Moment abfragst, in dem der Taster auf Grund des 
Prellens wieder auf '0' ist.

Wenn du das PORTB-Interrupt verwendest, kann es dir passieren, dass die 
ISR, wenn sie zu kurz ist auf Grund des Prellens öfters aufgerufen wird. 
Und es kann auch passieren, da der Taster auch beim Loslassen prellt, 
dass die ISR auch beim Loslassen der Taste aufgerufen wird.

von chris (Gast)


Lesenswert?

Max H. schrieb:
> Du kannst auch ein externes Interrupt verenden, du solltest aber in der
> ISR so lange warten

in ISRs wird nicht gewartet!

von Max H. (hartl192)


Lesenswert?

chris schrieb:
> in ISRs wird nicht gewartet!
Kennst du eine andere Möglichkeit ohne Timer?

von Creo_123 (Gast)


Lesenswert?

würdet ihr das dann nur per Software, also nicht schaltungstechnisch, 
zum Beispiel per Flip-Flop, entprellen?

Mir ist momentan auch der Unterschied zwischen Port-B- und CN-Interrupt 
nicht so wirklich bewusst.. also beim CN-Interrupt kann ich die Pins 
frei wählen, mehr finde ich nicht im Datenblatt..

von Max H. (hartl192)


Lesenswert?

Du wolltest per Hardware entprellen, hab ich ganz vergessen. Dann 
vergiss meinen Post zum Prellen...

Wenn ich's richtig im Kopf habe, hast du beim CN nur einen Vector für 
alle Pins und es löst ein Int bei beiden Flanken aus. Beim PortB hast du 
einen Vector pro Pin und kannst die Flanke einstellen.

von Creo_123 (Gast)


Lesenswert?

werde dann aber auf jeden Fall probieren nur über die Software zu 
entprellen, weil das ja einfacher wäre für mich.. insofern ist der 
Hinweis schon gut..

nur wenn ich mir die Tabelle mit den verschiedenen Interrupts anschaue, 
bin ich mir gar nicht mehr sicher, ob mein Controller so ein 
PortB-Interrupt überhaupt unterstützt..

wenn ich zu dem Thema google, dann wird da meistens das RBIF-Bit 
genutzt. Das ist bei mir aber das ECAN Flag-Bit.. für nen kleinen Tipp 
in welchen Registern ich da suchen muss, wäre ich also sehr dankbar:)

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

So aus dem Kopf heraus.
Das RBIF-Bit reagiert auf eine Änderung an versch. PortB-Eingängen, die 
man maskieren kann.

Die CN-Bits reagieren auf genau 1 Eingang.

Du kannst Du Taster über RBIF abfragen.
Die Abfrage wie oben schon gepostet genau 1x ausführen und den Rest 
logisch verknüpfen. Immer startet ein Timer von ca. 50ms.
Ist der Timer abgelaufen wird in einer anderen IRQ-Routine nachgesehen, 
ob das Eingangs-Bit noch eingeschaltet ist. Wenn ja - Taste gedrückt.

von Peter D. (peda)


Lesenswert?

Creo_123 schrieb:
> werde dann aber auf jeden Fall probieren nur über die Software zu
> entprellen, weil das ja einfacher wäre für mich..

Nicht nur das, die zusätzliche CPU-Last ist einfach nur lächerlich.
Und einen Timertick kann man auch für viele andere Sachen gebrauchen.

Am bequemsten ist es, immer einen ganzen Input-Port zu entprellen. Es 
kostet gleich viel CPU-Zeit, wie für nur einen Pin.

von Creo_123 (Gast)


Lesenswert?

Nur noch eine Frage zu dem externen Interrupt.. ist der PortB-Interrupt, 
dann einer von den INT0 bis INT2? Und über das INTxEP-Bit im 
INTCON2-Register kann ich ja dann entscheiden ob auf eine steigende oder 
fallende Flanke reagiert wird.. oder habe ich das komplett falsch 
verstanden?

von Bernd (Gast)


Lesenswert?

INT0-2 sind andere INTs als der RBIF. Sieh mal in das Datenblatt, aus 
der Historie reagiert der RBIF auf PortB4-7.

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.