Forum: Compiler & IDEs RFM 01 empfängt nicht


von Maikel (Gast)


Angehängte Dateien:

Lesenswert?

Hi Leute ich weiß es gibt unzählige Beiträge zum RFM aber ich komm 
trozdem nicht hinter mein Problem.

Also wie schon gesagt empfange ich nichts, mein Sender klappt auf jeden 
fall das weiß ich.

Im Anhang ist der Schaltplan

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 10-Pin
12
----------------------------------------------------------------------
13
PD6               SCK
14
PD5               SDI
15
PD7               nSEL
16
PD4               SDO
17
PC4               LED2
18
PC5               LED1 (Power)
19
20
PB3 (MOSI)                  MOSI
21
PB4 (MISO)                  MISO
22
PB5 (SCK)                  SCK
23
PC6 (RESET)                  RESET
24
25
// nFFS: 1-10k Pullup an Vcc !!!
26
*********************************************************************/
27
28
#include <avr/io.h>
29
#include "defines.h"
30
#include "uart.h"
31
#include "rfm01.h"
32
33
void Delay_ms(unsigned char amS){
34
  unsigned char i;
35
  unsigned int j;
36
  for(i=0;i<amS;i++)for(j=0;j<914;j++);
37
}
38
39
int main(void)
40
{
41
  unsigned char i,j,ChkSum;
42
  uart_init(51);
43
  LED_OUTPUT();
44
  LED1_ON();
45
  for(i = 0;i<5;i++)
46
  {
47
    LED1_TRG();
48
    Delay_ms(200);
49
  uart_putc(i);
50
  }
51
  uart_puts("huhu");
52
53
  RFXX_PORT_INIT();
54
  RFXX_WRT_CMD(0x0000);
55
  RFXX_WRT_CMD(0x898A);//134kHz
56
  uart_puts("898A\r\n");
57
  RFXX_WRT_CMD(0xA640);//434MHz
58
  uart_puts("A640\r\n");
59
  RFXX_WRT_CMD(0xC847);//4.8kbps
60
  uart_puts("C847\r\n");
61
  RFXX_WRT_CMD(0xC69B);//AFC setting
62
  uart_puts("C69B\r\n");
63
  RFXX_WRT_CMD(0xC42A);//Clock recovery manual control,Digital filter,DQD=4
64
  uart_puts("C42A\r\n");
65
  RFXX_WRT_CMD(0xC240);//output 1.66MHz
66
  uart_puts("C240\r\n");
67
  RFXX_WRT_CMD(0xC080);
68
  uart_puts("C080\r\n");
69
  RFXX_WRT_CMD(0xCE88);//Aktiviere FIFO
70
  uart_puts("CE88\r\n");
71
  RFXX_WRT_CMD(0xCE8B);
72
  uart_puts("CE8B\r\n");
73
  RFXX_WRT_CMD(0xC081);//Start RX
74
  uart_puts("C081\r\n");
75
  DDRD |= (1<<RFXX_DATA);
76
  DDRD &= ~(1<<RFXX_NIRQ);
77
  while(1)
78
  {
79
    while(!(PIND&(1<<RFXX_NIRQ)))//wartet darauf das RFXX_NIRQ gelöscht ist
80
  {
81
      RF_RXBUF[i++]=RF01_RDFIFO();//lese FIFO Daten
82
     uart_putc(RF01_RDFIFO());
83
     uart_puts("\r\n");
84
      if(i==18){
85
        RFXX_WRT_CMD(0xCE88); //Resetet FIFO um den nächsten Frame zu empfangen
86
        RFXX_WRT_CMD(0xCE8B);
87
        i=0;
88
        ChkSum=0;
89
        for(j=0;j<16;j++){
90
          ChkSum+=RF_RXBUF[j]; //berechnete checksumme
91
        }
92
        if(ChkSum==RF_RXBUF[16]){//frame check
93
          LED1_TRG();
94
        }
95
      }
96
    }
97
  }
98
}
99
100
101
//rfm01.c die rfm01.h gibt es natürlich auch hab ich nur nicht aufgelistet
102
103
//-------------RFM01---------//
104
#include <avr/io.h>
105
#include "defines.h"
106
#include "rfm01.h"
107
#include "uart.h"
108
109
void RFXX_PORT_INIT(void)
110
{
111
  uart_puts("Initialisiere \r\n");
112
  HI_SEL();
113
  HI_SDI();
114
  LOW_SCK();
115
  SEL_OUTPUT();
116
  SDI_OUTPUT();
117
  SDO_INPUT();
118
  SCK_OUTPUT();
119
}
120
121
unsigned int RFXX_WRT_CMD(unsigned int aCmd){
122
  unsigned char i;
123
  unsigned int temp;
124
  LOW_SCK();
125
  LOW_SEL();
126
  for(i=0;i<16;i++){
127
    temp<<=1;
128
    if(SDO_HI()){
129
      temp|=0x0001;
130
    }
131
    LOW_SCK();
132
    if(aCmd&0x8000){
133
      HI_SDI();
134
      }else{
135
      LOW_SDI();
136
    }
137
    HI_SCK();
138
    aCmd<<=1;
139
  };
140
  LOW_SCK();
141
  HI_SEL();
142
  return(temp);
143
}
144
145
unsigned char RF01_RDFIFO(void){
146
  unsigned char i,Result;
147
  LOW_SCK();
148
  LOW_SDI();
149
  LOW_SEL();
150
  for(i=0;i<16;i++){//skip status bits
151
    HI_SCK();
152
    HI_SCK();
153
    LOW_SCK();
154
    LOW_SCK();
155
  }
156
  Result=0;
157
  for(i=0;i<8;i++){//read fifo data byte
158
    Result<<=1;
159
    if(SDO_HI()){
160
      Result|=1;
161
    }
162
    HI_SCK();
163
    HI_SCK();
164
    LOW_SCK();
165
    LOW_SCK();
166
  };
167
  HI_SEL();
168
  return(Result);
169
}

