Forum: HF, Funk und Felder RF12 auf 868Mhz (initialisierung)


von Niko S. (huibui2010)


Lesenswert?

Hallo,
ich bekomme einfach mein RF12 auf 868 Mhz nicht zum laufen, versuchte 
schon mit der Initialisierung rum zu spielen aber leider ohne Erfolg. 
Vielleicht koennte einer von euch mir helfen der sich mit der Sache 
schon etwas laenger befasst, denn ich habe erst vor 2 Wochen damit 
angefangen mich fuer die Programmierung von AVR's zu beschaeftigen.
Wuerde mich sehr ueber antworten freuen.

Viele Gruesse,

Niko
1
#define BAUD_UART 4800UL
2
#ifndef F_CPU
3
#define F_CPU 1000000UL
4
#endif
5
6
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <avr/pgmspace.h>
9
#include <avr/eeprom.h>
10
#include <stdlib.h>  
11
#include <util/delay.h>
12
#include <stdint.h>
13
14
#define RF_PORT    PORTB
15
#define RF_DDR    DDRB
16
#define RF_PIN    PINB
17
18
/*
19
rf12     ATmega32
20
21
SDI    <--------  MOSI      (PB5)
22
SDO    -------->  MIS0      (PB6)
23
SCK   <--------  SCK        (PB7)
24
nSEL  <--------  SS <=> CS (PB4)
25
nIERQ -------->  INT0      (PD2)  
26
VDI   --------- INT1    (PD3)
27
*/
28
29
#define SDI    PB5
30
#define SDO    PB6
31
#define SCK    PB7
32
#define CS    PB4
33
34
35
void USART_Transmit_String( unsigned char *data, uint8_t length );
36
void USART_Transmit( unsigned char data );
37
//***************************************************************************************************
38
#ifndef cbi                 //cbi(RF_PORT, CS) --> PORTB &= ~(1<<CS)
39
#define cbi(sfr, bit)     (_SFR_BYTE(sfr) &= ~_BV(bit)) 
40
#endif
41
42
#ifndef sbi
43
#define sbi(sfr, bit)     (_SFR_BYTE(sfr) |= _BV(bit))  
44
#endif
45
//***************************************************************************************************
46
uint16_t rf12_trans(uint16_t wert);        
47
// transfer 1 word to/from module
48
void rf12_init(void);      
49
// initialize module
50
void rf12_setfreq(unsigned short freq);  
51
// set center frequency
52
void rf12_setbaud(unsigned short baud);    
53
// set baudrate
54
void rf12_setpower(unsigned char power, unsigned char mod);    
55
// set transmission settings
56
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi);  
57
// set receiver settings
58
void rf12_txdata(unsigned char *data, unsigned char number);    
59
// transmit number of bytes from array
60
void rf12_rxdata(unsigned char *data, unsigned char number);    
61
// receive number of bytes into array
62
void rf12_ready(void);                      
63
// wait until FIFO ready (to transmit/read data)
64
65
//*geaendert fuer 868Mhz
66
#define RF12FREQ(freq)  ((freq-860.0)/0.005)              
67
// macro for calculating frequency value out of frequency in MHz
68
//***************************************************************************************************
69
void USART_Init( void )
70
{
71
  uint16_t baud_t = (uint16_t)((uint32_t) F_CPU/(16*BAUD_UART)-1);
72
  /* Set baud rate */
73
  UBRRH = (unsigned char)(baud_t>>8);
74
  UBRRL = (unsigned char)(baud_t);
75
  /* Enable receiver and transmitter */
76
  UCSRB = (1<<RXEN)|(1<<TXEN);
77
  /* Set frame format: 8data, 2stop bit */
78
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
79
}
80
81
void USART_Transmit( unsigned char data )
82
{
83
  /* Wait for empty transmit buffer */
84
  while ( !( UCSRA & (1<<UDRE)) )
85
    ;
86
  /* Put data into buffer, sends the data */
87
  UDR = data;
88
}
89
90
void USART_Transmit_String( unsigned char *data, uint8_t length )
91
{
92
  for( uint8_t i = 0; i < length; i++ )
93
    USART_Transmit( data[i] );
94
}
95
//***************************************************************************************************
96
uint16_t rf12_trans(uint16_t wert)
97
{  unsigned short werti=0;
98
  unsigned char i;
99
100
  cbi(RF_PORT, CS);
101
  for (i=0; i<16; i++)
102
  {
103
    if (wert&32768) //0b1000 0000 0000 0000
104
      sbi(RF_PORT, SDI);
105
    else
106
      cbi(RF_PORT, SDI);
107
  
108
    werti<<=1;
109
    if (RF_PIN&(1<<SDO))
110
      werti|=1;
111
112
    sbi(RF_PORT, SCK);
113
    wert<<=1;
114
    _delay_us(0.3);
115
    cbi(RF_PORT, SCK);
116
  }
117
  sbi(RF_PORT, CS);
118
  return werti;
119
}
120
121
void rf12_init(void)
122
{  
123
  RF_DDR = (1<<SDI)|(1<<SCK)|(1<<CS);
124
  RF_PORT=(1<<CS);
125
// wait until POR done
126
  for (unsigned char i=0; i<10; i++)
127
    _delay_ms(10);  
128
129
  rf12_trans(0x80E8);    //1.  Configuration Command    --> el und ef = 1; 868MHz band; 12,5pF 
130
  //rf12_trans(0x    );  //2.  Power Conmmand
131
  rf12_trans(0xA67C);     //3.  Frequenzy setting Command  --> 868,3MHz  
132
  rf12_trans(0xC646);    //4.  Data Rate Command ---> cs=0; Bit Rate RAW Physical: 4800          
133
  rf12_trans(0x9528);    //5.  Receiver Command ---> VDI output; Medium; 400KHz BW; -6dB -103dbRSSI
134
  //rf12_trans(0xc2AC);    //6.  Datafilter Command ---> al = 1; ml = 0; DQD = 3; digital = 0; analog = 1
135
  //rf12_trans(0xCA81);    //7.  FIFO / Reset Mode Command  --> al: sync pattern = 0; FIFO fill = 0; Disable high sens; reset =1
136
              //8.  Receiver FIFO Mode
137
  rf12_trans(0x6253);    //9.  AFC Command        --> ;AFC automatic mode = Offset always;  st : Strobe edge = 0;fi : Fine mode = 1
138
                           //    --> ;oe : Offset rgister enable = 1
139
                          //    --> ;en : Calculate offset = 1
140
                          //    --> ;Range limit = +7fres to -8fres
141
              //10. TX Config
142
              //11. Transmitter Register Write
143
  rf12_trans(0xE000);    //12. Wake-Up Timer Command    --> 0ms
144
  rf12_trans(0xC800);    //13. Low Duty-Cycle Command  --> en : Enable low duty-cycle = 0;Duty-cycle = .66666%
145
  rf12_trans(0xc0E0);    //14. LB Det./Clock Div. Command--> 10MHz; VIb=2,2V
146
}
147
/*
148
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
149
{
150
  rf12_trans(0x9500|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
151
}
152
153
void rf12_setfreq(unsigned short freq)
154
{  if (freq<96)        // 430,2400MHz  //868MHz
155
    return;
156
  else if (freq>3903)      // 439,7575MHz
157
    freq=3903;
158
  rf12_trans(0xA000|freq);
159
}
160
161
void rf12_setbaud(unsigned short baud)
162
{
163
  if (baud<664)
164
    baud=664;
165
  if (baud<5400)            // Baudrate= 344827,58621/(R+1)/(1+CS*7)
166
    rf12_trans(0xC680|((43104/baud)-1));
167
  else
168
    rf12_trans(0xC600|((344828UL/baud)-1));  // R=344828/Baud-1
169
}
170
171
void rf12_setpower(unsigned char power, unsigned char mod)
172
{  
173
  rf12_trans(0x9800|(power&7)|((mod&15)<<4));
174
}
175
*/
176
void rf12_ready(void)
177
{  cbi(RF_PORT, CS);
178
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
179
}
180
181
void rf12_txdata(unsigned char *data, unsigned char number)
182
{  unsigned char i;
183
  PORTD  = (1<<PIND5);    //TX_LED_2 on
184
  rf12_trans(0x8239);      // TX on  Power Command
185
  rf12_ready();
186
  rf12_trans(0xB8AA);
187
  rf12_ready();
188
  rf12_trans(0xB8AA);
189
  rf12_ready();
190
  rf12_trans(0xB8AA);
191
  rf12_ready();
192
  rf12_trans(0xB82D);
193
  rf12_ready();
194
  rf12_trans(0xB8D4);
195
  for (i=0; i<number; i++)
196
  {  rf12_ready();
197
    rf12_trans(0xB800|(*data++));
198
  }
199
  rf12_ready();
200
  PORTD  = (!(1<<PIND5));
201
  rf12_trans(0x8208);      // TX off
202
  _delay_ms(1);
203
}
204
205
void rf12_rxdata(unsigned char *data, unsigned char number)
206
{  unsigned char i;
207
  PORTD  = (1<<PIND6);  //RX_LED_1 on
208
  rf12_ready();
209
  rf12_trans(0x82C8);      // RX on  Power Command
210
  rf12_ready();
211
  rf12_trans(0xCA81);      // set FIFO mode
212
  rf12_ready();
213
  rf12_trans(0xCA83);      // enable FIFO 
214
  
215
  for (i=0; i<number; i++)
216
  {  rf12_ready();
217
    *data++=rf12_trans(0xB000);
218
  }
219
  
220
  rf12_ready();
221
    PORTD  = (!(1<<PIND6));//RX_LED off
222
  rf12_trans(0x8208);    // RX off
223
  _delay_ms(1);      
224
}
225
226
//**********************************************************************
227
void send(void);
228
void receive(void);
229
230
void receive(void){
231
  unsigned char test[32];  
232
  rf12_rxdata(test,32);  
233
  // daten verarbeiten
234
  USART_Transmit_String( test, 32 );   
235
}
236
237
void send(void){
238
  unsigned char test[]= "Dies ist ein 868MHz Test !!!\n";  
239
  rf12_txdata(test,32);
240
  USART_Transmit_String( test, 32 );
241
}
242
243
int main(void){
244
  
245
  USART_Init();
246
  DDRD = 0xff;
247
248
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
249
  //rf12_setfreq(RF12FREQ(868.3));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
250
  //rf12_setbandwidth(5, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
251
  //rf12_setbaud(19200);      // 19200 baud
252
  //rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift
253
254
  for (;;)
255
  {
256
    //send();
257
    //USART_Transmit_String("Test \n", 6);
258
    for (unsigned char i=0; i<100; i++)
259
      {_delay_ms(10);
260
      PORTD  = (1<<PIND6);
261
      }
262
    receive();
263
  }
264
}

: Verschoben durch Moderator
von rfidler (Gast)


Lesenswert?

Hi,

Fuses richtig eingestellt? Welcher Atmel ist das?


mfg

von Niko S. (huibui2010)


Lesenswert?

Oh super vielen dank fuer eine erste Antwort! Es handelt sich hierbei um 
den ATmega32-16PU, Fuses sind wie folgt eingestellt, da ich ueber isp 
programmiere natuerlich da ein haeckchen. Ansonsten 1 Mhz bei 64ms habe 
den internen clock genommen (default).

Wuerde mich sehr ueber weitere Antworten freuen.

mfg

von Niko S. (huibui2010)


Lesenswert?

Hallo,
bin durch probieren darauf gekommen das meine tx funktion nur bis zur 
abfrage ready kommt. dann bleibt es davor stehen vielleicht hilft das 
weiter. bitte um ganz viele Antworten danke schon einmal im voraus.

MFG

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.