Forum: Mikrocontroller und Digitale Elektronik Interruptprobleme mit RFM12 868 MHz


von Wolfgang A. (wolfg123)


Angehängte Dateien:

Lesenswert?

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

von ck (Gast)


Lesenswert?

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.

von Wolfgang A. (wolfg123)


Angehängte Dateien:

Lesenswert?

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

von J. -. (Gast)


Lesenswert?

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
}

von Wolfgang A. (wolfg123)


Angehängte Dateien:

Lesenswert?

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

von J. -. (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Das Ding ist ja ein Albtraum, nirgends ein brauchbares Datenblatt zu 
finden.

von Christian K. (the_kirsch)


Lesenswert?

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
Noch kein Account? Hier anmelden.