Forum: Mikrocontroller und Digitale Elektronik Pollin RFM12 Funkmodul Probleme


von Wolfgang Meyerle (Gast)


Lesenswert?

Hallo,

ich habe mir inwzischen ein Funkmodul das Funkmodul RFM12 von Pollin 
zugelegt und komme irgendwie noch nicht so richtig damit zurecht. 
Einerseits habe ich jetzt eine Platine als Fertigbausatz 
(Funkmodulbausatz von Pollin mit einem RFM12) und andererseits von 
Rowalt ein AVR Mikrokontroller Board mit SIL Sockelleisten woran ich 
mein zweites RFM12 angeschlossen habe. Ich habe mir gedacht das ich als 
erstes das Rowalt Board ständig durch die gegend funken lasse und das 
gefunkte per Pollin Funkevaluationsboard empfange und danach auf die 
RS232 Schnittstelle ausgebe. Da ich das Datenblatt von Pollin gerade als 
Klopapier vieleicht noch gute Zwecke leistet hab ich den Rat im Forum 
befolgt und mir direkt vom Hersteller das Datenblatt von HOPE angesehen. 
Ich weiß es gibt schon fertige Funkstacks usw. aber ich möchte das ganze 
erstmal so simpel wie möglich machen und durch den Äther senden und 
empfangen. Da ich auf der Empfangsseite angeblich nur 00er Bytes bekomme 
(zumindest sagt mir das die RS232) stelle ich mir nun folgende Fragen:

Wie kann ich a) erstmal überprüfen ob mein Rowalt Sendemodul überhaupt 
sendet?
und b) das mein Empfangsmodull empfängt?

Als Antennen verwende ich bisher 2 ca 17cm lange verlötete Drahtstücke. 
Ist das ok soweit? Ich will damit momentan noch keine Reichweitenrekorde 
aufstellen, mir gehts nurmal ums Prinzip.

Als Quellcode für das ganze habe ich den Code im Datenblatt von Hoppe 
verwendet:

Das Sendemodul hängt dabei wie folgt am Atmega8
// NIRQ -> PD2
// SCK  -> PB5
// SDO  -> PB4
// SDI  -> PB3
// NSEL -> PD2
// FSK/DATA/NFFS -> PD7
// DLCK -> PD3
// NINT -> PB0


Der Takt des Prozessors beträgt wie man sieht 8Mhz (interner Oszilator)

Sender:



#define F_CPU 8000000UL

#include <avr/io.h>
#include <compat/ina90.h>
//#include <avr/interrupt.h>
#include <stdint.h>
#include <stdbool.h>
// #include <avr/eeprom.h>
#include <util/delay.h>

#include <avr/interrupt.h>

// #include "rf12.h"


#define DDR_IN     0
#define DDR_OUT   1

#define PORT_SEL   PORTB
#define PIN_SEL   PINB
#define DDR_SEL   DDRB

#define PORT_SDI   PORTB
#define PIN_SDI   PINB
#define DDR_SDI   DDRB

#define PORT_SCK   PORTB
#define PIN_SCK   PINB
#define DDR_SCK   DDRB

#define PORT_SDO   PORTB
#define PIN_SDO   PINB
#define DDR_SDO   DDRB

#define PORT_DATA   PORTD
#define PIN_DATA   PIND
#define DDR_DATA   DDRD

#define PB7     7// --
#define PB6     6//  |
#define RFXX_SCK   5//  |
#define RFXX_SDO   4//  |RF_PORT
#define RFXX_SDI   3//  |
#define RFXX_SEL   2//  |
#define NC       1//  |
#define PBO      0//--/

#define SEL_OUTPUT() DDR_SEL|= (1<<RFXX_SEL)
#define HI_SEL()   PORT_SEL|= (1<<RFXX_SEL)
#define LOW_SEL()   PORT_SEL&=~(1<<RFXX_SEL)

#define SDI_OUTPUT() DDR_SDI|= (1<<RFXX_SDI)
#define HI_SDI()   PORT_SDI|= (1<<RFXX_SDI)
#define LOW_SDI()   PORT_SDI&=~(1<<RFXX_SDI)

#define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)
#define SDO_HI()   PIN_SDO&(1<<RFXX_SDO)

