www.mikrocontroller.net

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


Autor: Niko S. (huibui2010)
Datum:

Bewertung
0 lesenswert
nicht 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
#define BAUD_UART 4800UL
#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>  
#include <util/delay.h>
#include <stdint.h>

#define RF_PORT    PORTB
#define RF_DDR    DDRB
#define RF_PIN    PINB

/*
rf12     ATmega32

SDI    <--------  MOSI      (PB5)
SDO    -------->  MIS0      (PB6)
SCK   <--------  SCK        (PB7)
nSEL  <--------  SS <=> CS (PB4)
nIERQ -------->  INT0      (PD2)  
VDI   --------- INT1    (PD3)
*/

#define SDI    PB5
#define SDO    PB6
#define SCK    PB7
#define CS    PB4


void USART_Transmit_String( unsigned char *data, uint8_t length );
void USART_Transmit( unsigned char data );
//***************************************************************************************************
#ifndef cbi                 //cbi(RF_PORT, CS) --> PORTB &= ~(1<<CS)
#define cbi(sfr, bit)     (_SFR_BYTE(sfr) &= ~_BV(bit)) 
#endif

#ifndef sbi
#define sbi(sfr, bit)     (_SFR_BYTE(sfr) |= _BV(bit))  
#endif
//***************************************************************************************************
uint16_t rf12_trans(uint16_t wert);        
// transfer 1 word to/from module
void rf12_init(void);      
// initialize module
void rf12_setfreq(unsigned short freq);  
// set center frequency
void rf12_setbaud(unsigned short baud);    
// set baudrate
void rf12_setpower(unsigned char power, unsigned char mod);    
// set transmission settings
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi);  
// set receiver settings
void rf12_txdata(unsigned char *data, unsigned char number);    
// transmit number of bytes from array
void rf12_rxdata(unsigned char *data, unsigned char number);    
// receive number of bytes into array
void rf12_ready(void);                      
// wait until FIFO ready (to transmit/read data)

//*geaendert fuer 868Mhz
#define RF12FREQ(freq)  ((freq-860.0)/0.005)              
// macro for calculating frequency value out of frequency in MHz
//***************************************************************************************************
void USART_Init( void )
{
  uint16_t baud_t = (uint16_t)((uint32_t) F_CPU/(16*BAUD_UART)-1);
  /* Set baud rate */
  UBRRH = (unsigned char)(baud_t>>8);
  UBRRL = (unsigned char)(baud_t);
  /* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
  /* Set frame format: 8data, 2stop bit */
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) )
    ;
  /* Put data into buffer, sends the data */
  UDR = data;
}

void USART_Transmit_String( unsigned char *data, uint8_t length )
{
  for( uint8_t i = 0; i < length; i++ )
    USART_Transmit( data[i] );
}
//***************************************************************************************************
uint16_t rf12_trans(uint16_t wert)
{  unsigned short werti=0;
  unsigned char i;

  cbi(RF_PORT, CS);
  for (i=0; i<16; i++)
  {
    if (wert&32768) //0b1000 0000 0000 0000
      sbi(RF_PORT, SDI);
    else
      cbi(RF_PORT, SDI);
  
    werti<<=1;
    if (RF_PIN&(1<<SDO))
      werti|=1;

    sbi(RF_PORT, SCK);
    wert<<=1;
    _delay_us(0.3);
    cbi(RF_PORT, SCK);
  }
  sbi(RF_PORT, CS);
  return werti;
}

