Hallo, ich habe probleme mit dem rfm12. Ich benutze 2 module (einen zum empfangen einen zum senden). ich benutze den code aus www.mikrocontroller.net/topic/67273 allerdings umgebaut das er auf nem pic läuft... der sender sendet jede sekunde 4 byte, der empfanver soll diese empfangen... leider empfangt er nur alle paar minuten etwas und dann aber nur müll... welche schritte zur lösungsfindung kann ich durchfuhren bzw. wo konnt das problem liegen?? ich habe.ein 12mhz oszi zur verfugung... grus andi
um die korrekte funktionalität deiner kommunikationsroutinen mit dem RFM12 zu testen, wird öfters empfohlen, das RFM12 so zu konfigurieren, das es seinen eigenen takt am clock-ausgang ausgibt. das kannst du dann mit dem OSZI feststellen.. aber hier im forum gibts tonnenweise material dazu.. mfg
das debuggen von den dinger ist ziemlich blöd, da du ja eigentlich kaum die möglichkeit hast zu sehen was er sendet... bist du sicher das er genau das empfängt was du sendet oder das es mehr oder weniger zufallstreffer sind? Ich habe auch schon oft bemerkt das meine RFMs manchmal einfach irgendwas empfangen, also tatsächliche im Rauschen mal ein zufälliges paket daherkommt... am besten du testet ob du mit den RFMs reden kannst und deren statusregister auslesen kannst und dann probierst du eine funkübertragung. die Interrupts die er auslösen kann lassen sich eigentlich gut zum testen verwenden, etwa ob du ihn ausm schlaf wecken kannst, etc
er empfängt nur zufällig ab und zu datenmüll... (wahrscheinlich durch rauschen) status kann ich auslesen...
Also am clock kommen 10Mhz raus... habe ich gerade geprüft. Zwar zeigt bei mir mein oszi nur ein sinus an mit 10MHz aber des liegt wohl daran das es mit seiner abtastung an die grenzen stöst :)
werd hier nich verrückt mit dem funkmodul :( ich weis net wo der fehler liegt und vorallem net wie ich danach suchen soll :( bitte dringend um hilfe!!!
Ich glaub es ist garkein Fehler! Habt Ihr einen Funkschlüssel vom Auto zur Hand? Drückt den, und beobachtet mal ob Eure Verbindung dann Fehler aufweist! Wenn ja, so ist bei Euch das 433ISM-Band verseucht. Ein Funktermometer reicht da schon!
aber ich habe ja noch gar keine verbindung :) der sender sendet anscheinden (SDO reagiert zumindest, wobei ich auch net genau weis ob des so passt was der da so macht, das datenblatt kann man echt vergessen!)
Habt Ihr ne Möglichkeit mittels Scanner zu checken, ob das Band (433.025-434.7875MHz überhaupt frei ist?
leider nein... das ist ja das problem... ich weis net ob das problem beim sender, beim empfänger oder bei beiden liegt :(
Meine Vermutung: du hast die Antenne vergessen, am Sender und Empfänger (zumindest hast du noch nichts davon geschrieben). Ansonsten kannst du deinen Code posten? Vielleicht sieht jemand direkt irgendwelche Fehler.
Ich habe die Dinger vor ein paar Monaten zum Laufen gebracht. Meine Erfahrung: Wenn Sender und Empfänger nebeneinander stehen, dann funkt da nichts dazwischen - selbst wenn keine Antenne dran wäre. Gruß, FlorenzW
die beiden module sind direkt nebeneinander auf einer euro platine. Eine Antenne ist in Form eines drahtes bei sender und empfänger dran gelötet...
Dann Stelle die mal ein paar Meter entfernt auf, das kann auch zu Problemen führen. Ansonsten hilft wirklich nur das ausführliche Studium des Datenblattes um ih korrekt zu initialisieren etc. Burkhard Kainka hat das in der Elektor einmal schön zusammengefasst !
wer hat was gemacht ^^ kannst dur mir nen link geben? Hab zwar schon so ziemlich alles bezüglich rfm12 durchgestöber aber mal schauen...
So also: Anbei mal mein Anschlussplan :) Zum Senden verwende ich ein PIC12F683 Zum Empfangen einen PIC32MX460F Der Code zum Senden (PIC12F683):
1 | include "pic.h" |
2 | |
3 | typedef unsigned char uchar; |
4 | typedef unsigned int uint; |
5 | |
6 | #define _XTAL_FREQ 8000000
|
7 | |
8 | |
9 | #define RF_PORT GPIO
|
10 | #define RF_DDR TRISIO
|
11 | #define RF_PIN GPIO
|
12 | |
13 | #define SDI 0
|
14 | #define SDO 1
|
15 | #define SCK 2
|
16 | #define TASTER 3 //GP3 INPUT ONLY!!!
|
17 | #define CS 4
|
18 | #define LED 5
|
19 | |
20 | |
21 | #define cbi(PORT, BIT) (PORT &= ~(1<<BIT))
|
22 | #define sbi(PORT, BIT) (PORT |= (1<<BIT))
|
23 | #define RF12FREQ(freq) ((freq-430.0)/0.0025) // macro for calculating frequency value out of frequency in MHz
|
24 | |
25 | |
26 | |
27 | void InitApplication(void); |
28 | void rf12_init(void); |
29 | unsigned short rf12_trans(unsigned short wert); |
30 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi); |
31 | void rf12_setfreq(unsigned short freq); |
32 | void rf12_setbaud(unsigned short baud); |
33 | void rf12_setpower(unsigned char power, unsigned char mod); |
34 | void rf12_ready(void); |
35 | void rf12_txdata(unsigned char *data, unsigned char number); |
36 | void rf12_rxdata(unsigned char *data, unsigned char number); |
37 | void send(void); |
38 | |
39 | __CONFIG(0x3FF4); |
40 | |
41 | unsigned short state = 1; |
42 | |
43 | void main() |
44 | {
|
45 | for (unsigned char i=0; i<200; i++) |
46 | __delay_ms(10); //2s |
47 | |
48 | InitApplication(); |
49 | |
50 | while(1) |
51 | {
|
52 | switch(state) |
53 | {
|
54 | case 1: |
55 | sbi(RF_PORT, LED); |
56 | for (unsigned char i=0; i<50; i++) |
57 | __delay_ms(10); //500ms |
58 | state = 2; |
59 | break; |
60 | case 2: //init |
61 | rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz) |
62 | rf12_setfreq(RF12FREQ(433.92)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen |
63 | rf12_setbandwidth(4, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm |
64 | rf12_setbaud(19200); // 19200 baud |
65 | rf12_setpower(0, 6); // 1mW Ausgangangsleistung, 120kHz Frequenzshift |
66 | state = 3; |
67 | break; |
68 | case 3: |
69 | cbi(RF_PORT, LED); |
70 | for (unsigned char i=0; i<50; i++) |
71 | __delay_ms(10); //500ms |
72 | send(); |
73 | state = 4; |
74 | break; |
75 | case 4: |
76 | sbi(RF_PORT, LED); |
77 | for (unsigned char i=0; i<50; i++) |
78 | __delay_ms(10); //500ms |
79 | state = 3; |
80 | break; |
81 | |
82 | }
|
83 | |
84 | }
|
85 | }
|
86 | |
87 | |
88 | void interrupt interrupt_Handler(void) |
89 | {
|
90 | }
|
91 | |
92 | |
93 | |
94 | |
95 | void InitApplication(void) |
96 | {
|
97 | OSCCON = 0x75; // 8 MHz internal Clock |
98 | CM0 = 1; //111 = CIN pins are configured as I/O, COUT pin |
99 | CM1 = 1; //is configured as I/O, Comparator output disabled, Comparator off. |
100 | CM2 = 1; |
101 | ANS0 = 0; // all I/Os are digital |
102 | ANS1 = 0; |
103 | ANS2 = 0; |
104 | ANS3 = 0; |
105 | TRISIO &= ~(1<<SDI); |
106 | TRISIO &= ~(1<<SCK); |
107 | TRISIO &= ~(1<<CS); |
108 | TRISIO &= ~(1<<LED); |
109 | }
|
110 | |
111 | |
112 | |
113 | unsigned short rf12_trans(unsigned short wert) |
114 | { unsigned short werti=0; |
115 | unsigned char i; |
116 | |
117 | cbi(RF_PORT, CS); |
118 | |
119 | for (i=0; i<16; i++) |
120 | { if (wert&32768) |
121 | {
|
122 | sbi(RF_PORT, SDI); |
123 | }
|
124 | else
|
125 | {
|
126 | cbi(RF_PORT, SDI); |
127 | }
|
128 | werti<<=1; |
129 | if (RF_PIN&(1<<SDO)) |
130 | werti|=1; |
131 | __delay_us(100); //CHANGED |
132 | sbi(RF_PORT, SCK); |
133 | wert<<=1; |
134 | //__delay_us(5);
|
135 | __delay_us(100); //CHANGED |
136 | cbi(RF_PORT, SCK); |
137 | }
|
138 | __delay_us(5); |
139 | sbi(RF_PORT, CS); |
140 | return werti; |
141 | }
|
142 | |
143 | |
144 | void rf12_init(void) |
145 | {
|
146 | //RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
|
147 | RF_PORT=(1<<CS)|(1<<LED); |
148 | |
149 | for (unsigned char i=0; i<10; i++) |
150 | __delay_ms(10); // wait until POR done |
151 | |
152 | rf12_trans(0xC0E0); // AVR CLK: 10MHz |
153 | rf12_trans(0x80D7); // Enable FIFO |
154 | rf12_trans(0xC2AB); // Data Filter: internal |
155 | rf12_trans(0xCA81); // Set FIFO mode |
156 | rf12_trans(0xE000); // disable wakeuptimer |
157 | rf12_trans(0xC800); // disable low duty cycle |
158 | rf12_trans(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz |
159 | }
|
160 | |
161 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi) |
162 | {
|
163 | rf12_trans(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7)); |
164 | }
|
165 | void rf12_setfreq(unsigned short freq) |
166 | { if (freq<96) // 430,2400MHz |
167 | freq=96; |
168 | else if (freq>3903) // 439,7575MHz |
169 | freq=3903; |
170 | rf12_trans(0xA000|freq); |
171 | }
|
172 | |
173 | void rf12_setbaud(unsigned short baud) |
174 | {
|
175 | if (baud<663) |
176 | return; |
177 | if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7) |
178 | rf12_trans(0xC680|((43104/baud)-1)); |
179 | else
|
180 | rf12_trans(0xC600|((344828UL/baud)-1)); |
181 | }
|
182 | |
183 | void rf12_setpower(unsigned char power, unsigned char mod) |
184 | {
|
185 | rf12_trans(0x9800|(power&7)|((mod&15)<<4)); |
186 | }
|
187 | |
188 | void rf12_ready(void) |
189 | { cbi(RF_PORT, CS); |
190 | while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready |
191 | }
|
192 | |
193 | void rf12_txdata(unsigned char *data, unsigned char number) |
194 | { unsigned char i; |
195 | rf12_trans(0x8238); // TX on |
196 | rf12_ready(); |
197 | rf12_trans(0xB8AA); |
198 | rf12_ready(); |
199 | rf12_trans(0xB8AA); |
200 | rf12_ready(); |
201 | rf12_trans(0xB8AA); |
202 | rf12_ready(); |
203 | rf12_trans(0xB82D); |
204 | rf12_ready(); |
205 | rf12_trans(0xB8D4); |
206 | for (i=0; i<number; i++) |
207 | { rf12_ready(); |
208 | rf12_trans(0xB800|(*data++)); |
209 | }
|
210 | rf12_ready(); |
211 | rf12_trans(0x8208); // TX off |
212 | }
|
213 | |
214 | |
215 | void rf12_rxdata(unsigned char *data, unsigned char number) |
216 | { unsigned char i; |
217 | rf12_trans(0x82C8); // RX on |
218 | rf12_trans(0xCA81); // set FIFO mode |
219 | rf12_trans(0xCA83); // enable FIFO |
220 | for (i=0; i<number; i++) |
221 | { rf12_ready(); |
222 | *data++=rf12_trans(0xB000); |
223 | }
|
224 | rf12_trans(0x8208); // RX off |
225 | }
|
226 | |
227 | |
228 | void send(void) |
229 | { unsigned char test[]="TEST"; |
230 | rf12_txdata(test,4); |
231 | }
|
Wie bereits gesagt ist das der Code aus Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module" Zum empfangen wird genau der gleiche verwendet allerdings dann die empfangsroutine
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 | { rf12_ready(); |
8 | *data++=rf12_trans(0xB000); |
9 | }
|
10 | rf12_trans(0x8208); // RX off |
11 | }
|
12 | |
13 | |
14 | unsigned int receive(void) |
15 | { unsigned char test[4]; |
16 | rf12_rxdata(test,4); |
17 | // daten verarbeiten
|
18 | sprintf(buf, "DATA RECEIVED: %i%i%i%i\n",test[0],test[1],test[2],test[3]); |
19 | SendDataBuffer(buf, strlen(buf)); |
20 | }
|
Bitte um Hilfe, Vielen Dank!
1 | __delay_us(100); //CHANGED |
Wofür sind die delays in der trans funktion? Ich hab an der Stelle keine delays, und 100µs kommen mir schon ziemlich lang vor. Könnte sein, dass das OK is beim Setzen von Registern, aber zu lang ist beim Senden/Empfangen.
Hab nochmal nachgerechnet. Wenn ich richtig gerechnet hab, kannst du durch die 100µs delays mit maximal 2500 baud an den rfm12 schicken, du hast aber 19200 baud eingestellt. Evtl. kommt der dann aus dem sync, und deshalb empfängst du die meiste zeit garnichts, bzw kaputte Pakete ("Müll").
mhh das mit der baud rate habe ich sowieso nicht ganz verstanden... ich benutze doch SPI um die daten zu übertragen und da gebe ich doch sowieso einen Clock mit, warum brauche ich dann überhaupt die baudrate?!?! Habe gedacht die baudrate ist nur relevant wenn ich die daten am FSK/DATA/nFFS seriell reinschiebe... @Holger W. Kannst du mir vllt mal deinen Code geben? Dann könnt ich auch mal schauen was evt falsch sein könnte...
Als erstes setz mal die Baudrate runter. Nimm dazu mal den festen Wert und lass nicht berechnen, das gab bei mir einen Fehler, hab es kurzerhand nur mit einer switch anweiung gemacht. Also auf 4800 mit rf12_trans(0xC647); Das ist die Baudrate mit der die beiden RF untereinander kommunizieren. Die Delay in der rf12_trans können raus, ich hab nur 1 NOP bei 48Mhz Takt zwischen SCK set und clear. In der tx_data solltest du noch 2 Dummybytes senden bevor du den tx auschaltest. Wenn das nicht hilft dann melde dich nochmal. Holger
Andi schrieb: > die beiden module sind direkt nebeneinander auf einer euro platine. Eine > Antenne ist in Form eines drahtes bei sender und empfänger dran > gelötet... Ahh, Du stopfst den Empfänger einfach nur zu! Du darfst doch keine Antennenanschlüsse miteinander verbinden!
LANG LEBE Holger W.!!!! Funktioniert! Einfach super VIEEEELEN DANK!!!! Gruß Andi
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.