#define SCK_OUTPUT()  DDR_SCK|= (1<<RFXX_SCK)
#define HI_SCK()     PORT_SCK|= (1<<RFXX_SCK)
#define LOW_SCK()    PORT_SCK&=~(1<<RFXX_SCK)

#define RF12_DATA 4//PD4
#define DATA_OUT  DDR_DATA|=1<<RF12_DATA
#define HI_DATA    PORT_DATA|=1<<RF12_DATA

#define LEDG_OUTPUT() DDRD|=~(1<<6)
#define LEDR_OUTPUT() DDRD|=~(1<<7)

#define LEDG_ON() PORTD|=(1<<6)
#define LEDG_OFF() PORTD&=~(1<<6)

#define LEDR_ON() PORTD|=(1<<7)
#define LEDR_OFF() PORTD&=~(1<<7)

void RFXX_PORT_INIT(void) {
  HI_SEL();
  HI_SDI();
  LOW_SCK();

  SEL_OUTPUT();
  SDI_OUTPUT();
  SDO_INPUT();
  SCK_OUTPUT();
}

unsigned int RFXX_WRT_CMD(unsigned int aCmd) {
  unsigned char i;
  unsigned int temp;
  LOW_SCK();
  LOW_SEL();
  for(i=0;i<16;i++) {
  temp<<=1;
  if (SDO_HI()) {
  temp |=0x0001;
}

  LOW_SCK();
  if(aCmd&0x8000) {
  HI_SDI();
  }else {
  LOW_SDI();
  }
  HI_SCK();
  aCmd<<=1;
  };
  LOW_SCK();
  HI_SEL();
  return (temp) ;
}

void RF12_INIT(void) {
  RFXX_WRT_CMD(0x80D7) ;//EL,EF, 433band, l2.0pF
  RFXX_WRT_CMD(0x8239) ;//!er, !ebb, ET, ES, EX, !eb, !ew,DC
  RFXX_WRT_CMD(0xA640) ;//A140=430.8MHz 434Mhz?
  RFXX_WRT_CMD(0xC647) ;//19.2kbps
  RFXX_WRT_CMD(0x94A0) ;//VDI,FAST, l34kHz,OdBm,-103dBm
  RFXX_WRT_CMD(0xC2AC) ;//AL, !ml,DIG,DQD4
  RFXX_WRT_CMD(0xCA81) ;//FIFO8,SYNC, !ff,DR
  RFXX_WRT_CMD(0xC483) ;//@PWR,NO RSTRIC, !st, !fi,OE,EN
  RFXX_WRT_CMD(0x9850) ;//!mp,9810=30kHz,MAX OUT
  RFXX_WRT_CMD(0xE000) ;//NOT USE
  RFXX_WRT_CMD(0xC800) ;//NOT USE
  RFXX_WRT_CMD(0xC400) ;//1.66MHz, 2.2V
}


void RF12_SEND(unsigned char aByte) {
  while(PIND&(1<<2)) ;//wait for previously TX over
  RFXX_WRT_CMD(0xB800+aByte) ;
}



#define LEDG_OUTPUT() DDRD|=~(1<<6)
#define LEDR_OUTPUT() DDRD|=~(1<<7)

#define LEDG_ON() PORTD|=(1<<6)
#define LEDG_OFF() PORTD&=~(1<<6)

#define LEDR_ON() PORTD|=(1<<7)
#define LEDR_OFF() PORTD&=~(1<<7)
void send(void);
void receive(void);


void ledTest(void){
  for (int i=0;i<3;i++){
    LEDR_ON();
    LEDG_ON();
    _delay_ms(200);
    LEDR_OFF();
    LEDG_OFF();
    _delay_ms(200);
  }
}



