Forum: Mikrocontroller und Digitale Elektronik RFM01 Problem


von Maikel (Gast)


Angehängte Dateien:

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)
1
/********************************************************************
2
Bobycar-Empfänger
3
RFM01-Funkmodul (Empfangen)
4
Maikel Rehl
5
6
Prozessor: ATMEGA8
7
Frequenz: 434MHz
8
Datenrate: 4.8kbps
9
10
----------------------------------------------------------------------
11
ATMEGA8           RFM01      ISP 6-Pin
12
----------------------------------------------------------------------
13
PC0               nSEL
14
PC1               SCK
15
PC2               SDI
16
PC4               nIRQ
17
PC3               SDO
18
PC5               DATA
19
PB1               LED1
20
21
PB3(MOSI)                    MOSI
22
PB4(MISO)                    MISO
23
PB5(SCK)                     SCK
24
PC6(RESET)                   RESET
25
26
27
*********************************************************************/
28
/* Apply fuses lfuse D4 hfuse D9 */
29
30
#include <avr/io.h>
31
#define DDR_IN 0
32
#define DDR_OUT 1
33
#define PORT_SEL PORTC
34
#define PIN_SEL PINC
35
#define DDR_SEL DDRC
36
#define PORT_SDI PORTC
37
#define PIN_SDI PINC
38
#define DDR_SDI DDRC
39
#define PORT_SCK PORTC
40
#define PIN_SCK PINC
41
#define DDR_SCK DDRC
42
#define PORT_SDO PORTC
43
#define PIN_SDO PINC
44
#define DDR_SDO DDRC
45
#define PORT_LED PORTB
46
#define DDR_LED DDRB
47
#define PB7 7
48
#define PB6 6// |
49
#define RFXX_SCK PC1// |
50
#define RFXX_SDO PC3// |RF_PORT
51
#define RFXX_SDI PC2// |
52
#define RFXX_SEL PC0// |
53
#define RFXX_DATA PC5// |
54
#define PB0 0//--/
55
#define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
56
#define HI_SEL() PORT_SEL |= (1<<RFXX_SEL)
57
#define LOW_SEL() PORT_SEL &= ~(1<<RFXX_SEL)
58
#define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
59
#define HI_SDI() PORT_SDI |= (1<<RFXX_SDI)
60
#define LOW_SDI() PORT_SDI &= ~(1<<RFXX_SDI)
61
#define SDO_INPUT() DDR_SDO &= ~(1<<RFXX_SDO)
62
#define SDO_HI() PIN_SDO&(1<<RFXX_SDO)
63
#define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK)
64
#define HI_SCK() PORT_SCK |= (1<<RFXX_SCK)
65
#define LOW_SCK() PORT_SCK &= ~(1<<RFXX_SCK)
66
#define LED_OUTPUT() DDR_LED |= (1<<PB1)
67
#define LED_OFF() PORT_LED &= ~(1<<PB1)
68
#define LED_ON() PORT_LED |= (1<<PB1)
69
#define LED_TRG() PORT_LED ^= (1<<PB1)
70
unsigned char RF_RXBUF[22];
71
72
void RFXX_PORT_INIT(void){
73
  HI_SEL();
74
  HI_SDI();
75
  LOW_SCK();
76
  SEL_OUTPUT();
77
  SDI_OUTPUT();
78
  SDO_INPUT();
79
  SCK_OUTPUT();
80
  PORTC |= (1<<PC4);    //pull up on nIRQ
81
  DDRC &=~ (1<<PC4);
82
}
83
84
void Delay_ms(unsigned char amS){
85
  unsigned char i;
86
  unsigned int j;
87
  for(i=0;i<amS;i++)for(j=0;j<914;j++);
88
}
89
90
unsigned int RFXX_WRT_CMD(unsigned int aCmd){
91
  unsigned char i;
92
  unsigned int temp;
93
  LOW_SCK();
94
  LOW_SEL();
95
  for(i=0;i<16;i++){
96
    temp<<=1;
97
    if(SDO_HI()){
98
      temp|=0x0001;
99
    }
100
    LOW_SCK();
101
    if(aCmd&0x8000){
102
      HI_SDI();
103
      }else{
104
      LOW_SDI();
105
    }
106
    HI_SCK();
107
    aCmd<<=1;
108
  };
109
  LOW_SCK();
110
  HI_SEL();
111
  return(temp);
112
}
113
114
unsigned char RF01_RDFIFO(void){
115
  unsigned char i,Result;
116
  LOW_SCK();
117
  LOW_SDI();
118
  LOW_SEL();
119
  for(i=0;i<16;i++){//skip status bits
120
    HI_SCK();
121
    HI_SCK();
122
    LOW_SCK();
123
    LOW_SCK();
124
  }
125
  Result=0;
126
  for(i=0;i<8;i++){//read fifo data byte
127
    Result<<=1;
128
    if(SDO_HI()){
129
      Result|=1;
130
    }
131
    HI_SCK();
132
    HI_SCK();
133
    LOW_SCK();
134
    LOW_SCK();
135
  };
136
  HI_SEL();
137
  return(Result);
138
}
139
140
int main(void)
141
{
142
  unsigned int intI,intJ;
143
  unsigned char i,j,ChkSum;
144
  for(intI=0;intI<10000;intI++)for(intJ=0;intJ<123;intJ++);
145
146
  //POWER ON indication: LED blink 3 times
147
  LED_OUTPUT();
148
  LED_OFF();
149
  for(i=0;i<3;i++){
150
    Delay_ms(200);
151
    LED_ON();
152
    Delay_ms(200);
153
    LED_OFF();
154
  }
155
  Delay_ms(200);
156
157
  RFXX_PORT_INIT();
158
  RFXX_WRT_CMD(0x0000);
159
  RFXX_WRT_CMD(0x898A);//134kHz
160
  RFXX_WRT_CMD(0xA640);//434MHz
161
  RFXX_WRT_CMD(0xC847);//4.8kbps
162
  RFXX_WRT_CMD(0xC69B);//AFC setting
163
  RFXX_WRT_CMD(0xC42A);//Clock recovery manual control,Digital filter,DQD=4
164
  RFXX_WRT_CMD(0xC240);//output 1.66MHz
165
  RFXX_WRT_CMD(0xC080);
166
  RFXX_WRT_CMD(0xCE88);//use FIFO
167
  RFXX_WRT_CMD(0xCE8B);
168
  RFXX_WRT_CMD(0xC081);//OPEN RX
169
  DDRC |= (1<<RFXX_DATA);
170
  i=0;
171
  DDRC &= ~(1<<PC4);    //nIRQ
172
  while(1){
173
    while(!(PINC&(1<<PC4))){//polling the nIRQ data
174
   LED_ON();
175
    Delay_ms(200);
176
    LED_OFF();
177
   Delay_ms(200);
178
      RF_RXBUF[i++]=RF01_RDFIFO();//read FIFO data
179
      if(i==18){
180
        RFXX_WRT_CMD(0xCE88); //reset FIFO for next frame recognition
181
        RFXX_WRT_CMD(0xCE8B);
182
        i=0;
183
        ChkSum=0;
184
        for(j=0;j<16;j++){
185
          ChkSum+=RF_RXBUF[j]; //calculate checksum
186
        }
187
        if(ChkSum==RF_RXBUF[16]){//frame check
188
          LED_ON();
189
          Delay_ms(200);
190
          LED_OFF();
191
    Delay_ms(200);
192
        }
193
      }
194
    }
195
  }
196
}

