PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rfm01, Rfm02 Rfm12 Pollin Funkmodul mit bascom



stevensen
19.05.2007, 15:58
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?

Rofo88
19.05.2007, 16:07
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

stevensen
19.05.2007, 18:33
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.

Spanky
29.05.2007, 15:14
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

Eisbaeeer
13.06.2007, 16:47
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

Spanky
13.06.2007, 18:37
Ich hab das angeschlossen.
Seit dem kann ich mit dem Board nix mehr Programmieren.

Gut das ich zwei hab :P

Picht
13.06.2007, 19:43
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

Spanky
14.06.2007, 13:42
@Picht:

Jo,
den Optokoppler hab ich eingebaut. Da muss ich das mal irgentwie überbrücken. Mal sehen was ich machen kann

Eisbaeeer
14.06.2007, 16:06
Hallo Eisbaeeer,
jou hab ich , seh mal unter

http://www.comwebnet.de/

nach.

Ja da war ich schon. Ich hab versucht, das Script für einen Atmega32 - 16MHz anzupassen. Bisher ohne Erfolg.

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

Picht
15.06.2007, 16:04
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

Eisbaeeer
15.06.2007, 22:11
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.


' 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
Print

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


Kann da jemand helfen?
Eval Funk Board von Pollin, Funkmodul auch von Pollin, Atmega32-16

Grüße Eisbaeeer

recycle
15.06.2007, 22:55
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?

Eisbaeeer
16.06.2007, 08:59
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

Picht
16.06.2007, 19:59
Hallo Eisbaeer,
nochmals, ich habe das Board in Funktion,allerdings statt
Optokoppler eine Brücke.

http://www.mikrocontroller.net/attachment/23592/PICT0131.JPG

kann es sein das bei 16Mhz der Prozessor zu schnell ist und Du bei


Sub Rf12_ready
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub

nop einsetzen musst
probier mal.
in der Simmulation bleibt bei Empfang mein Code auch stehen.
Geht aber
Ich vergleich trotzdem mal die Code.

Wigbert

Picht
16.06.2007, 21:23
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

Eisbaeeer
17.06.2007, 09:58
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

Picht
17.06.2007, 10:13
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

Eisbaeeer
17.06.2007, 14:37
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.
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

Picht
17.06.2007, 14:54
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

Eisbaeeer
17.06.2007, 14:59
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.
Ich bin mal gespannt.

Picht
17.06.2007, 15:46
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

Picht
17.06.2007, 16:21
Nachtrag,
bei meinem Eigenbau-RFM12 Board habe ich diesen "Stromanstieg"
wie bein Pollinboard nicht. Werde das mal weiter untersuchen.

Wigbert

Picht
17.06.2007, 22:28
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

Eisbaeeer
18.06.2007, 06:19
Hallo



Auf dem Pollinboard wurde ein 10K Widerstand zwischen FSK und
VDD am rfm12 gelegt.
Wigbert

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 .
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:


' 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
Print

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

Picht
18.06.2007, 09:30
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

Picht
18.06.2007, 09:47
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

Eisbaeeer
18.06.2007, 10:01
Hallo Eisbaeeer,
die 10 K sind nicht Standard und habe ich aus anderen Foren.

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.



Da der M8 und der m32 beschaltet ist ,einfach auf eine leere Fassung
stecken. Richtiger Pin natürlich.

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.



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 werde das mit dem 10k Widerstand gleich heut Abend testen.

Grüße Eisbaeeer

P.S.: Wenn das ganze mal läuft, werde ich das mal richtig dokumentieren.

Picht
18.06.2007, 11:17
Hallo Leute,
ein Bild sagt mehr als Tausen Worte.....
Hab mal unter:

http://www.mikrocontroller.net/attachment/24044/PICT0158.JPG

meine Modifikation des Pollinboards für den o.g.Code
hinterlegt.



Ich hab den FSK mit dem obigen Script auf High. Das ist ja jetzt vergleichbar mit 10k Pullup
Irgendwann wirst Du den FSK-Pin brauchen, ich denke mit dem
10KOhm Pullup-Widerstand ist das die klügere Entscheidung.

Wigbert

Eisbaeeer
18.06.2007, 16:40
Hi


