RFM12 fehlersuche

Gast #2346353
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
Gast #2346884
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
#2346995
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
Gast #2348484
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!)
Gast #2348543
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.
Gast #2348559
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
Gast #2348601
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 !
Gast #2348759
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!
Angehängte Dateien:
Gast #2348858
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.
Gast #2348897
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").
Gast #2349133
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...
#2349260
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren