Hallo![]()
![]()
![]()
Es funktioniert !!! \/ \
/ \
/
Habe die Dinger zum Laufen gebracht. Ich habe einfach die Baudrate auf 1200 Baud gesetzt und seit dem kommts auch an. Zwar ist immer noch des letzte übertragene Zeichen Müll, aber das ist eine Kleinigkeit. Seltsamerweise setzt die erste Übertragung auch nicht an der ersten Stelle auf, sondern irgendwo mittendrin. Es sind immer ein paar Blanks am Anfang. Naja, halt beim ersten Mal senden.
OK, hab Programm noch ein wenig angepaßt.
Sender:
Empfänger:Code:' Atmega8 ' VDD -> VCC ' GND -> GND ' SDI -> MOSI (PB3, Pin 17) ' SDO -> MISO (PB4, Pin 18) ' SCK -> SCK (PB5, Pin 19) ' nSel -> SS (PB2, Pin 16) ' Fsk - > R 10k nach VDD ' Atmega16 ' 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 nach VDD $regfile = "m8def.dat" $crystal = 1000000 ' $hwstack = 32 $swstack = 32 $framesize = 40 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 Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Config Lcd = 16 * 2 , Chipset = Dogm162v3 Cursor Off Noblink Cls ' 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 Portb.1 = Output ' LED zur Schleifenkontrolle ' 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 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}" ' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren Do ' Ewigschleife Pulseout Portb , 1 , 500 ' Schleifenkontrolle Text = "433MHz Test #" + Str(j) Senden Locate 1 , 1 : Lcd "Ready " Incr J Wait 3 Loop End ' ######################################################################## ' ####### Tranceiverroutinen ' ######################################################################## Sub Empfangen Locate 2 , 1 : Lcd "Empfange " Waitms 100 Call Rf12_rxdata(maxchar) Locate 2 , 1 : Lcd " " Locate 2 , 1 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
@Wigbert:Code:' Atmega8 ' VDD -> VCC ' GND -> GND ' SDI -> MOSI (PB3, Pin 17) ' SDO -> MISO (PB4, Pin 18) ' SCK -> SCK (PB5, Pin 19) ' nSel -> SS (PB2, Pin 16) ' Fsk - > R 10k ' Atmega16 ' 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 $regfile = "m16def.dat" $crystal = 1000000 ' $hwstack = 32 $swstack = 32 $framesize = 40 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 Lcdpin = Pin , Db4 = Porta.7 , Db5 = Porta.6 , Db6 = Porta.5 , Db7 = Porta.4 , E = Portc.1 , Rs = Portc.0 Config Lcd = 16 * 2 , Chipset = Dogm162v3 Cursor Off Noblink Cls ' 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.7 = Output ' LED zur Schleifenkontrolle ' 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 Pulseout Portd , 7 , 500 ' Schleifenkontrolle 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
Die 1 Sekunde Warten war offensichtlich kein Problem. Ja OK, wenn während der Zeit was gesendet wurde gings natürlich ins Nirwana.
Ist da eigentlich ein Schreibfehler ?
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
Decr Temp
Temp = Rf12_trans(temp)
End Sub
Das rot markierte meine ich. Das würde zumindest bei mir den Fehler mit der herunter gesetzten Baudrate erklären.
Thomas







Zitieren

Lesezeichen