Forum: Mikrocontroller und Digitale Elektronik Problem mit RFM12 868Mhz


von Nico H. (nico84)


Lesenswert?

Hallo,

Ich habe ein Problem mit dem RFM12 und dem Beispielprogramm:
1
/********************************************************************
2
Beispiel für RFM12-Funkmodul (Senden)
3
IAR Embedded Workbench IDE, C
4
Prozessor: ATMEGA8
5
Frequenz: 434MHz
6
Datenrate: 4.8kbps
7
8
Diese Programm stellt eine kurze Testroutine für den ATMEGA8 in
9
Verbindung mit einem externen 8MHz Quarz, einem RFM12-Funkmodul, und
10
dem Pollin Electronic Funk-AVR-Evaluations-Board dar.
11
Es handelt sich ausdrücklich um eine Testroutine und ein Anwendungs-
12
beispiel. Elementare Elemente wie Fehlerbehandlungen usw. sind nicht
13
vorhanden.
14
15
Ablauf:
16
Sendet Preamble, Frame-Recognition, 16 Datenbyte und ChkSumme der
17
16 Datenbyte. Anschließend erfolgt eine Signalisierung mit LED1.
18
Dies geschieht in einer Endlosschleife.
19
20
Pinbelegung
21
-----------------------
22
ATMEGA8           RFM12
23
-----------------------
24
SCK               SCK
25
MISO              SDO
26
MOSI              SDI
27
SS                nSEL
28
INT0              nIRQ
29
PD6               LED1
30
PD5               LED2
31
PD4               Module-Power
32
33
PD7               FSK
34
PD3               DCLK,FFIT
35
PB0               NINT, VDI
36
**********************************************************************/
37
#define F_CPU 16000000UL
38
39
#include <avr/io.h>
40
#define DDR_IN 0
41
#define DDR_OUT 1
42
#define PORT_SEL PORTB
43
#define PIN_SEL PINB
44
#define DDR_SEL DDRB
45
#define PORT_SDI PORTB
46
#define PIN_SDI PINB
47
#define DDR_SDI DDRB
48
#define PORT_SCK PORTB
49
#define PIN_SCK PINB
50
#define DDR_SCK DDRB
51
#define PORT_SDO PORTB
52
#define PIN_SDO PINB
53
#define DDR_SDO DDRB
54
#define PORT_DATA PORTD
55
#define PIN_DATA PIND
56
#define DDR_DATA DDRD
57
#define PB7 7
58
#define PB6 6// |
59
#define RFXX_SCK 5// |
60
#define RFXX_SDO 4// |RF_PORT
61
#define RFXX_SDI 3// |
62
#define RFXX_SEL 2// |
63
#define NC 1// |
64
#define PB0 0//--/
65
#define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
66
#define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
67
#define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)
68
#define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
69
#define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
70
#define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)
71
#define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)
72
#define SDO_HI() PIN_SDO&(1<<RFXX_SDO)
73
#define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK)
74
#define HI_SCK() PORT_SCK|= (1<<RFXX_SCK)
75
#define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK)
76
#define RF12_DATA 7//PD7
77
#define DATA_OUT DDR_DATA|=1<<RF12_DATA
78
#define HI_DATA PORT_DATA|=1<<RF12_DATA
79
#define LED1_OUTPUT() DDRD|=((1<<6)|(1<<4)) //+Module-Power
80
#define LED1_OFF() PORTD&=~(1<<6)
81
#define LED1_ON() PORTD|=(1<<6)
82
#define MODULE_OFF() PORTD&=~(1<<4)
83
#define MODULE_ON() PORTD|=(1<<4)
84
85
void RFXX_PORT_INIT(void){
86
  HI_SEL();
87
  HI_SDI();
88
  LOW_SCK();
89
  SEL_OUTPUT();
90
  SDI_OUTPUT();
91
  SDO_INPUT();
92
  SCK_OUTPUT();
93
}
94
95
unsigned int RFXX_WRT_CMD(unsigned int aCmd){
96
  unsigned char i;
97
  unsigned int temp;
98
  LOW_SCK();
99
  LOW_SEL();
100
  for(i=0;i<16;i++){
101
    temp<<=1;
102
    if(SDO_HI()){
103
      temp|=0x0001;
104
    }
105
    LOW_SCK();
106
    if(aCmd&0x8000){
107
      HI_SDI();
108
      }else{
109
      LOW_SDI();
110
    }
111
    HI_SCK();
112
    aCmd<<=1;
113
  };
114
  LOW_SCK();
115
  HI_SEL();
116
  return(temp);
117
}
118
119
void RF12_INIT(void){
120
121
  
122
  RFXX_WRT_CMD(0x80D7);//EL,EF,12.0pF
123
  RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
124
  RFXX_WRT_CMD(0xA67C);
125
  RFXX_WRT_CMD(0xC647);//4.8kbps
126
  RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
127
  RFXX_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
128
  RFXX_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
129
  RFXX_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
130
  RFXX_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
131
  RFXX_WRT_CMD(0xE000);//NOT USE
132
  RFXX_WRT_CMD(0xC800);//NOT USE
133
  RFXX_WRT_CMD(0xC400);//1.66MHz,2.2V
134
  
135
  
136
}
137
138
void RF12_SEND(unsigned char aByte){
139
  while(PIND&(1<<2));//wait for previously TX over
140
    RFXX_WRT_CMD(0xB800+aByte);
141
  }
