Forum: Mikrocontroller und Digitale Elektronik RFM12B Transceiver an ATmega8


von Peter M. (pedda)


Lesenswert?

Guten Tag,
ich versuche hier verzweifelt seit tagen einen string bzw. ein byte mit 
einem rfm12b zu senden bzw. empfangen.

Verkablung:

1 SDO -> MISO
2 NIRQ -> frei
3 FSK/DATA/NFFS -> VCC 3,3V
4 DCLK/CFIL/FFIT -> frei
5 CLK -> frei
6 NRES -> frei
7 GND -> GND
8 ANT -> Antenne 7,5cm
9 VCC -> VCC 3,3V
10 GND -> GND
11 NINT/VDI -> frei
12 SDI -> MOSI
13 SCK -> SCK
14 NSEL -> SS

Ist die Verdrahtung so korrekt?
Fragen:
-NRES kann freigelassen werden?

So nun zu der Software:
Sender:
1
#include "rfm12b.h"
2
#include <inttypes.h>
3
#ifndef F_CPU
4
#define F_CPU 1000000L
5
#endif
6
#include <util/delay.h>
7
#define SCL_CLOCK  100000L
8
9
10
int main()
11
{
12
  int i;
13
  uint8_t data[]="test";
14
15
  DDRB=0xff;
16
  DDRD=0xff;
17
  DDRC = 0xff;
18
19
  for (i=0;i<4;i++)
20
  {
21
    PORTB = ( 1<<PB1 );
22
    _delay_ms(500);
23
    PORTB = !(1<<PB1);
24
    _delay_ms(500);
25
  }
26
27
  SPCR = (1<<SPE)|(1<<MSTR);
28
  SPSR = (1<<SPI2X);
29
30
  RFM12B_init_hard();
31
  RFM12B_init_soft();
32
33
  while(1)
34
  {
35
    RFM12B_transmit(data,5);
36
    _delay_ms(500);
37
  
38
  }
39
}

Hier gibt es glaub ich keine Probleme (stromaufnahme in 500ms abständen 
auf Netzteilanzeige).

Nun der Empfänger:
1
#include "rfm12b.h"
2
#ifndef F_CPU
3
#define F_CPU 1000000L
4
#endif
5
#include <util/delay.h>
6
#define SCL_CLOCK  100000L
7
8
int main()
9
{
10
  int i;
11
  uint8_t data[5];
12
  DDRB=0xff; 
13
  DDRD=0xff;   
14
        DDRC=0xff;
15
16
  for (i=0;i<4;i++)
17
  {
18
    PORTB = (1<<PB1);
19
    _delay_ms(500);
20
    PORTB = !(1<<PB1);
21
    _delay_ms(500);
22
  }
23
24
25
  SPCR = (1<<SPE)|(1<<MSTR);
26
  SPSR = (1<<SPI2X);
27
    
28
  RFM12B_init_hard();
29
  RFM12B_init_soft();
30
31
  while(1)
32
  {
33
    RFM12B_receive(data,5);
34
    if (data[0]=='t')
35
    PORTD=(1<<PD0);
36
    else
37
    PORTD=!(1<<PD0);
38
    _delay_ms(500);
39
  } 
40
}

Fragen:
- code vom prinzip überhaupt richtig?
- if(data[0]=='t') kann das gehen?

kann mir wer helfen?
bitte keine links auf andere threads im forum, die hab ich schon durch 
;P

