Hallo!
Ich habe 2x RFM12 aufgebaut. Der Erste sendet mittels des kleinen
Programms von Bennedikt K. einen Teststring raus. Mit dem Oszi kann ich
am Antennenausgang per "FFT" periodisch noch einen kleinen Träger bei
433 +/- 1MHz erkennen. Laut JTAG scheint auch alles durch zu laufen.
Der Empfänger beinhaltet ebenfalls Bennedikts Testprogramm. Allerdings
bleibt dieses an der Stelle stehen, an der auf ein High am SDO des
Moduls gewartet wird.
Hier der Code des Empfängers:
(bps geändert, Ausgangsleitung auf Minimum)
1 | int main (void) {
|
2 | sei();
|
3 | // ------- RFM12 init -----------------------
|
4 | rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
|
5 | rf12_setfreq(RF12FREQ(433.92)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
|
6 | rf12_setbandwidth(4, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
|
7 | rf12_setbaud(1600); // 1600 bps
|
8 | rf12_setpower(7, 6); // -21db Ausgangangsleistung, 120kHz Frequenzshift
|
9 |
|
10 | // --------------------------------------------
|
11 | for (;;)
|
12 | {
|
13 | // send();
|
14 | for (unsigned char i=0; i<100; i++)
|
15 | _delay_ms(10);
|
16 |
|
17 | receive();
|
18 | }
|
19 | }
|
20 |
|
21 | void receive(void)
|
22 | { unsigned char test[32];
|
23 | rf12_rxdata(test,32);
|
24 | // daten verarbeiten
|
25 | }
|
die rf12_init() sieht bei mir so aus:
(Clk-Ausgang auf 5MHz; AFC ohne Einschränkung; sonst alles identisch)
1 | void rf12_init(void)
|
2 | {
|
3 | RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
|
4 | RF_PORT=(1<<CS);
|
5 |
|
6 | for (unsigned char i=0; i<10; i++)
|
7 | _delay_ms(10); // wait until POR done
|
8 |
|
9 | rf12_trans(0xC0D0); // 14. AVR CLK: 5MHz
|
10 | rf12_trans(0x80D7); // 1. Config Setting: Enable FIFO
|
11 | rf12_trans(0xC2AB); // 6. Data Filter: internal
|
12 | rf12_trans(0xCA81); // 7. Set FIFO mode
|
13 | rf12_trans(0xE000); // 12. disable wakeuptimer
|
14 | rf12_trans(0xC800); // 13. disable low duty cycle
|
15 | rf12_trans(0xC4C7); // 9. AFC settings: autotuning: no restriction
|
16 | }
|
An der Stelle mit dem Pfeil passiert nichts mehr. In der Ready-Funktion
wird auf ein HighPegel am SDO gewartet.
1 | void rf12_rxdata(unsigned char *data, unsigned char number)
|
2 | { unsigned char i;
|
3 | rf12_trans(0x82C8); // RX on
|
4 | rf12_trans(0xCA81); // set FIFO mode
|
5 | rf12_trans(0xCA83); // enable FIFO
|
6 | for (i=0; i<number; i++)
|
7 | {
|
8 | --> rf12_ready();
|
9 | *data++=rf12_trans(0xB000);
|
10 | }
|
11 | rf12_trans(0x8208); // RX off
|
12 | }
|
Ist es möglich, am Modul die eintreffenden "Bits" direkt Ausgeben zu
lassen? Ich weiß noch nicht wo mein Problem ist... Ich kann leider auch
nicht wirklich messen, ob die korrekten Daten über die Antenne raus
gehen (per SPI gehen auf jeden Fall die Richtigen rein!). Ich möchte
gern sehen, was da so durch den Äther geht...
Weiß jemand Rat?
Beste Grüße, Gregor