von Maikel (Gast)


Lesenswert?

hat keiner eine idee oder bin ich einfach in der falschen kategorie 
gelandet ?

von Yaro (Gast)


Angehängte Dateien:

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.

von Markus J. (markusj)


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

von Frank B. (frank501)


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

von Maikel (Gast)


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.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
#define PORT_SEL PORTB
6
#define DDR_SEL DDRB
7
#define PORT_SDI PORTB
8
#define DDR_SDI DDRB
9
#define PORT_SCK PORTB
10
#define DDR_SCK DDRB
11
#define PORT_SDO PORTB
12
#define PIN_SDO PINB    //achtung, nicht PORT, sondern PIN
13
#define DDR_SDO DDRB
14
#define DDR_nIRQ DDRD
15
#define PIN_nIRQ PIND   //achtung, nicht PORT, sondern PIN
16
17
#define PORT_LED PORTD
18
#define DDR_LED DDRD
19
20
#define RFM_SCK 5// |
21
#define RFM_SDO 4// |RF_PORT
22
#define RFM_SDI 6// |
23
#define RFM_SEL 2// |
24
#define RFM_nIRQ 2
25
26
#define SEL_OUTPUT() DDR_SEL |= (1<<RFM_SEL)  //ab hier defines automatisch
27
#define HI_SEL() PORT_SEL |= (1<<RFM_SEL)
28
#define LOW_SEL() PORT_SEL &= ~(1<<RFM_SEL)
29
#define SDI_OUTPUT() DDR_SDI |= (1<<RFM_SDI)
30
#define HI_SDI() PORT_SDI |= (1<<RFM_SDI)
31
#define LOW_SDI() PORT_SDI &= ~(1<<RFM_SDI)
32
#define SDO_INPUT() DDR_SDO &= ~(1<<RFM_SDO)
33
#define SDO_HI() PIN_SDO&(1<<RFM_SDO)
34
#define SCK_OUTPUT() DDR_SCK |= (1<<RFM_SCK)
35
#define HI_SCK() PORT_SCK |= (1<<RFM_SCK)
36
#define LOW_SCK() PORT_SCK &= ~(1<<RFM_SCK)
37
#define nIRQ_INPUT() DDR_nIRQ &= ~(1<<RFM_nIRQ)
38
#define LOW_nIRQ() !(PIN_nIRQ&(1<<RFM_nIRQ))    //bis hier
39
40
#define LED_OUTPUT() DDR_LED |= ((1<<5)|(1<<4)) //+Module-Power
41
#define LED_OFF() PORT_LED &= ~(1<<5)
42
#define LED_ON() PORT_LED |= (1<<5)
43
#define LED_TRG() PORT_LED ^= (1<<5)
44
#define MODULE_OFF() PORT_LED &= ~(1<<4)
45
#define MODULE_ON() PORT_LED |= (1<<4)
46
47
unsigned char RF_RXBUF[22];
48
49
void RFXX_PORT_INIT(void){
50
  HI_SEL();
51
  HI_SDI();
52
  LOW_SCK();
53
  SEL_OUTPUT();
54
  SDI_OUTPUT();
55
  SDO_INPUT();
56
  SCK_OUTPUT();
57
  nIRQ_INPUT();
58
}
59
60
unsigned int RFXX_WRT_CMD(unsigned int aCmd){
61
  unsigned char i;
62
  unsigned int temp;
63
  LOW_SCK();
64
  LOW_SEL();
65
  for(i=0;i<16;i++){
66
    temp<<=1;
67
    if(SDO_HI()){
68
      temp|=0x0001;
69
    }
70
    LOW_SCK();
71
    if(aCmd&0x8000){
72
      HI_SDI();
73
      }else{
74
      LOW_SDI();
75
    }
76
    HI_SCK();
77
    aCmd<<=1;
78
  };
79
  LOW_SCK();
80
  HI_SEL();
81
  return(temp);
82
}
83
84
unsigned char RF01_RDFIFO(void){
85
  unsigned char i,Result;
86
  LOW_SCK();
87
  LOW_SDI();
88
  LOW_SEL();
89
  for(i=0;i<16;i++){//skip status bits
90
    HI_SCK();
91
    HI_SCK();
92
    LOW_SCK();
93
    LOW_SCK();
94
  }
95
  Result=0;
96
  for(i=0;i<8;i++){//read fifo data byte
97
    Result<<=1;
98
    if(SDO_HI()){
99
      Result|=1;
100
    }
101
    HI_SCK();
102
    HI_SCK();
103
    LOW_SCK();
104
    LOW_SCK();
105
  };
106
  HI_SEL();
107
  return(Result);
108
}
109
110
int main(void)
111
{
112
  unsigned int intI,intJ;
113
  unsigned char i,j,ChkSum;
114
  for(intI=0;intI<10000;intI++)for(intJ=0;intJ<123;intJ++);
115
116
  //POWER ON indication: LED blink 3 times
117
  LED_OUTPUT();
118
  LED_OFF();
119
  for(i=0;i<3;i++){
120
    _delay_ms(1000);
121
    LED_ON();
122
    _delay_ms(1000);
123
    LED_OFF();
124
  }
125
  _delay_ms(1500);
126
127
  RFXX_PORT_INIT();
128
  RFXX_WRT_CMD(0x0000);
129
  RFXX_WRT_CMD(0x898A);//134kHz
130
  RFXX_WRT_CMD(0xA640);//434MHz
131
  RFXX_WRT_CMD(0xC847);//4.8kbps
132
  RFXX_WRT_CMD(0xC69B);//AFC setting
133
  RFXX_WRT_CMD(0xC42A);//Clock recovery manual control,Digital filter,DQD=4
134
  RFXX_WRT_CMD(0xC240);//output 1.66MHz
135
  RFXX_WRT_CMD(0xC080);
136
  RFXX_WRT_CMD(0xCE88);//use FIFO
137
  RFXX_WRT_CMD(0xCE8B);
138
  RFXX_WRT_CMD(0xC081);//OPEN RX
139
140
  //DDRC |= (1<<RFXX_DATA);
141
  i=0;
142
  while(1){
143
    while(!LOW_nIRQ()){//polling the nIRQ data
144
      RF_RXBUF[i++]=RF01_RDFIFO();//read FIFO data
145
      if(i==18){
146
        RFXX_WRT_CMD(0xCE88); //reset FIFO for next frame recognition
147
        RFXX_WRT_CMD(0xCE8B);
148
        i=0;
149
        ChkSum=0;
150
        for(j=0;j<16;j++){
151
          ChkSum+=RF_RXBUF[j]; //calculate checksum
152
        }
153
        if(ChkSum==RF_RXBUF[16]){//frame check
154
          LED_ON();
155
          _delay_ms(1000);
156
          LED_OFF();
157
      _delay_ms(1000);
158
        }
159
      }
160
    }
161
  }
162
}

