Forum: Mikrocontroller und Digitale Elektronik RFM12 868 Mhz umstellen


von Tobias und Ole (Gast)


Lesenswert?

Hallo,

Wir sind immoment daran eine Funkstrecke, zwischen zwei AVR's zu 
realisieren.

Zur Programmierung benutzen wir die Libarys von Ulrich Radig

http://www.ulrichradig.de/home/uploads/File/USB_RF_MODULE/USB_FUNK.zip

Unser Problem besteht aktuell darin das wir das 868Mhz nutzen wollen!

Folgende Programmabschnitte haben wir bereits geändert:

In der RF12.h:
Von:
#define RF12TxBDW(kfrq)  ((unsigned char)(kfrq/15)-1)
// macro for calculating frequency value out of frequency in MHz
#define RF12FREQ(freq)  ((freq-430.0)/0.0025)

Zu:
#define RF12TxBDW(kfrq)  ((unsigned char)(kfrq/15)-1)
// macro for calculating frequency value out of frequency in MHz
#define RF12FREQ(freq)  ((freq-860.0)/0.005)

und in der Main.c:
Von:
rf12_init();  // ein paar Register setzen (z.B. CLK auf 10MHz)
rf12_setfreq(RF12FREQ(433.92))// Sende/Empfangsfrequenz auf 433,92MHz
rf12_setbandwidth(5, 1, 4);    // 200kHz Bandbreite,
rf12_setbaud(9600);    // 19200 baud
rf12_setpower(0, 6);    // 1mW Ausgangangsleistung, 120k

Zu:
rf12_init();  // ein paar Register setzen (z.B. CLK auf 10MHz)
rf12_setfreq(RF12FREQ(868.92))//??? Passende Nachkommastellen
rf12_setbandwidth(5, 1, 4);    // 200kHz Bandbreite,
rf12_setbaud(9600);    // 19200 baud
rf12_setpower(0, 6);    // 1mW Ausgangangsleistung, 120k

Hier noch einige Stellen bei denen ich weiß das sie geändert werden 
müssen ich allerdings nicht sicher bin wie !

In der RF12.c:
{
if (freq<96)        // 430,2400MHz
freq=96;
else if (freq>3903)      // 439,7575MHz
freq=3903;
rf12_trans(0xA000|freq);
}


Nun stehen wir allerdings vor einer Mauer da wir nicht wissen, wie die 
weiteren Parameter zu ändern sind bzw. welche Parameter noch geändert 
werden müssen!

Freuen auf eure Hilfe!

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die 96 und 3903 ändern sich nicht mit der Frequenz, das gilt für alle 
vier Bereiche. Im Kommentar muß dann eben 868MHz +96 bzw. 3903 * 5kHz 
stehen

von Tobias (Gast)


Lesenswert?

Fehlen den sonst noch irgendwelche Parameter?

Kann leider erst morgen testen ob es vielleicht auch so schon 
funktioniert.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

http://www.mikrocontroller.net/articles/RFM12#Configuration_Setting
die Bandumschaltung fehlt natürlich noch, zwei Bit im Configuration 
Register

"b... = Zu nutzende Basisfrequenz (00=315MHz / 01=433MHz / 10=868MHz / 
11=915MHz"

und das Modul sollte das Antennenanpassnetzwerk für 868 MHz haben, nur 
darin unterscheiden sich die Versionen -433 und -868

von Jörg B. (manos)


Lesenswert?

Tobias und Ole wrote:
> rf12_setbaud(9600);    // 19200 baud
Auch wenn das jetzt nur am Rande zum Thema gehört finde ich den 
Kommentar möglicherweise fragwürdig...

von Tobias und Ole (Gast)


Lesenswert?

Ist erstmal nicht wichtig Kommentare kann man löschen ;)

von Helmut -. (dc3yc)


Lesenswert?

Und schaut bitte bei der BNetzA nach, auf welcher Frequenz eure 
Betriebsart erlaubt ist! Die Frequenzen werden unterschieden nach der 
Einschaltdauer der Sender.

Servus,
Helmut.

von (prx) A. K. (prx)


Lesenswert?

Tobias und Ole wrote:

> Ist erstmal nicht wichtig Kommentare kann man löschen ;)

Kann man schon. Tut man oft nicht. Und so stehen zur Erheiterung 
derjenigen, die fremdem Code pflegen müssen, solche Erleuchtungen oft 
noch nach Jahren drin.

von Tobias und Ole (Gast)


Lesenswert?

Erstmal muss es laufen ;)

von Tobias (Gast)


Lesenswert?

Hab noch einen zu ändernden Parameter in der RF12.c gefunden