von Gast (Gast)


Lesenswert?

> Also wie schon gesagt empfange ich nichts
Was hast du denn schon versucht um doch etwas zu empfangen?

> mein Sender klappt auf jeden fall das weiß ich.
Woher weist du das?

von Maikel (Gast)


Lesenswert?

ich hab mir von einem freund eine fernbedinung ausgeliehen die mit dem 
RFM12 läuft, und die funktioniert bei ihm, daher weiß ich das, und den 
code davon hab ich auch.

von Gast (Gast)


Lesenswert?

Wie kommst du dann darauf dass der Fehler im Code liegt, wenn dieser bei 
deinem Freund funktioniert?

von Maikel (Gast)


Lesenswert?

ich hab gesagt der fehler liegt an meinem EMPFÄNGER, von meinem freund 
ist der sender.

der code oben ist auch von EMPFÄNGER

von Gast (Gast)


Lesenswert?

Dann versuch doch einfach mal den Code deines Freundes...
Selbstverständlich den des EMPFÄNGERS.

von User (Gast)


Lesenswert?

Du solltest mal den Code aufräumen..:

>   DDRD |= (1<<RFXX_DATA);
>   DDRD &= ~(1<<RFXX_NIRQ);
^- das ist in der init() besser aufgehoben, wobei sich mir der Sinn von 
DATA noch nicht recht erschliesst. Laut Schaltplan (und wenn ich mich 
recht erinnere, dann auch laut Erinnerung) ist das dauerhaft auf High 
gezogen.

>   while(1)
>   {
>     while(!(PIND&(1<<RFXX_NIRQ)))//wartet darauf das RFXX_NIRQ gelöscht ist
              ^- das schreit geradezu nach einem aussagekräftigen Makro 
:-)
>     {
>         RF_RXBUF[i++]=RF01_RDFIFO();//lese FIFO Daten
>         uart_putc(RF01_RDFIFO());
                    ^- ?? sollte da nicht "RF_RXBUF[i-1]" (Achtung 
Array-Grenzen!!!!) stehen?

Deklaration und Definition von RF_RXBUF hab ich nicht gefunden, kann Dir 
also nicht sagen, ob die while-Bedingung im Kontext sinnvoll ist. Das i 
wird auch nicht zurückgesetzt, das hat am Anfang obiger while-Schleife 
noch den Wert 5 - ist das beabsichtigt??

HTH

von Maikel (Gast)


Lesenswert?

der code ist der beispiel code von pollin an dem ich eigentlich nur die 
pins geändert habe, mit RFXX_DATA geb ich dir recht mir auch nicht 
schlüssig wozu das da sein soll, denn der ist nicht angeschlossen oder 
sonst was.

RF_RXBUF ist in der define.h daklariert.

von User (Gast)


Lesenswert?

So, ich hab mir mal den Code von Pollin [1] angesehen, da gibts 
tatsächlich ein Beispielprogramm..

> mit RFXX_DATA geb ich dir recht mir auch nicht schlüssig wozu das da
> sein soll, denn der ist nicht angeschlossen oder sonst was.

Laut deren Pinout ist er angeschossen.. Bei Dir nicht. Hab eben mein 
Modul rausgekramt (868MHz), dort ist er (so wie bei Dir) per Pullup auf 
+Vcc (und es funktioniert) -> im Code entfernen.

>> Das i wird auch nicht zurückgesetzt, das hat am Anfang obiger while-
>> Schleife noch den Wert 5 - ist das beabsichtigt??

Ich mach mal die Ingrid nachdem Du nicht drauf eingegangen bist: Nein, 
es ist nicht sinnvoll </WinkMitDemZaunpfahl> ;-)

In Deinem Code sind Sender und Empfänger (etwa.. siehe weiter unten) 5 
Bytes Phasenverschoben. Wär schon ein großer Zufall, wenn die Checksumme 
dann trotzdem mal passen würde..

Achja nochmal die Ingrid: Das mit dem doppelten FiFo-Lesen ist natürlich 
auch Mist. Dein Code bewirkt etwa folgendes:

