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!
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
Fehlen den sonst noch irgendwelche Parameter? Kann leider erst morgen testen ob es vielleicht auch so schon funktioniert.
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
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...
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.
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.
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 ?
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.