Hallo Zusammen Ich versuche zwei ATMEGA32 über zwei RFM12 (868MHz) miteinander kommunizieren zu lassen. Senden und Empfangen geschieht jeweils über Interrupt wird wechselseitig in den Modulen ein/ und ausgeschaltet. Ich bin jetzt soweit gekommen: - Modul1 sendet. - Modul2 empfängt, sendet die Daten zurück, geht wieder auf Empfang - Modul1 sendet. - Modul2 empfängt -...und das war's, das klappt leider nur einmal !! Dann gibt es Probleme beim Ausschalten des RFM Empfängermoduls. Beim Abschalten (0x8208) wird vom RFM ein Interrupt generiert, obwohl vorher alle gesendeten Daten in der ISR-Routine abgeholt wurden. Der Sender sendet nichts mehr. Modul1: sendet 3 Bytes: 0x02, 0xF0, 0x0F (natürlich mit Vorspann: 0xAA, 0xAA, 0xAA, x2D, 0xD4) Modul2: 0xB000: Daten empfangen 0x0000: Status lesen : : 0x8208: disable receiver anschliessend generiert RFM12 einen Interrupt Im RFM12 Status ist Bit15/ Bit0 gesetzt. Bit15 ist gesetzt, obwohl der Empfänger ausgeschaltet ist und vom Sender nicht mehr gekommen ist (??). In der ISR-Routine werden die "angeblichen" Nutzdaten trotzdem mit 0xB000 abgeholt und der Interrupt mit 0x0000 quittiert. Der Interrupt bleibt aber auf low. Ich habe zwei Signaltraces von Modul2 beigefügt. receiveSendNOK.jpg zeigt den Fehlerfall. receiveSendOK.jpg zeigt den Gutfall. aufgezeichnet ist: - A0: Interrupt INT0 - A1..A3: Tracesignale meiner Interruptroutinen (senden/ empfangen) - A4..A5: Tracesignale meiner Sende/ Empfangsroutinen - A6..B1: Kommunikation zwischen ATMEGA32 und RFM12 - B1: nSEL Es funktioniert genau einmal direkt nach dem Einschalten Modul1 sendet 0x02, 0xF0, 0x0F Modul2 empfängt 0x02, 0xF0, 0x0F Modul2 schaltet dann den RFM12 Empfänger aus. RFM zieht Interrupt auf high (so soll es sein) Modul2 schaltet den RFM12 Sender ein und sendet 0x02, 0xF0, 0x0F Modul2 schaltet den RFM12 Sendetrakt aus Empfänger wieder ein Wie kann ich den RFM12 Empfängertrakt so ausschalten, daß der Interrupt auf high gesetzt wird und eine Flankenauswertung stattfinden kann? Verhalten wie im Gutfall: receiveSendOK.jpg Ich meine irgendwo gelesen zu haben, daß es Probleme mit dem Interrupts bei den RFM12 868MHz geben soll. Stimmt das ? Über eine Hilfe wäre ich sehr dankbar. Grüsse
Lange ist es her, das ich mit den RFM12 was gemacht habe. Ohne Quellcode ist muss wieder die Kristallkugel her halten. Wolfgang A. schrieb: > 0x8208: disable receiver > anschliessend generiert RFM12 einen Interrupt > Im RFM12 Status ist Bit15/ Bit0 gesetzt. Ist an dieser stelle das Transmitter Enable (ET) Bit gesetzt? Dann ist das normal, deine Sende Fifo kann Daten aufnehmen, daher ist dieses Bit gesetzt.
Hallo erst mal danke für die schnelle Antwort. Der Transmitter wurde im vorhergehenden Zyklus ausgeschaltet und ist zu diesem Zeitpunkt nicht aktiv. Wird später mit 0x8238 (et, es, ex) eingeschaltet Ich habe zwei Quellen beigelegt, aus denen die RFM12 Funktionen hoffentlich hervorgehen. Es sind die beiden Quellen für die RFM12 Logik. Wenn was unklar ist, bitte nachfragen. Grüsse Wolfgang
ck schrieb: > Lange ist es her, das ich mit den RFM12 was gemacht habe. Hier ebenso. Allerdings kann ich mich erinnern, daß ich ebenfalls auf der Suche nach einem Interrupt war, der nicht sein sollte. Ich habe dann in dem Interrupt für den Empfang (nIRQ) das Statusregister (0x0000) ausgelesen und explizit nochmal auf FiFo-Limit-Flag FFIT (0x8000) getestet
1 | ISR (INT0_vect) |
2 | {
|
3 | if (RFM12_Trans(0x0000) & 0x8000) flag |= RFM_RX_FLAG; |
4 | }
|
Hallo Jürgen S. schrieb: > Ich habe dann in dem Interrupt für den Empfang (nIRQ) das Statusregister > (0x0000) ausgelesen und explizit nochmal auf FiFo-Limit-Flag FFIT > (0x8000) getestet Wie hast Du dann darauf reagiert ? Ich behandle den Interrupt folgendermassen (siehe Bild): 1. 0xB000 FIFO lesen, Daten abholen 2. 0x0000 Status lesen Ergebnis, FIFO ist leer: Bit9, FFEM, fifo empty Bit8, RSSI,received signal strength Bit7, DQD, data quality detector Bit6, CRL, clock recovery locked 3. 0x8208 Empfänger ausschalten RFM12 setzt Interrupt ?? 4. 0x0000 Status lesen Ergebnis Bit15 gesetzt Ist das jetzt FFIT oder RGIT ? Empfänger ist ausgeschaltet, also er=0, also RGIT ? Andererseits wird der Sender erst später gestartet (in 7), was gegen RGIT und wiederum für FFIT spricht 5.,6. Reaktion auf Bit15 FFIT/ RGIT: 0xB000 FIFO lesen 0x0000 Status lesen und Interrupt quittieren Bit15 FFIT/ RGIT gesetzt Bit8, RSSI,received signal strength Der Interrupt wird leider nicht zurückgenommen, bleibt dauerhaft anstehen 7. Sender einschalten keine Reaktion Grüsse Wolfgang
Hallo Wolfgang, ich kann mich leider nicht mehr reinfuchsen, aber vielleicht findest Du eine Möglichkeit, den zweiten Interrupt abzuschalten. ck hat die Ursache für das Auftreten des zweiten Interrupts treffend beschrieben. Soweit ich erinnere, ist es mir nicht gelungen, diesen zweiten Interrupt zu eliminieren. Meine INT0-Routine wird also tatsächlich 2x aufgerufen, aber nur, wenn FFIT gesetzt ist, wird der FiFo ausgelesen und in den Empfangsbuffer gespeichert. Das passiert bei C in der main, wo das flag permanent abgefragt und nach dem Speichern wieder gelöscht wird. //--- Ich habe jetzt nochmal meine Sourcen durchgeschaut und gesehen, daß ich im INT0 gelieben bin, sobald das flag gesetzt war. D.h., im Interrupt wird der komplette RX-Buffer gelesen (das Längenbyte steht an erster Stelle, so hat man gleich zu Beginn diese Info und kann die Bytes mitzählen). Das macht man eigentlich nicht so, denn der Interrupt sollte ja so kurz wie möglich gehalten werden. Aber ich nehme an, daß diese doppelten Interrupts bei jedem RX-Byte dem AVR zuviel wurden (jedesmal push/pop der Register).
Das Ding ist ja ein Albtraum, nirgends ein brauchbares Datenblatt zu finden.
Ich bin immer nach diesem Datenblatt vorgegangen https://www.silabs.com/documents/public/data-sheets/Si4420.pdf Die RFMs sind fertig Module wo dieser Controller verbaut ist. Ich kann mich leider nicht mehr entsinnen, ob ich auch Probleme mit doppeltem Interrupt hatte. In meiner Ansteuerung habe ich immer das komplette Statusregister ausgelesen wenn ein Interrupt aufgetreten ist. Und auf die Statusbits reagiert je nachdem in welchen Modus ich mich befand Idle/Listening/Sending.
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.