PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RFM12 433Mhz seltsame Phänomene



apohero
04.04.2008, 18:25
Servus, mal wieder, zusammen,
endlich habe ich jetzt die richtigen RFM12 Module mit 433Mhz bekommen. Heute habe ich sie integriert und wollte sie natürlich testen.
Beschaltet habe ich sie beide wie hier:
http://comwebnet.co.funpic.de/RFM12/RFM12.GIF

an jeweils 2 Atmega88.

Hier ist der Code des Senders:


' ################################################## #####################
' ### generated. Take care that the chip supports all fuse bytes.
' ### RFM12-Test in Bascom
' ### Basiert auf Code von Benedikt K. ( in C )
' ### Joachim Fossie Bär Reiter 04/2007 ( BASCOM )
' ### Wigbert Picht Verbesserungen
' ### Version V0.1 03.06.07
' ### www.comwebnet.de
' ################################################## ######################
' # !! ATMEGA mit externen Takt Fussen !!
' ################################################## #######################

$regfile = "m88def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 8000000 '
$baud = 19200
Baud = 19200

Config Portd.0 = Output 'LED zur Schleifenkontrolle
Portd.0 = 1
Waitms 500
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_readys
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Sub Senden
Declare Sub Empfangen

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

' werden benötigt für rf12_ready
Spi_cs Alias Portb.2 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.4 ' 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
Dim S As String * 10



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


'Goto Empf
Schleife:

Toggle Portd.5 'Schleifenkontrolle

If Len(s) > 2 Then 'wenn String >... dann Ausgabe
'interrupt niRQ 'warten auf nIRQ
Senden
Text = S
S = ""

End If
Goto Schleife

Zuruck:
Loop
End

' ################################################## ######################
' ####### Tranceiverroutinen
' ################################################## ######################
Sub Empfangen
Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ; "-";
Next Count
Print
Goto Zuruck
End Sub

Sub Senden
'Waitms 1 'e
' Hier ist die Senderoutine
Print "Sende"
Call Rf12_txdata(maxchar)
Waitms 10
End Sub

' ################################################## ######################
' ###### Unterroutinen
' ################################################## ######################

Sub Rf12_init:
Waitms 150
Temp = Rf12_trans(&Hc0e0)
Toggle Portd.0
Waitms 400
Temp = Rf12_trans(&H80d7)
Toggle Portd.0
Waitms 400
Temp = Rf12_trans(&Hc2ab)
Toggle Portd.0
Waitms 400
Temp = Rf12_trans(&Hca81)
Toggle Portd.0
Waitms 400
Temp = Rf12_trans(&He000)
Toggle Portd.0
Waitms 400
Temp = Rf12_trans(&Hc800)
Toggle Portd.0
Waitms 400
Temp = Rf12_trans(&Hc4f7)
Toggle Portd.0
Waitms 400
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_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb82d)
Rf12_readys
Temp = Rf12_trans(&Hb8d4)
Rf12_readys
For Count = 1 To Maxchar
Rf12_readys
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Rf12_readys
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_readys 'ready Senden
Reset Spi_cs
While Spi_sdo = 0
Wend
End Sub

Sub Rf12_ready 'ready Empfangen
Reset Spi_cs
While Spi_sdo = 0
If Len(s) > 0 Then 'Wenn ein string eingelesen
Temp = Rf12_trans(&Hca81) 'Fifo deaktivieren
Temp = Rf12_trans(&H8208) 'Empf. ausschalten
Goto Schleife 'Springe zum hauptprogramm
Else 'sonst warte weiter auf Empfangsdaten
Wend
End If
End Sub

' ################################################## ###############
' ######## String einlesen durch Interrupt
' ################################################## ###############


Und hier der des Empfängers:



' ################################################## #####################
' ### generated. Take care that the chip supports all fuse bytes.
' ### RFM12-Test in Bascom
' ### Basiert auf Code von Benedikt K. ( in C )
' ### Joachim Fossie Bär Reiter 04/2007 ( BASCOM )
' ### Wigbert Picht Verbesserungen
' ### Version V0.1 03.06.07
' ### www.comwebnet.de
' ################################################## ######################
' # !! ATMEGA mit externen Takt Fussen !!
' ################################################## #######################

$regfile = "m88def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 8000000 '
$baud = 19200
Baud = 19200

Config Portd.5 = Output 'LED zur Schleifenkontrolle
Home
Lcd "Starte init"
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_readys
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Sub Senden
Declare Sub Empfangen

Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 32
Config Lcd = 16 * 2
Config Portb.0 = 1
Config Lcdpin = Pin , Db7 = Portc.3 , Db6 = Portc.2 , Db5 = Portc.1 , Db4 = Portc.0 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Config Portd.7 = 0
Config Portd.6 = 0
Portb.0 = 1

