Forum: Mikrocontroller und Digitale Elektronik RFM12 Problem


von kappos (Gast)


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

von Kappos (Gast)


Lesenswert?

Hat keiner ein Tip für mich?

von Franz (Gast)


Lesenswert?

Hmmm, könnte sein, dass der Fehler irgendwo in deinem Code ist.
Aber das ist reine Spekulation. Hör' lieber nicht auf mich.

von kappos (Gast)


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

von Guest (Gast)


Lesenswert?

Habe den Code von Benedikt K. als Einsteig auch verwendet.
Die Fuses des ATMEGA88 müssen korrekt gesetzt sein (ext. Clock, CLOCKDIV 
off), dann sollte es problemlos laufen.

von Kappos (Gast)


Lesenswert?

Fuses sind richtig gesetzt Rfm funktioniert auch clk liefert 10mhz. Mich 
verwirrt beim Senden unheimlich der Status a000

von Tom M. (tomm) Benutzerseite


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).

von Tom M. (tomm) Benutzerseite


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.

von kappos (Gast)


Lesenswert?

HIPPIE, endlich funktioniert es.

Habe lediglich die Baudrate extrem runtergesetzt. Auf eine Baudrate von 
1000. Was mich aber trotzdem sehr verwundert das ich nur so kleine 
Baudraten hinbekomm. Woran kann das liegen?

@Tom
Am Mega liegt es nicht.
Mega läuft mit dem Takt was das rfm12 Modul ausgibt, also mit 10mhz.

von g457 (Gast)


Lesenswert?

> Mega läuft mit dem Takt was das rfm12 Modul ausgibt, also mit 10mhz.

CKDIV8?

von kappos (Gast)


Lesenswert?

Mega läuft mit 10Mhz, sonst würde mein Uart nicht funktionieren....

von g457 (Gast)


Lesenswert?

> Mega läuft mit 10Mhz, sonst würde mein Uart nicht funktionieren....

UART kann man auch passend konfigurieren trotz CKDIV8 - absichtlich oder 
versehentlich. Oder auf PC-Seite adäquat anpassen - ebenso absichtlich 
oder versehentlich :-)

Wenns das nicht iss isses was anderes.

HF

von Franz (Gast)


Lesenswert?

kappos schrieb:
> Habe lediglich die Baudrate extrem runtergesetzt...

Du meinst die Sende/Empfangs-Baudrate vom rfm12?
Evtl. Empfang zu schwach, wegen falscher oder keiner Antenne?
Das würde erklären, warum das Runtersetzen der Baudrate hilft (steigert 
die wahrscheinlichkeit, dass genug Signal im Rauschen drin ist).

von Stephan M. (stmz)


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

von kappos (Gast)


Lesenswert?

Fehlende Antenne kann durchaus sein. Mal weiter experimentieren. Muss 
jetzt mal ein sauberers Datenpacket definieren.

Nur zur Info, also die Frequenz des Megas läuft bei 10MHZ das ist alles 
wunderbar...

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.