Forum: HF, Funk und Felder Rfm12B 686Mhz Bascom Testprogramm.


von Thomas V. (linuxer7)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

vor langer Zeit, ich denke es war so um 2005 bekam ich von einem 
bekannten 2 RFM12B 686MHZ Module.
Die Dinger verschwanden lange Zeit und sind vor kurzem wieder 
aufgetaucht, weshalb ich mich beschloss mit den Modulen zu 
experimentieren, was jedoch gar nicht mal so einfach ist. Zumindest 
nicht für mich. :(
Bin eigentlich der absolute Anfänger was Bascom betrifft und sicher 
nicht der Fortgeschrittenen-Fraktion an. Ich habe zwar einfache Sachen 
gemacht, aber das hier geht ans eingemachte.

Mein Plan ist folgender.
Ich habe mir eine kleine Drohne gebaut und möchte das Ding nun mit einem 
GPS-Modul und eben diesem Sender ausstatten.
Der Atmega liest die GPS-Daten aus und sendet im 30 Sekunden Takt 
Position und Höhe an den Empfänger auf dessen Display dann die Daten 
angezeigt werden. Das Auslesen der GPS-Daten ist kein Problem, geht ja 
alles Seriell. Der GPGGA -"Textstring" wird dann an den Empfänger 
gesendet wo sie dann ausgewertet und auf einem Display angezeigt werden 
können.
Auch die Batteriespannung der Drohne wird so übertragen.
Falls mir das Ding mal im Wald oder den Feldern landet, (haben wir eine 
Menge hier),- kann ich es auf diese Art wenigstens im engen umkreis 
Orten.

Ich habe mich im Internet schlau gemacht und einiges zu dem Thema RFM12B 
gefunden leider jedoch beziehen sich die meisten Test-Programme auf den 
433Mhz Typ und sind in C. Ich bräuchte jedoch ein Bascom File das ich 
umbauen könnte.

Leider ist das jedoch schwieriger als ich dachte. Ein paar einfache 
Sachen habe ich schon gemacht, aber das hier ist für mich ziemlich 
Komplex.
Mein Gedanke war im Internet ein Testprogramm zu finden und damit zu 
experimentieren.

Gestoßen bin ich auf dieses hier.
1
' ########################################################################
2
' generated. Take care that the chip supports all fuse bytes.
3
' ### RF12-Test in Bascom
4
' ### Basiert auf Code von Benedikt K.
5
' ### Joachim Fossie B�r Reiter 04/2007
6
' ########################################################################
7
8
9
$regfile = "m32def.dat"
10
$hwstack = 32                                               ' default use 32 for the hardware stack
11
$swstack = 10                                               'default use 10 for the SW stack
12
$framesize = 40
13
14
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
15
                                                                                                                                                                 
16
$crystal = 8000000                                                                                                                                               
17
$baud = 19200                                                                                                                                                    
18
Baud = 19200                                                                                                                                                     
19
                                                                                                                                                                 
20
Declare Sub Rf12_init                                                                                                                                            
21
Declare Function Rf12_trans(byval Wert As Word) As Word                                                                                                          
22
Declare Sub Rf12_setfreq(byval Freq As Single)                                                                                                                   
23
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)                                                                  
24
Declare Sub Rf12_setbaud(byval Rfbaud As Long)                                                                                                                   
25
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)                                                                                         
26
Declare Sub Rf12_ready                                                                                                                                           
27
Declare Sub Rf12_txdata(byval Maxchar As Byte)                                                                                                                   
28
Declare Sub Rf12_rxdata(byval Maxchar As Byte)                                                                                                                   
29
                                                                                                                                                                 
