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
Hmmm, könnte sein, dass der Fehler irgendwo in deinem Code ist. Aber das ist reine Spekulation. Hör' lieber nicht auf mich.
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
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.
Fuses sind richtig gesetzt Rfm funktioniert auch clk liefert 10mhz. Mich verwirrt beim Senden unheimlich der Status a000
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).
> 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.
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.
> 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
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).
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.