1. Die Phase um 5 Bytes verschieben (am Anfang)
2. Das erste Byte aus dem FiFo lesen und an der sechsten(!) Stelle 
Speichern
3. Müll aus dem wahrscheinlich noch nicht wieder vollständig gefüllten 
FiFo lesen und über uart verschicken.
4. Warten auf neue Daten
5. Das zweite Byte (respektive Müll - gerne bitweise Phasenverschoben, 
falls bei 3. schon wieder ein paar 'echte' Bits im FiFo waren) aus dem 
FiFo lesen und an siebter(!) Stelle speichern.
6. Wieder Müll über uart schicken..
7. D.C.ad.lib.

HTH

[1] http://www.pollin.de/shop/ds/MjU5OTgxOTk-.html - Downloads zu 
RFM01-433

von Maikel (Gast)


Lesenswert?

Also ist der Code eigentlich völliger müll wenn ich das richtig verstehe

von User (Gast)


Lesenswert?

> Also ist der Code eigentlich völliger müll wenn ich das richtig verstehe

Depends. Der von Reichelt funktioniert afair. Abgesehen von der geräte- 
und anwendungsspezifischen Initialisierung kann man den schon nehmen zum 
Testen. Nur hast Du ein paar Copy/Paste-Fehler reingebaut, die das 
Erfolgserlebnis erstmal erfolgreich verhindern. Aber nicht aufgeben, der 
hardwarenahe Teil sollte ja klappern, der Rest wird schon noch.

Achja eine etwas ausführlichere Doku zu den Chips gibts beim Hersteller 
[1] s.v. RF01 und RF02 (ohne 'M'), hat mir damals doch weiter geholfen 
:-)

HTH

[1] http://hoperf.com/

von Maikel (Gast)


Lesenswert?

ja danke die hab ich auch schon gefunden :)

aber ich wollte erst mal den von pollin nehmen weil da alles in c ist 
und in dem anderen ist aich asm drin das hätet mich verwirrt.

Ich werds mal weiter versuchen, aber angeschlossen hab ich doch alles 
richtig oder also liegt der fehler auf jeden fall im programm.

von User (Gast)


Lesenswert?

Der Rest sieht gut aus so weit. Bau mal die angesprochenen Fehler aus, 
dann sollte zumindest schon mal was ankommen.

Ich seh bei mir gerade im Code, dass ich bei den Kommandos 'fifo_off' 
und 'fifo_on' die Werte 0xCE84 und 0xCE87 schicke (bei Dir: 0xCE88 und 
0xCE8B). Schau nochmal ins Datenblatt, ob du wirklich 'reserved' haben 
willst als fifo-fill-start-condition (★Zaunpfahlwinker★). Bei mir steht 
das auf 'sync word' und es funktioniert einwandfrei :-) (Hint: Das 
Syncword ist 0x2DD4). Kannst je nach Anforderung natürlich auch 'VDI' 
oder 'always' nehmen. Nur 'reserved' würde ich mir für später aufheben.. 
;-)

HTH

von Maikel (Gast)


Lesenswert?

vielen dank schonmal ich werds mal versuchen

von Maikel (Gast)


Lesenswert?

also bei mir im daten blatt steht 0xCE88 und
0xCE8B. aber könnten wir vielleicht mal über icq oder so schreiben ich 
denke das geht schneller schick mir wenn möglich einfach ne nummer oder 
was weiß ich an (r e f l e x _ n o . 1 @ w e b . d e) natürlich alles 
zusammen.

von User (Gast)


Lesenswert?

> also bei mir im daten blatt steht 0xCE88 und 0xCE8B.

In der Tat, es gibt eine neuere Version des Datenblatts.. und dort steht 
geschrieben zum LSNibble:
  1 0 x x fifo-fill-start-condition 'VDI & sync-word'

..gabs bei mir damals(tm) (Anfang April diesen Jahres) noch nicht.. Aber 
man lernt ja nie aus :-)

HF beim Debuggen

von Maikel (Gast)


Lesenswert?

also ich habe in meinem code jetzt mal RFXX_DATA gelöscht, und 
uart_putc(RF_RXBUF[i-1]); benutzt, aber es tut sich nix, denn der müsste 
mir doch eigentlich auch den "müll" anzeigen können, allso es sollte ja 
wenigstens irgendwas kommen.
leider kommt aber nix

von User (Gast)


Lesenswert?

Tja, jetzt wirds langsam eng.. ein paar Kleinigkeiten hätt ich noch, 
wenn das nicht hilft, dann heissts klassisch debuggen - mit dem Oszi 
(auf SCK, SDI, SDO - ob sich da was tut) so anwesend, behelfsweise 
'led-blinken in den Schleifen', 'uart-flooding bei Aktivität', ..

Was käme noch in Frage:

- startup zu schnell. Der Compiler könnte - abhängig vom 
Optimierungsgrad - deine Delay_ms() wegoptimieren. Ich verwende 
stattdessen die _delay_ms() aus <util/delay.h> (zzgl. F_CPU).

