mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM01 Problem


Autor: Maikel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

also erstmal ich weiß das es die Suchfunktion gibt nur ich sitze schon 
wochen an dem problem und weiß nicht wo mein fehler ist.

Ich empfange einfach nichts ich hab echt alles was mir möglich war 
versucht aber ich checks nicht.

Also das Progamm läuft bis zum nIRQ Polling und da gehts nicht weiter.
Ich denke also das dass polling nicht funktioniert weiß aber nicht wieso 
nicht.

Ich betötige glaube ich keine Links zu anderen beiträgen mehr, da ich eh 
schon alle gelesen habe, und überall was anderes steht. (Das verwirrt 
mich)

Ich hoffe Ihr könnt mir helfen, und VIELEN DANK

PS: Das ist der Code von Pollin in dem ich soweit nur die belegung 
geändert habe. Und ja ich weiß der ist nicht sehr aufgeräumt.

Den Schaltplan habe ich auch mal angehangen.

Ich arbeite mit AVR-Studio 4
Configuration:
atmega8
8000000 hz
optimierung O0 (bei allem anderen funktioniert nicht mal die led)
/********************************************************************
Bobycar-Empfänger
RFM01-Funkmodul (Empfangen)
Maikel Rehl

Prozessor: ATMEGA8
Frequenz: 434MHz
Datenrate: 4.8kbps

----------------------------------------------------------------------
ATMEGA8           RFM01      ISP 6-Pin
----------------------------------------------------------------------
PC0               nSEL
PC1               SCK
PC2               SDI
PC4               nIRQ
PC3               SDO
PC5               DATA
PB1               LED1

PB3(MOSI)                    MOSI
PB4(MISO)                    MISO
PB5(SCK)                     SCK
PC6(RESET)                   RESET


*********************************************************************/
/* Apply fuses lfuse D4 hfuse D9 */

#include <avr/io.h>
#define DDR_IN 0
#define DDR_OUT 1
#define PORT_SEL PORTC
#define PIN_SEL PINC
#define DDR_SEL DDRC
#define PORT_SDI PORTC
#define PIN_SDI PINC
#define DDR_SDI DDRC
#define PORT_SCK PORTC
#define PIN_SCK PINC
#define DDR_SCK DDRC
#define PORT_SDO PORTC
#define PIN_SDO PINC
#define DDR_SDO DDRC
#define PORT_LED PORTB
#define DDR_LED DDRB
#define PB7 7
#define PB6 6// |
#define RFXX_SCK PC1// |
#define RFXX_SDO PC3// |RF_PORT
#define RFXX_SDI PC2// |
#define RFXX_SEL PC0// |
#define RFXX_DATA PC5// |
#define PB0 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 LED_OUTPUT() DDR_LED |= (1<<PB1)
#define LED_OFF() PORT_LED &= ~(1<<PB1)
#define LED_ON() PORT_LED |= (1<<PB1)
#define LED_TRG() PORT_LED ^= (1<<PB1)
unsigned char RF_RXBUF[22];

void RFXX_PORT_INIT(void){
  HI_SEL();
  HI_SDI();
  LOW_SCK();
  SEL_OUTPUT();
  SDI_OUTPUT();
  SDO_INPUT();
  SCK_OUTPUT();
  PORTC |= (1<<PC4);    //pull up on nIRQ
  DDRC &=~ (1<<PC4);
}

void Delay_ms(unsigned char amS){
  unsigned char i;
  unsigned int j;
  for(i=0;i<amS;i++)for(j=0;j<914;j++);
}

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);
}

unsigned char RF01_RDFIFO(void){
  unsigned char i,Result;
  LOW_SCK();
  LOW_SDI();
  LOW_SEL();
  for(i=0;i<16;i++){//skip status bits
    HI_SCK();
    HI_SCK();
    LOW_SCK();
    LOW_SCK();
  }
  Result=0;
  for(i=0;i<8;i++){//read fifo data byte
    Result<<=1;
    if(SDO_HI()){
      Result|=1;
    }
    HI_SCK();
    HI_SCK();
    LOW_SCK();
    LOW_SCK();
  };
  HI_SEL();
  return(Result);
}

