Forum: Mikrocontroller und Digitale Elektronik RFM 12 hängt sich auf


von Gaasi (Gast)


Lesenswert?

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!

von Ziegenpeter (Gast)


Lesenswert?

Evtl. Fehler beim Initialisieren: das Programm zum Empfangen 
initialisiert richtig, das Programm zum Senden nicht (vielleicht fehlt 
das Initialisieren eines Registers oder falsche Werte?).

von Gaasi (Gast)


Lesenswert?

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

von Gaasi (Gast)


Lesenswert?

Hat keiner mehr eine Idee?

von R. W. (quakeman)


Lesenswert?

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

von Gaasi (Gast)


Lesenswert?

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
}

von Andreas W. (royalwithcheese)


Lesenswert?

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
}

von Michael U. (amiga)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

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