Zwischenfrage: Die uart-Nachrichten aus der Initialisierungsphase kommen 
aber schon an, oder?

- erst 'Output' setzten, dann 'hi/lo'? ..bei mir immer in dieser 
Reihenfolge, im Datenblatt zu $avr hab ich mal was dazu gelesen.. 
irgendwo.. in weiter Ferne.. könnte signifikant sein, kann mich aber 
auch täuschen.. da müsste im Datenblatt zu Deinem AVR auch was drin 
stehen..

- ich ziehe SDI regelmäßig auf low (am Anfang und am Ende von 
write_command()), weiss aber nicht mehr genau, ob ich das wegen 
Stromsparen eingebaut hab oder wegen der Kommunikation.

- achja wäre es denkbar, dass Sender und Empfänger auf unterschiedliche 
Funkparameter eingestellt sind? Ich erinnere mich vage, dass sich die 
Kommandos damals(tm) erheblich unterschieden haben für RFM01 und RFM02..

Viel Erfolg!

P.S.: Antennen sind schon eingesteckt, oder? ;-)

von Maikel (Gast)


Lesenswert?

ja normal uart senden geht, aber antenne hab ich im empfänger nicht 
drin, nur im sender, hab gelesen das es auch so geht

von Ralph Fischer (Gast)


Lesenswert?

Moin!

Da fummeln ja noch andere an dem RFM01/02_Pärchen rum... :-)

[quote]In der Tat, es gibt eine neuere Version des Datenblatts.. und 
dort steht
geschrieben zum LSNibble:
  1 0 x x fifo-fill-start-condition 'VDI & sync-word'[/quote]

Beim Hersteller der Chips (Silicon Labs) steht das schon ziemlich lange 
so drin.

Hope kauft die Chips bei Silabs und bastelt die auf ihre Module. Beim 
Kopieren der  Datenblätter schaffen es die Jungs tatsächlich, Fehler 
einzubauen...also besser die Originale nehmen (TX = Si4020, RX = 
Si4320).

Bei Silabs gibt es einiges an Literatur zu den Chips, z.B. ein recht 
gutes Tutorial zum Ermitteln der geeigneten HF-Parameter. Ich finde es 
sinniger, das zu lesen und die Datenblätter zu studieren (und 
verstehen), als irgendwelche Konfig-Parameter aus dem Netz zu nehmen. Da 
ist eine Menge Unfug unterwegs.

An den OP: versuche doch erstmal, den Fifo wegzulassen und zu sehen, ob 
der VDI "schnackelt".

So weit habe ich meinen RFM01 jetzt.

Das Mistding wird bald aufgeben... :-)

Viel Glück!

Ralph

von Maikel (Gast)


Lesenswert?

