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:)
Im Horoskop steht dazu heute: Du könntest Pech haben, wenn die Taste prellt.
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
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.
Max H. schrieb: > Du kannst auch ein externes Interrupt verenden, du solltest aber in der > ISR so lange warten in ISRs wird nicht gewartet!
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.