Guten Abend, mir ist bewusst, dass es schon viele Beiträge zu diesem Thema gibt, aber diese haben mir leider nicht weitergeholfen. Ich verwende 2 RFM12 mit 2 Atmega32. Da ich mir nicht sicher war ob mein Code Falsch ist habe ich den von Bastelbaer aus diesem Forum verwendet, dieser Code funktioniert bei ihm. Um festzustellen ob die SPI-Funktion korrekt arbeitet, habe ich das Statusregister am Anfang ausgelesen, der HEX-Code lautet 4000, was bestätigt das kein SPI-Fehler vorliegt. Desweiteren habe ich das Statusregister während der Senderoutine ausgelesen, dort ist das 15 Bit und 13 Bit auf 1, was bedeutet, dass der Sender bereit für das Senden ist, aber der Datenstrom abgebrochen ist, bzw zu langsam gesendt wurde. Hier habe ich die Clockfrequenz von SPI auf max gestellt, Quarz statt 8 MHZ, 10 MHZ verwendet. Leider ohne Erfolg. Zur weiteren Information, beim Empfänger gibt er mir zuer Empfange und dann Nullen über die RS-232 Schnittstelle aus. Anbei habe ich den Code des Senders, ich habe hier nur ein Unterprogramm (Sub) für die Statusabfrage eingefügt sonst keine Änderungen des Codes vorgenommen. Anschluss des RFM12: uC(Atmega32) rfm12 pb4(SS) nSEL pb5(MOSI) SDI pb6(MISO) SDO pb7(SCK) SCK 10K Pullup an FSK und Antenne ist 16 cm lang Hoffe es kann mir jemand weiterhelfen ' 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 = 8000000 $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_readys Declare Sub Rf12_txdata(byval Maxchar As Byte) Declare Sub Rf12_rxdata(byval Maxchar As Byte) Declare Sub Rf12_sta 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.4 ' SS-Pin Config Spi_cs = Output Spi_sdo Alias Pinb.6 ' MOSI-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) ' Waitms 10 Wait 1 ' Hier ist die Empfangsroutine 'Print "Empfange" 'Call Rf12_rxdata(maxchar) 'For Count = 1 To Maxchar 'Print Chr(rfdata(count)) ; "-"; 'Next Count 'Print gosub rf12_sta Loop End 'end program ' ######################################################################## ' ###### Unterroutinen ' ######################################################################## Sub Rf12_init: Waitms 150 Gosub Rf12_sta 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_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_readys 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_sta Temp = Rf12_trans(&H0000) Print " " Print Hex(temp) Print " " End Sub
Philipp K. schrieb: > mir ist bewusst, dass es schon viele Beiträge zu diesem Thema gibt, Und im Bascom Forum gibts sogar funktionierenden Code für die RFMs.
Ja ich verwende auch einen davon aber es funktioniert troztdem nicht
Philipp K. schrieb: > ich verwende auch einen davon Toll, sehr aufschlussreich. Dann nimm die einfach für beide Seiten.
Dieser Code ist für beide Seiten, daher habe ich ja in dieses Forum geschrieben da ich Selbst mit dem auslesen des Statusregisters nicht mehr weiter komme!
Philipp K. schrieb: > Ja ich verwende auch einen davon aber es funktioniert troztdem nicht Falls du auf beiden Seiten Beispielcode verwendest, der bei anderen funktioniert, würde ich nochmal kontrollieren, ob du tatsächlich mit 10MHz läufst, und nicht mit 1,25 MHz. Hast du eine LED, oder etwas ähnliches auf dem Board, die du mit einem einfachen Code z.B. im Sekundentakt blinken lassen kannst?
bezüglich der Taktfrequenz: Der Takt funktioniert korrekt, die Fuses sind am Atmega richtig gesetzt, das Funktmodul kann ich auch am CLK in den verschiedenen Frequenzen einstellen eine LED benötige ich nicht, da ich über die RS-232 Schnittstelle ein Senden jede Sekunde empfange
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.