Forum: Mikrocontroller und Digitale Elektronik RF22B - unendlich viele Interrupts :/


von Johannes V. (johannes_v)


Lesenswert?

Guten Tag,

ich bin gerade mit ein paar RF22B Modulen am Experimentieren und habe 
ein Problem. Wenn Ich in den IRQ enable registern 0xFF 0xFF eintrage, 
also praktisch jeden Interrupt aktiviere dann triggered der ohne 
Unterbrechung.
Also abgesehen von einem kurzen Moment in dem ich die IRQ Status 
Register auslese. Dort steht dann aber 0 und 0 drin.

Wenn ich eine andere Interrupt Maske verwende, wie z.b. die eigentlich 
geplante, dann erscheinen in den Status Registern Interrupts welche ich 
nicht aktiviert habe. Z.b. TX FIFO allmoust empty.
Praktisch sobald ich den Externen Interrupt am µC aktiviere nachdem ich 
durch die Initialisierung der RF22B bin steht das Programm, gefangen in 
Dauer-ISR -.-

Vielleicht weiss jemand Rat?

von Carsten M. (ccp1con)


Lesenswert?

Ist doch logisch: du sagst beim Auslesen der Interrupt Register kommt 
nur 0 und 0 raus. D.h das Auslesen funktioniert nicht und deswegen 
löscht der RFM22 den Interrupt auch nicht!

Denke ich. :-)

von Johannes V. (johannes_v)


Lesenswert?

Naja,

ich habe zu Testzwecken jetzt noch eine LED angeschlossen, sie leuchtet 
die ganze Zeit.

Meine Ext Interrupt Register im Controller werden aber gesetzt und nach 
verlassen der ISR auch wieder geleert.

Wenn ich per Hand den Ext Int pin auf V+ oder Masse lege erhalte ich 
auch das erwartet verhalten, Trigger bei negativer Flanke.

Ich denke das die Interrupt Status Register beim Auslesen 0 0 anstelle 
von 0x20 0x02 anzeigen wenn ich als interrupt enable Maske 0xFF 0xFF 
angebe ist kein Fehler, sondern ein Feature.
Eine Interrupt Source ist nur einmal aktuell und wenn die Maske nicht 
gesetzt ist sind es keine Interroupt Sourcen, sondern nur Statusbits, 
die jederzeit gelesen werden können und dann natürlich auch nicht 
gelöscht werden.

Hilft mir leider nicht bei meinen Interrupts :<

Habe es genauer untersucht, scheint als ob das lesen des ersten Status 
einen Interrupt triggered, aber da selbst bei single Step die LED nicht 
einmal ausgeht, wird wohl nur zweimal schnell getoggled.

Habe jetzt das löschen des Interrupt request ans ende der ISR gesetzt, 
scheint auf den ersten Blick zu funktionieren. Aber schon ärgerlich, 
dass ein IRQ generiert wird wenn man ein Register ausliesst. Muss man 
erstmal drauf kommen

von Carsten M. (ccp1con)


Lesenswert?

Da haben wir uns vielleicht falsch verstanden.
Du mußt die Interrupt Register 0x03 und 0x04 (am Besten in deiner ISR) 
des RFM22 auslesen! Nur dann löscht der RFM22 den Interrupt (setzt den 
Pin nIRQ wieder high)

Was du auch noch beachten solltes ist, dass auch nach einem POR die 
Regsiter 0x03 und 0x04 gelesen werden sollten.

>dass ein IRQ generiert wird wenn man ein Register ausliesst
Kann mich nicht daran erinnern, dass das so war!

von Johannes V. (johannes_v)


Lesenswert?

Habe das ganze jetzt weiter verfolgt, und es ist scheinbar noch 
schlimmer.

Es scheint dass sobald das Chip Ready Bit sitzt, jeder Zugriff auf das 
Gerät einen IRQ ausöst, aber im Status steht nichts besonderes. Der nIRQ 
Pin bleibt auch nicht low, sondern wird nur gepulst. Also um mich klarer 
auszudrücken, Mit einem Breakpoint am Anfang der ISR kann gezeigt 
werden, dass schon gar kein IRQ mehr vorliegt wenn sie angesprungen 
wird, da die LED am nIRQ Pin durchweg leuchtet.

Das ganze führt im Moment dazu, dass mir die ISR teilweise CS wieder 
setzt und im Hauptprogramm wird dann trotzdem weiter munter die 
Schnittstelle angesprochen.

Den Status nach der Initialisierung einmal zu lesen um erstmal alle 
Interrupts, falls da welche sind, wegzulesen habe ich eingebaut. Kannte 
das von der RF12 schon ;)

von Fox Mulder (Gast)


Lesenswert?

Funktioniert eigentlich das Lesen der Register 0, 1 & 2?

von Johannes V. (johannes_v)


Angehängte Dateien:

Lesenswert?

Nach genauerem hinsehen scheint der Interrupt mit jedem CS = low gepulst 
zu werden.
Habe Pins für beide Signale getauscht, ändert aber leider rein gar 
nichts :<

Ok, habe das Problem gefunden, auch wenn es sich mir immenoch nicht 
erklärt.

Mein Versuchsaufbau im Anhang, nach entfernen er CS LED wird kein IRQ 
mehr erzeugt, aber kann mir das mal jemand elektrisch erklären? Die IRQ 
LED sollte doch sperren gegen die 0 an CS..

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.