int main(void)
{
  unsigned int intI,intJ;
  unsigned char i,j,ChkSum;
  for(intI=0;intI<10000;intI++)for(intJ=0;intJ<123;intJ++);

  //POWER ON indication: LED blink 3 times
  LED_OUTPUT();
  LED_OFF();
  for(i=0;i<3;i++){
    Delay_ms(200);
    LED_ON();
    Delay_ms(200);
    LED_OFF();
  }
  Delay_ms(200);

  RFXX_PORT_INIT();
  RFXX_WRT_CMD(0x0000);
  RFXX_WRT_CMD(0x898A);//134kHz
  RFXX_WRT_CMD(0xA640);//434MHz
  RFXX_WRT_CMD(0xC847);//4.8kbps
  RFXX_WRT_CMD(0xC69B);//AFC setting
  RFXX_WRT_CMD(0xC42A);//Clock recovery manual control,Digital filter,DQD=4
  RFXX_WRT_CMD(0xC240);//output 1.66MHz
  RFXX_WRT_CMD(0xC080);
  RFXX_WRT_CMD(0xCE88);//use FIFO
  RFXX_WRT_CMD(0xCE8B);
  RFXX_WRT_CMD(0xC081);//OPEN RX
  DDRC |= (1<<RFXX_DATA);
  i=0;
  DDRC &= ~(1<<PC4);    //nIRQ
  while(1){
    while(!(PINC&(1<<PC4))){//polling the nIRQ data
   LED_ON();
    Delay_ms(200);
    LED_OFF();
   Delay_ms(200);
      RF_RXBUF[i++]=RF01_RDFIFO();//read FIFO data
      if(i==18){
        RFXX_WRT_CMD(0xCE88); //reset FIFO for next frame recognition
        RFXX_WRT_CMD(0xCE8B);
        i=0;
        ChkSum=0;
        for(j=0;j<16;j++){
          ChkSum+=RF_RXBUF[j]; //calculate checksum
        }
        if(ChkSum==RF_RXBUF[16]){//frame check
          LED_ON();
          Delay_ms(200);
          LED_OFF();
    Delay_ms(200);
        }
      }
    }
  }
}

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner eine idee oder bin ich einfach in der falschen kategorie 
gelandet ?

