RFM22B Interrupt Empfang

OP #2848855
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
Angehängte Dateien:
#2850420
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
OP #2850440
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
#2850617
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
#2851746
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.