int main(void){



  // --------------
  unsigned int i, j;
  unsigned char ChkSum;

  asm volatile ("cli") ;
  DDRB=0x00;//PB INPUT;
  DDRD=0x00;//PD INPUT;

  //POWER ON indication: both LEDR and LEDG blink 3 times
  LEDG_OFF();
  LEDR_OFF();

  LEDG_OUTPUT();
  LEDR_OUTPUT();

  for(i=0;i<3;i++) {
    _delay_ms(200) ;
    LEDG_ON();
    LEDR_ON();
    _delay_ms(200) ;
    LEDG_OFF();
    LEDR_OFF();
  }


  bool redWasLast = true;
  RFXX_PORT_INIT();
  RF12_INIT();

  DDRD|= (1<<RF12_DATA) ;
  PORTD|= (1<<RF12_DATA) ;// SET nFFS pin HI when using TX register
  DDRD&=~(1<<2); //PD2(INTO)

  while(1) {




    RFXX_WRT_CMD(0x0000) ;//read status register
    RFXX_WRT_CMD(0x8239) ;//!er, !ebb,ET,ES, EX, !eb, !ew,DC

    ChkSum=0;
    RF12_SEND(0xAA) ;//PREAMBLE
    RF12_SEND(0xAA) ;//PREAMBLE
    RF12_SEND(0xAA) ;//PREAMBLE
    RF12_SEND(0x2D) ;//SYNC HI BYTE
    RF12_SEND(0xD4) ;//SYNC LOW BYTE
    RF12_SEND(0x30) ;//DATA BYTE 0
    ChkSum+=0x30;
    RF12_SEND(0x31) ;//DATA BYTE 1
    ChkSum+=0x31;
    RF12_SEND(0x32) ;
    ChkSum+=0x32;
    RF12_SEND(0x33) ;
    ChkSum+=0x33;
    RF12_SEND(0x34) ;
    ChkSum+=0x34;
    RF12_SEND(0x35) ;
    ChkSum+=0x35;
    RF12_SEND(0x36) ;
    ChkSum+=0x36;
    RF12_SEND(0x37) ;
    ChkSum+=0x37;
    RF12_SEND(0x38) ;
    ChkSum+=0x38;
    RF12_SEND(0x39) ;
    ChkSum+=0x39;
    RF12_SEND(0x3A) ;
    ChkSum+=0x3A;
    RF12_SEND(0x3B) ;
    ChkSum+=0x3B;
    RF12_SEND(0x3C) ;
    ChkSum+=0x3C;
    RF12_SEND(0x3D) ;
    ChkSum+=0x3D;
    RF12_SEND(0x3E) ;
    ChkSum+=0x3E;
    RF12_SEND(0x3F); //DATA BYTE 15
    ChkSum+=0x3F;
    RF12_SEND(ChkSum); //send chek sum
    RF12_SEND(0xAA) ;//DUMMY BYTE
    RF12_SEND(0xAA) ;//DUMMY BYTE
    RF12_SEND(0xAA) ;//DUMMY BYTE

    RFXX_WRT_CMD(0x8201) ;

    //LEDG_ON();
    if (redWasLast==true){
      LEDG_ON();
      _delay_ms(200);
      LEDG_OFF();
      _delay_ms(200);
      redWasLast=false;
    } else{
      redWasLast=true;
      LEDR_ON();
      _delay_ms(200);
      LEDR_OFF();
      _delay_ms(200);
    }
  } ;
}

Die Empfängerseite ist wie gesagt das Pollin Evaluationsboard mit nem 
verlöteten RFM12 Modul


Empfänger:

/*
 * Main.cpp
 *
 *  Created on: 07.06.2009
 *      Author: procrash
 */
#define F_CPU 8000000UL

#include <avr/io.h>
#include <compat/ina90.h>
//#include <avr/interrupt.h>
#include <stdint.h>
#include <stdbool.h>
// #include <avr/eeprom.h>
#include <util/delay.h>


/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif

   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
   verwendet wird und dort eine andere, nicht zur Hardware passende
   Taktrate eingestellt ist: Dann wird die folgende Definition
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */

#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 
4000000"
#define F_CPU 12000000UL    // Systemtakt in Hz - Definition als 
unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
#endif

#define BAUD 19200UL          // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = 
kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu 
hoch!
#endif
void uartInit(void){
   //UCR |= (1<<TXEN);
   UCSRB |= (1<<TXEN);                            // UART TX einschalten
   UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1

   UBRRH = UBRR_VAL >> 8;
   UBRRL = UBRR_VAL & 0xFF;

}
















/*
copyright Ce) 2006
;Title RF12 TX simple example based on AVR C
;Company: Hope microelectronic Co.,Ltd.
;Author: Tank
;Current version: vl.O
;Date: 2006-11-13
;processor ATMEGA48
;Clock:
;Contact:
;E-MAIL:
10MHz Crystal
+86-0755-86106557
hopefsk@hoperf.com
Connections
ATMEGA48 SIDE RF12 SIDE
SCK---------------)SCK
MISO---------------)SDO
MOSI---------------)SDI
SS---------------)nSEL
INTO<---------------nIRQ
PD6: LED GREEN
PD7: LED RED
*/
// #include <mega48.h>