Autor: Yaro (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Diese RFM-Dinger sind der letzte Scheiß! Ich hatte mal ein 
funkgesteuertes Auto damit gebaut.... Das teil ist immer abgestürzt! Ich 
konnte nur damit arbeiten, wenn ich es ständig neu initialisiert habe. 
Sie sind total anfällig für Spannungsstöße!
Außerdem sind die Datenblätter total dürftig!
So steht z.B. nirgendwo, daas sie eine startup-Zeit von mehrenen ms 
brauchen...

Naja... nun zu deinem Problem... versuch mal VDI mit nem Pullup auf High 
zu legen. Ich kann mich nciht mehr gut dran erinnern, aber irgendwas in 
der Richtung hatte ich auch... Aber der Pollin-Code ging bei mir ganz 
gut (zumindest auf dem Steckbrett). Ansonsten musst du dich mal durch 
google suchen... da findet man einige Anhaltspunkte...
Im Moment habe ich das Auto, das ich gebaut habe nicht hier... Habe dort 
nicht 100% Schaltplangetreu gebaut... aber ich kann dir meinen Code 
posten...
Damit kann man ein Array empfangen, was gesendet wird. (Senderoutinen 
sind auch dabei). Der Code ist schon älter, da habe ich grad mit 
Programmieren richtig angefangen... also nicht wundern, falls was nicht 
so schön ist. Redundanz ist aber z.T. erwünscht.

Autor: Markus J. (markusj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yaro schrieb:
> Diese RFM-Dinger sind der letzte Scheiß!

Bitte etwas differenzierter Betrachten!
Mit der nötigen Sorgfalt und Geduld, arbeiten diese Module meinem 
Eindruck nach ganz zuverlässig, selbst wenn man sich dabei an die untere 
Grenze des zulässigen Spannungsbereichs annähert ...

Spannungsstöße: Bessere Entkoppelung
Startup-Time: Ist vermutlich im Datenblatt unter AC-Characteristics 
(etwas verschleiert) aufgeschlüsselt in POR-Reset-Puls und die 
Startup-Time der verschiedenen Blöcke.
Schlechtes Datenblatt: Jein, wenn man das ganze dreimal vorwärts und 
rückwärts gelesen (und vielleicht noch mit den fast identischen 
SiLabs-Chips verglichen) hat, passt das schon. Teilweise wird mit 
(unerklärten) Begriffen und Abkürzungen rumgeschmissen, die man nur 
durch einen Blick in die Glaskugel entschlüsseln kann.

Als Minimalbeschaltung reichen nSEL, SDI, SCK und SDO am µC, ferner DATA
(und evtl. nRES) via Pullup an VCC - und natürlich GND und VCC selbst
...
CLK und DCLK braucht man normalerweise nicht, nIRQ (geht auch über SDI) 
ebenfalls, VDI ist
nice-to-have wenn man etwa vor hat, eine Art Sendersuchlauf o.ä. zu
Programmieren - wobei man das auch ohne VDI machen kann ...

mfG
Markus

Autor: Frank B. (frank501)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yaro schrieb:
> Diese RFM-Dinger sind der letzte Scheiß!

fully ACK


Kauf Dir lieber die BTM112 oder für höherer Reichweite die BTM222 
Module. Die brauchen nicht so viele Pins am µC, man kann sie an den PC 
anschließen und sie sind wesentlich einfacher zu benutzen.
Die 10€ die die Bluetoothmodule mehr kosten sind durch den geringeren 
Zeitaufwand auch im Hobbybereich schnell wieder eingespielt.

Frank

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank schon mal an alle die mir versuchen zu helfen, besonders an 
Yaro.
Dein Code hat mich schon weitergebracht.
Hab jetzt meine Code mit den ideen aus deinem überarbeitet, aber jetzt 
scheint der immer zu empfängen obwohl ich gar nichts sende.
ich leg mal eben den neuen code offen.

die pinbelegung stimmt jetzt nihct mehr mit dem ersten code überein da 
ich es jetzt zum testen auf nem bread board habe.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define PORT_SEL PORTB
#define DDR_SEL DDRB
#define PORT_SDI PORTB
#define DDR_SDI DDRB
#define PORT_SCK PORTB
#define DDR_SCK DDRB
#define PORT_SDO PORTB
#define PIN_SDO PINB    //achtung, nicht PORT, sondern PIN
#define DDR_SDO DDRB
#define DDR_nIRQ DDRD
#define PIN_nIRQ PIND   //achtung, nicht PORT, sondern PIN

#define PORT_LED PORTD
#define DDR_LED DDRD

#define RFM_SCK 5// |
#define RFM_SDO 4// |RF_PORT
#define RFM_SDI 6// |
#define RFM_SEL 2// |
#define RFM_nIRQ 2

#define SEL_OUTPUT() DDR_SEL |= (1<<RFM_SEL)  //ab hier defines automatisch
#define HI_SEL() PORT_SEL |= (1<<RFM_SEL)
#define LOW_SEL() PORT_SEL &= ~(1<<RFM_SEL)
#define SDI_OUTPUT() DDR_SDI |= (1<<RFM_SDI)
#define HI_SDI() PORT_SDI |= (1<<RFM_SDI)
#define LOW_SDI() PORT_SDI &= ~(1<<RFM_SDI)
#define SDO_INPUT() DDR_SDO &= ~(1<<RFM_SDO)
#define SDO_HI() PIN_SDO&(1<<RFM_SDO)
#define SCK_OUTPUT() DDR_SCK |= (1<<RFM_SCK)
#define HI_SCK() PORT_SCK |= (1<<RFM_SCK)
#define LOW_SCK() PORT_SCK &= ~(1<<RFM_SCK)
#define nIRQ_INPUT() DDR_nIRQ &= ~(1<<RFM_nIRQ)
#define LOW_nIRQ() !(PIN_nIRQ&(1<<RFM_nIRQ))    //bis hier

#define LED_OUTPUT() DDR_LED |= ((1<<5)|(1<<4)) //+Module-Power
#define LED_OFF() PORT_LED &= ~(1<<5)
#define LED_ON() PORT_LED |= (1<<5)
#define LED_TRG() PORT_LED ^= (1<<5)
#define MODULE_OFF() PORT_LED &= ~(1<<4)
#define MODULE_ON() PORT_LED |= (1<<4)

unsigned char RF_RXBUF[22];

void RFXX_PORT_INIT(void){
  HI_SEL();
  HI_SDI();
  LOW_SCK();
  SEL_OUTPUT();
  SDI_OUTPUT();
  SDO_INPUT();
  SCK_OUTPUT();
  nIRQ_INPUT();
}

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);
}

unsigned char RF01_RDFIFO(void){
  unsigned char i,Result;
  LOW_SCK();
  LOW_SDI();
  LOW_SEL();
  for(i=0;i<16;i++){//skip status bits
    HI_SCK();
    HI_SCK();
    LOW_SCK();
    LOW_SCK();
  }
  Result=0;
  for(i=0;i<8;i++){//read fifo data byte
    Result<<=1;
    if(SDO_HI()){
      Result|=1;
    }
    HI_SCK();
    HI_SCK();
    LOW_SCK();
    LOW_SCK();
  };
  HI_SEL();
  return(Result);
}

int main(void)
{
  unsigned int intI,intJ;
  unsigned char i,j,ChkSum;
  for(intI=0;intI<10000;intI++)for(intJ=0;intJ<123;intJ++);

  //POWER ON indication: LED blink 3 times
  LED_OUTPUT();
  LED_OFF();
  for(i=0;i<3;i++){
    _delay_ms(1000);
    LED_ON();
    _delay_ms(1000);
    LED_OFF();
  }
  _delay_ms(1500);

  RFXX_PORT_INIT();
  RFXX_WRT_CMD(0x0000);
  RFXX_WRT_CMD(0x898A);//134kHz
  RFXX_WRT_CMD(0xA640);//434MHz
  RFXX_WRT_CMD(0xC847);//4.8kbps
  RFXX_WRT_CMD(0xC69B);//AFC setting
  RFXX_WRT_CMD(0xC42A);//Clock recovery manual control,Digital filter,DQD=4
  RFXX_WRT_CMD(0xC240);//output 1.66MHz
  RFXX_WRT_CMD(0xC080);
  RFXX_WRT_CMD(0xCE88);//use FIFO
  RFXX_WRT_CMD(0xCE8B);
  RFXX_WRT_CMD(0xC081);//OPEN RX

  //DDRC |= (1<<RFXX_DATA);
  i=0;
  while(1){
    while(!LOW_nIRQ()){//polling the nIRQ data
      RF_RXBUF[i++]=RF01_RDFIFO();//read FIFO data
      if(i==18){
        RFXX_WRT_CMD(0xCE88); //reset FIFO for next frame recognition
        RFXX_WRT_CMD(0xCE8B);
        i=0;
        ChkSum=0;
        for(j=0;j<16;j++){
          ChkSum+=RF_RXBUF[j]; //calculate checksum
        }
        if(ChkSum==RF_RXBUF[16]){//frame check
          LED_ON();
          _delay_ms(1000);
          LED_OFF();
      _delay_ms(1000);
        }
      }
    }
  }
}

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ! ist bei LOW_nIRQ() schon eingebaut. Du machst sozusagen doppelte 
Verneinung.

Gruß, Yaro

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hast du ja auch einen fiesen Nachbarn, der ständig mit einem 
RFM sendet und dich so verarschen will... Deswegen empfängst du auch 
ständig was! =)

Autor: maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:D ja genau.
ne das wird nicht der fall sein.
ok das mit der doppelverneinung stimmt das änder ich gleich mal.

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was hattest du bei den einstellungen eingestellt ?
frequenz und optimierung ?

Autor: Matthias Reichelt (reichema)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kann von den Modulen nur gutes Berichten. Ich muss ehrlich zugeben 
ich verwende in dem Fall Schaltungen und Programmteile wie RFM12.c ( 
z.B. von Benedikt ) aus den Forum hier. Sie dienen mir als Komponenten 
ohne sie weiter untersuchen zu müssen. So kann ich mich auf das 
Hauptprogramm konzentrieren.

Die RFM Software Komponenten von Benedikt lassen sich ungesehen in 
andere Software einbauen und funktionierten bei mir auf anhieb.

