PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Elektor RFM12 Code in UART ändern. Aber wie?



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

Bammel
16.09.2009, 20:52
soo.. hatte es jezze geschaft daten erfolgreich zu übertragen aber nicht so das ich es wie ein uart nutzen kann.. da mir das alles zu kompliziert ist udn ich auhc funksignale so nicht nachprüfen kann. habe ich mir zwei easy radio 433mhz modul bestellt.