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?
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. :-)
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
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!
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 ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.