Ich habe RFM01, RFM02 und RFM12 Komponenten als Hausbus im Einsatz ( 
dort wo ich kein Kabel liegen habe ) und die Funkversorgung vom Haus und 
Grundstück ist gedeckt. Sogar aus dem geschlossenen Stromzählerkasten 
aus Blech kann ich Daten ins ganze Haus schicken.

Falls Du nicht weiterkommst kann ich Dir eine einfache Schaltung mit 
wenigen Bauteilen ( ATMEGA8, LCD Modul und RFM01 ) und Software zukommen 
lassen.

Grüße
Matthias

Autor: maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das wäre der hammer wenn du das machen würdest.
ich hab auch ein lcd display hier.
aber ich wünsche mir einfach das meine übertragung überhaupt mal klappt.
was vielleicht noch wichtig ist, ich habe keine antennen dran die module 
liegen aber nebeneinander.

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal erstmal 8cm Litze als Antenne dran... Dann sollte es 
funktionieren...

Autor: Matthias Reichelt (reichema)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

hier eine Version eines RFM01 Empfängers mit LCD und noch ein paar 
Spielereien.

Das ganze habe ich verwendet um Daten vom meinem Stromzähler zu 
empfangen und anzuzeigen. Den Teil des LED Balkens im Schaltplan und die 
Erkennung der Empfangstexte kannst Du ignorieren.

Ich habe auch einen Kontrollempfänger gebaut, der nur aus ATMEGA8, LCD 
und RFM12 besteht. Er zeigt alles an, was empfangen wird. Dein Thema ist 
aber mehr der RFM01 und außerdem habe ich nicht nur eine schlechte 
sondern keine Dokumentation zum dem Bauvorhaben.

Also hier meine Vorversion des Remote Display meines Stromzählers, die 
noch in der ersten Zeile des LCD zu Kontrollzwecken jeden empfangenen 
Text anzeigt ( Erste 16 Zeichen ).  Egal was empfangen wurde. Die ist 
das was Dich interessiert. Wenn es funktioniert kannst Du den Code zu 
Deinen Zwecken anpassen.

Achtung: Ich verwende 19200Bd auf 433.300Mhz. Bei Bedarf muss dies 
angepasst werden.

Bist Du eigentlich sicher dass der Sender funktioniert ?

Benedikt K. hat unter Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module" die 
Software für RFM01 RFM02 und RFM12 verteilt, die ich auch verwende. Sie 
sendet die empfangenen Daten seriell z.B an einen PC. Gepostet am 
16.04.2007. Für Testzwecke ist das vielleicht einfacher. Dort gibt es 
auch die Sendesoftware.

Ich habe auch gesehen dass Du Ende letzten Jahres das Thema hier im 
Forum schonmal aufgemacht hast. Was ist damals daraus geworden ?

Grüße

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche das gerade auch mit den Codes von Benedikt hab auch gestern 
schon viel drin gelesen.
Ich hatte es damals aufgegeben und wollte mich jetzt nochmal dran 
setzten.
Und vielen Dank für dein Code, ich les mir das jetzt mal durch.

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt die Codes von benedikt getestet und auf den sender und 
den empfänger gespielt.

im main mit F_CPU 8000000UL
und in der rf01/02 mit F_CPU 10000000UL
ich weiß zwar nicht wieso das unterschiedlich sein soll aber du hattest 
es bei dir auch so.

Aber woher weiß ich welche Baudrate ich für die module einstellen soll, 
habe jetzt auch mal 19200 gemacht.

Naja auf jeden fall habe ich beim empfänger das empfangene an den uart 
ausgegeben, aber da kommt leider nichts an.

Ich werde es einfach mal weiter versuchen.