von Yaro (Gast)


Lesenswert?

Das ! ist bei LOW_nIRQ() schon eingebaut. Du machst sozusagen doppelte 
Verneinung.

Gruß, Yaro

von Yaro (Gast)


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! =)

von maikel (Gast)


Lesenswert?

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

von Maikel (Gast)


Lesenswert?

was hattest du bei den einstellungen eingestellt ?
frequenz und optimierung ?

von Matthias R. (reichema)


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

von maikel (Gast)


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.

von Yaro (Gast)


Lesenswert?

Mach mal erstmal 8cm Litze als Antenne dran... Dann sollte es 
funktionieren...

von Matthias R. (reichema)


Angehängte Dateien:

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

von Maikel (Gast)


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.

von Maikel (Gast)


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.

von Wayne M. (vibra)


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

von Maikel (Gast)


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.

von Markus J. (markusj)


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

von Maikel (Gast)


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.

von Matthias R. (reichema)


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.

von Maikel (Gast)


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
1
#define RF_PORT  PORTB
2
#define RF_DDR  DDRB
3
#define RF_PIN  PINB
4
5
#define SDI    5  // SDI,  -> RF02
6
#define SCK    6  // SCK,  -> RF02
7
#define CS    7  // nSEL, -> RF02
8
#define SDO    0  // SDO,  <- RF02
9
10
// nFFS: 1-10k Pullup an Vcc !!!