142
143
void Delay_ms(unsigned char amS){
144
  unsigned char i;
145
  unsigned int j;
146
  for(i=0;i<amS;i++)for(j=0;j<914;j++);
147
}
148
149
void main(void)
150
{
151
  unsigned int i,j;
152
  unsigned char ChkSum;
153
  asm("cli");
154
  DDRB=0x00;//PB INPUT;
155
  DDRD=0x00;//PD INPUT;
156
  //POWER ON indication: LED blink 3 times
157
  LED1_OUTPUT();
158
  LED1_OFF();
159
  MODULE_OFF(); //for reset
160
  for(i=0;i<3;i++){
161
    Delay_ms(200);
162
    LED1_ON();
163
    Delay_ms(200);
164
    LED1_OFF();
165
  }
166
  LED1_OFF();
167
  MODULE_ON();
168
  Delay_ms(200);
169
170
  RFXX_PORT_INIT();
171
  RF12_INIT();
172
  DDRD|=(1<<RF12_DATA);
173
  PORTD|=(1<<RF12_DATA);// SET nFFS pin HI when using TX register
174
  DDRD&=~(1<<2); //PD2(INT0)
175
  while(1){
176
    LED1_ON();
177
    RFXX_WRT_CMD(0x0000);//read status register
178
    RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
179
    ChkSum=0;
180
    RF12_SEND(0xAA);//PREAMBLE
181
    RF12_SEND(0xAA);//PREAMBLE
182
    RF12_SEND(0xAA);//PREAMBLE
183
    RF12_SEND(0x2D);//SYNC HI BYTE
184
    RF12_SEND(0xD4);//SYNC LOW BYTE
185
    RF12_SEND(0x30);//DATA BYTE 0
186
    ChkSum+=0x30;
187
    RF12_SEND(0x31);//DATA BYTE 1
188
    ChkSum+=0x31;
189
    RF12_SEND(0x32);
190
    ChkSum+=0x32;
191
    RF12_SEND(0x33);
192
    ChkSum+=0x33;
193
    RF12_SEND(0x34);
194
    ChkSum+=0x34;
195
    RF12_SEND(0x35);
196
    ChkSum+=0x35;
197
    RF12_SEND(0x36);
198
    ChkSum+=0x36;
199
    RF12_SEND(0x37);
200
    ChkSum+=0x37;
201
    RF12_SEND(0x38);
202
    ChkSum+=0x38;
203
    RF12_SEND(0x39);
204
    ChkSum+=0x39;
205
    RF12_SEND(0x3A);
206
    ChkSum+=0x3A;
207
    RF12_SEND(0x3B);
208
    ChkSum+=0x3B;
209
    RF12_SEND(0x3C);
210
    ChkSum+=0x3C;
211
    RF12_SEND(0x3D);
212
    ChkSum+=0x3D;
213
    RF12_SEND(0x3E);
214
    ChkSum+=0x3E;
215
    RF12_SEND(0x3F); //DATA BYTE 15
216
    ChkSum+=0x3F;
217
    RF12_SEND(ChkSum); //send chk sum
218
    RF12_SEND(0xAA);//DUMMY BYTE
219
    RF12_SEND(0xAA);//DUMMY BYTE
220
    RF12_SEND(0xAA);//DUMMY BYTE
221
    RFXX_WRT_CMD(0x8201);
222
    LED1_OFF();
223
    for(i=0;i<10000;i++)for(j=0;j<123;j++);//sleep
224
  };
225
}