Autor: Wayne Monga (vibra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du
#include <util/delay.h>
einbindest ,solltest du dem Compiler schon den richtigen Wert der 
Quarz/Taktfrequenz mitteilen.
Wenn deine delays nicht stimmen ... stimmt nacher garnichts mehr..

#ifndef F_CPU
#define F_CPU X000000UL /* Quarz/InternerOz mit ,,Mhz */
#endif
#include <util/delay.h>

Das #define gehört vor das #include

mfg

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein mega8 ist auf 8Mhz intern gestellt und der rfm auf 10Mhz
also ist das dann schon richtig ne wenn ich in der main.c 800000UL und 
in der rf.c 10000000UL verwende.
ja das define hab ich vor dem include

ich habe die optimierung auch mal auf O2 gestellt weil anscheind das 
beste für die rfm sein soll.

Autor: Markus J. (markusj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ARGH
Wie wäre es wenn du dir zum AVR-Lernen ein anderes Projekt suchst?
1. F_CPU meint NUR, AUSSCHLIEßLICH die Taktfrequenz des AVR. IMMER
2. afaik sind Os und O2 für AVRs die beiden besten Optimierungsstufen, 
das muss man einfach Mal ausprobieren, ich arbeite normalerweise mit Os. 
Das hängt aber NICHT vom RFM0x-Modul ab, sondern einzig und alleine 
von deinem Programmcode (und der verwendeten Compiler-Version ...)
3. Solltest du bei beiden erst einmal eine niedrige Baudrate einstellen 
und dann dafür sorgen, dass beide auf der gleichen Frequenz funken 
(evtl. noch feintunen). Ob/Was der Empfänger reinbekommt, sagt dir das 
Statusregister.

Hast du eigentlich inzwischen das (richtige) Datenblatt durchgelesen?

hmpf
Markus

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal danke für deine Antwort.

Ich habe schon vorher bisschen was mit AVR gemacht, z.b. lichsteuerungen 
oder LCD ansteuerung, ging alles ohne probleme, nur ich versteh es 
einfach nicht wieso diese rfm dinger bei mir nicht so wollen wie ich das 
will, deswegen hinterfrag ich nochmal alles.

Das (richtige) Datenblatt habe ich gelesen aber nicht ganz.
Optimierung verwende ich normal auch Os, aber ich thread von Benedikt 
wird O2 empfohlen.

Autor: Matthias Reichelt (reichema)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss nicht warum es da solche Probleme gibt. Ich kann mir nur 
vorstellen, dass ein Problem mit dem Sender besteht oder die Verkabelung 
ist nicht richtig. Ich würde einfach alles so aufbauen wie es Benedikt 
beschrieben hat. Nichts mehr und nichts weniger. Nichts an der Software 
herumschrauben. Mach alles so wie beschrieben und dann klappt es.

Autor: Maikel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe anstatt der pullup widerstände den internen pullup das mega8 
verwendet, weil ich die auf der platine eh angeschlossen hatte.
Ich habe jetzt ausschließlich nur die belegung geändert, und im 
empfänger den UART in der main zum empfangen der daten eingebaut. Der 
UART funktionier aber zu 100%.

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

#define SDI    5  // SDI,  -> RF02
#define SCK    6  // SCK,  -> RF02
#define CS    7  // nSEL, -> RF02
#define SDO    0  // SDO,  <- RF02

// nFFS: 1-10k Pullup an Vcc !!!

Meins
#define RF_PORT  PORTC
#define RF_DDR  DDRC
#define RF_PIN  PINC

#define SDI    2  // SDI,  -> RF02
#define SCK    1  // SCK,  -> RF02
#define CS    0  // nSEL, -> RF02
#define SDO    3  // SDO,  <- RF02
#define nFFS    5 //Interner Pullup

//nirq an PC4 angeschlossen aber nicht verwendet
// nFFS: 1-10k Pullup an Vcc !!!

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

#define SDI    0  // SDI,  -> RF02
#define SCK    1  // SCK,  -> RF02
#define CS    2  // nSEL, -> RF02
#define IRQ    4  // nIRQ, <- RF02

// FSK: Pullup oder Pulldown

Meins
#define RF_PORT  PORTD
#define RF_DDR  DDRD
#define RF_PIN  PIND

#define SDI    3  // SDI,  -> RF02
#define SCK    4  // SCK,  -> RF02
#define CS    5  // nSEL, -> RF02
#define IRQ    2  // nIRQ, <- RF02
#define FSK     6  // FSK RF02 (intern pullup)

// FSK: Pullup oder Pulldown

Autor: Maikel R. (maikel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei mir ist jetzt das prolem das der empfänger nicht aus der 
empfangsrotine raus kommt.
Das programm bleibt immer in der rf01_rxdata() hängen.

10Mhz am CLK kommen an, und der Sender funktioniert ebenfalls.

Ich weiß echt nich was ich falsch mache, hab nur die ports geändert, und 
den uart eingebaut.

Kann es daran liegen das ich anstatt 1-10k ann vcc, den internen pullup 
nutze ?

Meine Fuses sind, sind die vielleicht Falsch ? Nutze 8Mhz intern.
lfuse:D4
hfuse:D9

Autor: Matthias Reichelt (reichema)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem mit dem hängenbleiben hatte ich auch als ich die SW von 
Benedikt verwendet habe. Sie ist so geschrieben, dass wenn der Empfänger 
eingeschaltet wird solange gewartet wird bis etwas empfangen wurde.

Ich habe den Code nicht hier aber schaut mal in der RFM01.c nach einer 
while schleife. Wenn ich mich recht erinner habe ich dort nach einer 
Anzahl von Zyklen abgebrochen. Du kannst auch in der RFM01.c 
nachschauen, die ich zuvor hier gepostet habe. Dies ist schon die 
modifizierte version.

Grüße

Autor: Maikel R. (maikel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso okay vielen dank für deine antwort, ich gucke gleich mal nach.
Ich hoffe das es dann funktioniert.

Autor: Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- Kondensator an Reset PIN ist quasi Plicht!
- Stützkondensatoren beim RF Modul verwenden!
- laut Schaltplan arbeitest du mit dem internen Clock >> 8000000 hz
  macht keinen Sinn!
- Wieso hast du die SPI Pins des RF moduls nicht an die SPI Leitungen 
des
Controllers gelegt?

Autor: Maikel R. (maikel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau ich arbeite mit 8mhz intern, wieso macht das keinen sinn ?
ich habe an spi leitung nur die ISP schnittstelle aber das ist doch auch 
egal, ich kann den rfm ja anschließen wo ich möchte.

Ein kondensator am reset pin hab ich bisher noch nicht gesehen, wenn 
dann nur pullup widerstand.

Kondensator am rfm okay das macht sinn, aber wie du in der schaltung 
siehst hab ich unmittelbar davor ein kondensator eingebaut.

Autor: Tester (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen

1.

ok 8mhz ist ok. Ich verwende meistens einen externen clock und hab nicht 
gewusst, dass der interne bis 8MHz geht.

2.

Sieh dir mal meinen Anhang an (Kapitel 3)
Du hast ja nicht ganz unrecht, in 99% der Fälle wird es nichts 
ausmachen, ich bevorzuge aber immer die sichere Variante.

3. Entweder filtert mein Auge Kondensatoren oder ich bin total blind. 
Falls du C1 meinst ist das kein Stützkondensator für das Funkmodul 
sondern schon vom 7805er Datenblatt vorgesehen. Grundsätzlich immer 
jedem IC einen Kondensator gönnen. Davon wird man afaik nicht arm.

Schöne Grüße!

Autor: Maikel R. (maikel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

erstmal vielen dank und super von dir das du dir die mühe macht und 
sogar datenblätter anhängst ;)

Ne den C1 meinte ich nicht, ich meinte C3 der ist auf der Platine 
unmittelbar mit dem mega8 und dem rfm verbunden (sieht man im schaltplan 
nicht), aber alles kla ich werde mal noch einen einlöten hab noch einige 
hier die paar cent tun nicht weh da hast du schon recht.

Kleine zwischenfrage, was stellst du bei avr ein wenn einen externen 
quartz verwendest weil ich komm da was durcheinander.
Weil bei den RC gleidern steht 3-8MHz und dann noch 8-12MHz, aber es 
sind ja keine RC glieder. Und bei den anderen dadrunter steht nut 
Low-frequency, mid oder hight.

Autor: Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh dir mal das an!

Eine bessere (einfachere) als diese Beschreibung der Fuses gibt es 
eigentlich nicht. Als ich das einmal gefunden habe war ich überglücklich 
weil ich mich anfangs jedesmal mit diesen Fuses herumgeärgert habe!

http://halvar.at/elektronik/kleiner_bascom_avr_kur...

Sollte auch das noch unklar sein meldest du dich hald wieder

Autor: Maikel R. (maikel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wow danke das war echt gut :)
dann kann ich mich jetzt wieder weiter meinem problem widmen

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.