Hallo Zusammen,
ich hab mir jetzt für meinen Roboter auch 2 RFM12 Module von Pollin gekauft. Um auch mal von meinem Pc aus mit diesem kommunizieren zu können.
Dazu habe ich mir zunächst eine Schaltung gebaut die wie folgt aussieht:
PC --[RS232]--> MAX232 --[TTL-RS232]--> AVR (Mega --[SPI]--> RFM12
So weit so gut.
Dann hab ich auf den Controller folgendes Test-Programm aufgespielt:
(Erstmal den PC-Teil weg gelassen)
Code:
$regfile = "m8def.dat"
$crystal = 8000000
'DDR = &B76543210 ; 0=Eingang ; 1=Ausgang
Ddrb = &B00101100
Ddrc = &B00000100
Ddrd = &B01000000
Portb = &B00000000
Portc = &B00000000
Portd = &B00000000
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0
Declare Sub Rfm_init
Declare Sub Rfm_send
Dim Text As String * 20
Dim Spi_data As Integer '2 Bytes
Dim Zeichen As String * 1
Dim Text_send As String * 50
Dim A As Byte
Dim B As Byte
Dim Temp As String * 1
Led Alias Portd.6
Enable Interrupts
Spiinit
wait 1
Rfm_init
Ddrc.0 = 1
Portc.0 = 1
Ddrd.2 = 0
Do
Text_send = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
Rfm_send
Wait 1
Loop
Sub Rfm_init
Set Led
Reset Portc.2 'Modulpower aus
Waitms 400
Set Portc.2 'Modulpower an
Waitms 200
Spi_data = &H80D7
Spiout Spi_data , 2
Spi_data = &H8239
Spiout Spi_data , 2
Spi_data = &HA640
Spiout Spi_data , 2
Spi_data = &HC647
Spiout Spi_data , 2
Spi_data = &H94A0
Spiout Spi_data , 2
Spi_data = &HC2AC
Spiout Spi_data , 2
Spi_data = &HCA81
Spiout Spi_data , 2
Spi_data = &HC483
Spiout Spi_data , 2
Spi_data = &H9850
Spiout Spi_data , 2
Spi_data = &HE000
Spiout Spi_data , 2
Spi_data = &HC800
Spiout Spi_data , 2
Spi_data = &HC400
Spiout Spi_data , 2
Reset Led
End Sub
Sub Rfm_send
Set Led
Spi_data = &H0000
Spiout Spi_data , 2
Spi_data = &H8239
Spiout Spi_data , 2
Spi_data = &HAA
Do
Loop Until Pind.2 = 1
Spiout Spi_data , 1
Spi_data = &HAA
Do
Loop Until Pind.2 = 1
Spiout Spi_data , 1
Spi_data = &HAA
Do
Loop Until Pind.2 = 1
Spiout Spi_data , 1
Spi_data = &H2D
Do
Loop Until Pind.2 = 1
Spiout Spi_data , 1
Spi_data = &HD4
Do
Loop Until Pind.2 = 1
Spiout Spi_data , 1
For B = 1 To 100
For A = 1 To Len(text_send)
Temp = Mid(text_send , A , 1)
Spi_data = Asc(temp)
Do
Loop Until Pind.2 = 1
Spiout Spi_data , 1
Next A
Next B
Reset Led
End Sub
End
Anschluss vom RFM zum AVR ist wie folgt:
RFM12 -> M8
SCK -> SCK
SDO -> MISO
SDI -> MOSI
nSEL -> SS
nIRQ -> INT0
VDD -> PC2
FSK -> PC0
DCLK, FFIT -> PC1
NINT, VDI -> PB1
Das programm sollte nun also alle 1 Sekunden Daten abschicken. Während des sendens müsste die LED leuchten.
Nun hab ich mal zusammen mit einem Kollegen ein Funkgerät daneben gehalten. Man konnte tatsächlich hören das was gesendet wird
ABER: Was mich irritiert hatte: Während die LED leuchtete war nur rauschen zu hören. Und so lange wie die LED aus war, war dann ein Piepton zu hören. Wie kann das denn sein? Ich dachte das Modul sendet sofort das was vom Bus kommt. Denn der hat doch nur ein 16 Bit FIFO. Wie kann er dann eine ganze Sekunde lang was senden, während auf dem Bus nichts geschickt wird?
Aber soll erstmal zweitrangig sein. Es wird ja schonmal irgendwas gesendet.
Nun hab ich mich auch mal an den Empfänger gewagt:
Das Gebilde schaut wie folgt aus:
RFM12 --[SPI]--> AVR (Mega32)
So, als Programm hab ich folgendes geschrieben:
Code:
$regfile = "m32def.dat"
$crystal = 8000000
Ddra = &B01111000
Ddrb = &B10110000
Ddrc = &B11110000
Ddrd = &B00010000
Porta = &B00000000
Portb = &B00000100
Portc = &B00000000
Portd = &B00001000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.7 , Db5 = Portc.6 , Db6 = Portc.5 , Db7 = Portc.4 , E = Porta.6 , Rs = Porta.4
Config Lcdbus = 4
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0
Enable Interrupts
Waitms 10
Initlcd
Cursor Off
Waitms 10
Spiinit
Waitms 100
'RF12 Init:
Waitms 200
Locate 1 , 1
Lcd "Start INIT..."
Reset Porta.3 'Modulpower aus
Waitms 1200
Set Porta.3
Waitms 200 'Modulpower an
Spi_data = &H80D7
Spiout Spi_data , 2
Spi_data = &H82D9
Spiout Spi_data , 2
Spi_data = &HA640
Spiout Spi_data , 2
Spi_data = &HC647
Spiout Spi_data , 2
Spi_data = &H94A0
Spiout Spi_data , 2
Spi_data = &HC2AC
Spiout Spi_data , 2
Spi_data = &HCA81
Spiout Spi_data , 2
Spi_data = &HC483
Spiout Spi_data , 2
Spi_data = &H9850
Spiout Spi_data , 2
Spi_data = &HE000
Spiout Spi_data , 2
Spi_data = &HC800
Spiout Spi_data , 2
Spi_data = &HC400
Spiout Spi_data , 2
Spi_data = &HCA81
Spiout Spi_data , 2
'Enable FIFO
Spi_data = &HCA83
Spiout Spi_data , 2
'Set Portb.2
Locate 1 , 1
Lcd "Wait for data..."
Set Error_led
Do
Loop Until Pinb.2 = 0
Spi_data = &H0000
Spiout Spi_data , 2
Spi_data = &HB000
Spiout Spi_data , 2
Locate 1 , 1
Lcd "Jetzt kommt was"
Set Error_led
Do
Loop
End
Anschluss ist hier wie folgt:
RFM12 -> M32
SCK -> SCK
SDO -> MISO
SDI -> MOSI
nSEL -> SS
nIRQ -> INT2 (PB2)
VDD -> PA3
FSK -> PA0
DCLK, FFIT -> PA1
NINT, VDI -> PA2
Das Proggi läuft durch, bis auf dem Display drinne steht "Wait for data..."
Und da bleibt es stehen. Ganz egal was ich mit dem Sender mache.
Beim durchstöbern der Suche hab ich hier noch ein anderes Empfangs-Programm gefunden, welches ich getestet habe.
Bei diesem Blick ich allerdings nicht durch
Hier mal der Code:
Code:
$regfile = "m32def.dat"
$crystal = 8000000
'DDR = &B76543210 ; 0=Eingang ; 1=Ausgang
Ddra = &B01111000
Ddrb = &B10110000
Ddrc = &B11110000
Ddrd = &B00010000
Porta = &B00000000
Portb = &B00000100
Portc = &B00000000
Portd = &B00001000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.7 , Db5 = Portc.6 , Db6 = Portc.5 , Db7 = Portc.4 , E = Porta.6 , Rs = Porta.4
Config Lcdbus = 4
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 = 1200
Const Maxchar = 16
' 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
Led Alias Portd.4 'Im Text als Portd.7
Waitms 20
Initlcd
Cursor Off
Waitms 10
Locate 1 , 1
Lcd " Cyberdriver 2"
Locate 2 , 1
Lcd " Test-Programm"
Wait 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
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
'Dim J As Byte
Locate 1 , 1 : Lcd "Init RFM12 "
Waitms 100
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Locate 1 , 1 : Lcd "Set Frequenz "
Waitms 100
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Locate 1 , 1 : Lcd "Set Bandwith "
Waitms 100
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Locate 1 , 1 : Lcd "Set Baudrate "
Waitms 100
Call Rf12_setbaud(rf12baud) ' 19200 baud
Locate 1 , 1 : Lcd "Set Tx-Power "
Waitms 100
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
'Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
'Text = "433MHz Test #" + J
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do ' Ewigschleife
Empfangen
Toggle Led
Locate 1 , 1 : Lcd "Ready "
Wait 1
Loop
End
' ########################################################################
' ####### Tranceiverroutinen
' ########################################################################
Sub Empfangen
Locate 1 , 1 : Lcd "Empfange "
Waitms 100
Locate 2 , 1 : Lcd " "
Locate 2 , 1
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Lcd Chr(rfdata(count)) ;
Waitms 100
Next Count
End Sub
Sub Senden
Locate 1 , 1 : Lcd "Sende "
Waitms 100
Call Rf12_txdata(maxchar)
Waitms 10
End Sub
' ########################################################################
' ###### 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
Local I As Word
Reset Spi_cs
For I = 1 To 65000
If Spi_sdo = 1 Then Exit For
Next
End Sub
Auf dem Display steht dann immer "Empfange"
Nach einiger Zeit läuft dann die untere Zeile mit wilden Zeichen voll (Das Zeichen gibts im Display-Datenblatt nicht mal, sind grob gesagt 4 waagerechte striche übereinander).
So, an dem Verhalten ändert sich aber absolut nichts, ob ich den sender an hab oder aus. Das verhalten ist immer exakt gleich.
Hm, nun ja. Hoffe das sich jemand diesen Langen Text durchliest.
Wäre echt super dankbar für jede Hilfe.
Komm hier echt absolut nimmer weiter.
Will zumidnest mal ein Paar Zeichen übertragen können.
Ich denke danach würd ich selbst weiter kommen.
Hoffe auf hilfe.
Gruß, euer Robodriver
Lesezeichen