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