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