30
Const Rf12freq = 433.92
31
Const Rf12baud = 19200
32
Const Maxchar = 32
33
34
'config the SPI in master mode.The clock must be a quarter of the slave cpu
35
' Hier ggf. den SoftSPI reinmachen
36
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
37
38
' werden ben�tigt f�r rf12_ready
39
Spi_cs Alias Portb.4                                        ' SS-Pin
40
Config Spi_cs = Output
41
Spi_sdo Alias Pinb.6                                        ' MOSI-PIN
42
Set Spi_cs
43
44
'init the spi pins
45
Spiinit
46
47
' was so gebraucht wird
48
Dim Count As Byte
49
Dim Temp As Word
50
Dim Rfdata(32) As Byte
51
Dim Text As String * Maxchar At Rfdata Overlay
52
53
Print "Init"
54
Call Rf12_init                                              ' ein paar Register setzen (z.B. CLK auf 10MHz)
55
Print "Set Frequenz"
56
Call Rf12_setfreq(rf12freq)                                 '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
57
Print "Set Bandwith"
58
Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verst�rkung, DRSSI threshold: -79dBm
59
Print "Set Baudrate"
60
Call Rf12_setbaud(rf12baud)                                 '  19200 baud
61
Print "Set Power"
62
Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift
63
64
65
' ########################################################################
66
' ###### Hauptproggi
67
' ########################################################################
68
69
70
Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
71
72
' Je nachdem ob Sender oder Empf�nger die entsprechenden Zeilen aktivieren
73
Do                                                          'Ewigschleife
74
75
76
' Hier ist die Senderoutine
77
'  Print "Sende"
78
'  Call Rf12_txdata(maxchar)
79
80
  Wait 1
81
82
' Hier ist die Empfangsroutine
83
  Print "Empfange"
84
  Call Rf12_rxdata(maxchar)
85
  For Count = 1 To Maxchar
86
    Print Chr(rfdata(count)) ; "-";
87
  Next Count
88
  Print
89
90
Loop
91
92
93
End                                                         'end program
94
95
96
' ########################################################################
97
' ###### Unterroutinen
98
' ########################################################################
99
100
Sub Rf12_init:
101
  Waitms 150
102
  Temp = Rf12_trans(&Hc0e0)
103
  Temp = Rf12_trans(&H80d7)
104
  Temp = Rf12_trans(&Hc2ab)
105
  Temp = Rf12_trans(&Hca81)
106
  Temp = Rf12_trans(&He000)
107
  Temp = Rf12_trans(&Hc800)
108
  Temp = Rf12_trans(&Hc4f7)
109
End Sub
110
111
112
Sub Rf12_setfreq(byval Freq As Single)
113
114
  Freq = Freq - 430.00
115
  Temp = Freq / 0.0025
116
  If Temp < 96 Then
117
    Temp = 96
118
  Elseif Temp > 3903 Then
119
    Temp = 3903
120
  End If
121
  Temp = Temp + &HA000
122
  Temp = Rf12_trans(temp)
123
End Sub
124
125
126
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
127
  Drssi = Drssi And 7
128
  Gain = Gain And 3
129
  Temp = Bandwith And 7
130
  Shift Temp , Left , 2
131
  Temp = Temp + Gain
132
  Shift Temp , Left , 3
133
  Temp = Temp + Drssi
134
  Temp = Temp + &H9400
135
  Temp = Rf12_trans(temp)
136
End Sub
137
138
139
Sub Rf12_setbaud(byval Rfbaud As Long )
140
  Local Ltemp As Long
141
142
  If Rfbaud < 663 Then Exit Sub
143
144
  If Rfbaud < 5400 Then
145
    Temp = 43104 / Rfbaud
146
    Temp = Temp + &HC680
147
  Else
148
    Ltemp = 344828 / Rfbaud
149
    Temp = Ltemp
150
    Temp = Temp + &HC600
151
  End If
152
  Decr Temp
153
  Temp = Rf12_trans(temp)
154
End Sub
155
156
157
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
158
  Outpower = Outpower And 7
159
  Temp = Fskmod And 15
160
  Shift Temp , Left , 4
161
  Temp = Temp + Outpower
162
  Temp = Temp + &H9800
163
  Temp = Rf12_trans(temp)