soo ich hab jetzt was anderes versucht
von hoperf gibt es ja auch codes die hat mein freund auch benutzt
ich hab den auch mal benutzt der code sieht auf jeden fall besser aus 
aber leider passiert immer noch nicht so viel, kann es denn vielleicht 
echt daran liegen das ich keine antenne habe ?
ich zeig mal den code.
1
// main.c
2
/********************************************************************
3
Bobycar-Empfänger
4
RFM01-Funkmodul (Empfangen)
5
Maikel Rehl
6
7
Prozessor: ATMEGA8
8
Frequenz: 434MHz
9
Datenrate: 4.8kbps
10
11
----------------------------------------------------------------------
12
ATMEGA8           RFM01            ISP 10-Pin
13
----------------------------------------------------------------------
14
PD6               SCK
15
PD5               SDI
16
PD7               nSEL
17
PD4               SDO
18
PC4               LED2
19
PC5               LED1 (Power)
20
21
PB3 (MOSI)                  MOSI
22
PB4 (MISO)                  MISO
23
PB5 (SCK)                  SCK
24
PC6 (RESET)                  RESET
25
26
// nFFS: 1-10k Pullup an Vcc !!!
27
*********************************************************************/
28
29
#include <avr/io.h>
30
#include "defines.h"
31
#include "uart.h"
32
#include "rf01.h"
33
#include <util/delay.h>
34
35
int main(void)
36
{
37
  uart_init(51);
38
  LED_OUTPUT();
39
  LED1_ON();
40
  for(int i = 0;i<5;i++)
41
  {
42
    LED1_TRG();
43
    _delay_ms(500);
44
  }
45
  uart_puts("los");
46
47
  rf01_init();          
48
  rf01_setfreq(RF01FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
49
  rf01_setbandwidth(4);      // -6dB Verstärkung, DRSSI threshold: -79dBm 
50
  rf01_setbaud(9600);        // 200kHz Bandbreite
51
  rf01_setreceiver(2,4);      // 9600 Baud
52
53
  for (;;)
54
  {  rf01_rxdata(RF_RXBUF, 3);    // 3Bytes empfangen
55
    uart_putc(RF_RXBUF[0]);
56
    uart_putc(RF_RXBUF[1]);
57
    uart_putc(RF_RXBUF[2]);
58
    uart_puts("\r\n");
59
    _delay_ms(500);
60
  }
61
}
62
63
64
65
//rf01.c
66
67
//-------------RFM01---------//
68
#include <avr/io.h>
69
#include "defines.h"
70
#include "rf01.h"
71
#include "uart.h"
72
73
#ifndef F_CPU
74
  #define F_CPU 8000000UL
75
#endif
76
77
#ifndef cbi
78
#define cbi(sfr, bit)     (_SFR_BYTE(sfr) &= ~_BV(bit)) 
79
#endif
80
#ifndef sbi
81
#define sbi(sfr, bit)     (_SFR_BYTE(sfr) |= _BV(bit))  
82
#endif
83
84
#include <util/delay.h>
85
86
static unsigned char sdrssi, sgain;
87
88
void rf01_trans(unsigned short wert)
89
{  unsigned char i;
90
91
  cbi(RF_PORT, CS);
92
  for (i=0; i<16; i++)
93
  {  if (wert&32768)
94
      sbi(RF_PORT, SDI);
95
    else
96
      cbi(RF_PORT, SDI);
97
    sbi(RF_PORT, SCK);
98
    wert<<=1;
99
    _delay_us(0.2);
100
    cbi(RF_PORT, SCK);
101
  }
102
  sbi(RF_PORT, CS);
103
}
104
105
void rf01_init(void)
106
{  unsigned char i;
107
  RF_PORT=(1<<CS);
108
  RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
109
110
  for (i=0; i<11; i++)
111
    _delay_ms(10);      // wait until POR done
112
113
  rf01_trans(0xC2E0);      // AVR CLK: 10MHz
114
  rf01_trans(0xC42B);      // Data Filter: internal
115
  rf01_trans(0xCE88);      // FIFO mode
116
  rf01_trans(0xC6F7);      // AFC settings: autotuning: -10kHz...+7,5kHz
117
  rf01_trans(0xE000);      // disable wakeuptimer
118
  rf01_trans(0xCC00);      // disable low duty cycle
119
}
120
121
void rf01_setbandwidth(unsigned char bandwidth)
122
{
123
  rf01_trans(0x8970|((bandwidth&7)<<1));
124
}
125
126
void rf01_setreceiver(unsigned char gain, unsigned char drssi)
127
{
128
  sdrssi=drssi;
129
  sgain=gain;
130
}
131
132
void rf01_setfreq(unsigned short freq)
133
{  if (freq<96)        // 430,2400MHz
134
    freq=96;
135
  else if (freq>3903)      // 439,7575MHz
136
    freq=3903;
137
  rf01_trans(0xA000|freq);
138
}
139
140
void rf01_setbaud(unsigned short baud)
141
{
142
  if (baud<336)
143
    return;
144
  if (baud<5400)        // Baudrate= 344827,58621/(R+1)/(1+CS*7)
145
    rf01_trans(0xC880|((43104/baud)-1));
146
  else
147
    rf01_trans(0xC800|((344828UL/baud)-1));
148
}
149
150
void rf01_rxdata(unsigned char *data, unsigned char number)
151
{  unsigned char i,j,c;
152
  uint8_t TimeOut;
153
  rf01_trans(0xC0C1|((sgain&3)<<4)|((sdrssi&7)<<1));  // RX on
154
  rf01_trans(0xCE89);      // set FIFO mode
155
  rf01_trans(0xCE8B);      // enable FIFO
156
  cbi(RF_PORT, SDI);
157
  for (i=0; i<number; i++)
158
  {  cbi(RF_PORT, CS);
159
    
160
    while (!(RF_PIN&(1<<SDO)))
161
    {
162
      TimeOut++;
163
      _delay_us(1);
164
      if (TimeOut == 250)
165
      return;
166
    } // wait until data in FIFO
167
    
168
    for (j=0; j<16; j++)  // read and discard status register
169
    {  sbi(RF_PORT, SCK);
170
      asm("nop");
171
      cbi(RF_PORT, SCK);
172
    }
173
    c=0;
174
    for (j=0; j<8; j++)
175
    {  c<<=1;
176
      if (RF_PIN&(1<<SDO))
177
        c|=1;
178
      sbi(RF_PORT, SCK);
179
      _delay_us(0.2);
180
      cbi(RF_PORT, SCK);
181
    }
182
    *data++=c;
183
    sbi(RF_PORT, CS);
184
  }
185
  rf01_trans(0xC0C0|((sgain&3)<<4)|((sdrssi&7)<<1));  // RX off
186
}
187
188
189
190
//define.h
191
192
//Hier stehen alle Defines für den Sender
193
194
#define RF_PORT  PORTD
195
#define RF_DDR  DDRD
196
#define RF_PIN  PIND
197
198
#define SDI    5  // SDI,  -> RF02
199
#define SCK    6  // SCK,  -> RF02
200
#define CS    7  // nSEL, -> RF02
201
#define SDO    4  // SDO,  <- RF02
202
203
#define DDR_IN 0
204
#define DDR_OUT 1
205
#define DDR_LED DDRC
206
#define PORT_LED PORTC
207
#define LED_OUTPUT() DDR_LED = 0x30
208
#define LED1_ON() PORT_LED|=(1<<4)
209
#define LED1_OFF() PORT_LED&=~(1<<4)
210
#define MODULE_ON() PORT_LED|=(1<<5)
211
#define MODULE_OFF() PORT_LED&=~(1<<5)
212
#define LED1_TRG() PORT_LED^=(1<<4)
213
unsigned char RF_RXBUF[3];

von User (Gast)


Lesenswert?

Ad Drahtstummel: Ich hab meine noch nie mit ohne Antenne betrieben. Aber 
ein guter Grund, dass es nicht geht wäre es auf jeden Fall :-)