// NIRQ -> PD2
// SCK  -> PB5
// SDO  -> PB4
// SDI  -> PB3
// NSEL -> PD2
// FSK/DATA/NFFS -> PD7
// DLCK -> PD3
// NINT -> PB0

#define DDR_IN     0
#define DDR_OUT   1

#define PORT_SEL   PORTB
#define PIN_SEL   PINB
#define DDR_SEL   DDRB

#define PORT_SDI   PORTB
#define PIN_SDI   PINB
#define DDR_SDI   DDRB

#define PORT_SCK   PORTB
#define PIN_SCK   PINB
#define DDR_SCK   DDRB

#define PORT_SDO   PORTB
#define PIN_SDO   PINB
#define DDR_SDO   DDRB

#define PORT_DATA   PORTD
#define PIN_DATA   PIND
#define DDR_DATA   DDRD

#define PB7     7//--\
#define PB6     6//  |
#define RFXX_SCK   5//  |
#define RFXX_SDO   4//  |RF_PORT
#define RFXX_SDI   3//  |
#define RFXX_SEL   2//  |
#define NC       1//  |
#define PBO      0//--/

#define SEL_OUTPUT() DDR_SEL|= (1<<RFXX_SEL)
#define HI_SEL()   PORT_SEL|= (1<<RFXX_SEL)
#define LOW_SEL()   PORT_SEL&=~(1<<RFXX_SEL)

#define SDI_OUTPUT() DDR_SDI|= (1<<RFXX_SDI)
#define HI_SDI()   PORT_SDI|= (1<<RFXX_SDI)
#define LOW_SDI()   PORT_SDI&=~(1<<RFXX_SDI)

#define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)
#define SDO_HI()   PIN_SDO&(1<<RFXX_SDO)

#define SCK_OUTPUT()  DDR_SCK|= (1<<RFXX_SCK)
#define HI_SCK()     PORT_SCK|= (1<<RFXX_SCK)
#define LOW_SCK()    PORT_SCK&=~(1<<RFXX_SCK)

#define RF12_DATA 4//PD4
#define DATA_OUT  DDR_DATA|=1<<RF12_DATA
#define HI_DATA    PORT_DATA|=1<<RF12_DATA

#define RF12_IRQ     2
#define IRQ_IN()     DDR_IRQ &=~(1<<RF12_IRQ)
#define WAIT_IRQ_LOW()   while(PIND&(1<<RF12_IRQ))


#define LEDG_OUTPUT() DDRD|=~(1<<6)
#define LEDR_OUTPUT() DDRD|=~(1<<7)

#define LED1_OUTPUT() DDRD|=~(1<<5)
#define LED2_OUTPUT() DDRD|=~(1<<6)

#define LEDG_ON() PORTD|=(1<<6)
#define LEDG_OFF() PORTD&=~(1<<6)

#define LED1_ON() PORTD|=(1<<5)
#define LED1_OFF() PORTD&=~(1<<5)

#define LED2_ON() PORTD|=(1<<6)
#define LED2_OFF() PORTD&=~(1<<6)

#define LEDR_ON() PORTD|=(1<<7)
#define LEDR_OFF() PORTD&=~(1<<7)

void RFXX_PORT_INIT(void) {
  HI_SEL();
  HI_SDI();
  LOW_SCK();

  SEL_OUTPUT();
  SDI_OUTPUT();
  SDO_INPUT();
  SCK_OUTPUT();
}

unsigned int RFXX_WRT_CMD(unsigned int aCmd) {
  unsigned char i;
  unsigned int temp;
  LOW_SCK();
  LOW_SEL();
  for(i=0;i<16;i++) {
  temp<<=1;
  if (SDO_HI()) {
  temp |=0x0001;
}

  LOW_SCK();
  if(aCmd&0x8000) {
  HI_SDI();
  }else {
  LOW_SDI();
  }
  HI_SCK();
  aCmd<<=1;
  };
  LOW_SCK();
  HI_SEL();
  return (temp) ;
}