164
End Sub
165
166
167
Sub Rf12_txdata(byval Maxchar As Byte)
168
  Temp = Rf12_trans(&H8238)
169
  Rf12_ready
170
  Temp = Rf12_trans(&Hb8aa)
171
  Rf12_ready
172
  Temp = Rf12_trans(&Hb8aa)
173
  Rf12_ready
174
  Temp = Rf12_trans(&Hb8aa)
175
  Rf12_ready
176
  Temp = Rf12_trans(&Hb82d)
177
  Rf12_ready
178
  Temp = Rf12_trans(&Hb8d4)
179
  Rf12_ready
180
  For Count = 1 To Maxchar
181
    Rf12_ready
182
    Temp = &HB800 + Rfdata(count)
183
    Temp = Rf12_trans(temp)
184
  Next Count
185
  Rf12_ready
186
  Temp = Rf12_trans(&H8208)
187
End Sub
188
189
190
Sub Rf12_rxdata(byval Maxchar As Byte)
191
  Temp = Rf12_trans(&H82c8)
192
  Temp = Rf12_trans(&Hca81)
193
  Temp = Rf12_trans(&Hca83)
194
  For Count = 1 To Maxchar
195
    Rf12_ready
196
    Temp = Rf12_trans(&Hb000)
197
    Rfdata(count) = Temp
198
  Next Count
199
  Temp = Rf12_trans(&H8208)
200
End Sub
201
202
203
204
Function Rf12_trans(byval Wert As Word) As Word
205
  Local Lowbyte As Byte
206
  Local Highbyte As Byte
207
208
  Lowbyte = Wert And 255
209
  Shift Wert , Right , 8
210
  Reset Spi_cs
211
212
  Highbyte = Spimove(wert)
213
  Lowbyte = Spimove(lowbyte)
214
  Set Spi_cs
215
216
  Temp = Highbyte * 256
217
  Temp = Temp + Lowbyte
218
  Rf12_trans = Temp
219
End Function
220
221
222
Sub Rf12_ready
223
  Reset Spi_cs
224
  While Spi_sdo = 0
225
  Wend

Also habe ich mir auf einem Testboard eine Schaltung aufgebaut dessen 
Hauptkomponenten bestehen aus 2 Amega8 mit 8Mhz Intern getaktet
sowie 2 RFM12B 686MHz Module.

Angeschlossen habe ich es nach folgendem Beispiel:
1
Die Routinen für den BASCOM laufen. Ein kleiner Fehler, abgesehen von 
2
dem den HUMIX gemeldet hat, war noch drin (Highbyte zuerst senden) aber 
3
jetzt laufen sie. Ich habe sie gerade an der Hardware mit einem 
4
Evalboard getestet. Allerdings hab ich den MEGA32 mit 8Mhz vom Evalboard 
5
getaktet, also nicht mit den 10MHz vom Modul. Also aufpassen im 
6
Quelltext falls einer die 10Mhz nutzt. Angeschlossen hab ich das Modul 
7
folgendermassen:
8
VDD    ->  VCC
9
GND    ->  GND
10
SDI    ->  MOSI (PB5, Pin 6)
11
SDO    ->  MISO (PB6, Pin 7)
12
SCK    ->  SCK  (PB7, Pin 8)
13
nSel   ->  SS   (PB4, Pin 5)
14
FSK    ->  R 10k Pullup
15
16
Jetzt gehts weiter im Programm mit den Feinheiten und IRQ-Steuerung. 
17
Auch werde ich mal mit dem SPI-Clock spielen um schneller zu werden.
18
19
Datei anbei, und nicht die Fuses vergessen.

Auch dieses habe ich aus dem Forum.

Mein Problem ist nun folgendes.
Im obigen Beispiel bezieht sich die Einstellung auf den 433Mhz Typ.
Ich bräuchte aber Daten für den 686Mhz Typ.
Könnte mir jemand sagen was ich überall "WO" ändern müsste um die SW 
angepasst auf die 686Mhz zum laufen zu bekommen?


