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)
Anschluss vom RFM zum AVR ist wie folgt: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
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:
Anschluss ist hier wie folgt: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
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:
Auf dem Display steht dann immer "Empfange"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
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








Zitieren

Lesezeichen