www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12B Transceiver an ATmega8


Autor: Peter Menson (pedda)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include "rfm12b.h"
#include <inttypes.h>
#ifndef F_CPU
#define F_CPU 1000000L
#endif
#include <util/delay.h>
#define SCL_CLOCK  100000L


int main()
{
  int i;
  uint8_t data[]="test";

  DDRB=0xff;
  DDRD=0xff;
  DDRC = 0xff;

  for (i=0;i<4;i++)
  {
    PORTB = ( 1<<PB1 );
    _delay_ms(500);
    PORTB = !(1<<PB1);
    _delay_ms(500);
  }

  SPCR = (1<<SPE)|(1<<MSTR);
  SPSR = (1<<SPI2X);

  RFM12B_init_hard();
  RFM12B_init_soft();

  while(1)
  {
    RFM12B_transmit(data,5);
    _delay_ms(500);
  
  }
}

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

Nun der Empfänger:
#include "rfm12b.h"
#ifndef F_CPU
#define F_CPU 1000000L
#endif
#include <util/delay.h>
#define SCL_CLOCK  100000L

int main()
{
  int i;
  uint8_t data[5];
  DDRB=0xff; 
  DDRD=0xff;   
        DDRC=0xff;

  for (i=0;i<4;i++)
  {
    PORTB = (1<<PB1);
    _delay_ms(500);
    PORTB = !(1<<PB1);
    _delay_ms(500);
  }


  SPCR = (1<<SPE)|(1<<MSTR);
  SPSR = (1<<SPI2X);
    
  RFM12B_init_hard();
  RFM12B_init_soft();

  while(1)
  {
    RFM12B_receive(data,5);
    if (data[0]=='t')
    PORTD=(1<<PD0);
    else
    PORTD=!(1<<PD0);
    _delay_ms(500);
  } 
}

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:
#include "rfm12b.h"
// send and receive a 16bit-word via spi
uint16_t RFM12B_spi(uint16_t cmd)
{
 uint8_t i;
 uint16_t recv = 0;
 // start communication
 RFM12B_SCK_LOW();
 RFM12B_SS_LOW();
 // read 16 bits
 for(i=0; i<16; i++)
 {
 // send bit
 if(cmd & 0x8000)
 RFM12B_MOSI_HIGH();
 else
 RFM12B_MOSI_LOW();
 // clock
 RFM12B_SCK_HIGH();
 recv<<=1;
 // receive bit
 if(RFM12B_MISO_HIGH())
 {
 recv|=0x0001;
 }
 // clock
 RFM12B_SCK_LOW();
 cmd<<=1;
 }
 // end communication
 RFM12B_SS_HIGH();
 return recv;
}
// initialize hardware (atmel) (CHECKED)
void RFM12B_init_hard()
{
 // set default values
 RFM12B_SS_HIGH();
 RFM12B_MOSI_HIGH();
 RFM12B_SCK_LOW();
 // init ports
 RFM12B_SCK_INIT();
 RFM12B_MOSI_INIT();
 RFM12B_MISO_INIT();
 RFM12B_SS_INIT();
}
// initialize software (rfm12b) (CHECKED)
void RFM12B_init_soft()
{
 RFM12B_spi(0x80D7);//EL,EF,433band,12.0pF
 RFM12B_spi(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
/*  RFM12B_spi(0xA640);//434MHz*/
 RFM12B_spi(0xA74E);//869,35 MHz
 RFM12B_spi(0xC647);//4.8kbps
 RFM12B_spi(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
 RFM12B_spi(0xC2AC);//AL,!ml,DIG,DQD4
 RFM12B_spi(0xCA81);//FIFO8,SYNC,!ff,DR
 RFM12B_spi(0xCED4);//SYNC=2DD4;
 RFM12B_spi(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
/*  RFM12B_spi(0x9850);//!mp,90kHz,MAX OUT*/
 RFM12B_spi(0x9820);//!mp,45kHz,MAX OUT*/
 RFM12B_spi(0xCC77);//OB1,OB0, LPX,!ddy,DDIT,BW0
 RFM12B_spi(0xE000);//NOT USE
 RFM12B_spi(0xC800);//NOT USE
 RFM12B_spi(0xC040);//1.66MHz,2.2V
}
// send a byte (CHECKED)
//   uint8_t  data  data to send
void RFM12B_put(uint8_t data)
{
 RFM12B_WAIT_RGIT();
 RFM12B_spi(0xB800 + data);
}
// receive a byte (CHECKED)
uint8_t RFM12B_get()
{
 RFM12B_WAIT_FFIT();
 return RFM12B_spi(0xB000) & 0x00FF;
}
// transmit multiple bytes (CHECKED)
//   uint8_t  data[]  data to transmit
//   uint8_t  length  length of the data to transmit
void RFM12B_transmit(uint8_t data[], uint8_t length)
{
 uint8_t i;
 // enable TX
 RFM12B_spi(0x8238);
 RFM12B_put(0xAA);
 RFM12B_put(0xAA);
 RFM12B_put(0xAA);
 RFM12B_put(0x2D);
 RFM12B_put(0xD4);
 for(i = 0; i < length; i++)
 {
 RFM12B_put(data[i]);
 }
 RFM12B_WAIT_RGIT();
 // disable TX
 RFM12B_spi(0x8208);
}
// receive multiple bytes (CHECKED)
//   uint8_t  data[]  buffer for received data
//   uint8_t  length  length of data to receive
void RFM12B_receive(uint8_t *data, uint8_t length)
{
 uint8_t i;
 // enable RX
 RFM12B_spi(0x82C8);
 // set FIFO mode
 RFM12B_spi(0xCA81);
 // enable FIFO
 RFM12B_spi(0xCA83);
 for(i = 0; i < length; i++)
 {
 data[i] = RFM12B_get();
 }
 RFM12B_WAIT_FFIT();
 // disable RX
 RFM12B_spi(0x8208);
}

config.h
// _I = INPUT PORT
// _O = OUTPUT PORT
// _P = PORT INDEX
// _D = DATA DIRECTION REGISTER
// SPI SCK (clock, output)#define  RFM12B_SCK_I  PINB
#define  RFM12B_SCK_O  PORTB
#define  RFM12B_SCK_P  5
#define  RFM12B_SCK_D  DDRB
#define  RFM12B_SCK_INIT()  RFM12B_SCK_D |=  (1<<(RFM12B_SCK_P))
#define  RFM12B_SCK_LOW()   RFM12B_SCK_O &= ~(1<<(RFM12B_SCK_P))
#define  RFM12B_SCK_HIGH()  RFM12B_SCK_O |=  (1<<(RFM12B_SCK_P))
// SPI MISO / SDO (master in slave out, input)
#define  RFM12B_MISO_I  PINB
#define  RFM12B_MISO_O  PORTB
#define  RFM12B_MISO_P  4
#define  RFM12B_MISO_D  DDRB
#define  RFM12B_MISO_INIT()  RFM12B_MISO_D &= ~(1<<(RFM12B_MISO_P))
#define  RFM12B_MISO_LOW()   ~(RFM12B_MISO_HIGH())
#define  RFM12B_MISO_HIGH()  RFM12B_MISO_I & (1<<(RFM12B_MISO_P))
// SPI MOSI / SDI (master out slave in, output)
#define  RFM12B_MOSI_I  PINB
#define  RFM12B_MOSI_O  PORTB
#define  RFM12B_MOSI_P  3
#define  RFM12B_MOSI_D  DDRB
#define  RFM12B_MOSI_INIT()  RFM12B_MOSI_D |=  (1<<(RFM12B_MOSI_P))
#define  RFM12B_MOSI_LOW()   RFM12B_MOSI_O &= ~(1<<(RFM12B_MOSI_P))
#define  RFM12B_MOSI_HIGH()  RFM12B_MOSI_O |=  (1<<(RFM12B_MOSI_P))
// SPI SS / CS (slave select, output)
#define  RFM12B_SS_I  PINB
#define  RFM12B_SS_O  PORTB
#define  RFM12B_SS_P  2
#define  RFM12B_SS_D  DDRB
#define  RFM12B_SS_INIT()  RFM12B_SS_D |=  (1<<(RFM12B_SS_P))
#define  RFM12B_SS_LOW()   RFM12B_SS_O &= ~(1<<(RFM12B_SS_P))
#define  RFM12B_SS_HIGH()  RFM12B_SS_O |=  (1<<(RFM12B_SS_P))

Autor: Sören Hirsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... (die Reichweite beträgt etwa 50 cm) ...

Der Code scheint doch nicht so gut zu sein.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.