Und zwar in der Funktion

void RF12_init(void)


rf12_trans(0x80D7);      // Enable FIFO
muss geändert werden da hier nach Datenblatt von Hope RF auch die 
Frequenz der Module und der Crystal load capacicator bestimmt werden!
http://www.hoperf.com/pdf/RF12_code.pdf

auf die 868Mhz eingestimmt muss es also so sein:

rf12_trans(0x80E7); // b1 wird auf 1 gesetzt und b0 auf 0 (868Mhz)

Allerdings weiß ich jetzt grade nicht was mit dem Crystal load 
capacicator von welchem im Datenblatt die rede ist gemeint ist und kann 
so diese Parameter nicht anpassen.

Kann mir hier vielleicht jemand helfen ?

Ansonsten müsste im Code denk ich alles gleichbleiben oder habe ich da 
noch etwas vergessen ?

von Ralf (Gast)


Lesenswert?

Das hier dürfte das Datenblatt zu dem Chip sein:

https://www.silabs.com/Support%20Documents/TechnicalDocs/Si4420.pdf

Der Chip hat die Lastkapazitäten für den Quarz intern, und diese sind 
konfigurierbar -> Datenblatt lesen. Aber wenn der Quarz nicht geändert 
wird, besteht kein Grund, die Einstellung zu ändern...

Ralf

von Tobias (Gast)


Lesenswert?

Bin leider jetzt erst dazu gekommen Sender und Empfänger zu 
programmieren!
Leider funktioniert die Funkübertragung noch nicht. Vielleicht weiß ja 
jemand von euch was ich falsch mache?

Ich habe die Dateien so angepasst wie oben bereits beschrieben.

Die Empfänger und Sender Codes sind die von Ulrich Radig nur leicht 
verändert!

Für den Empfänger:
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <avr/usart.h>
4
#include <avr/rf12.h>
5
//------------------------------------------------------------------------------
6
7
int main (void) 
8
{
9
  unsigned char test[100];
10
  usart_init(9600); // Serielle Schnittstelle initialisieren
11
  DDRD = (1<<6)|(1<<4);
12
13
  PORTD |= (1<<6);
14
  PORTD |= (1<<4);
15
   
16
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
17
  rf12_setfreq(RF12FREQ(868.3));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
18
  rf12_setbandwidth(5, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
19
  rf12_setbaud(9600);        
20
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120k
21
  usart_write("USB TEST\r\n");
22
  while(1)
23
  { 
24
  
25
  
26
  while(!(rf12_rxdata(test)));
27
  
28
  usart_write("%s",(char*)test);
29
  usart_write("Empfängt!!");
30
  usart_write("\r\n");
31
  }
32
}

und für den Sender
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <avr/rf12.h>
4
//------------------------------------------------------------------------------
5
6
int main (void) 
7
{
8
  
9
  unsigned char test[100]="test hallo\n";
10
  
11
  DDRB = (1<<3);
12
  PORTB = (1<<3); 
13
14
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
15
  rf12_setfreq(RF12FREQ(868.3));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
16
  rf12_setbandwidth(5, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
17
  rf12_setbaud(9600);        
18
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120k
19
  
20
  while(1)
21
  { 
22
  
23
  rf12_txdata(test,13);
24
  for(long a = 0;a<100000;a++)
25
  {
26
  asm("nop");
27
  };
28
  }
29
}

Kann es den eigentlich auch eventuell daran liegen das ich keine Antenne 
nutze ?
Die Module liegen 3-10cm ausseinander.

Freue mich auf alle Antworten

gruß Tobias

von Tobias (Gast)


Lesenswert?

Hab jetzt einfach mal versucht den Sendercode auf den Empfänger stick zu 
spielen um über die serielle Schnitstelle zu sehen was passiert:
Code wie oben hier nur die Neuerung:
1
 while(1)
2
3
     {
4
5
   
6
usart_write("sendet...");
7
   rf12_txdata(test,13);
8
9
   for(long a = 0;a<100000;a++)
10
{
11
asm("nop");
12
usart_write("nop...");
13
};
14
usart_write("gesendet...")
15
   }
16
17
}

Nun bekomm ich über die serielle schnittstelle allerdings nur nop...'s
Und nop heißt ja quasi nichtstun bzw. abwarten.
Ich bekomm zwischen den ganzen nops kein einziges gesendet raus
Hab ich irgendwie nen Denkfehler drin und der Darf beim senden gar nich 
aus der Schleife kommen ? findet eventuell eine abfrage statt ob über 
haupt ein empfäger vorhanden ist ?
Oder ist das wirklich nich normal und er sedet einfach aus irgendeinem 
grund nicht!

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.