Ad Silabs: Ui krass, endlich anständige Datenblätter :-) Das hat mich 
damals(tm) vielleicht Nerven gekostet.. aber zum Laufen hab ich sie dann 
doch noch hingeprügelt.. mit viel Trial and Error..

Ich bin dann mal Literatur wälzen :-)))) Besten Dank für den Hinweis 
:-))

von User (Ingrid..) (Gast)


Lesenswert?

Nochmal ad Antenne: Ich hab (für 868MHz) sehr gute Erfahrungen gemacht 
mit einem einfachen Stück Litze, 8.6cm lang direkt an das PCB gelötet. 
Ein einfachster ƛ/4-Strahler halt :-) Und zum Testen sollte es sowieso 
langen. (Bei 433MHz wären das dann etwa 17.3cm, nur der Vollständigkeit 
halber)

So, jetzt aber zurück in den Datenblattstapel :-))

von Maikel (Gast)


Lesenswert?

Also ich hab das datenblatt auch mal überflogen und gesehen das die in 
der mindestbeschaltung nirq angeschlossen haben, was ich bei mir ja auch 
habe.
jedoch wird es im code überhaupt nicht benutzt.
aber der muss doch immer auf low stehen wenn er etwas empfäng also muss 
ich doch vor jedem empfangen den stauts low abwarten oder ?

von User (Ingrid..) (Gast)


Lesenswert?

[ nIRQ ]

Im ursprünglichen Code hast Du das benutzt (und ich habs angemosert ob 
da nicht ein Makro hüpscher wär), in der neueren Version steht 
stattdessen 'return falls SDO zu lange low '.. das sollte wohl auch eher 
'warten auf nIRQ low' sein.

Eine Anmerkung möchte ich noch loswerden: Das Warten war in ersterem 
Fall erfolgreicher gelöst. Genau genommen gehts aber noch etwas besser, 
zumindest wenn man nicht realtime-artig auf eine 'Antwort' wartet:

- RX initialisieren
- RX FiFo zurücksetzen (z.B. mit Länge 8 Bit)
:warten_und_teetrinken
- irgendwann geht nIRQ auf low
- eine FiFo-Füllung abholen (z.B. 8 Bit)
- ein Datenpakt vollständig ? { selbiges verarbeiten; FiFo 
zurücksetzen(!) } : nop
- goto warten_und_teetrinken

Das Warten kann man per busy-waiting totschlagen oder per IRQ (letzteres 
hab ich an einem attiny2313 per PCINT nicht zum laufen bekommen.. aus 
einem mir bisher nicht bekannten Grund hat der tiny den PCINT nicht 
aufgezeichnet.. obwohl das Oszi die Pegeländerung sauber(tm) 
protokolliert hat.. und falls er ihn doch mal mitbekommen hat, dann zu 
langsam, da war die Millisekunde dann schon vorbei..)

HTH

von Maikel (Gast)


Lesenswert?

ich hab gesehen das in dem code darauf gewartet wird das SDO auf low 
geht, aber ich habs auch mal mit nIQR versucht leider klappt es nicht. 
ich werde wohl echt mal versuchen ne antenne anzuschließen

von Maikel (Gast)


Lesenswert?

so ich hab mal ne antenne angeschlossen
leider tut sich noch nichts, könnt ihr euch vielleicht noch mal den code 
genau angucken und mir sagen was daran falsch ist, ich verzweifel 
langsam echt.
wäre echt super

von User (Gast)


Lesenswert?

Kannst Du mal deinen vollständigen Code anhängen(!)? Wenn möglich 
inklusive build-Skripten/Makefile/.. Ansonsten kann ich Dir anbieten, 
dass Du mal meinen (alten) Code ausprobierst, der ist allerdings an ein 
paar (wenigen, hier unwesentlichen) Stellen tiny2313-spezifisch.

Aber erstmal noch eine wichtige Frage zum Hardwaredebuggen: Hast Du ein 
Oszi zur Hand? Schau mal auf SCK, SDI und SDO, ob sich da irgendwas tut. 
Mit einem Multimeter kannst auch auf nIRQ schauen, ob das (bei zu 
erwartendem Empfang) auf low geht. Falls sich am nIRQ nix rührt, dann 
hast Du ein Problem mit dem Empfang (falsch konfiguriert, 
Stromversorgung, ..aaah, da fällt mir grad was ein: Ich hab dem 
RFM0[1,2] einen extra Elko (100u-universal-totschlag-Elko) spendiert, 
obwohl (oder gerade weil?) die Stromversorgung aus einer Batterie 
stammt. Und immer wenn was gekommen ist (über Funk), dann hat das RFM* 
einen reset gemacht.. da bin ich aber erst mit dem Oszi draufgekommen..)