void RF12_INIT(void) {
  RFXX_WRT_CMD(0x80D7) ;//EL,EF, 433band, l2.0pF
  RFXX_WRT_CMD(0x8239) ;//!er, !ebb, ET, ES, EX, !eb, !ew,DC //82D)
  RFXX_WRT_CMD(0xA640) ;//A140=430.8MHz 434Mhz?
  RFXX_WRT_CMD(0xC647) ;//19.2kbps //C647
  RFXX_WRT_CMD(0x94A0) ;//VDI,FAST, l34kHz,OdBm,-103dBm
  RFXX_WRT_CMD(0xC2AC) ;//AL, !ml,DIG,DQD4
  RFXX_WRT_CMD(0xCA81) ;//FIFO8,SYNC, !ff,DR
  RFXX_WRT_CMD(0xC483) ;//@PWR,NO RSTRIC, !st, !fi,OE,EN
  RFXX_WRT_CMD(0x9850) ;//!mp,9810=30kHz,MAX OUT
  RFXX_WRT_CMD(0xE000) ;//NOT USE
  RFXX_WRT_CMD(0xC800) ;//NOT USE
  RFXX_WRT_CMD(0xC400) ;//1.66MHz, 2.2V
}


void RF12_SEND(unsigned char aByte) {
  while(PIND&(1<<2)) ;//wait for previously TX over
  RFXX_WRT_CMD(0xB800+aByte) ;
}

unsigned char RF12_RECV(void){
  unsigned int FIFO_data;
  WAIT_IRQ_LOW();
  RFXX_WRT_CMD(0x0000);
  FIFO_data=RFXX_WRT_CMD(0xB000);
  return(FIFO_data&0x00FF);
}




void sendUART(unsigned char b){
    // bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier 
z.B. fuer ATmega16:
//    b=255;
    unsigned char hexMSB = b / 16;
    unsigned char hexLSB = b % 16;

    if (hexMSB<10) hexMSB+='0'; else hexMSB+=55;
    if (hexLSB<10) hexLSB+='0'; else hexLSB+=55;



    while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
      {
      }


      UDR = hexMSB;                    // schreibt das Zeichen x auf die 
Schnittstelle

    while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
      {
      }


      UDR = hexLSB;                    // schreibt das Zeichen x auf die 
Schnittstelle

    while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
      {
      }


      UDR = ' ';                    // schreibt das Zeichen x auf die 
Schnittstelle

}
int main(void){


  uartInit();


  unsigned char i;

  unsigned char ChkSum;

  asm volatile ("cli") ;
  DDRB=0x00;//PB INPUT;
  DDRD=0x00;//PD INPUT;

  //POWER ON indication: both LEDR and LEDG blink 3 times

  LED1_OUTPUT();
  LED2_OUTPUT();

  for(i=0;i<3;i++) {
    _delay_ms(200) ;
    LED1_ON();
    LED2_ON();
    _delay_ms(200) ;
    LED1_OFF();
    LED2_OFF();
  }

  bool redWasLast = true;
  RFXX_PORT_INIT();
  RF12_INIT();

  DDRD|= (1<<RF12_DATA) ;
  PORTD|= (1<<RF12_DATA) ;// SET nFFS pin HI when using TX register
  DDRD&=~(1<<2); //PD2(INTO)

  RFXX_WRT_CMD(0xCA81);
  unsigned char recvd;
  while(1) {


    RFXX_WRT_CMD(0xCA83);
    ChkSum=0;
    for (i=0;i<16;i++){
      recvd=RF12_RECV();
      sendUART(recvd);
      ChkSum+=recvd;
    }
    recvd=RF12_RECV();
    i = recvd;
    sendUART(recvd);

    RFXX_WRT_CMD(0xCA81) ;//read status register
    if (ChkSum==i){
      LED2_ON();
      _delay_ms(200);
      LED2_OFF();
    } else
    {
      LED1_ON();
      _delay_ms(200);
      LED1_OFF();

    }
  } ;
}

von Olaf (Gast)


Lesenswert?

> Wie kann ich a) erstmal überprüfen ob mein Rowalt Sendemodul
> überhaupt sendet?