Irgendwann wirst Du den FSK-Pin brauchen, ich denke mit dem
10KOhm Pullup-Widerstand ist das die klügere Entscheidung.

Wigbert

Ja schon klar.
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]

Picht
18.06.2007, 17:31
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

Eisbaeeer
18.06.2007, 17:48
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:


ÿ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>

Hier der Code zum Board mit gebrücktem Optokoppler:



' 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
Print

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


So, jetzt muss wohl doch das Datenblatt studiert werden. Aber ausdrucken lässt sich das mist***** nicht.

Grüße Eisbaeeer

Picht
18.06.2007, 17:58
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

Eisbaeeer
18.06.2007, 18:08
Hast du das ganze schon Bidirektional gestestet? In beide Richtungen?

Picht
18.06.2007, 18:25
Aber sicher doch,

der code unter

http://home.arcor.de/dirk.milewski/RFM12/rf12Tranceiver.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

Eisbaeeer
18.06.2007, 20:35
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

Picht
18.06.2007, 20:45
Eisbaeer,

Post angekommen?

Wigbert

Knickohr
05.07.2007, 09:48
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

Picht
05.07.2007, 10:31
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

Knickohr
05.07.2007, 11:37
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

Picht
05.07.2007, 15:07
wenn Dir 32 Zeichen zu lang sind. versuch das mal mit:


Const Maxchar = 32

zu verändern.

Wigbert

nikolaus10
21.07.2007, 00:19
Hallo

Hab mir nochmal das Layout der Pollin-Evaluierungskarte angeschaut.
Da wurde aber mit den Abblockkondensatoren am Spannungsregler geschludert.
Vielleicht ist das der Grund fuer die Erwaermung.
Wenn man es gut machen will nimmt man an jeder Seite des 5Volt Reglers keramische Kondensatoren so nah an den Regler wie moeglich.
Koennte also sein das einige Platinen durch Exemplarstreung durch den Optokoppler anfangen zu schwingen. Koennte das mal einer der Besitzer des Pollin Eval-Boardes ueberpruefen ?

MFG

heinzi
29.07.2007, 11:02
hallo leute!

hier hat dino dieter nen CRC check und empfangsroutine für UART in
bascom geschrieben. ausgelegt für diese billigempfänger (und sender) von conrad:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=5540

vielleicht kann man den CRC check irgendwie verwenden.

den code von bastelbaer kennt ihr ja bereits (http://www.mikrocontroller.net/topic/67273)

das datenblatt des verwendeten ICs dürfte auch detailliertere angaben liefern als die von pollin =P~

http://www.integration.com/docs/IA4421-DS.pdf

Spokky
20.09.2007, 01:09
hallo, habs nun auch nach langen versuchen hinbekommen die dinger ans laufen zu bekommen, hab aber ein kleines problem.
die ersten 1 bis 3 bytes kommen nur verstückelt an. also -irgendwas-s--i-s-t--e-i-n--4-3-3-M-H-z--T-e-s-t--!-!-!-!-!- .
was kann ich da machen? ist so egal in welche richtung ich schicke, also an den boards kanns nicht liegen. hab sogar den sender eine etage höher gestellt um verbindungsprobleme zu suchen, aber war den dingern egal.
benutze einen atmega 8 @ 7.3728 Mhz und nen mega 168 @ 8 Mhz. 19200 baud. rs232 und funkmodul. egal in welche richtung, egal wie weit weg voneinander, egal wie ausgerichtet, immer das gleiche problem. :(

Knickohr
20.09.2007, 11:02
Hallo Spokky,

spiel mal ein bißchen mit den Werten in der Rf12_ready-Routine.

Das Problem hatte ich auch. Offensichtlich kommt da hin und wieder der Timeout zu früh :

Sub Rf12_ready
Reset Spi_cs
For I = 1 To 1500
If Spi_sdo = 1 Then Exit For
Next
End Sub

Im Extremfall einfach keinen Timeout programmieren :

Sub Rf12_ready
Reset Spi_cs
Do
Loop Until Spi_sdo = 1
End Sub

Thomas

Spokky
20.09.2007, 11:20
jo, danke, das werde ich nacher sofort mal probieren. hatte das problem jetzt erstmal gelöst indem ich den string kürzergemacht habe. dann ging es komischerweise auch ohne probleme.