Forum: Mikrocontroller und Digitale Elektronik Problem mit RFM02


von Robert K. (mr_insanity)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hatte zwar schon mal einen Thread zu dem Thema gestartet und auch 
ein paar Tips bekommen, welche aber noch keinen Erfolg gebracht haben.
Ich verzweifle jedenfalls gerade an einem RFM02. Habe zwei Eval-Boards 
von Pollin mit je einem RFM01 und einem RFM02 und versuche gerade mit 
einem kleinen Testprogramm das RFM02 zum laufen zu bringen. Das Programm 
bleibt aber immer in der Funktion rf02_txdata hängen und ich finde 
einfach nicht heraus, warum.

Hier der Code der Funktion:
1
void rf02_txdata(unsigned char *data, unsigned char number)
2
{  unsigned char i,wert;
3
  wert=0xC6;
4
  cbi(CS_PORT, CS);
5
  for (i=0; i<8; i++)
6
  {  
7
    if (wert&128)
8
      sbi(SDI_PORT, SDI);
9
    else
10
      cbi(SDI_PORT, SDI);
11
    sbi(SCK_PORT, SCK);
12
    wert<<=1;
13
    _delay_us(0.2);
14
    cbi(SCK_PORT, SCK);
15
    
16
  }
17
    rf02_shiftout(0xAA);
18
    rf02_shiftout(0xAA);
19
    rf02_shiftout(0xAA);
20
    rf02_shiftout(0x2D);
21
    rf02_shiftout(0xD4);
22
  for (i=0; i<number; i++)
23
    rf02_shiftout(*data++);
24
  sbi(CS_PORT, CS);
25
  while(IRQ_PIN&(1<<IRQ));    // wait until transfer done
26
  rf02_trans(0xC464);      // TX off after 10us
27
}


und hier mein kleines Testprogramm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>
6
#include <util/delay.h>
7
#include "global.h"
8
#include "rf02.h"
9
10
#define Taster_PORT PORTB
11
#define Taster_DDR   DDRB
12
#define Taster_PIN   PINB
13
#define Taster 1
14
15
#define LED_PORT  PORTD
16
#define LED_DDR   DDRD
17
#define LED_PIN   PIND
18
#define LED 5
19
20
21
unsigned char test[2]="01";
22
23
int main(void)
24
{
25
  Taster_DDR &= ~(1<<Taster);
26
  LED_DDR |= (1<<LED);
27
  
28
  rf02_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
29
  rf02_setfreq(RF02FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
30
  rf02_setpower(0);        // -0dBm Ausgangangsleistung
31
  rf02_setmodfreq(3);        // 120kHz Frequenzshift
32
  rf02_setbaud(19200);      // 19200 Baud
33
  
34
  
35
  while(1)
36
  {
37
    if (Taster_PIN & (1<<Taster))
38
    {
39
      rf02_txdata(test,2);
40
      LED_PORT |= (1<<LED);      
41
      _delay_ms(1000);
42
      LED_PORT &= ~(1<<LED);
43
    }
44
  }
45
}

Die gesamte Library für das rfm02 habe ich mal in den Anhang gepackt.
Hoffe Ihr könnt mir weiterhelfen. Schon mal vielen Dank für jegliche 
Hilfe.

von Robert K. (mr_insanity)


Lesenswert?

Habe gerade bei weiterer Suche im Forum gesehen, dass das die Library 
von Benedikt K. ist. (Wusste gar nicht mehr wo ich die her hatte)
Vielleicht hilft das ja weiter...

von Robert K. (mr_insanity)


Lesenswert?

Wäre es vielleicht auch möglich, dass das an einem Defekt des RFM liegt?

von Jens K. (studone)


Lesenswert?

So um mal etwas Hilfe zu geben...

habe mich diese Woche mal intensiv mit dem RFM02 von Pollin beschäftigt.
Versuch auch eine kleine Funkstrecke aufzubauen.

Und auch bei mir blieb er in der "rf02_txdata" Funktion hängen.

diese do geschrieben das nur bei einer steigenden Flanke der nIRQ die 
Daten übernommen werden sollen. Mhm..soweit stehts auch im Datenblatt.
Nun Ist der nIRQ auber immer low....wärend man die Initdaten sendet.
Habs mal aufgezeichnet und die reaktion des Moduls versucht zu verstehn, 
mit der erkenntniss das nicht jeder Befehl akzeptiert wird. :-(

Dann durch zufall...kam ich dahinter... :-)

Das RFM02 modul hat einen internen PLL und muß sich von daher erst 
einschingen. Und wenn man in die C-codes schaut fällt einem auf das man 
bis auf etwas Port-Init nicht viel macht bevor der erste Befehl gesendet 
wird.

Und das ist meinst einer der schon einfach "verschluckt" wird. Lösung 
ist hier einfach das RFM02 Modul sich etwas Einschwingen zu lassen, 
bevor man es anspricht.  Also ne Delay schleife mit 
250msec-500msec...wartezeit vor dem ersten Befehl.

Dann wird auch der nIRQ gleich nach diesem High sein :-)

Und nach dem TX aktiv befehl kommt auch das syn-Signal mittels nIRQ.

Freut mich wenn ich weiter Helfen konnte :-)

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.