Du koenntet deinen Spektrumanalyzer anschliessen. Solltest du gerade
keinen da haben so kannst du auch einen HF-Tastkopf bauen. Oder du
schaust mal ob du eine Frequenz hinbekommst die du mit einem TV-Tuner
empfangen kannst.

> und b) das mein Empfangsmodull empfängt?

Sobald dein Sender erfolgreich sendet musst du nur schauen ob das
auch aus deinem Empfaenger wieder rauskommt.

> Als Quellcode für das ganze habe ich den Code im Datenblatt von
> Hoppe verwendet:

Ich glaube das muss uns nicht interessieren da du es doch selber
machen wolltest. .-)

Olaf

von Wolfgang Meyerle (Gast)


Lesenswert?

Hi Olaf,

also in meinem Heimwerkerlabor habe ich höchstens noch ein Oszi zur 
Verfügung aber ich schätze da das ganze ja HF ist wird mir mein Oszi da 
nicht viel helfen oder?
Nützt mir das was? Du solltest vielleicht wissen das ich das ganze nur 
Hobbymäßig mache und kein E-Technik Studium oder ne Ausbildung hinter 
mir habe.
Das mit den Antennen passt soweit oder?
Stimmt denn der Code den ich angegeben habe? Der ist 1:1 aus dem 
Datenblatt von Hoppe.

Gruß

Wolfgang

von Olaf (Gast)


Lesenswert?

> Verfügung aber ich schätze da das ganze ja HF ist wird mir mein Oszi da
> nicht viel helfen oder?

Du hast dir nicht die Muehe gemacht mal herauszufinden was ein 
HF-Tastkopf ist?

http://www.io.com/~n5fc/rfprobe1.htm

> Das mit den Antennen passt soweit oder?

Du hielst es bis jetzt nicht fuer noetig uns deine Frequenz mitzuteilen. 
Solange es aber erstmal nur darum geht ein paar cm auf deinem 
Schreibtisch zu ueberbruecken ist die Antenne ziemlich egal.

> Stimmt denn der Code den ich angegeben habe?

Glaubst du im ernst hier liesst sich einer mehrere Seiten Programmcode 
durch? Und glaubst du wirklich selbst wenn das einer macht das er dann
mal eben so irgendeinen Fehler finden wuerde?

Olaf

von Wolfgang Meyerle (Gast)


Lesenswert?

Ok Olaf,

ich mach mich mal schlau bezüglich des HF Tastkopfes. Der Code ist 
übrigens eins zu eins bereits im Forum mal gepostet worden 
(RFM12_RX_TX). Weisst du zufälligerweise was bei dem Modul alles 
angeschlossen sein muss? Laut Datenblatt hab ich SDI, NSEL, NIRQ, VDD, 
SCK, SDO, DATA und GND angeschlossen. Warum muss Data eigentlich über 
nen 10k Widerstand an VDD angeschlossen werden? Weisst du das zufällig?
Ich werde morgen mal das zweite Evaluationsboard zusammenlöten und mal 
sehen ob es mit dem Referenzbeispielcode klappt den ich für die Pollin 
Boards im Netz gefunden habe und hoffe dass das klappt. Und dann seh ich 
mir natürlich den HF-Tastkopf mal genauer an Olaf.

Natürlich verlange ich nicht das Ihr euch seitenweise Code durchlest 
aber es wäre ja schonmal ganz nett gewesen zu wissen ob dieser Code der 
im Forum schonmal gepostet wurde und im Hoppe Datenblatt steht 
funktioniert oder ob das Ding wieder für den Anus ist. Weisst du da was 
drüber?

Ansonsten immer mal locker bleiben... :-)

Gruß

Wolfgang

von Wolfgang Meyerle (Gast)


Lesenswert?

Ach ja die Frequenz liegt momentan noch auf 433Mhz laut Quellcode. Jaja 
nicht schon wieder fluchen, ich änder das noch...

von Wolfgang Meyerle (Gast)


Lesenswert?

Ach ja, der Quellcode war von Benedikt. Mittlerweile hab ich mir den 
RF-Probe Artikel von dem Link den du gepostet hast mal angesehen. So wie 
das aussieht kann ich damit jetzt HF-Spannungen messen, richtig? Mal ne 
sau blöde Frage: Wo greif ich die ab? An zwischen Antenne und GND?

von Michael U. (amiga)


Lesenswert?

Hallo,

