Forum: Mikrocontroller und Digitale Elektronik RFM12 fehlersuche


von Andi (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

???

von dunno.. (Gast)


Lesenswert?

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

von Sebastian B. (sebastian_b86)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

er empfängt nur zufällig ab und zu datenmüll... (wahrscheinlich durch 
rauschen) status kann ich auslesen...

von Andi (Gast)


Lesenswert?

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 :)

von Andi (Gast)


Lesenswert?

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!!!

von Alex W. (a20q90)


Lesenswert?

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!

von Andi (Gast)


Lesenswert?

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!)

von Alex W. (a20q90)


Lesenswert?

Habt Ihr ne Möglichkeit mittels Scanner zu checken, ob das Band 
(433.025-434.7875MHz überhaupt frei ist?

von Andi (Gast)


Lesenswert?

leider nein... das ist ja das problem... ich weis net ob das problem 
beim sender, beim empfänger oder bei beiden liegt :(

von ziegenpeter (Gast)


Lesenswert?

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.

von FlorenzW (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

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...

von Klatsch (Gast)


Lesenswert?

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 !

von Andi (Gast)


Lesenswert?

wer hat was gemacht ^^ kannst dur mir nen link geben? Hab zwar schon so 
ziemlich alles bezüglich rfm12 durchgestöber aber mal schauen...

von Holger W. (holgerw)


Lesenswert?

Ich hab die Dinger recht gut am laufen mit PIC, zeig doch mal deinen 
Code und Stromlaufplan.

Holger

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

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!

von ziegenpeter (Gast)


Lesenswert?

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.

von ziegenpeter (Gast)


Lesenswert?

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").

von Andi (Gast)


Lesenswert?

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...

von Holger W. (holgerw)


Lesenswert?

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

von Alex W. (a20q90)


Lesenswert?

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!

von Andi (Gast)


Lesenswert?

nein ich habe.die.antennen nicht verbunden :-)

von Andi (Gast)


Lesenswert?

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