Eigentlich sollte die LED 3 mal blinken, dann zum senden angehen, danach 
wieder ausgehen und nach kurzer Zeit wieder angehen zum senden.

Bei mir blinkt sie 3 mal und bleibt dann dauerhaft an.
Der Code ist ein Beispiel Code von Pollin, ich habe nur 
RFXX_WRT_CMD(0xA67C);  auf 868Mhz angepasst und #define F_CPU 16000000UL 
eingefügt, da mein Atmega8 auf 16Mhz läuft.


Was könnte ich übersehen haben?

von Nico H. (nico84)


Lesenswert?

ich habe den Code noch etwas abgeändert und ein 8Mhz Quarz verwendet.

nach dem ersten "RF12_SEND(0xAA)" geht es nicht weiter. aber warum?
1
/********************************************************************
2
Beispiel für RFM12-Funkmodul (Senden)
3
IAR Embedded Workbench IDE, C
4
Prozessor: ATMEGA8
5
Frequenz: 434MHz
6
Datenrate: 4.8kbps
7
8
Diese Programm stellt eine kurze Testroutine für den ATMEGA8 in
9
Verbindung mit einem externen 8MHz Quarz, einem RFM12-Funkmodul, und
10
dem Pollin Electronic Funk-AVR-Evaluations-Board dar.
11
Es handelt sich ausdrücklich um eine Testroutine und ein Anwendungs-
12
beispiel. Elementare Elemente wie Fehlerbehandlungen usw. sind nicht
13
vorhanden.
14
15
Ablauf:
16
Sendet Preamble, Frame-Recognition, 16 Datenbyte und ChkSumme der
17
16 Datenbyte. Anschließend erfolgt eine Signalisierung mit LED1.
18
Dies geschieht in einer Endlosschleife.
19
20
Pinbelegung
21
-----------------------
22
ATMEGA8           RFM12
23
-----------------------
24
SCK               SCK
25
MISO              SDO
26
MOSI              SDI
27
SS                nSEL
28
INT0              nIRQ
29
PD6               LED1
30
PD5               LED2
31
PD4               Module-Power
32
33
PD7               FSK
34
PD3               DCLK,FFIT
35
PB0               NINT, VDI
36
**********************************************************************/
37
38
#include <avr/io.h>
39
40
#define DDR_IN 0
41
#define DDR_OUT 1
42
#define PORT_SEL PORTB
43
#define PIN_SEL PINB
44
#define DDR_SEL DDRB
45
#define PORT_SDI PORTB
46
#define PIN_SDI PINB
47
#define DDR_SDI DDRB
48
#define PORT_SCK PORTB
49
#define PIN_SCK PINB
50
#define DDR_SCK DDRB
51
#define PORT_SDO PORTB
52
#define PIN_SDO PINB
53
#define DDR_SDO DDRB
54
#define PORT_DATA PORTD
55
#define PIN_DATA PIND
56
#define DDR_DATA DDRD
57
#define PB7 7
58
#define PB6 6// |
59
#define RFXX_SCK 5// |
60
#define RFXX_SDO 4// |RF_PORT
61
#define RFXX_SDI 3// |
62
#define RFXX_SEL 2// |
63
#define NC 1// |
64
#define PB0 0//--/
65
#define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
66
#define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
67
#define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)
68
#define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
69
#define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
70
#define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)
71
#define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)
72
#define SDO_HI() PIN_SDO&(1<<RFXX_SDO)
73
#define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK)
74
#define HI_SCK() PORT_SCK|= (1<<RFXX_SCK)
75
#define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK)
76
#define RF12_DATA 7//PD7
77
#define DATA_OUT DDR_DATA|=1<<RF12_DATA
78
#define HI_DATA PORT_DATA|=1<<RF12_DATA
79
#define LED1_OUTPUT() DDRD|=((1<<6)|(1<<4)) //+Module-Power
80
#define LED1_OFF() PORTD&=~(1<<6)
81
#define LED1_ON() PORTD|=(1<<6)
82
#define MODULE_OFF() PORTD&=~(1<<4)
83
#define MODULE_ON() PORTD|=(1<<4)
84
85
void RFXX_PORT_INIT(void){
86
  HI_SEL();
87
  HI_SDI();
88
  LOW_SCK();
89
  SEL_OUTPUT();
90
  SDI_OUTPUT();
91
  SDO_INPUT();
92
  SCK_OUTPUT();
93
}
94
95
unsigned int RFXX_WRT_CMD(unsigned int aCmd){
96
  unsigned char i;
97
  unsigned int temp;
98
  LOW_SCK();
99
  LOW_SEL();
100
  for(i=0;i<16;i++){
101
    temp<<=1;
102
    if(SDO_HI()){
103
      temp|=0x0001;
104
    }
105
    LOW_SCK();
106
    if(aCmd&0x8000){
107
      HI_SDI();
108
      }else{
109
      LOW_SDI();
110
    }
111
    HI_SCK();
112
    aCmd<<=1;
113
  };
114
  LOW_SCK();
115
  HI_SEL();
116
  return(temp);
117
}
118
119
void RF12_INIT(void){
120
  
121
     RFXX_WRT_CMD(0x80E7); //EL,EF,868band,12.0pF
122
     RFXX_WRT_CMD(0x82d9); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
123
     RFXX_WRT_CMD(0xA67c); //frequency select
124
     RFXX_WRT_CMD(0xC647);
125
     RFXX_WRT_CMD(0x94A0);
126
     RFXX_WRT_CMD(0xC2AC);
127
     RFXX_WRT_CMD(0xCA80);
128
     RFXX_WRT_CMD(0xCA83);
129
     RFXX_WRT_CMD(0xC483);
130
     RFXX_WRT_CMD(0x9850);
131
     RFXX_WRT_CMD(0xE000); //NOT USED
132
     RFXX_WRT_CMD(0xC800); //NOT USED
133
     RFXX_WRT_CMD(0xC000); //1.66MHz,2.2V
134
     RFXX_WRT_CMD(0x0000); //NOT USED
135
}
136
137
void RF12_SEND(unsigned char aByte){
138
  while(PIND&(1<<2));//wait for previously TX over
139
    RFXX_WRT_CMD(0xB800+aByte);
140
  }