indirekt kannst Du auch die Stromaufnahme messen, wenn er den Sender 
einschaltet sind es so um 12-15mA.

0xA620 sind 433,92MHz, also da wo alle Senden. ;)
Sener-Init habe ich keine hier für einen RFM12, nutze die im Moment nur 
als Empfänger, Sender sind RFM02.

Antenn ist egal, solange der Kram relativ nahe beeinander ist.
Mein Sensor aus dem Keller ist im 2. Stock auch noch ohne Antenne am 
Empfänger zu empfangen...
1
  rfm12_send_cmd(0x0000);  // Status read
2
  rfm12_send_cmd(0xC080);  // CLK-Frequenz / Batterie-Level
3
  rfm12_send_cmd(0x80D7);  // FIFO ein, 433MHZ-Band, C = 12pF
4
  rfm12_send_cmd(0xC2AB);  // Clock Recovery Auto, Filter digital, DQD-Thresold 3
5
  rfm12_send_cmd(0xCA81);  // FIFO-Level 8 Bit, Sync Pattern ein, High senity Reset aus
6
  rfm12_send_cmd(0xE000);  // WakeUp aus
7
  rfm12_send_cmd(0xC800);  // Low Duty Cycle aus
8
  rfm12_send_cmd(0xC4F3);  // AFC immer, +7,5 / -10kHz, Add Freq-Offset zur PLL, Berechne Freq. Offset aus AFC
9
  rfm12_send_cmd(0xA620);  // Frequenz 433,92MHz
10
  rfm12_send_cmd(0x948C);  // VDI Output, VDI Fast, Bandbreite 200kHz, LBA-Gain -6dB, RSSI-Thresold -79dB
11
  rfm12_send_cmd(0xC610);  // Baudrate 19200
12
  rfm12_send_cmd(0x8281);  // Empfänger ein, Clock Out aus
13
  rfm12_send_cmd(0xCA81);  // set FIFO mode
14
  rfm12_send_cmd(0xCA83);  // enable FIFO

Das sind die Werte des Empfängers mit dem RFM12.

Dicht am RFM-Modul einen Elko 4,7-10µ über die Betriebsspannung legen, 
ich hatte mehrfach das Problem, daß die Module beim Schalten auf Senden 
abstürzten (RFM02) speziell auf dem Steckbrett mit den längeren 
Leitungen.

Außerdem als erstes den Status lesen, ohne dem gab es manchmal den "geht 
- geht nicht" Effekt. ;)

Vielleicht hilft Dir auch
http://www.avr.roehres-home.de
etwas weiter.

Gruß aus Berlin
Michael

von Alex W. (a20q90)


Lesenswert?

Michael U. schrieb:

> 0xA620 sind 433,92MHz, also da wo alle Senden. ;)

Nein!

Die Radarfalle uP80 sendet vom Fahrzeug zur Fotoeinheit auf 434.600MHz!

von Wolfgang M. (procrash)


Lesenswert?

Hallo Michael,

danke für die Antwort. Einen Fehler hab ich inzwischen schon gefunden. 
mIch hatte den Data Port des Moduls nicht über nen 10k Widerstand an Vdd 
gelegt. Das mit dem Elko probier ich gleich mal aus.

Gruß,

Wolfgang

von Wolfgang M. (procrash)


Lesenswert?

Das ist doch super. Dann weiss man wo man senden muss ;-)

von Wolfgang M. (procrash)


Lesenswert?

Hi nochmal,

hab mir heute mal das Modul etwas sauberer auf ner Adapterplatine 
aufgebaut und die Stromaufnahme gemessen. Laut Multimeter zeigt er mir 
eine schwankende Stromaufnahme von 6-15ma an. Kann ich davon ausgehen 
dass er zumindest was sendet wenn dieser wert schwankt? Ich sende ein 
paar Byte, danach lass ich meine LED's blinken also denk ich mir ist in 
diesem Bereich die Stromaufnahme geringer da das Blinken und Senden 
nicht parallel abläuft. Welche Stromaufnahme hat das Ding wenn ich 
nichts durch die gegend Funke sondern nur Beispielsweise den Status die 
ganze Zeit abfrage?

von Michael U. (amiga)


Lesenswert?

Hallo,

