Change Notification Interrupt

Gast #3556969
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:)
#3556997
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.
Gast #3557101
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:)
#3557497
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.
Gast #3557501
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..
#3557566
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.
Gast #3557696
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..
#3557714
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.
Gast #3557756
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:)
(Firma: Promaxx.net) #3557791
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.
#3558149
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.
Gast #3558160
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?

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