Gruß
Thomas

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

das kann man im Datenblatt auf den Seiten 14 u 15 genau nachlesen.

Configuration Setting Command 8008h,
Frequency Setting Command A680h


Welche Betriebsart ist denn im oben angeführten Programm eingestellt?




http://www.mikrocontroller-elektronik.de/funkmodul-programmierung-rfm12b-rn-mikrofunk/



Beispiele mit Fehlerkorrektur z.B. hier

Beitrag "bidirektionale RS232 Funkbrücke mit RFM12"


Es ist immer gut zu wissen, welche Frequenz mit welcher Reglementierung 
beaufschlagt ist:

https://de.m.wikipedia.org/wiki/Short_Range_Devices

686 MHz ist da bestimmt irgendwo dabei...

MfG

: Bearbeitet durch User
von Thomas V. (linuxer7)


Angehängte Dateien:

Lesenswert?

Hallo Christian,

ein Datenblatt habe ich keines bekommen, nur die beiden Module und einen 
Zettel, der aber nicht wirklich Hilfreich für mich ist.
Ich habe im Internet nach Informationen gesucht, aber so wirklich fündig 
bin ich nicht geworden.

Was meinst Du mit Betriebsart ?
Im obigen Programm kann ich einstellen was Sender und was Empfänger ist 
indem ich die jeweiligen Zeilen aktiviere.

Ich vermute mal das ich das Programm jeweils als Sender oder als 
Empfänger und in den jeweiligen Kontroller Flash. Einer ist dann der 
Sender und einer der Empfänger. So verstehe ich das.

Das reicht mir im Prinzip auch schon.
Das Programm soll ja immer nur eine Textzeile senden.

In der Subroutine.....

Sub Rf12_setfreq(byval Freq As Single)

  Freq = Freq - 430.00
  Temp = Freq / 0.0025
  If Temp < 96 Then
    Temp = 96
  Elseif Temp > 3903 Then
    Temp = 3903
  End If
  Temp = Temp + &HA000
  Temp = Rf12_trans(temp)
End Sub

.... ist von den 430Mhz die Rede. Schätze mal das hier die Einstellung 
auf die 686Mhz gemacht werden.
Was da aber genau alles geändert werden muss weis ich nicht.


Vielleicht kann mir ja der Entwickler des Programmes sagen was ich "WO" 
noch ergänzen/ändern müsste damit es funktioniert.

Der thread ist halt schon 10 Jahre alt.
Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module"

Gruß
Thomas

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo Thomas,

mit dem Datenblatt meine ich das hier:

https://www.google.de/url?sa=t&source=web&rct=j&url=http://www.hoperf.com/upload/rf/RFM12.pdf&ved=0ahUKEwicrpOCipbXAhWlJZoKHaCzCZoQFggcMAA&usg=AOvVaw32bPpTaCqizh81uImb94lK


Man kann das Fifo benutzen oder direkt ein Signal zur Modulation drauf 
geben.

Im Code ist die Formel Seite 17 oben zum frequency setting command 
angegeben. Diese müsstest Du ins Programm einpflegen.




//#define RF12FREQ(freq)  ((freq-430.0)/0.0025)    // 433 MHz macro for 
calculating frequency value out of frequency in MHz


//auf 868MHz-Modul angepasst:
//#define RF12FREQ(freq)  ((freq/20-43.0)*4000)      // 868 MHz macro 
for calculating frequency value out of frequency in MHz
//#define RF12FREQ(freq)  ((freq-20*43.0)/20*4000)              // 433 
MHz macro for calculating frequency value out of frequency in MHz
#define RF12FREQ(freq)  ((freq-860.0)*200)              // 433 MHz macro 
for calculating frequency value out of frequency in MHz
//ergibt mit Werten zwischen 868,48 MHz und 879,515MHz einen Bereich von 
genau 96...3903

________


