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:)
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.
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:)
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.
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..
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.
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..
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.
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:)
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.
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.
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?