'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

' werden benötigt für rf12_ready
Spi_cs Alias Portb.2 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.4 ' 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
Dim S As String * 10

'Einlesen der String durch Interrupt


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

Empfangen
'Goto Empf
Schleife:

Toggle Portd.5 'Schleifenkontrolle

If Len(s) > 2 Then 'wenn String >... dann Ausgabe
'interrupt niRQ 'warten auf nIRQ

Text = S
S = ""
Empfangen
End If
Goto Schleife

Zuruck:
Loop
End

' ################################################## ######################
' ####### Tranceiverroutinen
' ################################################## ######################
Sub Empfangen
Home
Lcd "Empfange"
Call Rf12_rxdata(maxchar)
Locate 2 , 1
For Count = 1 To Maxchar
Lcd Chr(rfdata(count)) ; "-";
Next Count
Print
Goto Zuruck
End Sub

Sub Senden
'Waitms 1 'e
' Hier ist die Senderoutine
Print "Sende"
Call Rf12_txdata(maxchar)
Waitms 10
End Sub

' ################################################## ######################
' ###### Unterroutinen
' ################################################## ######################

Sub Rf12_init:
Waitms 150
Home
Lcd "C0e0"
Temp = Rf12_trans(&Hc0e0)
Home
Lcd "80d7"
Temp = Rf12_trans(&H80d7)
Home
Lcd "Cc2ab"
Temp = Rf12_trans(&Hc2ab)
Home
Lcd "Ca81"
Temp = Rf12_trans(&Hca81)
Home
Lcd "e000"
Temp = Rf12_trans(&He000)
Home
Lcd "c800"
Temp = Rf12_trans(&Hc800)
Home
Lcd "c4f7"
Temp = Rf12_trans(&Hc4f7)
Home
Lcd "fertig"
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_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb82d)
Rf12_readys
Temp = Rf12_trans(&Hb8d4)
Rf12_readys
For Count = 1 To Maxchar
Rf12_readys
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Rf12_readys
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_readys 'ready Senden
Reset Spi_cs
While Spi_sdo = 0
Wend
End Sub

Sub Rf12_ready 'ready Empfangen
Reset Spi_cs
While Spi_sdo = 0
If Len(s) > 0 Then 'Wenn ein string eingelesen
Temp = Rf12_trans(&Hca81) 'Fifo deaktivieren
Temp = Rf12_trans(&H8208) 'Empf. ausschalten
Goto Schleife 'Springe zum hauptprogramm
Else 'sonst warte weiter auf Empfangsdaten
Wend
End If
End Sub

' ################################################## ###############
' ######## String einlesen durch Interrupt
' ################################################## ###############

Onrxd:
S = S + Chr(udr)
Return


Soviel dazu.Jetzt kommen die Fehler:
Am Sender habe ich eine überprüfungsled an Portd.0. Diese leuchtet aber nur extrem schwach. Ich habe den Code auch schon reduziert wie hier:


$regfile = "m88def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 8000000 '
$baud = 19200
Baud = 19200

Config Portd.0 = Output 'LED zur Schleifenkontrolle
Portd.0 = 1

Allerding bleibt das Phänomen. Wenn ich allerding die beiden Baudzeilen entferne leuchtet sie wieder sehr hell wie gewohnt. Was soll das?

Mein 2. Fehler (und der ist mir sehr wichtig): Das Programm läuft an, hält aber bei Sender und empfänger jeweil bei der Init Funktion an der Stelle He000 auf (also direkt beim Aufruf). Woran liegt das? Den 1k Widerstand zwischen Data und 5V liegt an und ich verwenden den internen 8mhz Os.

Ich wäre euch tausendfach dankbar wenn ihr mir helft diese Module ENDLICH zum laufen zu bringen. Bin am verzweifeln.

raggy
04.04.2008, 22:10
Hallo
Geh mal in der Suchfunktion "RFM12 -- Bascom"
unter Knickohr ist ein Programm aber das weiter unten,nicht das erste,
funktioniert bei mir tadellos.FSK/data hab ich 10 Kohm genommen und laß mal die Led ,erstmal weg.
Gruß raggy

