Hallo zusammen, ich habe nun endlich meine RFM12-basierte Funkbrücke erfolgreich in Betrieb genommen. (Nach ca. 4 Wochen :D ) Aber ich hab nicht aufgegeben. Jetzt funktioniert alles einwandfrei mit den Beispielprogrammen und mit meinen eigenen. Bei dem Beispielprogramm handelt es sich um das aus dem Thread: Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module" Nur folgendes Problem: Wenn ich das ganze Testboard (Steckbrett) aus und wieder einschalte kommt es manchmal dazu, dass der Sender nicht mehr sendet. Ich muss dann, komischer Weise, zunächst das Programm für den Empfangsmodus überspielen. Und anschließend das Sende-programm. Erst dann geht es wieder. Jetzt ist es natürlich so, dass ich die Fernbedienung (Die daraus mal entstehen soll, auch ausschalten möchte, oder sie ggf komplett ausgeht wegen batteriewechsel/hinfallen etc.) Was kann ich tuen damit das nicht mehr passiert. Danke schonmal für die Hilfe!
Evtl. Fehler beim Initialisieren: das Programm zum Empfangen initialisiert richtig, das Programm zum Senden nicht (vielleicht fehlt das Initialisieren eines Registers oder falsche Werte?).
Die Initialisierungen sind identisch: [c] uart_init(UART_BAUD_SELECT(19200, F_CPU)); rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz) rf12_setfreq(RF12FREQ(433.92)); // Sende/Empfangsfrequenz rf12_setbandwidth(4, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm rf12_setbaud(19200); // 19200 baud rf12_setpower(0, 6); // 1mW Ausgangangsleistung, 120kHz Frequenzshift [\c] Normalerweise funktioniert es ja auch. Aber wie gesagt, es funktioniert manchmal nicht mehr, wenn ich den Strom wegnehme...
Du kannst doch nicht erwarten, dass 40 Minuten nach deinem Post schon eine Antwort kommt. Da musst du schon etwas geduldiger sein. ;) Gaasi schrieb: > uart_init(UART_BAUD_SELECT(19200, F_CPU)); > rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz) > rf12_setfreq(RF12FREQ(433.92)); // Sende/Empfangsfrequenz > rf12_setbandwidth(4, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, > DRSSI threshold: -79dBm > rf12_setbaud(19200); // 19200 baud > rf12_setpower(0, 6); // 1mW Ausgangangsleistung, 120kHz > Frequenzshift Diese Initialisierung hilft uns nicht weiter. Wenn schon, dann brauchen wir die realen Werte die in den RFM12 geschrieben werden und keine Wrapperfunktionen. Eventuell ist nämlich in diesen schon ein Fehler drin. Ebenso brauchen wir die Werte die in den RFM12 geschrieben werden, wenn du ein Paket sendest. Am besten hängst du mal den gesamten relevanten Codeteil für die RFM12 an deinen Post an. Ich betreibe die RFM12 auch in einem selbstgebauten Handsender und sie funktionieren nach jedem aus- und einschalten problemlos. Ciao, Rainer
Okay sorry...
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include "global.h" |
4 | #include "rf12.h" |
5 | |
6 | #define F_CPU 8000000UL
|
7 | #include <util/delay.h> |
8 | |
9 | #define RF_PORT PORTB
|
10 | #define RF_DDR DDRB
|
11 | #define RF_PIN PINB
|
12 | |
13 | #define SDI 3
|
14 | #define SCK 5
|
15 | #define CS 2
|
16 | #define SDO 4
|
17 | |
18 | unsigned short rf12_trans(unsigned short wert) |
19 | { unsigned char i; |
20 | |
21 | cbi(RF_PORT, CS); |
22 | for (i=0; i<16; i++) |
23 | { if (wert&32768) |
24 | sbi(RF_PORT, SDI); |
25 | else
|
26 | cbi(RF_PORT, SDI); |
27 | wert<<=1; |
28 | if (RF_PIN&(1<<SDO)) |
29 | wert|=1; |
30 | sbi(RF_PORT, SCK); |
31 | asm("nop"); |
32 | asm("nop"); |
33 | cbi(RF_PORT, SCK); |
34 | }
|
35 | sbi(RF_PORT, CS); |
36 | return wert; |
37 | }
|
38 | |
39 | void rf12_init(void) |
40 | {
|
41 | RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS); |
42 | RF_PORT=(1<<CS); |
43 | |
44 | for (unsigned char i=0; i<50; i++) |
45 | _delay_ms(10); // wait until POR done |
46 | rf12_trans(0xC0E0); // AVR CLK: 10MHz |
47 | rf12_trans(0x80D7); // Enable FIFO |
48 | rf12_trans(0xC2AB); // Data Filter: internal |
49 | rf12_trans(0xCA81); // Set FIFO mode |
50 | rf12_trans(0xE000); // disable wakeuptimer |
51 | rf12_trans(0xC800); // disable low duty cycle |
52 | rf12_trans(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz |
53 | }
|
54 | |
55 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi) |
56 | {
|
57 | rf12_trans(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7)); |
58 | }
|
59 | |
60 | void rf12_setfreq(unsigned short freq) |
61 | { if (freq<96) // 430,2400MHz |
62 | freq=96; |
63 | else if (freq>3903) // 439,7575MHz |
64 | freq=3903; |
65 | rf12_trans(0xA000|freq); |
66 | }
|
67 | |
68 | void rf12_setbaud(unsigned short baud) |
69 | {
|
70 | if (baud<664) |
71 | baud=664; |
72 | if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7) |
73 | rf12_trans(0xC680|((43104/baud)-1)); // R=(344828/8)/Baud-1 |
74 | else
|
75 | rf12_trans(0xC600|((344828UL/baud)-1)); // R=344828/Baud-1 |
76 | }
|
77 | |
78 | void rf12_setpower(unsigned char power, unsigned char mod) |
79 | {
|
80 | rf12_trans(0x9800|(power&7)|((mod&15)<<4)); |
81 | }
|
82 | |
83 | void rf12_ready(void) |
84 | { cbi(RF_PORT, SDI); |
85 | cbi(RF_PORT, CS); |
86 | asm("nop"); |
87 | while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready |
88 | }
|
89 | |
90 | void rf12_txdata(unsigned char *data, unsigned char number) |
91 | { unsigned char i; |
92 | rf12_trans(0x8238); // TX on |
93 | rf12_ready(); |
94 | rf12_trans(0xB8AA); |
95 | rf12_ready(); |
96 | rf12_trans(0xB8AA); |
97 | rf12_ready(); |
98 | rf12_trans(0xB8AA); |
99 | rf12_ready(); |
100 | rf12_trans(0xB82D); |
101 | rf12_ready(); |
102 | rf12_trans(0xB8D4); |
103 | for (i=0; i<number; i++) |
104 | { rf12_ready(); |
105 | rf12_trans(0xB800|(*data++)); |
106 | }
|
107 | rf12_ready(); |
108 | _delay_us(10); |
109 | rf12_trans(0x8208); // TX off |
110 | }
|
111 | |
112 | void rf12_rxdata(unsigned char *data, unsigned char number) |
113 | { unsigned char i; |
114 | rf12_trans(0x82C8); // RX on |
115 | rf12_trans(0xCA81); // set FIFO mode |
116 | rf12_trans(0xCA83); // enable FIFO |
117 | for (i=0; i<number; i++) |
118 | { rf12_ready(); |
119 | *data++=rf12_trans(0xB000); |
120 | }
|
121 | rf12_trans(0x8208); // RX off |
122 | }
|
Mein rf12_trans sieht so aus:
1 | unsigned short rf12_trans(unsigned short wert) |
2 | { unsigned short werti=0; |
3 | unsigned char i; |
4 | |
5 | cbi(RF_PORT, CS); |
6 | for (i=0; i<16; i++) |
7 | { if (wert&32768) |
8 | sbi(RF_PORT, SDI); |
9 | else
|
10 | cbi(RF_PORT, SDI); |
11 | werti<<=1; |
12 | if (RF_PIN&(1<<SDO)) |
13 | werti|=1; |
14 | sbi(RF_PORT, SCK); |
15 | wert<<=1; |
16 | _delay_us(0.3); |
17 | cbi(RF_PORT, SCK); |
18 | }
|
19 | sbi(RF_PORT, CS); |
20 | return werti; |
21 | }
|
Hallo, hänge mal zum Test dicht an den Spannungsanschlüssen des RFM einen Elko 10..22µF. Ich hatte den Effekt, daß er nach dem Aufwecken aus dem Sleep manchmal nicht senden wollte, der Elko half zuverlässig. Nach PowerOn außerdem als erste Amtshandlung beim Initialisieren den Status auslesen, sonst gab es bei mir trotz Wartezeit öfter keine Reaktion. Gruß aus Berlin Michael
Hast du auf deinem Steckbrett einen Elko? Ansonsten hat das Modul bei mir nach dem Anschalten ab und zu einfach nicht funktioniert. Lief dann aber spätestens nach einem Reset.
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.