141
142
void Delay_ms(unsigned char amS){
143
  unsigned char i;
144
  unsigned int j;
145
  for(i=0;i<amS;i++)for(j=0;j<914;j++);
146
}
147
148
int main(void)
149
{
150
  unsigned int i,j;
151
  unsigned char ChkSum;
152
  asm("cli");
153
  DDRB=0x00;//PB INPUT;
154
  DDRD=0x00;//PD INPUT;
155
  //POWER ON indication: LED blink 3 times
156
  LED1_OUTPUT();
157
  LED1_OFF();
158
  MODULE_OFF(); //for reset
159
  
160
  LED1_OFF();
161
  MODULE_ON();
162
  Delay_ms(200);
163
164
  RFXX_PORT_INIT();
165
  RF12_INIT();
166
  DDRD|=(1<<RF12_DATA);
167
  PORTD|=(1<<RF12_DATA);// SET nFFS pin HI when using TX register
168
  DDRD&=~(1<<2); //PD2(INT0)
169
170
  while(1){
171
    
172
    RFXX_WRT_CMD(0x0000);//read status register
173
    RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
174
  
175
    ChkSum=0;
176
  
177
    RF12_SEND(0xAA);//PREAMBLE
178
  LED1_ON();
179
    RF12_SEND(0xAA);//PREAMBLE
180
    RF12_SEND(0xAA);//PREAMBLE
181
    RF12_SEND(0x2D);//SYNC HI BYTE
182
    RF12_SEND(0xD4);//SYNC LOW BYTE
183
    RF12_SEND(0x30);//DATA BYTE 0
184
185
    ChkSum+=0x30;
186
    RF12_SEND(0x31);//DATA BYTE 1
187
    ChkSum+=0x31;
188
    RF12_SEND(0x32);
189
    ChkSum+=0x32;
190
    RF12_SEND(0x33);
191
    ChkSum+=0x33;
192
    RF12_SEND(0x34);
193
    ChkSum+=0x34;
194
    RF12_SEND(0x35);
195
    ChkSum+=0x35;
196
    RF12_SEND(0x36);
197
    ChkSum+=0x36;
198
    RF12_SEND(0x37);
199
    ChkSum+=0x37;
200
    RF12_SEND(0x38);
201
    ChkSum+=0x38;
202
    RF12_SEND(0x39);
203
    ChkSum+=0x39;
204
    RF12_SEND(0x3A);
205
    ChkSum+=0x3A;
206
    RF12_SEND(0x3B);
207
    ChkSum+=0x3B;
208
    RF12_SEND(0x3C);
209
    ChkSum+=0x3C;
210
    RF12_SEND(0x3D);
211
    ChkSum+=0x3D;
212
    RF12_SEND(0x3E);
213
    ChkSum+=0x3E;
214
    RF12_SEND(0x3F); //DATA BYTE 15
215
    ChkSum+=0x3F;
216
    RF12_SEND(ChkSum); //send chk sum
217
    RF12_SEND(0xAA);//DUMMY BYTE
218
    RF12_SEND(0xAA);//DUMMY BYTE
219
    RF12_SEND(0xAA);//DUMMY BYTE
220
    RFXX_WRT_CMD(0x8201);
221
    LED1_OFF();
222
    for(i=0;i<10000;i++)for(j=0;j<123;j++);//sleep
223
  };
224
}

