www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM 12 hängt sich auf


Autor: Gaasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich habe nun endlich meine RFM12-basierte Funkbrücke erfolgreich in 
Betrieb genommen. (Nach ca. 4 Wochen :D ) Aber ich hab nicht aufgegeben.

Jetzt funktioniert alles einwandfrei mit den Beispielprogrammen und mit 
meinen eigenen. Bei dem Beispielprogramm handelt es sich um das aus dem 
Thread: Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module"

Nur folgendes Problem:
Wenn ich das ganze Testboard (Steckbrett) aus und wieder einschalte 
kommt es manchmal dazu, dass der Sender nicht mehr sendet. Ich muss 
dann, komischer Weise, zunächst das Programm für den Empfangsmodus 
überspielen. Und anschließend das Sende-programm. Erst dann geht es 
wieder.

Jetzt ist es natürlich so, dass ich die Fernbedienung (Die daraus mal 
entstehen soll, auch ausschalten möchte, oder sie ggf komplett ausgeht 
wegen batteriewechsel/hinfallen etc.)

Was kann ich tuen damit das nicht mehr passiert.

Danke schonmal für die Hilfe!

Autor: Ziegenpeter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. Fehler beim Initialisieren: das Programm zum Empfangen 
initialisiert richtig, das Programm zum Senden nicht (vielleicht fehlt 
das Initialisieren eines Registers oder falsche Werte?).

Autor: Gaasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Initialisierungen sind identisch:

[c]
  uart_init(UART_BAUD_SELECT(19200, F_CPU));
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
  rf12_setfreq(RF12FREQ(433.92));  // Sende/Empfangsfrequenz
  rf12_setbandwidth(4, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, 
DRSSI threshold: -79dBm
  rf12_setbaud(19200);      // 19200 baud
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz 
Frequenzshift

[\c]

Normalerweise funktioniert es ja auch. Aber wie gesagt, es funktioniert 
manchmal nicht mehr, wenn ich den Strom wegnehme...

Autor: Gaasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner mehr eine Idee?

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst doch nicht erwarten, dass 40 Minuten nach deinem Post schon 
eine Antwort kommt. Da musst du schon etwas geduldiger sein. ;)

Gaasi schrieb:
>   uart_init(UART_BAUD_SELECT(19200, F_CPU));
>   rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
>   rf12_setfreq(RF12FREQ(433.92));  // Sende/Empfangsfrequenz
>   rf12_setbandwidth(4, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung,
> DRSSI threshold: -79dBm
>   rf12_setbaud(19200);      // 19200 baud
>   rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz
> Frequenzshift

Diese Initialisierung hilft uns nicht weiter. Wenn schon, dann brauchen 
wir die realen Werte die in den RFM12 geschrieben werden und keine 
Wrapperfunktionen. Eventuell ist nämlich in diesen schon ein Fehler 
drin.
Ebenso brauchen wir die Werte die in den RFM12 geschrieben werden, wenn 
du ein Paket sendest. Am besten hängst du mal den gesamten relevanten 
Codeteil für die RFM12 an deinen Post an.

Ich betreibe die RFM12 auch in einem selbstgebauten Handsender und sie 
funktionieren nach jedem aus- und einschalten problemlos.

Ciao,
     Rainer

Autor: Gaasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay sorry...
#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"
#include "rf12.h"

#define F_CPU 8000000UL
#include <util/delay.h>

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

#define SDI    3
#define SCK    5
#define CS    2
#define SDO    4

unsigned short rf12_trans(unsigned short wert)
{  unsigned char i;

  cbi(RF_PORT, CS);
  for (i=0; i<16; i++)
  {  if (wert&32768)
      sbi(RF_PORT, SDI);
    else
      cbi(RF_PORT, SDI);
    wert<<=1;
    if (RF_PIN&(1<<SDO))
      wert|=1;
    sbi(RF_PORT, SCK);
    asm("nop");
    asm("nop");
    cbi(RF_PORT, SCK);
  }
  sbi(RF_PORT, CS);
  return wert;
}

void rf12_init(void)
{
  RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
  RF_PORT=(1<<CS);

  for (unsigned char i=0; i<50; i++)
    _delay_ms(10);      // wait until POR done
  rf12_trans(0xC0E0);      // AVR CLK: 10MHz
  rf12_trans(0x80D7);      // Enable FIFO
  rf12_trans(0xC2AB);      // Data Filter: internal
  rf12_trans(0xCA81);      // Set FIFO mode
  rf12_trans(0xE000);      // disable wakeuptimer
  rf12_trans(0xC800);      // disable low duty cycle
  rf12_trans(0xC4F7);      // AFC settings: autotuning: -10kHz...+7,5kHz
}

void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
{
  rf12_trans(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
}

void rf12_setfreq(unsigned short freq)
{  if (freq<96)        // 430,2400MHz
    freq=96;
  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));  // R=(344828/8)/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, SDI);
  cbi(RF_PORT, CS);
  asm("nop");
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
}

void rf12_txdata(unsigned char *data, unsigned char number)
{  unsigned char i;
  rf12_trans(0x8238);      // TX on
  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();
  _delay_us(10);
  rf12_trans(0x8208);      // TX off
}

void rf12_rxdata(unsigned char *data, unsigned char number)
{  unsigned char i;
  rf12_trans(0x82C8);      // RX on
  rf12_trans(0xCA81);      // set FIFO mode
  rf12_trans(0xCA83);      // enable FIFO
  for (i=0; i<number; i++)
  {  rf12_ready();
    *data++=rf12_trans(0xB000);
  }
  rf12_trans(0x8208);      // RX off
}


Autor: Andreas W. (royalwithcheese)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein rf12_trans sieht so aus:
unsigned short rf12_trans(unsigned short wert)
{  unsigned short werti=0;
  unsigned char i;

  cbi(RF_PORT, CS);
  for (i=0; i<16; i++)
  {  if (wert&32768)
      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;
}

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hänge mal zum Test dicht an den Spannungsanschlüssen des RFM einen Elko 
10..22µF.
Ich hatte den Effekt, daß er nach dem Aufwecken aus dem Sleep manchmal 
nicht senden wollte, der Elko half zuverlässig.
Nach PowerOn außerdem als erste Amtshandlung beim Initialisieren den 
Status auslesen, sonst gab es bei mir trotz Wartezeit öfter keine 
Reaktion.

Gruß aus Berlin
Michael

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du auf deinem Steckbrett einen Elko? Ansonsten hat das Modul bei 
mir nach dem Anschalten ab und zu einfach nicht funktioniert. Lief dann 
aber spätestens nach einem Reset.

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.