void rf12_init(void)
{  
  RF_DDR = (1<<SDI)|(1<<SCK)|(1<<CS);
  RF_PORT=(1<<CS);
// wait until POR done
  for (unsigned char i=0; i<10; i++)
    _delay_ms(10);  

  rf12_trans(0x80E8);    //1.  Configuration Command    --> el und ef = 1; 868MHz band; 12,5pF 
  //rf12_trans(0x    );  //2.  Power Conmmand
  rf12_trans(0xA67C);     //3.  Frequenzy setting Command  --> 868,3MHz  
  rf12_trans(0xC646);    //4.  Data Rate Command ---> cs=0; Bit Rate RAW Physical: 4800          
  rf12_trans(0x9528);    //5.  Receiver Command ---> VDI output; Medium; 400KHz BW; -6dB -103dbRSSI
  //rf12_trans(0xc2AC);    //6.  Datafilter Command ---> al = 1; ml = 0; DQD = 3; digital = 0; analog = 1
  //rf12_trans(0xCA81);    //7.  FIFO / Reset Mode Command  --> al: sync pattern = 0; FIFO fill = 0; Disable high sens; reset =1
              //8.  Receiver FIFO Mode
  rf12_trans(0x6253);    //9.  AFC Command        --> ;AFC automatic mode = Offset always;  st : Strobe edge = 0;fi : Fine mode = 1
                           //    --> ;oe : Offset rgister enable = 1
                          //    --> ;en : Calculate offset = 1
                          //    --> ;Range limit = +7fres to -8fres
              //10. TX Config
              //11. Transmitter Register Write
  rf12_trans(0xE000);    //12. Wake-Up Timer Command    --> 0ms
  rf12_trans(0xC800);    //13. Low Duty-Cycle Command  --> en : Enable low duty-cycle = 0;Duty-cycle = .66666%
  rf12_trans(0xc0E0);    //14. LB Det./Clock Div. Command--> 10MHz; VIb=2,2V
}
/*
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
{
  rf12_trans(0x9500|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
}

void rf12_setfreq(unsigned short freq)
{  if (freq<96)        // 430,2400MHz  //868MHz
    return;
  else if (freq>3903)      // 439,7575MHz
    freq=3903;
  rf12_trans(0xA000|freq);
}

void rf12_setbaud(unsigned short baud)
{
  if (baud<664)
    baud=664;
  if (baud<5400)            // Baudrate= 344827,58621/(R+1)/(1+CS*7)
    rf12_trans(0xC680|((43104/baud)-1));
  else
    rf12_trans(0xC600|((344828UL/baud)-1));  // R=344828/Baud-1
}

void rf12_setpower(unsigned char power, unsigned char mod)
{  
  rf12_trans(0x9800|(power&7)|((mod&15)<<4));
}
*/
void rf12_ready(void)
{  cbi(RF_PORT, CS);
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
}

void rf12_txdata(unsigned char *data, unsigned char number)
{  unsigned char i;
  PORTD  = (1<<PIND5);    //TX_LED_2 on
  rf12_trans(0x8239);      // TX on  Power Command
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB82D);
  rf12_ready();
  rf12_trans(0xB8D4);
  for (i=0; i<number; i++)
  {  rf12_ready();
    rf12_trans(0xB800|(*data++));
  }
  rf12_ready();
  PORTD  = (!(1<<PIND5));
  rf12_trans(0x8208);      // TX off
  _delay_ms(1);
}

void rf12_rxdata(unsigned char *data, unsigned char number)
{  unsigned char i;
  PORTD  = (1<<PIND6);  //RX_LED_1 on
  rf12_ready();
  rf12_trans(0x82C8);      // RX on  Power Command
  rf12_ready();
  rf12_trans(0xCA81);      // set FIFO mode
  rf12_ready();
  rf12_trans(0xCA83);      // enable FIFO 
  
  for (i=0; i<number; i++)
  {  rf12_ready();
    *data++=rf12_trans(0xB000);
  }
  
  rf12_ready();
    PORTD  = (!(1<<PIND6));//RX_LED off
  rf12_trans(0x8208);    // RX off
  _delay_ms(1);      
}

//**********************************************************************
void send(void);
void receive(void);

void receive(void){
  unsigned char test[32];  
  rf12_rxdata(test,32);  
  // daten verarbeiten
  USART_Transmit_String( test, 32 );   
}

void send(void){
  unsigned char test[]= "Dies ist ein 868MHz Test !!!\n";  
  rf12_txdata(test,32);
  USART_Transmit_String( test, 32 );
}

int main(void){
  
  USART_Init();
  DDRD = 0xff;

  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
  //rf12_setfreq(RF12FREQ(868.3));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
  //rf12_setbandwidth(5, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
  //rf12_setbaud(19200);      // 19200 baud
  //rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift

  for (;;)
  {
    //send();
    //USART_Transmit_String("Test \n", 6);
    for (unsigned char i=0; i<100; i++)
      {_delay_ms(10);
      PORTD  = (1<<PIND6);
      }
    receive();
  }
}


: Verschoben durch Moderator
Autor: rfidler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Fuses richtig eingestellt? Welcher Atmel ist das?


mfg

Autor: Niko S. (huibui2010)
Datum:

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

Autor: Niko S. (huibui2010)
Datum:

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

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.