void rf12_setfreq(unsigned short freq)    //Wichtig! den richtigen 
Bereich in Register 0x80 einstellen
{  if (freq<96)        // 430,2400MHz  //860,48
    freq=96;
  else if (freq>3903)      // 439,7575MHz  //879,515
    freq=3903;
  rf12_trans(0xA000|freq);
}



mfG

: Bearbeitet durch User
von Torsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Thomas,

meinst du manchmal das 868 MHz ISM-Band (860.48 - 879.515 MHZ)?
Wie weit soll deine Drohne fliegen?
Die SPI-Schnittstelle muss von der HF gut abgeschirmt sein und
braucht ein sehr gutes Timeing beim Auslesen des Buffers.
Über die Software könnte man sich streiten.
Funktionen wie diese sind einfach schrecklich.

Sub Rf12_init:
  Waitms 150
  Temp = Rf12_trans(&Hc0e0)
  Temp = Rf12_trans(&H80d7)
  Temp = Rf12_trans(&Hc2ab)
  Temp = Rf12_trans(&Hca81)
  Temp = Rf12_trans(&He000)
  Temp = Rf12_trans(&Hc800)
  Temp = Rf12_trans(&Hc4f7)
End Sub

Und da ist es schwer und fehleranfällig was zu ändern.
Das müsste erst mal so etwa aussehen.

 e_configure:
 e_cmd_set_conf:     .dw (CMD_SET_CONF   | CAPACITOR_12_5   | EN_TX_REG 
| EN_RX_BUF | FREQ_BAND_868)
 e_cmd_set_power:    .dw (CMD_SET_POWER  | EN_CRYSTAL       | DI_CLK_PIN 
| EN_SYNTH)
 e_cmd_set_freq:     .dw (CMD_SET_FREQ   | FREQ_869_525)
 e_cmd_set_br:       .dw (CMD_SET_BR     | BIT_RATE_1_2)
 e_cmd_rx_config:    .dw (CMD_RX_CONFIG  | BAND_WIDTH_134   | PIN_16_VDI 
| DRSSI_103 | VDI_SLOW | LNA_GAIN_0)
 e_cmd_set_filter:   .dw (CMD_SET_FILTER | CLK_REC_AUTO     | DIG_FILTER 
| DQD_7)
 e_cmd_fifo_reset:   .dw (CMD_FIFO_RESET | FIFO_SYNC_WORD   | EN_HI_SENS 
| FIFO_INT_LEVEL_8)
 e_cmd_sync_pat:     .dw (CMD_SYNC_PAT   | FRAME_START_L)
 e_cmd_afc:          .dw (CMD_AFC        | EN_AFC_ACCURACY  | EN_AFC_REG 
| AFC_INDEPEND | EN_AFC_FUNC)
 e_cmd_tx_config:    .dw (CMD_TX_CONFIG  | OUTPUT_POWER_21  | 
FREQ_DEVIATION_30 )
 e_cmd_set_pll:      .dw (CMD_SET_PLL    | DI_DITHERING_PLL)
 e_cmd_wake_up_time: .dw (CMD_WAKE_UP_TIME) ; disable
 e_cmd_low_duty:     .dw (CMD_LOW_DUTY)     ; disable
 e_cmd_batt_clk_div: .dw (CMD_BATT_CLK_DIV) ; disable
 e_configure_end:

 Die Headerdatei dafür hänge ich mal mit an.

 Gruß Torsten

von Marc H. (marchorby)


Lesenswert?

Müssen es unbedingt 686MHz sein? Normalerweise kenn ich die als 433 und 
868MHz. Für 686MHz sind die Filter wohl nicht ausgelegt. Zudem weis ich 
nicht ob dieses Band freigegeben ist!

von Thomas V. (linuxer7)


Lesenswert?

Morgen Leute,

ich komme nicht immer gleich zum Antworten, habe noch zuviel anderes um 
die Ohren. Habt bitte Nachsicht Wenns den etwas länger dauert :)

686 Mhz sind natürlich Blödsinn. Gemeint habe ich natürlich die 868 Mhz.
Sorry Zahlendreher.

