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