das müßtest Du Dir aus dem Datenblatt zusammensuchen (dem vollständigen, 
nicht den "Wurfzetteln". ;-)

ca. 15mA ziehen meine RFM02-Sensoren zusammen mit einem Tiny45. ca. 5mA 
sind es, wenn der AVR läuft und der RFM halbwegs initialisiert ist und 
nicht sendet. Die Werte sind mit Mulitmeter geschätzt, weil ich sie nur 
bei der Fehlersuche mal gemessen habe, als der Kram nicht zuverlässig 
schlafen ging.

Ich habe mit dem RFM12 noch nicht gesendet, da der RFM02 da ziemlich 
abweicht (kein Sendebuffer usw.) helfen Dir da meine Sourcen vermutlich 
wenig.
1
  rfm02_send_cmd(0xCC00);   // Status read
2
  rfm02_send_cmd(0xC0E0);   // Power Settings: Quarz ein, Synthesizer und PA ein bei Send-Command
3
  rfm02_send_cmd(0xC2A0);    // low bat detector, TX Bit Sync, WakUp-Timer Calibrierung aus
4
  rfm02_send_cmd(0x8883);    // Control: 1MHz Clock Out, 12,5pF Last Quarz, 120kHz Shift
5
  rfm02_send_cmd(0xA620);    // Frequenz: 430MHz + (0,0025 * 0x620) -> 433,92MHz
6
  rfm02_send_cmd(0xB200);   // Power 2 * -3dBm -> -6dBm
7
  rfm02_send_cmd(0xD2C0);   // Set PLL: set 33%
8
  rfm02_send_cmd(0xC810);   // Baudrate: 344827 / 19200 = 17 - 1 -> 0x10                   // Status read
9
  rfm02_send_cmd(0xE500 + 200); // WakeUp-Timer 2^7 *234ms ~ 30s ???!! nicht 1ms sondern 10ms !!???
10
  rfm02_send_cmd(0xC002);   // alles aus, WakeUp-Timer ein
11
  rfm02_send_cmd(0xC440);   // sleep, noch 64 Takte

ich hänge die Parameter des RFM02 mal ran, ich bin jetzt nicht sicher, 
ob die Kommentare noch 100% stimmen, also die Kommandowerte notfalls 
nochmal mit dem RFM02 Datenblatt vergleichen und entsprechend auf den 
RFM12 übernehmen.

Gruß aus Berlin
Michael

von Wolfgang M. (procrash)


Lesenswert?

@Olaf: Mal ne Frage: Laut Beschreibung kann die RF-Probe maximal 150Mhz 
(how accurate? +/-10% from 200 KHz to 150 MHz). Insofern wäre das Ding 
doch ungeeignet, zumindest mit den Bauteilwerten wenn ich ne HF mit 
433Mhz messen will oder liege ich da falsch?

Gruß

Wolfgang

von Gast (Gast)


Lesenswert?

Hallo,
ich weiß zwar nicht, woher die sehr große Vorliebe für die RFM-Module 
kommt, aber wir setzen seit Jahren die easy-radio-Module ein: die sind 
zwar etwas treuer, aber hier gilt wirklich; einbauen, Daten auf der 
einen Seite rein und wieder auf der anderen Seite raus. Das geht hierbei 
mit einem Drei-Zeiler, mehr ist nicht notwendig, also bei weitem nicht 
so ein imenser Aufwand wie bei den RFMs, die wir sehr schnell zur Seite 
gelegt haben.
Ein Versuch mit den easy-radio Modulen schadet nicht und einfacher gehts 
wirklich nicht !

Gast

von Michael U. (amiga)


Lesenswert?

Hallo,

@Gast (Gast):

was verbraucht ein Easy-Radio-Modul als Sender im Sleep-Mode?
Mehr oder weniger als ein RFM02 mit seinen 1,5µA?
Ich habe dazu im Datenblatt auf Anhieb nichts gefunden.

Gruß aus Berlin
Michael

von Wolfgang M. (procrash)


Lesenswert?

Hi nochmal,

es funktioniert jetzt endlich. Es lag an nem fehlerhaften Kontakt und 
daran dass ich FSK nicht auf VDD sondern mit nem Widerstand in Reihe an 
VDD angeschlossen hatte. Das Modul hatte sich desshalb aufgehängt. 
Juhuuuuuuu!

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.