Ich möchte mich auf das von mir gepostete Programm nicht festlegen. 
Verstehen tue ich das sowieso nur zur Hälfte, dafür kenne ich mich in 
Bascom zuwenig aus.
Ich brauche nur eine Subroutine oder eine Variable der ich meinen 
Ascii-Text übergebe und die dann in einem bestimmten Intervall das an 
den Sender gibt.
Am Empfänger dann der umgekehrte Fall. Ich bekomme eine Variable mit dem 
Empfangenen Text, den ich dann weiter verarbeiten kann. Das ist das 
kleinste Problem. Mir macht die Sende Empfangs-Geschichte Probleme, 
damit kenne ich mich nicht aus.

Das Auslesen des GPS-Moduls ist kein Problem. Die Daten in eine Variable 
zu Packen und dem Sender zur Verfügung zu stellen auch nicht.

Das Programm von Bendikt und Joachim wäre Perfekt, nur bekomme ich es 
nicht zum laufen. Ich bin jetzt schon ein paar Wochen dran aber am 
Empfänger kommt nix an.

Die Reichweite liegt glaube sowas um die 100-200 Meter habe ich gelesen, 
im günstigsten Fall. Das Reicht mir. Ich Wohne auf dem Land.
Hauptgrund der Aktion ist den Copter wieder zu finden wenn er mal 
verloren geht.
Wenn er dabei im Flug auch noch anzeigt wo er ist und Höhe und Akkustand 
durch gibt ist das klasse. Mehr will ich nicht.

Mein Sohn hat seinen Anfang des Jahres verloren das war echt sch....
Wir haben 3 Tage nach dem Ding gesucht und nicht mehr gefunden.
Tracker kosten einen haufen Geld was ich nicht habe und was mein 
"Finanzminister" auch nie befürworten würde.

Deswegen die Aktion mit den beiden Modulen die ich hier hatte.
Das GPS-Modul hat bei Banggood gerade mal 8€ gekostet und die beiden 
Atmega8 sowie ein Display hatte ich noch hier herum liegen.


@Thorsten:
Vielleicht ne blöde Frage, aber wie binde ich die Header Datei ein ?

Gruß
Thomas

von Torsten (Gast)


Lesenswert?

Hallo Thomas,

das war natürlich nicht zum Einbinden und alles wird gut gedacht.
Du must dir schon deine eigenen Konstanten definieren und damit
arbeiten. Es gibt auch nicht das Universalprogramm was überall
funktioniert. Habe mich genau wie du auch erst mal mit verschieden
Codevarianten beschäftigt und musste leider feststellen das selbst
Firmen mit nur sehr begrenzt brauchbaren Code arbeiten. Das präzise
lesen und schreiben der Daten in den Buffer ist nur mit Interrupt
Funktionen ordentlich machbar. Ein Polling-Betrieb geht da begrenzt,
wenn nur wenige Bytes übertragen werden. Meiner Ansicht nach ist
Assembler für diese Aufgabe am besten geeignet.

Gruß Torsten

von eloka (Gast)


Lesenswert?

Thomas V. schrieb:
> vor langer Zeit, ich denke es war so um 2005 bekam ich von einem
> bekannten 2 RFM12B 686MHZ Module.
Du weisst nicht zufällig noch die Quelle, oder?

von Thomas V. (linuxer7)


Lesenswert?

Hallo Thorsten,

okay dann muss ich passen. Das bekomme ich nicht zum laufen,
dazu ist mein Wissensstand zu gering. Ich bin "Gelegenheitsbastler".
Dann wandern die Dinger wieder erstmal wieder in die Kiste.
Danke Trotzdem :)

@eloka
Der hat damals oft beim Pollin bestellt. Das steht auch auf dem Beiblatt 
was ich habe.

Gruß
Thomas

von rfm (Gast)


Lesenswert?


von Thomas V. (linuxer7)


Lesenswert?

Danke für den Link. :)
Werde ich mir mal ansehen.

Gruß
Thomas

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.