Meins
1
#define RF_PORT  PORTC
2
#define RF_DDR  DDRC
3
#define RF_PIN  PINC
4
5
#define SDI    2  // SDI,  -> RF02
6
#define SCK    1  // SCK,  -> RF02
7
#define CS    0  // nSEL, -> RF02
8
#define SDO    3  // SDO,  <- RF02
9
#define nFFS    5 //Interner Pullup
10
11
//nirq an PC4 angeschlossen aber nicht verwendet
12
// nFFS: 1-10k Pullup an Vcc !!!

RFM02
Bendeikt
1
#define RF_PORT  PORTB
2
#define RF_DDR  DDRB
3
#define RF_PIN  PINB
4
5
#define SDI    0  // SDI,  -> RF02
6
#define SCK    1  // SCK,  -> RF02
7
#define CS    2  // nSEL, -> RF02
8
#define IRQ    4  // nIRQ, <- RF02
9
10
// FSK: Pullup oder Pulldown

Meins
1
#define RF_PORT  PORTD
2
#define RF_DDR  DDRD
3
#define RF_PIN  PIND
4
5
#define SDI    3  // SDI,  -> RF02
6
#define SCK    4  // SCK,  -> RF02
7
#define CS    5  // nSEL, -> RF02
8
#define IRQ    2  // nIRQ, <- RF02
9
#define FSK     6  // FSK RF02 (intern pullup)
10
11
// FSK: Pullup oder Pulldown

von Maikel R. (maikel)


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

von Matthias R. (reichema)


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

von Maikel R. (maikel)


Lesenswert?

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

von Tester (Gast)


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?

von Maikel R. (maikel)


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.

von Tester (Gast)



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!

von Maikel R. (maikel)


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.

von Tester (Gast)


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_kurs/fuse_lock_bits_2/

Sollte auch das noch unklar sein meldest du dich hald wieder

von Maikel R. (maikel)


Lesenswert?

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

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.