RFM12 Problem

Gast #2488043
Lesenswert?

hallo zusammen,

ich bin seit Tagen damit beschäfigt eine Funkbrücke zwischen zwei RFM12 
aufzubauen.

Aufbau ist mit einem Atmega88 und RFM12 Modul realisiert. Clock ausgang 
des RFM wird als Externe Clock für Atmega88 verwendet.

Kommunikation mit dem Modul klappt wunderbar. Kann es auch 
konfigurieren. Modul sendet auch (Überprüft mit TV auf Kanal37, 
periodisches knacken).

Empfangsmodul ist gleich aufgebaut, hiermit kann ich ebenfalls 
erfolgreich senden.


Mein Problem ist nun das ich nichts empfange im Empfangsmodus. Ich denke 
das er das Syncword nicht erkennt.

Sourcecode ist der Standartcode von Benedikt K.

Was mich sehr verwundert ist das nach dem Senden das Statusbit auf: A000 
steht. Was ja bedeuten würde das
x2 = FFOV / RGUR (RGUR = Der Datenstrom beim Senden ist abgerissen, da 
nicht schnell genug Daten nachgeladen wurden)

Habt ihr mir vielleicht ein Tip auf was das hindeuten kann?

Gruß Kappo
Gast #2488608
Lesenswert?

Wollte eigentlich nicht den ganzen Code posten, da dieser schon x-fach 
hier drin ist. Aber wenn es zur Lösungsfindung hilft

1
void rf12_init(void)
2
{
3
  RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
4
  RF_PORT=(1<<CS);
5

6
  for (unsigned char i=0; i<10; i++)
7
    _delay_ms(10);      // wait until POR done
8

9
  rf12_trans(0xC0E0);      // AVR CLK: 10MHz
10
  rf12_trans(0x80D7);      // Enable FIFO
11
  rf12_trans(0xC2AB);      // Data Filter: internal
12
  rf12_trans(0xCA81);      // Set FIFO mode
13
  rf12_trans(0xE000);      // disable wakeuptimer
14
  rf12_trans(0xC800);      // disable low duty cycle
15
  rf12_trans(0xC4F7);      // AFC settings: autotuning: -10kHz...+7,5kHz
16
}
17

18
void rf12_ready(void)
19
{  cbi(RF_PORT, CS);
20
  asm("nop");
21
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
22
}
23

24
unsigned short rf12_trans(unsigned short wert)
25
{  unsigned short werti=0;
26
  unsigned char i;
27

28
  cbi(RF_PORT, CS);
29
  for (i=0; i<16; i++)
30
  {  if (wert&32768)
31
      sbi(RF_PORT, SDI);
32
    else
33
      cbi(RF_PORT, SDI);
34
    werti<<=1;
35
    if (RF_PIN&(1<<SDO))
36
      werti|=1;
37
    sbi(RF_PORT, SCK);
38
    wert<<=1;
39
    _delay_us(0.3);
40
    cbi(RF_PORT, SCK);
41
  }
42
  sbi(RF_PORT, CS);
43
  return werti;
44
}
45

46

47
void rf12_txdata(unsigned char *data, unsigned char number)
48
{  unsigned char i;
49
  
50
  //Test kann raus
51
  char buf[10];
52
  //
53
  
54
  rf12_trans(0x8238);      // TX on
55
  rf12_ready();
56
  rf12_trans(0xB8AA);
57
  rf12_ready();
58
  rf12_trans(0xB8AA);
59
  rf12_ready();
60
  rf12_trans(0xB8AA);
61
  rf12_ready();
62
  rf12_trans(0xB82D);
63
  rf12_ready();
64
  rf12_trans(0xB8D4);
65
  for (i=0; i<number; i++)
66
  {    
67

68
    rf12_ready();
69
    rf12_trans(0xB800|(*data++));
70
  
71
  }
72
  rf12_ready();
73
  rf12_trans(0x8208);      // TX off
74
}

Und hier nun das Hauptprogramm allerdings nur ein Auszug mit den 
relevanten Punkten

1
void send(void)
2
{  
3
  unsigned char test[]="Dies ist ein 433MHz Test !!!\n   ";  
4
  rf12_txdata(test,32);
5

6
}
7

8
char buf[16];
9
   
10
  InitDevices();
11
  uint16_t result =  rf12_trans(0x00);
12
  itoa( result, buf, 16);
13
  uart_puts("Antwort vor config");
14
  uart_puts(buf);  
15

16
    while(1)
17
    {
18
    _delay_ms(1000);    
19
       result =  rf12_trans(0x00);
20
    
21
  uart_puts("Statusbits:");
22
  itoa( result, buf, 16);  
23
  uart_puts(buf);  
24
    uart_puts("\n");
25
  
26
  send();
27
    }

Folge vom Statusbit ist nun diese:

- Nach Init: 8000
- Nach dem Senden ist der Status: a000

Was bedeutet denn beim Status das RGUR Bit  beim senden?

Gruß Kappo
Persönliche Seite #2488684
Lesenswert?

kappos schrieb:

> - Nach Init: 8000

Sollte IMO 0x4000 sein: Bit 14 zeigt den "Power-On Reset" (POR) an, also 
Kaltstart. Da ist noch was buggy, versuch erst mal das zu fixen...

> - Nach dem Senden ist der Status: a000

Also Bit 15 und 13 gesetzt, FFIT und RGUR. Die Daten sind raus, aber du 
lieferst nicht schnell genug nach. Der Datenstrom ist beim Senden 
abgebrochen. Läuft dein mega noch mit int. Takt 1Mhz?

> Was bedeutet denn beim Status das RGUR Bit  beim senden?

Das Bit 13 ist doppelt belegt. Wenn das Modul im Sendebetrieb arbeitet, 
zeigt es einen buffer underrun an (RGUR), wenn es im Empfangsbetrieb 
ist, einen FIFO Overflow (FFOV).
Persönliche Seite #2488687
Lesenswert?

>   rf12_trans(0xC0E0);      // AVR CLK: 10MHz

Ich hab gelesen, dass das einige Module nicht mitmachen, direkt von 1Mhz 
auf 10Mhz springen. Versuch mal den Takt langsam raufzuschrauben, etwa 
so:
1
   rf12_trans(0xC060);              // AVR CLK: 2MHz
2
   _delay_ms(0.2);
3
   rf12_trans(0xC0C0);              // AVR CLK: 5MHz
4
   _delay_ms(0.2);
5
   rf12_trans(0xC0E0);              // AVR CLK: 10MHz

Kontrolle: Häng noch ne LED an den mega und lass sie im Sekundentakt 
blinken.
#2488990
Lesenswert?

Tom M. schrieb:

> Ich hab gelesen, dass das einige Module nicht mitmachen, direkt von 1Mhz
> auf 10Mhz springen. Versuch mal den Takt langsam raufzuschrauben, etwa
> so:

die Änderung der Frequenz kann auf dem Atmega Probleme machen. Laut 
Datenblatt sind hinsichtlich Frequenzänderung nur eine ganz minimale 
Variation zulässig. Wird der externe Clock vom RFM12 abgegriffen, so ist 
kein mit dem Datenblatt konformer Betrieb möglich.

Gruß
Stephan

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren