Forum: Mikrocontroller und Digitale Elektronik RFM22B Interrupt Empfang


von Christoph H. (christoph_b)


Angehängte Dateien:

Lesenswert?

Hallo

Habe eine kurze Frage zu den RFM22b Modulen.

Habe die Lib von Ulrich Radig an meine Bedürfnisse angepasst. Das 
Beispiel verwendet ja polling was ja nicht so schön ist. Also habe ich 
den Empfangsteil in einen Interrupt verschoben. Der Empfang funktioniert 
auch soweit. Für eine Bidirektionale Verbindung gehört aber auch das 
senden dazu und hier habe ich ein Problem

Sobald ich etwas senden löst der Interrupt nicht mehr aus. Warscheinlich 
ist irgend ein Bit des RFM22b nach dem Senden  falsch.

Auch nach 5h finde ich das Bit nicht. ;-)

Vieleicht kennt sich jemand damit aus und kennt den Fehler.

Gruß Christoph

von Christoph H. (christoph_b)


Lesenswert?

keiner eine Idee?

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

das Problem hatte ich auch schon, mit der rf22_getpacket kannst du nicht 
mit einem Interrupt arbeiten, weil außer der RX int auch noch was 
anderes einen INT setzt und die originale RX Funktion die INT's dann 
nicht löscht.

ich habs folgendermaßen gelöst:
[ISR_INT0]
Register 3 lesen (ISR1)
wenn Bit 1=1 dann merken/Flag setzen (Paket empfangen)
Register 4 lesen (ISR2)
[END ISR]

wenn Paket empfangen (siehe oben), hab ich aber Außerhalb der ISR
1
unsigned char rf22_getpacket(unsigned char *data)
2
{  
3
  unsigned char i, cnt;
4
5
    if (!(rf22_read(0x02)&32))  // packet not read
6
    {
7
      cnt=rf22_read(0x4B);    // packet length
8
      
9
      for (i=0; i<cnt; i++)    // Daten (cnt - 2 für CRC)
10
      {
11
        *data++=rf22_read(0x7f);
12
      }
13
      
14
      rf22_rxmode();  
15
      return (cnt);
16
    }
17
  rf22_rxmode();  
18
  return 0;
19
}

Edit:
und noch den INT in rf22_rxmode() wieder einschalten
1
void rf22_rxmode(void)
2
{  
3
  rf22_read(0x03);      // clear interrupt status
4
    rf22_read(0x04);      // clear interrupt status
5
  rf22_write(0x07, 0x01);    // to_ready_mode();
6
  
7
  rf22_write(0x07, 0x01);    // to_ready_mode();
8
  rf22_write(0x7e, 0x17);    // threshold for rx almost full, interrupt when 1 byte received
9
  
10
  rf22_write(0x08, 0x03);    // clear RX fifo
11
  rf22_write(0x08, 0x00);    // clear fifo, disable multi packet
12
  
13
  rf22_write(0x07, 0x05);    // RX on
14
  rf22_write(0x05, 0x02);    // RX INT on  <-- !!!!!!!
15
  
16
    rf22_read(0x03);      // clear interrupt status
17
    rf22_read(0x04);      // clear interrupt status
18
}


Sascha

von Christoph H. (christoph_b)


Lesenswert?

Hallo Sascha


Mit
Register 3 lesen (ISR1)
wenn Bit 1=1 dann merken/Flag setzen (Paket empfangen)
Register 4 lesen (ISR2)

meinst du das Register 0x03 und 0x04 vom RFM Modul oder?

Es wäre interresant zu wissen was genau den INT auslöst.

Vieleicht kann jemand noch Licht ins Dunkel bringen

Gruß Christoph

von Sascha W. (sascha-w)


Lesenswert?

Christoph B. schrieb:
> Hallo Sascha
>
>
> Mit
> Register 3 lesen (ISR1)
> wenn Bit 1=1 dann merken/Flag setzen (Paket empfangen)
> Register 4 lesen (ISR2)
>
> meinst du das Register 0x03 und 0x04 vom RFM Modul oder?
ja

> Es wäre interresant zu wissen was genau den INT auslöst.
hab mir die Inhalte der Register mal immer ausgeben lassen, aber frag 
mich jetzt nicht welches Bit es war. Jeden falls muss man immer beide 
Statusregister lesen um die Flags zu löschen. Und das passiert im 
originalen Code nicht, weil vorher das Register 0x31 abgefragt wird.

Sascha

von Christoph H. (christoph_b)


Lesenswert?

Hallo

Leider scheint das RFM22 Modul ein Eigenleben zu führen.

Wenn ich das 0x03 Register auslese und auswerte sollte eigentlich das 2 
Bit ( Valid Packet Received ) auf 1 sein.
Das wird aber nie 1.

In Register 0x05 wird aber das 2 Bit(enpkvalid) trotzdem auf 1 gesetzt.

von Sascha W. (sascha-w)


Lesenswert?

Christoph B. schrieb:
> Hallo
>
> Leider scheint das RFM22 Modul ein Eigenleben zu führen.
>
> Wenn ich das 0x03 Register auslese und auswerte sollte eigentlich das 2
> Bit ( Valid Packet Received ) auf 1 sein.
> Das wird aber nie 1.
>
> In Register 0x05 wird aber das 2 Bit(enpkvalid) trotzdem auf 1 gesetzt.

enpkvalid ist Bit 1, und das wird mit rf22_write(0x05, 0x02) 
eingeschaltet (die Zeile die ich hinzugefügt hatte). Und eben dieses Bit 
1 habe ich dann auch in Register 0x03 ausgewertet.

Sascha

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.