von Rolf P. (rolfp)


Lesenswert?

Nicolai H. schrieb:
> Ich habe ein Problem mit dem RFM12 und dem Beispielprogramm:

Dieses Programm enthaelt einige Fehler:

> RFXX_WRT_CMD(0x82d9); //!er,!ebb,ET,ES,EX,!eb,!ew,DC

Hier ist der Kommentar falsch. (Ok, das hat jetzt keinen Einfluss auf 
das Funktionieren des Programms.)

> for(i=0;i<10000;i++)for(j=0;j<123;j++);//sleep

Diese Warteschlaufe kann vom Compiler wegoptimiert werden. (Der gleiche 
Fehler wurde auch in Delay_ms() gemacht. Aber da hat bei Dir der 
Compiler offenbar nicht wegoptimiert, sonst wuerde die LED nicht 
blinken.)

Nicolai H. schrieb:
> ich habe den Code noch etwas abgeändert und ein 8Mhz Quarz verwendet.

Die Quarzfrequenz sollte keine Rolle spielen. Bei mir hat es jedenfalls 
sowohl mit dem 12MHz als auch mit dem internen 1MHz Takt funktioniert.

> nach dem ersten "RF12_SEND(0xAA)" geht es nicht weiter. aber warum?

Ist es wirklich beim ersten Mal? Vielleicht kommt der naechste Durchlauf 
(dank wegoptimierter Warteschlaufe) zu schnell?

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.