Hi Leudee,
kennt Ihr die Funkmodule RFM01 RFM02 Rfm12 von Pollin? Hat jemand von euch das RFM01 und das RFM02 mit nem AVR (Mega8 oder so)zum Laufen gebracht? Und wenn ja habt ihr ein wenig Code dazu?
Druckbare Version
Hi Leudee,
kennt Ihr die Funkmodule RFM01 RFM02 Rfm12 von Pollin? Hat jemand von euch das RFM01 und das RFM02 mit nem AVR (Mega8 oder so)zum Laufen gebracht? Und wenn ja habt ihr ein wenig Code dazu?
Kennst Du schon die tolle Suchfunktion hier im Forum?
Die würde dich zu dem hier führen... https://www.roboternetz.de/phpBB2/viewtopic.php?t=29202
Die Suchfunktion kenne, hab ich auch benutzt ... den von dir genannten Thread kenne ich natürlich und nen Quellcode für rfm01 und rfm02 gibts da trotzdem nicht. Ich habe auch schon auf mircocontroller.net geschaut da gibts momentan nur was für rfm12. Ich weiss nicht ob man den für rfm01 rfm02 umbauen kann.
Ich hab mal ein bischen im I-Net gestöbert. Dabei bin ich auf das hier gestoßen:
Programm für RFM01 ---> http://freenet-homepage.de/florian0/rfm01.zip
Programm für RFM02 ---> http://freenet-homepage.de/florian0/rfm02.zip
Is alles in C Programmiert
Original ---> http://www.mikrocontroller.net/topic/67273#new
(Man muss ein bischen suchen)
Ich hab das auf meinen WebSpace geladen da ich den Dateiort nicht gefunden habe.
Der Autor von den Programmen (benedikt) hat noch was geschrieben. Ich weis net ob das wichtig ist:
Zitat:
Hier nun dasselbe für den RF02 Sender. Funktioniert ähnlich, ist aber
etwas einfacher (da nur Senden), und kleiner (rund 650Bytes inkl main).
Ein Nachteil hat das ganze aber: Während die Senderoutine läuft, darf
kein Interrupt auftreten, also Interrupts während dem Senden abschalten.
Eine bessere Lösung wäre, die Senderoutine selbst teilweise in einen
Interrupt zu packen (USI, SPI, INT), aber das würde dann nicht mit allen
AVRs funktionieren, daher erst mal die einfache Lösung.
Ich höffe das hilft euch.
Gruß
Spanky
Hat schon jemand ein Script laufen mit dem RFM12 und dem Eval-Funk-Borad von Pollin?
Ich möchte versuchen, mit 2 Boards und RFM12 eine Kommunikation aufzubauen. Hat sich schon jemand die Mühe gemacht?
Laut der Suche gibt es noch nicht viel.
Grüße Eisbaeeer
Ich hab das angeschlossen.
Seit dem kann ich mit dem Board nix mehr Programmieren.
Gut das ich zwei hab :P
Hallo Eisbaeeer,
jou hab ich , seh mal unter
http://www.comwebnet.de/
nach.
Hallo Spanky,
kann es sein das Du den Optokoppler eingebaut hast.
Erst mal Spannungsbrücke einsetzen.
Der rfm12 muss beim ISP-Proggen eingeschaltet bleiben.
Wigbert
@Picht:
Jo,
den Optokoppler hab ich eingebaut. Da muss ich das mal irgentwie überbrücken. Mal sehen was ich machen kann
Ja da war ich schon. Ich hab versucht, das Script für einen Atmega32 - 16MHz anzupassen. Bisher ohne Erfolg.Zitat:
Zitat von Picht
Das Problem mit dem Optokoppler hatte ich anfangs auch. Ich habe alles über ISP programmiert. Später dann ein Modul aufgelötet, dann ging nichts mehr bzw. war es sogar so, dass es mir einen Atmega32 zerhauen hat. Meine damit, dass es einfach die Fuse Bits zerbogen hat. Leider ließ sich der eine Atmega dann auch nicht mehr durch einen externen Takt am XTAL beleben. :-s Lösung des Problems --> Bootloader und alles klappt wieder. Das hätte Pollin auch noch erwähnen können, nachdem eh schon ein extra Zettel wegen eines Routingfehlers auf der Platine vorlag.
Auf jeden Fall muss ich mich da noch reinarbeiten, in das Modul. Ich hatte bisher noch keine Muße, das Datenblatt durchzuarbeiten. Vieleicht ist ja doch noch jemand schneller O:)
Grüße Eisbaeeer
Hallo Eisbaeer,
der Code von Bastelbär ist doch für m32
Achtung! Irgendwie hat er Pinb.6 als MOSI Pin erklärt.
Ist natürlich MISO
Ich hoffe der Link geht.
http://www.mikrocontroller.net/topic/67273#new
Ja mit den Pollinboard hab ich nicht schlecht gestaunt.
Ich hatte zum Glück den Optokoppler draussen gelassen,
um erst mal arbeitsfähig zu sein.Muss man wirklich erst drauf
kommen.
Wigbert
Hallo
Ist schon komisch.
Ich habe den Optokoppler noch drin. Wenn ich dann den Port.d 4 auf high setze, wird mein Spannungswandler so heiß, dass man ihn fast nicht anfassen kann.
Das Script funktioniert leider auch nicht.
Auf der RS232 kommt nur eine Schleife beim Senden und dann bleibt er stehen.
Normalerweise sollte er die Schleife endlos durchlaufen.
Was habe ich im Script angepasst:
Crystal auf 16000000 gesetzt und eben den Port.d 4 auf high.
Kann da jemand helfen?Code:' generated. Take care that the chip supports all fuse bytes.' ########################################################################
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie Bär Reiter 04/2007
' ########################################################################
$regfile = "m32def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
$crystal = 16000000
$baud = 19200
Baud = 19200
Declare Sub Rf12_init
Declare Function Rf12_trans(byval Wert As Word) As Word
Declare Sub Rf12_setfreq(byval Freq As Single)
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Declare Sub Rf12_ready
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 32
'config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
Config Portd.4 = Output
Config Portd.6 = Output
Portd.4 = 1
Portd.6 = 1
' werden benötigt für rf12_ready
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' MISO-PIN
Set Spi_cs
'init the spi pins
Spiinit
' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Print "Init"
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Print "Set Frequenz"
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Print "Set Bandwith"
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Print "Set Baudrate"
Call Rf12_setbaud(rf12baud) ' 19200 baud
Print "Set Power"
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
' ########################################################################
' ###### Hauptproggi
' ########################################################################
Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do 'Ewigschleife
' Hier ist die Senderoutine
Print "Sende"
Call Rf12_txdata(maxchar)
Wait 1
' Hier ist die Empfangsroutine
' Print "Empfange"
' Call Rf12_rxdata(maxchar)
' For Count = 1 To Maxchar
' Print Chr(rfdata(count)) ; "-";
' Next Count
Loop
End 'end program
' ########################################################################
' ###### Unterroutinen
' ########################################################################
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
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
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Drssi = Drssi And 7
Gain = Gain And 3
Temp = Bandwith And 7
Shift Temp , Left , 2
Temp = Temp + Gain
Shift Temp , Left , 3
Temp = Temp + Drssi
Temp = Temp + &H9400
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setbaud(byval Rfbaud As Long )
Local Ltemp As Long
If Rfbaud < 663 Then Exit Sub
If Rfbaud < 5400 Then
Temp = 43104 / Rfbaud
Temp = Temp + &HC680
Else
Ltemp = 344828 / Rfbaud
Temp = Ltemp
Temp = Temp + &HC600
End If
Decr Temp
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Outpower = Outpower And 7
Temp = Fskmod And 15
Shift Temp , Left , 4
Temp = Temp + Outpower
Temp = Temp + &H9800
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_txdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H8238)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb82d)
Rf12_ready
Temp = Rf12_trans(&Hb8d4)
Rf12_ready
For Count = 1 To Maxchar
Rf12_ready
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Rf12_ready
Temp = Rf12_trans(&H8208)
End Sub
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
Next Count
Temp = Rf12_trans(&H8208)
End Sub
Function Rf12_trans(byval Wert As Word) As Word
Local Lowbyte As Byte
Local Highbyte As Byte
Lowbyte = Wert And 255
Shift Wert , Right , 8
Reset Spi_cs
Highbyte = Spimove(wert)
Lowbyte = Spimove(lowbyte)
Set Spi_cs
Temp = Highbyte * 256
Temp = Temp + Lowbyte
Rf12_trans = Temp
End Function
Sub Rf12_ready
Reset Spi_cs
While Spi_sdo = 0
Wend
End Sub
Eval Funk Board von Pollin, Funkmodul auch von Pollin, Atmega32-16
Grüße Eisbaeeer
Zitat:
Das Problem mit dem Optokoppler hatte ich anfangs auch. Ich habe alles über ISP programmiert. Später dann ein Modul aufgelötet, dann ging nichts mehr
.....
Lösung des Problems --> Bootloader und alles klappt wieder. Das hätte Pollin auch noch erwähnen können, nachdem eh schon ein extra Zettel wegen eines Routingfehlers auf der Platine vorlag.
Soll das heissen, dass man das Board nur über ISP-Programmieren kann, wenn man es vorher nicht komplett zuammenlötet?
In dem Fall hätte Pollin die Bezeichnung "Evaluationsboard" auf dem Beipackzettel bessr auch gleich korrigiert.
Warum ist auf dem Board eigentlich ein Optokopler und keine direkte Verbindung drauf?
Hallo
Tja, was will man für 10 Euro auch erwarten. Das ist dan die andere Seite.
Ich hatte das ganze in Stufen aufgebaut. Erst das Board ohne "Schnick-Schnack", also ohne Funk. Habe zu der Zeit noch alles über ISP programmiert.
Dann später das Funkmodul draufgelötet und das ISP ging nicht mehr sauber. Als ich dann nach ein paar Versuchen das andere Board (noch ohne Funkmodul) hernahm und den gleichen Atmega darauf wiede mit ISP programmieren konnte, war mir klar, dass es am Funkmodul lag.
Ich fand die Idee mit dem Optokoppler gar nicht schlecht, nur leider etwas verpeilt geplant und geroutet. Also hab ich ihn draufgelassen und einen Bootloader auf dem Atmega gebruzzelt. Hat für mich mehrere Vorteile. So bin ich dem Problem aus dem Weg gegangen und das ewig lange programmieren mit ISP hat mich eh schon genervt.
Aber das Funkmodul macht mir Kopfzerbrechen. Vor allem, weil beide Boards gleich reagieren.
Nochmal, hat jemand genau dieses Evaluationsborad von Pollin "MFHK22" mit dem RFM12 am laufen?
Grüße Eisbaeeer
Hallo Eisbaeer,
nochmals, ich habe das Board in Funktion,allerdings statt
Optokoppler eine Brücke.
http://www.mikrocontroller.net/attac...2/PICT0131.JPG
kann es sein das bei 16Mhz der Prozessor zu schnell ist und Du bei
nop einsetzen musstCode:Sub Rf12_ready
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub
probier mal.
in der Simmulation bleibt bei Empfang mein Code auch stehen.
Geht aber
Ich vergleich trotzdem mal die Code.
Wigbert
Ich noch mal,
also der Code ist wie mein m8
Empfang und Senden werden problemlos ausgeführt.
Was ist bei mir anders:
Ich benutze ein rfm12 mit intern 8Mhz,ein rfm12 mit extern 9,21600Mhz.
Auf dem Pollinboard wurde ein 10K Widerstand zwischen FSK und
VDD am rfm12 gelegt.
Ich musste bemerken, das nicht alle Terminalprogramme
den Empfang decodieren.Warum auch immer.
Bei Empfang wait 1 raus.
Ich lass die LED auf den Pollinboard Toggeln,um beim Senden eine
Kontrolle zu haben.
Geh mal spassenshalber auf intern 8Mhz runter.
Das Terminalprogramm. von Bascom zeigt nur eine Zeile an.
(immer wieder löschen)
Wigbert
Hallo Wigbert
Ich werde das ganze mal ausprobieren.
Hast du dir schon ein Protokoll überlegt? Am besten eins, das man sowohl über RS232 als auch über Funk fahren kann? Am besten wäre ja ein schon vorhandenes zu nehmen.
Ich schreib dir noch ne PM wegen einer Frage.
Grüße Eisbaeeer
Hallo Eisbaeeer,
wenn es gar nicht gehen sollte,spiele ich mal Dein Code auf
ein m32.
Der Optokoppler schaltet etwas später den rfm12 zu.
Sollte aber nicht das problem sein.
Im Groben sind Protokollvorstellungen schon vorhanden.
öfter mal auf der o.g.HP reinschauen.
Wigbert
Also ich hab jetzt den Toggle portd.6 Befehl noch in die Schleife eingefügt.Zitat:
Zitat von Picht
Das nop hab ich auch drin.
Er bleibt wieder stehen. Die LED toggelt nicht.
Dein Controller auf dem Board läuft ja mit den externen 8Mhz, oder?
Das RFM läuft mit den 10MHz vom RFM.
Laut Datenblatt kann man die pF von 8 bis 16 konfigurieren.
Ich muss als erstes mal die Subroutinen mit dem Datenblatt vergleichen, damit ich mal kapier, was da eigentlich passiert. An dem komm ich wohl nicht vorbei.
Grüße Eisbaeeer
Hallo Eisbaeer,
Also das Programm bleibt stehen wenn spi-sdo
auf 0 bleibt.
der rfm 12 schaltet ja diesen Pin.
Also kommt vom rfm12 keine Rückantwort.
Hast Du mal die Spannungsversorgung des rfm 12 am optokoppler
gebrückt?
Ich setz mal den Opto. bei mir ein
Wigbert
Wenn das die Ursache ist, wäre das ja die volle Fehlentwicklung.Zitat:
Zitat von Picht
Ich bin mal gespannt.
Hallo Eisbaeeer,
Ich habe den Optokoppler eingebaut.
Der Spannungsrgler wurde heiss das man ihn nicht mehr anfassen
kann.
Was passiert:
Beim Start des Boards steigt der Strom auf 170mA,
schaltet der Optokoppler durch,sinkt zwar der Strom auf seine
Nennstärke aber die Schleife bleibt stehen.Sie muss geresettet
werden und dann geht das Spiel von vorne los.
Durch meine Drahtbrücke wird der RFM12 sofort mit Spannung
versorgt und der Nennstrom bleibt konstant bei 60mA.
Muss mich korrigieren, nehm den Optokoppler raus.
Warum das so ist weiss ich noch nicht.
Die Schleife muss aber auch ohne RFM 12-Spannungsversorgung
laufen.Macht sie bei mir jedenfalls.
Wigbert
Nachtrag,
bei meinem Eigenbau-RFM12 Board habe ich diesen "Stromanstieg"
wie bein Pollinboard nicht. Werde das mal weiter untersuchen.
Wigbert
Ich noch mal,
Ich habe jetzt mal zwischen dem Öffnen des Optokopplerpins
und des weiteren Codes ein Wait 1 reingesetzt.
(In der Zeit wird doch wohl der RFM12 wach sein)
Der o.g.Code bleibt bei eingebauten Optokoppler trotzdem stehen.
An VDD des RFM12 liegen dann gute 4V an,wärend das restliche
System mit 5V versorgt wird.
Wigbert
Hallo
So, ich hab jetzt statt dem Optokoppler 2 Stifte eingelötet. Mit einem Jumper kann ich jetzt dauernd einschalten. Was ich aber nicht gefunden habe, ist der 10K Widerstand. Laut Schaltplan ist an FSK nichts angelegt, ausser Portb.3 .Zitat:
Zitat von Picht
Nachdem ich den Portb.3 auf High gesetzt hab, läuft nun die Schleife. Weiteres konnte ich jetzt noch nicht testen. Hier noch der Code:
Grüße EisbaeeerCode:' generated. Take care that the chip supports all fuse bytes.' ########################################################################
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie Bär Reiter 04/2007
' ########################################################################
$regfile = "m32def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
$crystal = 16000000
$baud = 19200
Baud = 19200
Declare Sub Rf12_init
Declare Function Rf12_trans(byval Wert As Word) As Word
Declare Sub Rf12_setfreq(byval Freq As Single)
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Declare Sub Rf12_ready
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 32
'config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
Config Portd.5 = Output
Config Portd.6 = Output
Config Portb.3 = Output
Portb.3 = 1
' werden benötigt für rf12_ready
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' MISO-PIN
Set Spi_cs
'init the spi pins
Spiinit
' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Print "Init"
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Print "Set Frequenz"
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Print "Set Bandwith"
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Print "Set Baudrate"
Call Rf12_setbaud(rf12baud) ' 19200 baud
Print "Set Power"
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
' ########################################################################
' ###### Hauptproggi
' ########################################################################
Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do 'Ewigschleife
' Hier ist die Senderoutine
Print "Sende"
Call Rf12_txdata(maxchar)
Wait 1
' Hier ist die Empfangsroutine
' Print "Empfange"
' Call Rf12_rxdata(maxchar)
' For Count = 1 To Maxchar
' Print Chr(rfdata(count)) ; "-";
' Next Count
Toggle Portd.6
Loop
End 'end program
' ########################################################################
' ###### Unterroutinen
' ########################################################################
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
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
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Drssi = Drssi And 7
Gain = Gain And 3
Temp = Bandwith And 7
Shift Temp , Left , 2
Temp = Temp + Gain
Shift Temp , Left , 3
Temp = Temp + Drssi
Temp = Temp + &H9400
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setbaud(byval Rfbaud As Long )
Local Ltemp As Long
If Rfbaud < 663 Then Exit Sub
If Rfbaud < 5400 Then
Temp = 43104 / Rfbaud
Temp = Temp + &HC680
Else
Ltemp = 344828 / Rfbaud
Temp = Ltemp
Temp = Temp + &HC600
End If
Decr Temp
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Outpower = Outpower And 7
Temp = Fskmod And 15
Shift Temp , Left , 4
Temp = Temp + Outpower
Temp = Temp + &H9800
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_txdata(byval Maxchar As Byte)
Toggle Portd.5
Temp = Rf12_trans(&H8238)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb82d)
Rf12_ready
Temp = Rf12_trans(&Hb8d4)
Rf12_ready
For Count = 1 To Maxchar
Rf12_ready
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Rf12_ready
Temp = Rf12_trans(&H8208)
End Sub
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
Next Count
Temp = Rf12_trans(&H8208)
End Sub
Function Rf12_trans(byval Wert As Word) As Word
Local Lowbyte As Byte
Local Highbyte As Byte
Lowbyte = Wert And 255
Shift Wert , Right , 8
Reset Spi_cs
Highbyte = Spimove(wert)
Lowbyte = Spimove(lowbyte)
Set Spi_cs
Temp = Highbyte * 256
Temp = Temp + Lowbyte
Rf12_trans = Temp
End Function
Sub Rf12_ready
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub
Hallo Eisbaeeer,
ein Stück weiter
die 10 K sind nicht Standard und habe ich aus anderen Foren.
Da der M8 und der m32 beschaltet ist ,einfach auf eine leere Fassung
stecken. Richtiger Pin natürlich.
Hast Du das Funkmodul nicht angeschaltet?
Ich nutze den FSK Pin nicht (jumper auf)
Leg mal Deine E-Mailadr. in mein Postfach.
und Deine m32 Fuse dazu.
Das Ding muss laufen.
Wigbert
Ich noch mal,
hab mal schnell probiert, ohne den zusätzlichen 10K Widerstand
bleibt meine Schleife auch stehen.
Also 10K rein und den Pin in Ruhe lassen.
Anbei mal die Beschaltung des geistigen Vaters des Codes
VDD -> VCC
GND -> GND
SDI -> MOSI (PB5, Pin 6)
SDO -> MISO (PB6, Pin 7)
SCK -> SCK (PB7, Pin 8 )
nSel -> SS (PB4, Pin 5)
FSK -> R 10k Pullup (also an +5V) !!!!!
Wigbert
Ich hab den FSK mit dem obigen Script auf High. Das ist ja jetzt vergleichbar mit 10k Pullup. Wenn ich mal von einem hochohmigen Eingang ausgehe. Die Datenblätter (die sich nur so nennen dürfen) sind ja furchtbar.Zitat:
Zitat von Picht
Wow, ich saß gerade auf der Leitung. Aber ich hab gerade kapiert, was du von mir willst. Einfach die Fassung vom M8 benutzen, um den 10k Widerstand zu stecken.Zitat:
Da der M8 und der m32 beschaltet ist ,einfach auf eine leere Fassung
stecken. Richtiger Pin natürlich.
Ich werde das mit dem 10k Widerstand gleich heut Abend testen.Zitat:
Hast Du das Funkmodul nicht angeschaltet?
Ich nutze den FSK Pin nicht (jumper auf)
Leg mal Deine E-Mailadr. in mein Postfach.
und Deine m32 Fuse dazu.
Das Ding muss laufen.
Wigbert
Grüße Eisbaeeer
P.S.: Wenn das ganze mal läuft, werde ich das mal richtig dokumentieren.
Hallo Leute,
ein Bild sagt mehr als Tausen Worte.....
Hab mal unter:
http://www.mikrocontroller.net/attac...4/PICT0158.JPG
meine Modifikation des Pollinboards für den o.g.Code
hinterlegt.
Irgendwann wirst Du den FSK-Pin brauchen, ich denke mit demZitat:
Ich hab den FSK mit dem obigen Script auf High. Das ist ja jetzt vergleichbar mit 10k Pullup
10KOhm Pullup-Widerstand ist das die klügere Entscheidung.
Wigbert
Hi
Ja schon klar.Zitat:
Zitat von Picht
Hat eigentich jemand ein vernüftiges Datenblatt? Ich hab das von Pollin (für den Mülleimer) und das Hope RF.
Der FSK ist doch "Frequenzy-Shift-Keying" oder?
Wie wird denn jetzt die Information übertragen, wenn nicht über FSK?
Grüße Eisbaeeer[/quote]
Hallo Eisbaeeer,
ich hab die selben Datenblätter,da aber bei mir jeder Nachbau
auf Anhieb funktioniert (komischerweise) bin ich immer erst
gezwungen das DBL zu studieren wenn es weitergeht.
Na,ja vielleicht nicht ganz so.
Da ich Empfang und Senden duch externen gesteuerten Interrupt
vornehme,kann ich mir vorstellen das auch der Pin zu was gut
ist. Im Moment erfolgt die Datenübertragung ja mit hard.SPI.
Oder wird FSK als Ablage benutzt? Muss mal doch lesen.
Wigbert
Also bei mir funktioniert jetzt der Sender und Empfänger auch.
Soweit mal, was ich gemacht hab und das Script für das Pollin Board mit Modifikation wie folgt:
Änderungen am Board:
1. Der Optokoppler muss weg. Soll heißen, dass ich ihn ausgelötet hab und durch 2 Pfostenstecker ersetzt. Die Module können jetzt per Jumper eingeschaltet werden. Dann bleibt auch der Spannungsregler kalt.
2. Ich hab auf den FSK Port ein "High" gesetzt (Portb.3)
Beide, Sender und Empfänger Toggeln jetzt die LED´s gleichmäßig und ich Empfange:
Hier der Code zum Board mit gebrücktem Optokoppler:Code:ÿInit<\r>
<\n>Set Frequenz<\r>
<\n>Set Bandwith<\r>
<\n>Set Baudrate<\r>
<\n>Set Power<\r>
<\n>Empfange<\r>
<\n>D-i-e-s- -i-s-t- -e-i-n- -4-3-3-M-H-z- -T-e-s-t- -!-!-!-!-!-<\r>
-<\b>-<\r>
<\n>Empfange<\r>
<\n>D-i-e-s- -i-s-t- -e-i-n- -4-3-3-M-H-z- -T-e-s-t- -!-!-!-!-!-<\r>
-?-<\r>
So, jetzt muss wohl doch das Datenblatt studiert werden. Aber ausdrucken lässt sich das mist***** nicht.Code:' generated. Take care that the chip supports all fuse bytes.' ########################################################################
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie Bär Reiter 04/2007
' ########################################################################
$regfile = "m32def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
$crystal = 16000000
$baud = 19200
Baud = 19200
Declare Sub Rf12_init
Declare Function Rf12_trans(byval Wert As Word) As Word
Declare Sub Rf12_setfreq(byval Freq As Single)
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Declare Sub Rf12_ready
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 32
'config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
Config Portd.5 = Output 'LED als Schleifenanzeige
Config Portd.6 = Output 'LED als Schleifenanzeige
Config Portb.3 = Output 'High auf FSK
Portb.3 = 1
' werden benötigt für rf12_ready
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' MISO-PIN
Set Spi_cs
'init the spi pins
Spiinit
' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Print "Init"
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Print "Set Frequenz"
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Print "Set Bandwith"
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Print "Set Baudrate"
Call Rf12_setbaud(rf12baud) ' 19200 baud
Print "Set Power"
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
' ########################################################################
' ###### Hauptproggi
' ########################################################################
Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do 'Ewigschleife
' Hier ist die Senderoutine
' Print "Sende"
' Call Rf12_txdata(maxchar)
' Wait 1
' Hier ist die Empfangsroutine
Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ; "-";
Next Count
Toggle Portd.6
Loop
End 'end program
' ########################################################################
' ###### Unterroutinen
' ########################################################################
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
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
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Drssi = Drssi And 7
Gain = Gain And 3
Temp = Bandwith And 7
Shift Temp , Left , 2
Temp = Temp + Gain
Shift Temp , Left , 3
Temp = Temp + Drssi
Temp = Temp + &H9400
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setbaud(byval Rfbaud As Long )
Local Ltemp As Long
If Rfbaud < 663 Then Exit Sub
If Rfbaud < 5400 Then
Temp = 43104 / Rfbaud
Temp = Temp + &HC680
Else
Ltemp = 344828 / Rfbaud
Temp = Ltemp
Temp = Temp + &HC600
End If
Decr Temp
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Outpower = Outpower And 7
Temp = Fskmod And 15
Shift Temp , Left , 4
Temp = Temp + Outpower
Temp = Temp + &H9800
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_txdata(byval Maxchar As Byte)
Toggle Portd.5
Temp = Rf12_trans(&H8238)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb82d)
Rf12_ready
Temp = Rf12_trans(&Hb8d4)
Rf12_ready
For Count = 1 To Maxchar
Rf12_ready
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Rf12_ready
Temp = Rf12_trans(&H8208)
End Sub
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
Next Count
Temp = Rf12_trans(&H8208)
End Sub
Function Rf12_trans(byval Wert As Word) As Word
Local Lowbyte As Byte
Local Highbyte As Byte
Lowbyte = Wert And 255
Shift Wert , Right , 8
Reset Spi_cs
Highbyte = Spimove(wert)
Lowbyte = Spimove(lowbyte)
Set Spi_cs
Temp = Highbyte * 256
Temp = Temp + Lowbyte
Rf12_trans = Temp
End Function
Sub Rf12_ready
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub
Grüße Eisbaeeer
Hallo Eisbaeeer,
na prima!!! mit internen Pullup geht das selbstverständlich auch.
Hast Du mal den Strom gemessen? 59mA oder so.(ohne Optok.)
Mein DBL lässt sich auch nicht drucken,na mal sehen.
Wigbert
Hast du das ganze schon Bidirektional gestestet? In beide Richtungen?
Aber sicher doch,
der code unter
http://home.arcor.de/dirk.milewski/R...Tranceiver.bas
kannst Du mit 2RFM12 und Terminalprogramme Senden und Empfangen.
Also ein Drahtlose Datenübertragung zwischen 2 Computer.
Sicher einfach gehalten, aber war ja nur zu Testzwecke gedacht.
Wigbert
Hi,
so, nachdem die ersten Tests gemacht sind, wäre jetzt eine Adressierung im Protkoll noch interessant. Sozusagen ein Master und Slaves.
Ich habe vor, einen Master (Steuerung) und 2 Slaves (Anzeigen) zu realisieren.
Was gäbe es für einfache Protokolle, damit z.B. die Uhrzeit, Temperatur, Schaltbefehle übertagen werden können.
Grüße Eisbaeeer
Eisbaeer,
Post angekommen?
Wigbert
Hallo Wigbert,
Dein Code oben scheint zu funktionieren :) Wenigstens läuft das Programm sauber durch. Muß am Wochenende mal den Empfänger aufbauen und gucken, wie weit ich mit den Dingern komme.
Habe den Code ein wenig angepaßt, das man nicht über ein Terminal den Text eingeben muß und die Ausgabe erfolgt über ein LCD-Display. Ich möchte ja sowieso mit den Modulen eigentlich nur sicher fernschalten, da reichen die 32 Zeichen Text vollkommen aus. Muß mir jetzt nur noch eine Rückmelderoutine einfallen lassen.
Thomas
Hallo Knickohr,
wenn Du nur ein Befehl sendest, kannst Du ja die Länge
Überwachen, oder Daten vergleichen und erst wenn es beim Empfänger zum Print kommt sendet er irgendetwas zurück.Echo?
Ist vielleicht einfach aber manchmal ausreichend.
Wigbert
Hallo,
ja, ich denke, ich werde in den 32 Zeichen irgend etwas reinschreiben, was sich eindeutig identifiziert und das dann vom Empfänger zurückschicken lassen. Kommt es korrekt an, dann bekomme ich eine Bestätigung, andernfalls kann ich den Befehl nochmal senden. Man kann vielleicht auch eine eindeutige Nummer mitgeben, so das mehrere Empfänger gleichzeitig angesprochen werden können.
Thomas
wenn Dir 32 Zeichen zu lang sind. versuch das mal mit:
zu verändern.Code:Const Maxchar = 32
Wigbert