Bammel
15.09.2009, 19:48
Hallo,
ich habe mir für mein Robo-Control ein Funkmodul mit einem Atmega8 und dem RFM12 433mhz modul gebaut.
Habe den code von der elektor auf mein modul angepasst. dies sieht so aus (tests hab ich weggelassen)
'Elektor RFM12
$regfile = "m8def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
'$crystal = 11059200
$crystal = 16000000
$baud = 19200
Nsel Alias Portb.2
Sdi Alias Portb.3
Sdo Alias Pinb.4
Sck Alias Portb.5
Dim D As Word
Dim Data_in(10) As Byte
Dim Data_out(10) As Byte
Dim N As Byte
Dim Timeout As Word
Dim T As Word
Dim Tt As Word
Dim Freq As Single
Declare Sub Send_rfm12
Declare Sub Receive_rfm12
Declare Sub Freq_rfm12
Declare Sub Wait_rfm12
Declare Function Spi16(byval Dout As Word) As Word
Config Nsel = Output
Config Sdi = Output
Config Sck = Output
'Config Portc = Output
'Porta = &HFF
'Init
Nsel = 1
Sck = 0
D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
'D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
D = Spi16(&Hc647) ' 4.8kbps
D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
D = Spi16(&H9850) ' 90 kHz , power - 0 dB
D = Spi16(&He000) '
D = Spi16(&Hc800) '
D = Spi16(&Hc000) ' 1 MHz , 2.2V
Freq = 434.150
Freq_rfm12
Do
For N = 1 To 10
Data_out(n) = N
Next N
Send_rfm12
Waitms 500
For N = 1 To 10
Data_in(n) = 0
Next N
Timeout = 400 + Rnd(1000)
Receive_rfm12
For N = 1 To 10
Print Data_in(n);
Print " ";
Next N
Waitms 700
Loop
Sub Freq_rfm12
If Freq < 800 Then Freq = Freq * 2
Freq = Freq - 860
D = Freq / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spi16(d)
End Sub
Sub Send_rfm12
D = Spi16(&H8238)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb82d)
Wait_rfm12
D = Spi16(&Hb8d4)
For N = 1 To 10
Wait_rfm12
D = &HB800 + Data_out(n)
D = Spi16(d)
Next N
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&H8208)
End Sub
Sub Wait_rfm12
Nsel = 0
Do
Loop Until Sdo = 1
End Sub
Sub Receive_rfm12
Tt = Timeout * 10
D = Spi16(&H82c8)
D = Spi16(&Hca83)
For N = 1 To 10
Nsel = 0
T = 0
Do
T = T + 1
Waitus 100
If T > Tt Then Goto Nosignal
Loop Until Sdo = 1
D = Spi16(&Hb000)
Data_in(n) = D
Next N
Nosignal:
D = Spi16(&H8208)
End Sub
Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
Nsel = 0
Dsdo = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Sdi = 0
Else
Sdi = 1
End If
Dout = Dout * 2
Dsdo = Dsdo * 2
Dsdo = Dsdo + Sdo
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Nsel = 1
Spi16 = Dsdo
End Function
das funktioniert soweit ja ganz gut bekomme über die uart immer folgende ausgabe "1 2 3 4 5 6 7 8 9 10"
dann habe ich ein wenig experimentiert und festgestellt das immer nur ziffer/buchstabe für ziffer/buchstabe übertragen werden. über die funkverbindung wäre es ja net schlimm jetzt möchte ich es aber so haben das die länge variabel ist und ich über die uart nur einmal beim fertig empfangenden string gesendet wird. dazu habe ich die main loop so geändert:
Dim Mystring As String * 9
Dim Myarray(10) As Byte At Mystring Overlay
Dim Myinstring As String * 9
Dim Myinarray(10) As Byte At Myinstring Overlay
mystring = "Beep"
Do
For N = 1 To 10
Data_out(n) = Myarray(n)
Next N
Send_rfm12
Waitms 500
For N = 1 To 10
Data_in(n) = 0
Next N
Timeout = 400 + Rnd(1000)
Receive_rfm12
For N = 1 To 10
Myinarray(n) = Data_in(n) ;
Next N
Print Myinstring ; "#" ;
Waitms 700
Loop
doch wird über die uart wieder alles einzelnt übertragen sprich ich bekomme erst ein "B" dann "e" dann "e" dann "p" und es wird ständig gesendet. ich möchte aber alles als ein wort bekommen also "Beep"
wenn die hürde genommen ist möchte ich noch über input oder ähnliches eine eingabe abwarten können. die dann gesendet wird. also das ganze system soll wie ein uart kabel laufen.
ich hoffe das war verständlich ansonsten einfach hinterhaken.
danke schonmal für drüberschauen.
mfg Bammel
ich habe mir für mein Robo-Control ein Funkmodul mit einem Atmega8 und dem RFM12 433mhz modul gebaut.
Habe den code von der elektor auf mein modul angepasst. dies sieht so aus (tests hab ich weggelassen)
'Elektor RFM12
$regfile = "m8def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
'$crystal = 11059200
$crystal = 16000000
$baud = 19200
Nsel Alias Portb.2
Sdi Alias Portb.3
Sdo Alias Pinb.4
Sck Alias Portb.5
Dim D As Word
Dim Data_in(10) As Byte
Dim Data_out(10) As Byte
Dim N As Byte
Dim Timeout As Word
Dim T As Word
Dim Tt As Word
Dim Freq As Single
Declare Sub Send_rfm12
Declare Sub Receive_rfm12
Declare Sub Freq_rfm12
Declare Sub Wait_rfm12
Declare Function Spi16(byval Dout As Word) As Word
Config Nsel = Output
Config Sdi = Output
Config Sck = Output
'Config Portc = Output
'Porta = &HFF
'Init
Nsel = 1
Sck = 0
D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
'D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
D = Spi16(&Hc647) ' 4.8kbps
D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
D = Spi16(&H9850) ' 90 kHz , power - 0 dB
D = Spi16(&He000) '
D = Spi16(&Hc800) '
D = Spi16(&Hc000) ' 1 MHz , 2.2V
Freq = 434.150
Freq_rfm12
Do
For N = 1 To 10
Data_out(n) = N
Next N
Send_rfm12
Waitms 500
For N = 1 To 10
Data_in(n) = 0
Next N
Timeout = 400 + Rnd(1000)
Receive_rfm12
For N = 1 To 10
Print Data_in(n);
Print " ";
Next N
Waitms 700
Loop
Sub Freq_rfm12
If Freq < 800 Then Freq = Freq * 2
Freq = Freq - 860
D = Freq / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spi16(d)
End Sub
Sub Send_rfm12
D = Spi16(&H8238)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb82d)
Wait_rfm12
D = Spi16(&Hb8d4)
For N = 1 To 10
Wait_rfm12
D = &HB800 + Data_out(n)
D = Spi16(d)
Next N
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&H8208)
End Sub
Sub Wait_rfm12
Nsel = 0
Do
Loop Until Sdo = 1
End Sub
Sub Receive_rfm12
Tt = Timeout * 10
D = Spi16(&H82c8)
D = Spi16(&Hca83)
For N = 1 To 10
Nsel = 0
T = 0
Do
T = T + 1
Waitus 100
If T > Tt Then Goto Nosignal
Loop Until Sdo = 1
D = Spi16(&Hb000)
Data_in(n) = D
Next N
Nosignal:
D = Spi16(&H8208)
End Sub
Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
Nsel = 0
Dsdo = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Sdi = 0
Else
Sdi = 1
End If
Dout = Dout * 2
Dsdo = Dsdo * 2
Dsdo = Dsdo + Sdo
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Nsel = 1
Spi16 = Dsdo
End Function
das funktioniert soweit ja ganz gut bekomme über die uart immer folgende ausgabe "1 2 3 4 5 6 7 8 9 10"
dann habe ich ein wenig experimentiert und festgestellt das immer nur ziffer/buchstabe für ziffer/buchstabe übertragen werden. über die funkverbindung wäre es ja net schlimm jetzt möchte ich es aber so haben das die länge variabel ist und ich über die uart nur einmal beim fertig empfangenden string gesendet wird. dazu habe ich die main loop so geändert:
Dim Mystring As String * 9
Dim Myarray(10) As Byte At Mystring Overlay
Dim Myinstring As String * 9
Dim Myinarray(10) As Byte At Myinstring Overlay
mystring = "Beep"
Do
For N = 1 To 10
Data_out(n) = Myarray(n)
Next N
Send_rfm12
Waitms 500
For N = 1 To 10
Data_in(n) = 0
Next N
Timeout = 400 + Rnd(1000)
Receive_rfm12
For N = 1 To 10
Myinarray(n) = Data_in(n) ;
Next N
Print Myinstring ; "#" ;
Waitms 700
Loop
doch wird über die uart wieder alles einzelnt übertragen sprich ich bekomme erst ein "B" dann "e" dann "e" dann "p" und es wird ständig gesendet. ich möchte aber alles als ein wort bekommen also "Beep"
wenn die hürde genommen ist möchte ich noch über input oder ähnliches eine eingabe abwarten können. die dann gesendet wird. also das ganze system soll wie ein uart kabel laufen.
ich hoffe das war verständlich ansonsten einfach hinterhaken.
danke schonmal für drüberschauen.
mfg Bammel