Wo war ich.. genau, also wenn sich an SDO was rührt, dann wär das schon 
mal was. Wenn sich nIRQ bewegt und es tut sich nix an SCK (und SDI), 
dann liegts sicher an der Software.

Viel Spaß beim messen :-)

von Maikel (Gast)


Angehängte Dateien:

Lesenswert?

zur hand hab ich leider keins, nur in der schule kann ich morgen aber 
mal nach gucken (ja morgen ^^ tag der offenen tür) aber erstmal muss ja 
der code stimmen :)
wegen dem resetproblem hab ich den reset pin über 10k an vcc, genau 
damit der nicht fröhlich vor sich hin resetet.
den code kann mal anhängen ja.

von User (Gast)


Lesenswert?

Der erste böse Schnitzer war zwar schon mal angesprochen, ist aber 
immernoch drin:
1
void rf01_rxdata( [..] )
2
    [..]
3
    while (!(RF_PIN&(1<<SDO)))
4
    {
5
      TimeOut++;
6
      _delay_us(1);
7
      if (TimeOut == 250)
8
      return;
9
    } // wait until data in FIFO
10
    [..]
Du wartest als allererstes auf SDO, da kann aber nix kommen, solange du 
kein SCK ausgibst. Korrekt müsste das etwa so heissen:
1
#define RFNIRQ_IS_HIGH() ( RF_PIN & (1 << IRQ) )
2
[..]
3
    // busy-wait for nIRQ low
4
    while (RFNIRQ_IS_HIGH())
5
    { [.. Timeout zählen oder auch nicht ..] }
Falls Du den timeout wirklich brauchst, dann kannst ihn natürlich auch 
da in die Schleife reinpacken. Wobei 250µs schon recht kurz sind bei so 
niedrigen Übertragungsraten: Wenn der Code 'richtig'(TM) ist und Du 9600 
baud setzt, dann dauert die Übertragung eines einzelnen Bytes immerhin 
(mindestens) 1/9600*8 Sekunden, da wären in Zahlen etwa 833µs(!). Bei 
einem so kurzen Timeout würdest Du also höchstens immer das erste Byte 
erwischen, der Rest wär noch nicht mal im Äther..

Das mit dem Elko(!) bei mir hatte übrigens keinen Zusammenhang mit einem 
eventuell nicht vorhandenen Reset-Pullup (der ist sowieso obligat). Bei 
mir hat das Funkmodul(!) resettet (und das hat als Folge gelegentlich 
auch den tiny mitgezogen). Also einfach mal einen Elko dazustecken falls 
Du alle anderen Fehlerquelle ausschließen kannst..

Noch zwei Verbesserungsvorschläge: In uart.c:
1
#include <avr/io.h>
2
#include <avr/iom8.h>
Das ist böse, korrekterweise steht da nur das Include für io.h, das muss 
langen. Der Rest kommt automagisch via -mmcu=$typ.

Und in die Header-Dateien (*.h) macht man üblicherweise ein
1
#ifndef include_eindeutiger_dateiname_h
2
#define include_eindeutiger_dateiname_h
3
4
[.. Inhalt ..]
5
6
#endif // include_eindeutiger_dateiname_h
aussen rum, das spart versehentliche doppelte Includes mit u.U. 
unverhersehbaren Nebeneffekten.

Viel Spaß mit dem Oszi morgen, aber korrigiere vorher noch obigen Bug!

HTH

von Maikel (Gast)


Lesenswert?

so vielen danke erstmal das du dir überhaupt die zeit für das alles 
nimmst :)

ich hab jetzt mal soweit ausgebessert, sieht bei mir jetzt so aus
1
#define RFNIRQ_IS_HIGH() ( RF_PIN & (1 << IRQ) )
2
[...]
3
while (RFNIRQ_IS_HIGH())
4
{
5
  return;
6
}

das include iom8.h hab ich jetzt rausgekommen, ich hatte das nur drin 
weil ich mit den UART probleme hatte aber naja jetzt ging das auf jeden 
fall auch noch.

so aber da hatte sich nix getan

dann hab ich einfach mal verscuht hier bei dem if auch RFNIRQ_IS_HIGH() 
reinzusetzten weil der da auch auf SDO=high gewartet hat, das ging aber 
auch nicht dann hab ich diese sache wieder rückgängig gemacht.
1
for (j=0; j<8; j++)
2
{  c<<=1;
3
  if (RFNIRQ_IS_HIGH())
4
  c|=1;
5
  sbi(RF_PORT, SCK);
6
  _delay_us(0.2);
7
  cbi(RF_PORT, SCK);
8
}