achja die rfm12b.h bzw. die zugehörige rf12b.c noch:
1
#include "rfm12b.h"
2
// send and receive a 16bit-word via spi
3
uint16_t RFM12B_spi(uint16_t cmd)
4
{
5
 uint8_t i;
6
 uint16_t recv = 0;
7
 // start communication
8
 RFM12B_SCK_LOW();
9
 RFM12B_SS_LOW();
10
 // read 16 bits
11
 for(i=0; i<16; i++)
12
 {
13
 // send bit
14
 if(cmd & 0x8000)
15
 RFM12B_MOSI_HIGH();
16
 else
17
 RFM12B_MOSI_LOW();
18
 // clock
19
 RFM12B_SCK_HIGH();
20
 recv<<=1;
21
 // receive bit
22
 if(RFM12B_MISO_HIGH())
23
 {
24
 recv|=0x0001;
25
 }
26
 // clock
27
 RFM12B_SCK_LOW();
28
 cmd<<=1;
29
 }
30
 // end communication
31
 RFM12B_SS_HIGH();
32
 return recv;
33
}
34
// initialize hardware (atmel) (CHECKED)
35
void RFM12B_init_hard()
36
{
37
 // set default values
38
 RFM12B_SS_HIGH();
39
 RFM12B_MOSI_HIGH();
40
 RFM12B_SCK_LOW();
41
 // init ports
42
 RFM12B_SCK_INIT();
43
 RFM12B_MOSI_INIT();
44
 RFM12B_MISO_INIT();
45
 RFM12B_SS_INIT();
46
}
47
// initialize software (rfm12b) (CHECKED)
48
void RFM12B_init_soft()
49
{
50
 RFM12B_spi(0x80D7);//EL,EF,433band,12.0pF
51
 RFM12B_spi(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
52
/*  RFM12B_spi(0xA640);//434MHz*/
53
 RFM12B_spi(0xA74E);//869,35 MHz
54
 RFM12B_spi(0xC647);//4.8kbps
55
 RFM12B_spi(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
56
 RFM12B_spi(0xC2AC);//AL,!ml,DIG,DQD4
57
 RFM12B_spi(0xCA81);//FIFO8,SYNC,!ff,DR
58
 RFM12B_spi(0xCED4);//SYNC=2DD4;
59
 RFM12B_spi(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
60
/*  RFM12B_spi(0x9850);//!mp,90kHz,MAX OUT*/
61
 RFM12B_spi(0x9820);//!mp,45kHz,MAX OUT*/
62
 RFM12B_spi(0xCC77);//OB1,OB0, LPX,!ddy,DDIT,BW0
63
 RFM12B_spi(0xE000);//NOT USE
64
 RFM12B_spi(0xC800);//NOT USE
65
 RFM12B_spi(0xC040);//1.66MHz,2.2V
66
}
67
// send a byte (CHECKED)
68
//   uint8_t  data  data to send
69
void RFM12B_put(uint8_t data)
70
{
71
 RFM12B_WAIT_RGIT();
72
 RFM12B_spi(0xB800 + data);
73
}
74
// receive a byte (CHECKED)
75
uint8_t RFM12B_get()
76
{
77
 RFM12B_WAIT_FFIT();
78
 return RFM12B_spi(0xB000) & 0x00FF;
79
}
80
// transmit multiple bytes (CHECKED)
81
//   uint8_t  data[]  data to transmit
82
//   uint8_t  length  length of the data to transmit
83
void RFM12B_transmit(uint8_t data[], uint8_t length)
84
{
85
 uint8_t i;
86
 // enable TX
87
 RFM12B_spi(0x8238);
88
 RFM12B_put(0xAA);
89
 RFM12B_put(0xAA);
90
 RFM12B_put(0xAA);
91
 RFM12B_put(0x2D);
92
 RFM12B_put(0xD4);
93
 for(i = 0; i < length; i++)
94
 {
95
 RFM12B_put(data[i]);
96
 }
97
 RFM12B_WAIT_RGIT();
98
 // disable TX
99
 RFM12B_spi(0x8208);
100
}
101
// receive multiple bytes (CHECKED)
102
//   uint8_t  data[]  buffer for received data
103
//   uint8_t  length  length of data to receive
104
void RFM12B_receive(uint8_t *data, uint8_t length)
105
{
106
 uint8_t i;
107
 // enable RX
108
 RFM12B_spi(0x82C8);
109
 // set FIFO mode
110
 RFM12B_spi(0xCA81);
111
 // enable FIFO
112
 RFM12B_spi(0xCA83);
113
 for(i = 0; i < length; i++)
114
 {
115
 data[i] = RFM12B_get();
116
 }
117
 RFM12B_WAIT_FFIT();
118
 // disable RX
119
 RFM12B_spi(0x8208);
120
}

config.h
1
// _I = INPUT PORT
2
// _O = OUTPUT PORT
3
// _P = PORT INDEX
4
// _D = DATA DIRECTION REGISTER
5
// SPI SCK (clock, output)#define  RFM12B_SCK_I  PINB
6
#define  RFM12B_SCK_O  PORTB
7
#define  RFM12B_SCK_P  5
8
#define  RFM12B_SCK_D  DDRB
9
#define  RFM12B_SCK_INIT()  RFM12B_SCK_D |=  (1<<(RFM12B_SCK_P))
10
#define  RFM12B_SCK_LOW()   RFM12B_SCK_O &= ~(1<<(RFM12B_SCK_P))
11
#define  RFM12B_SCK_HIGH()  RFM12B_SCK_O |=  (1<<(RFM12B_SCK_P))
12
// SPI MISO / SDO (master in slave out, input)
13
#define  RFM12B_MISO_I  PINB
14
#define  RFM12B_MISO_O  PORTB
15
#define  RFM12B_MISO_P  4
16
#define  RFM12B_MISO_D  DDRB
17
#define  RFM12B_MISO_INIT()  RFM12B_MISO_D &= ~(1<<(RFM12B_MISO_P))
18
#define  RFM12B_MISO_LOW()   ~(RFM12B_MISO_HIGH())
19
#define  RFM12B_MISO_HIGH()  RFM12B_MISO_I & (1<<(RFM12B_MISO_P))
20
// SPI MOSI / SDI (master out slave in, output)
21
#define  RFM12B_MOSI_I  PINB
22
#define  RFM12B_MOSI_O  PORTB
23
#define  RFM12B_MOSI_P  3
24
#define  RFM12B_MOSI_D  DDRB
25
#define  RFM12B_MOSI_INIT()  RFM12B_MOSI_D |=  (1<<(RFM12B_MOSI_P))
26
#define  RFM12B_MOSI_LOW()   RFM12B_MOSI_O &= ~(1<<(RFM12B_MOSI_P))
27
#define  RFM12B_MOSI_HIGH()  RFM12B_MOSI_O |=  (1<<(RFM12B_MOSI_P))
28
// SPI SS / CS (slave select, output)
29
#define  RFM12B_SS_I  PINB
30
#define  RFM12B_SS_O  PORTB
31
#define  RFM12B_SS_P  2
32
#define  RFM12B_SS_D  DDRB
33
#define  RFM12B_SS_INIT()  RFM12B_SS_D |=  (1<<(RFM12B_SS_P))
34
#define  RFM12B_SS_LOW()   RFM12B_SS_O &= ~(1<<(RFM12B_SS_P))
35
#define  RFM12B_SS_HIGH()  RFM12B_SS_O |=  (1<<(RFM12B_SS_P))

von Sören Hirsch (Gast)


Lesenswert?

Hat wirklich keiner eine Lösung für das Problem? Ich habe auch dieses 
Problem und komme garnicht weiter. Wäre schön, wenn sich jemand 
bereiterklären würde zu helfen!

MfG
Sören

von Martin (Gast)


Lesenswert?

An einer Antwort bin auch ich interessiert. Nachdem die RFM12B bei mir 
nicht liefen, habe ich sie gegen die "normalen" getauscht.

von Martin (Gast)


Lesenswert?

Das Gute liegt (vielleicht) so nah:

http://www.joachim-neu.de/post/70/rfm12b-868/

Ein RFM12B-Programm, das - nach Aussage auf der Seite - funktioniert.

von Martin (Gast)


Lesenswert?

... (die Reichweite beträgt etwa 50 cm) ...

Der Code scheint doch nicht so gut zu sein.

von g457 (Gast)


Lesenswert?

> ... (die Reichweite beträgt etwa 50 cm) ...
> Der Code scheint doch nicht so gut zu sein.

Entweder das oder er hat vergessen, eine (bzw. zwei :-) Antenne(n) 
anzubauen..

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.