apohero
05.04.2008, 10:40
Danke,
das hatte ich auch mal gefunden. Den 1k gegen den 10k austauschen brachte ebenfalls auch keinen Erfolg.
Aber!!!! Ich habe inzwischen den Empfänger soweit das er empfagsbereit ist. Woran es lag: Ich habe ja mit Atmega88 herum hantiert. Diese konnte ich aber nicht auf 1mhz einstellen. Dann habe ich einen Atmega8 genommen ihn eingestellt und dann lief er durch. ABER.... das darf man glaube ich niemanden erzählen sonst erklärt man mich für verrückt: Der läuft an und geht ins Init dann bleibt er an verschiedenen stellen stehen. Wenn ich aber (jetzt kommts) meine Hand ganz nah an die Kabel halte, geht er weiter. Hab auch mal alle Kabel ausgetauscht brachte aber ebenfalls nichts. Soviel zu den verrückten Phänomenen. Wenn ich die Schaltung in ruhe lasse bleibt er wiederum stehen. Ist doch merkwürdig. Liegt es vielleicht daran das ich alle Kabel an dem Modul verbunden habe ausser dem "Antenne" ?

apohero
05.04.2008, 10:42
Achja um den Sender muss ich mich auch noch kümmern da bisher nur klötzchen oder komische Striche angeziegt werden. Der scheint auch eine Magische Hand zu gebrauchen :)

raggy
05.04.2008, 11:55
Hallo
Hast Du Abblockkondensatoren am Atmega8 und an dem RFM12 Modul ?
https://www.roboternetz.de/wissen/index.php/Abblockkondensator
und auch an dem Atmega8 2xVCC 2xGnd ?
ansonsten muß ich passen
Gruß raggy

apohero
05.04.2008, 12:18
Abblockkondensatoren habe ich nicht dran... nein.
Wo müssen die denn dran? Hab noch nie welche gebraucht.

apohero
05.04.2008, 14:54
hmm ok lesen hilft. Ich werde deinen Tipp mal versuchen. Vielen Dank dafür, hoffe das ist der Fehler.

Ich finde es aber irgendwie merkwürdig, das die Elektronik auf mich reagiert. Dient mein Körper auf irgendeine weise als als Antenne ? Oder sind meine Kabel zum Funkmodul zu lang (ca. 13cm) ? Fuses vielleicht falsch (habe nur auf 8mhz gestellt und divide aus) ? Die Litze ,die als Antenne gilt, vielleicht länger machen (momentan 19cm) ?

raggy
05.04.2008, 15:40
Hi
zur Antenne vom modul bis anttenenspitze 19Cm sollte reichen die anpassung waere nur von vorteil um die Entfernung zu optemieren.
aber fusebit 8Mhz muß mit dem Programm überein sein nicht 19Mhz im programm und 8Mhz im fussebit das geht nicht weil die zeiten im Programm nicht richtig berechnet werden.

zB fuse 1Mhz = $crystal =8Mhz funktioniert nicht richtig

apohero
05.04.2008, 18:42
das ist mir bewußt. Hab 8mhz gefused und crystal 8mhz

apohero
05.04.2008, 19:38
Hab jetzt 2 100nf Kondensatoren verbaut einmal an vcc und gnd vom mikrocontroller und einmal ans Modul. Leider immernoch das selbe Problem. Ich weiß nicht was ich machen soll. Ich brauch nur den kleinen Finger ca. 1cm entfernt von den Kabeln halten und schon macht er weiter. Nehm ich den Finger wieder weg, bleibt er stehen. Hilfe!

apohero
06.04.2008, 15:09
OK!!!! Ich hab das Problem gelöst. Hätte mir nur die beiden Quellcodes genauer anschauen müssen und mich nicht auf die Hardware konzentrieren sollen.
Hatte den Sendercode auf das Modul geladen und der lief einwandfrei. Jetzt dachte ich mir vergleichste mal die beiden Codes auf Unterschiede. Und tatsache ..... der SS und Miso Pin waren falsch angegeben (war auf den Atmega16 gestellt aber ich nutze ja den Atmega8). Und prombt lief er einwandfrei durch. So ein ärger aber auch, wenn man auf soetwas simples nicht kommt. Er Empfängt momentan zwar nur Müll aber das versuche ich gerade in den Griff zu kriegen.
Vielen Dank und sorry das ich euch eure Zeit geraubt habe ;)

raggy
07.04.2008, 21:14
Na ja Prima das es Funktioniert.Dann viel Spaß beim weiter fummeln.
Gruß raggy

apohero
08.04.2008, 08:29
So jetzt läuft alles....Aber.. es gab noch böse Probleme mit der Schaltung. Aus Irgendeinen Grund lief der Empfang wenn ich den Chip auf ein Experimentierboard steckte und dann die Pins mit den Buchsen auf der Schaltung verbund. Aber wenn ich den CHip direkt auf die Schaltung stecke ging es nicht. Also habe ich komplett neu gemacht und siehe da er funkt.