naja auf jeden fall klappt es nocht nicht :(

von User (Gast)


Lesenswert?

Beim 'zweiten' ist das RFNIRQ natürlich fehl am Platze, schließlich 
liesst Du da den SDO aus - der RFNIRQ ist nur der Anzeiger, dass was im 
FIFO steht. Also wenn RFNIRQ low, dann ist was im FIFO, also SCK 
rausschicken und FIFO reinlesen..

Was sagt das Oszi zum RFNIRQ? Bekommst Du da was? Bleibt er dauerhaft 
high (dann hast Du keinen Empfang (Hardwarefehler, falsche 
Konfiguration, ..))? Geht er auf low und bleibt dort (dann bekommt der 
µC den Wechsel nicht richtig(tm) mit oder er setzt den FIFO nicht 
korrekt zurück)? Was Du sehen willst (bei Dauersenden/-empfang) ist ein 
schönes Rechtecksignal auf dem RFNIRQ. Alles andere ist (bei Verwendung 
des FIFO) ein guter Indikator für die Fehlerstelle.

HTH und viel Spaß beim Debugg0rn :-)

von Ralph Fischer (Gast)


Lesenswert?

Moin,

User schrieb:
> Was sagt das Oszi zum RFNIRQ? Bekommst Du da was? Bleibt er dauerhaft
> high (dann hast Du keinen Empfang (Hardwarefehler, falsche
> Konfiguration, ..))?

Hm, jein, man kann noch eine Stufe tiefer ansetzen und nur den VDI 
begucken. Wenn der im Rythmus des Senders zappelt, wird schon mal etwas 
empfangen. Der Nirq muß dann noch nicht klappen...in dem Stadium bin ich 
jetzt (wieder).

Vor einiger Zeit war ich schon so weit, bis dann ploetzlich nichts mehr 
ging. Heute fand ich die Ursache: ein Flachbandkabel vom Steckbrett zum 
RFM-Adapter (beide Seiten ordentlich mit Steckern kontaktiert) hatte ne 
Unterbrechung...grmpff&%&$§$&%&%§$!!

Was ich neulich vergessen hatte: bei http://www.controller-designs.de
gibt es ein paar nette Java-Tools (unter "Projekte") zum Umrechnen der 
Parameter in Hex.
Inzwischen habe ich mir aber angewöhnt, die Parameter binär in den 
Quelltext zu schreiben; finde ich übersichtlicher.

Viel Erfolg bei der Fehlersuche!

Ralph

von G. 4. (g457)


Lesenswert?

</User>*Account anleg*<g457>

> [ ..] bis dann ploetzlich nichts mehr ging [..] hatte ne
> Unterbrechung...grmpff&%&$§$&%&%§$!!

★eg★, das kenne ich.. ..Und Du wirst es kaum glauben, aber genau das 
selbe ist mir jetzt auch passiert, als ich mein 
RFM01-Labor-Testplattform-Platinen-Lochrasterkarten-Dings wieder in 
Betrieb nehmen wollte - es ging genau garnichts. Muss sich wohl eine 
kalte Lötstelle schlussendlich doch noch durchgesetzt haben. Zum Zwecke 
des Schonens der eigenen Nerven hab ichs jetzt stattdessen auf einem 
Brotbrett aufgebaut (und hey, es läuft bei 18.432MHz µC-Takt und 
868kommairgendwas MHz Empfangsfrequenz einwandfrei). Vielleicht komm ich 
die Tage mal dazu, des Delinquenten Quellcode auf meinen hiesigen Aufbau 
zu portieren. Vielleicht hilfts ja.

Ad VDI: note to self: VDI verkabeln :-)

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

da dieser Thread ganz brandaktuell ist und genau mein Problem ist, 
möchte ich mich kurz nach Eurer Erfahrung bekunden:

Aufbau RFM01 <-> RFM02 von Pollin
Ich nutze PIC-µC, aber trotzdem sollten die Teile ja laufen :-)

Mein Problem ist folgendes:
Sender sendet, Empfänger bekommt auf dem analogen Pin 
(Filter-Kondensator RSSI (?)) auch ein Signal.
Aber er synct überhaupt nicht, das heißt der Empfänger stellt sich 
eifnach tot: keine Daten am Fifo. Meine Einstellungen habe ich von 
Benedikt in asm übertragen. SPI am Empfänger geht auch, habe 10Mhz am 
CLK-pin.

Meine Frage: Woran könnte es liegen, wenn ich an besagtem Kondensator 
nur die An-und Abschaltvorgänge des Senders, aber nicht die Daten des 
Senders sehen kann?

Die Amplitude an dem Pin beträgt etwa 0,5V. ich sehe exakt die An-und 
abschaltvorgänge, die ich am Sender vornehme...
Funktioniert auch wenn der Sender im Nebenraum ist. Verbindung scheint 
also irgendwie zu stehen.

Bild: Low= Sender aus, High=Sender an und sendet

Habt Ihr Vorschläge / Ideen?

Gruß Hannes

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.