Frank
18.01.2013, 17:00
Das Programm demonstriert wie sich Daten per Funk austauschen lassen. Laden Sie das Programm unverändert in zwei RN-AVR UNIVERSAL Module die mit einem Funkmodul ausgestattet sind. Nach dem Start senden und empfangen die Module abwechselnd. Werden Daten empfangen werden die über die RS232/USBmodul ausgegeben. 'Werden keine Daten empfangen, wird "Kein Datenempfang" ausgegeben.
Dies ist nur ein Beispielprogramm das für eigene Zwecke beliebig angepasst werden kann
'################################################# #############
'Funkmodul RFM12 Test.bas
'
'Ein Testprogramm für die Universalplatine RN-AVR UNIVERSAL
'
'Das Programm demonstriert wie sich Daten per Funk austauschen lassen
'Laden Sie das Programm unverändert in zwei RN-AVR UNIVERSAL Module
'die mit einem Funkmodul ausgestattet sind.
'Nach dem Start senden und empfangen die Module abwechselnd
'Werden Daten empfangen werden die über die RS232/USBmodul ausgegeben
'Werden keine Daten empfangen, wird "Kein Datenempfang" ausgegeben.
'Dies ist nur ein Beispielprogramm das für eigene Zwecke beliebig
'angepasst werden kann
'
'Bezug: www.robotikhardware.de (http://www.robotikhardware.de)
'Weitere Beispiele auf DVD oder im www.Roboternetz.de (http://www.Roboternetz.de) und rn-wissen.de
'################################################# #####################
Declare Sub Rfm12_init
Declare Sub Rfm12_setfrequenz
Declare Sub Rfm12_empfange
Declare Sub Rfm12_senden
Declare Function Spitransfer(byval Dout As Word) As Word
$programmer = 12 'MCS USB (Zeile weglassen wenn anderer Programmer)
$prog &HFF , &HFF , &HD9 , &HFE 'Fusebits richtig programmieren (Quarz ein,Jtag aus)
$regfile = "m644def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000 'QuarzFrequenzuenz
$baud = 9600
Baud = 9600
Config Pind.6 = Output 'LED
Led1 Alias Portd.6
Config Pind.2 = Input 'Int0
Portd.2 = 1 'Pullup
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Funkirq
Ss Alias Portb.4
Mosi Alias Portb.5
Miso Alias Pinb.6
Sck Alias Portb.7
Config Ss = Output
Config Mosi = Output
Config Sck = Output
Dim Datenbytes As Byte
Dim D As Word
Dim Eingangsdaten(20) As Byte
Dim Ausgabedaten(20) As Byte
Dim N As Byte
Dim Timeout As Word
Dim T As Word
Dim Tt As Word
Dim Frequenz As Single
Ss = 1
Sck = 0
Rfm12_init
Frequenz = 434.150
Rfm12_setfrequenz
Do
For N = 1 To 10 'Datenbytes mit beliebigen Werten füllen
Ausgabedaten(n) = N
Next N
Rfm12_senden
Waitms 500
Timeout = 400 + Rnd(1000)
Rfm12_empfange
Led1 = 0
If Datenbytes = 0 Then
Print "Kein Datenempfang"
Else
Print
Print "Datenbytes:" ; Datenbytes
For N = 1 To Datenbytes
Print Eingangsdaten(n);
Print " ";
Next N
End If
Waitms 700
Loop
' ************ Hilfsfunktionen zur Kommunikation mit Funkmodul **************
' (nähere Infos im Datenblatt des Funkmoduls)
' Initialisiere Funkmodul
Sub Rfm12_init
D = Spitransfer(&H80d7) '433 MHz
'D = spitransfer(&H80e7) '868 MHz
D = Spitransfer(&H82d9)
D = Spitransfer(&Ha67c) '434,15 MHz / 868,3 MHz
D = Spitransfer(&Hc647) '4.8kbps
D = Spitransfer(&H94a4)
D = Spitransfer(&Hc2ac)
D = Spitransfer(&Hca81)
D = Spitransfer(&Hc483)
D = Spitransfer(&H9850)
D = Spitransfer(&He000)
D = Spitransfer(&Hc800)
D = Spitransfer(&Hc000)
D = Spitransfer(&H0000)
Waitms 200
End Sub
Sub Rfm12_setfrequenz
If Frequenz < 800 Then Frequenz = Frequenz * 2
Frequenz = Frequenz - 860
D = Frequenz / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spitransfer(d)
End Sub
Sub Rfm12_empfange
Tt = Timeout * 10
D = Spitransfer(&H82c8)
D = Spitransfer(&Hca83)
Datenbytes = 0
For N = 1 To 10
Ss = 0
T = 0
Do
T = T + 1
Waitus 100
If T > Tt Then Goto Nosignal
Loop Until Miso = 1
D = Spitransfer(&Hb000)
Eingangsdaten(n) = D
Datenbytes = Datenbytes + 1 'Anzahl der empfangenen Bytes merken
Next N
Nosignal:
D = Spitransfer(&H8208)
End Sub
Sub Rfm12_senden
D = Spitransfer(&H8238)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb82d)
Gosub Rfm12_warte
D = Spitransfer(&Hb8d4)
For N = 1 To 10
Gosub Rfm12_warte
D = &HB800 + Ausgabedaten(n)
D = Spitransfer(d)
Next N
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&H8208)
End Sub
Function Spitransfer(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dmiso As Word
Ss = 0
Dmiso = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Mosi = 0
Else
Mosi = 1
End If
Dout = Dout * 2
Dmiso = Dmiso * 2
Dmiso = Dmiso + Miso
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Ss = 1
Spitransfer = Dmiso
End Function
Rfm12_warte:
Ss = 0
Do
Loop Until Miso = 1
Return
Funkirq:
Led1 = 1
Return
Dies ist nur ein Beispielprogramm das für eigene Zwecke beliebig angepasst werden kann
'################################################# #############
'Funkmodul RFM12 Test.bas
'
'Ein Testprogramm für die Universalplatine RN-AVR UNIVERSAL
'
'Das Programm demonstriert wie sich Daten per Funk austauschen lassen
'Laden Sie das Programm unverändert in zwei RN-AVR UNIVERSAL Module
'die mit einem Funkmodul ausgestattet sind.
'Nach dem Start senden und empfangen die Module abwechselnd
'Werden Daten empfangen werden die über die RS232/USBmodul ausgegeben
'Werden keine Daten empfangen, wird "Kein Datenempfang" ausgegeben.
'Dies ist nur ein Beispielprogramm das für eigene Zwecke beliebig
'angepasst werden kann
'
'Bezug: www.robotikhardware.de (http://www.robotikhardware.de)
'Weitere Beispiele auf DVD oder im www.Roboternetz.de (http://www.Roboternetz.de) und rn-wissen.de
'################################################# #####################
Declare Sub Rfm12_init
Declare Sub Rfm12_setfrequenz
Declare Sub Rfm12_empfange
Declare Sub Rfm12_senden
Declare Function Spitransfer(byval Dout As Word) As Word
$programmer = 12 'MCS USB (Zeile weglassen wenn anderer Programmer)
$prog &HFF , &HFF , &HD9 , &HFE 'Fusebits richtig programmieren (Quarz ein,Jtag aus)
$regfile = "m644def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000 'QuarzFrequenzuenz
$baud = 9600
Baud = 9600
Config Pind.6 = Output 'LED
Led1 Alias Portd.6
Config Pind.2 = Input 'Int0
Portd.2 = 1 'Pullup
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Funkirq
Ss Alias Portb.4
Mosi Alias Portb.5
Miso Alias Pinb.6
Sck Alias Portb.7
Config Ss = Output
Config Mosi = Output
Config Sck = Output
Dim Datenbytes As Byte
Dim D As Word
Dim Eingangsdaten(20) As Byte
Dim Ausgabedaten(20) As Byte
Dim N As Byte
Dim Timeout As Word
Dim T As Word
Dim Tt As Word
Dim Frequenz As Single
Ss = 1
Sck = 0
Rfm12_init
Frequenz = 434.150
Rfm12_setfrequenz
Do
For N = 1 To 10 'Datenbytes mit beliebigen Werten füllen
Ausgabedaten(n) = N
Next N
Rfm12_senden
Waitms 500
Timeout = 400 + Rnd(1000)
Rfm12_empfange
Led1 = 0
If Datenbytes = 0 Then
Print "Kein Datenempfang"
Else
Print "Datenbytes:" ; Datenbytes
For N = 1 To Datenbytes
Print Eingangsdaten(n);
Print " ";
Next N
End If
Waitms 700
Loop
' ************ Hilfsfunktionen zur Kommunikation mit Funkmodul **************
' (nähere Infos im Datenblatt des Funkmoduls)
' Initialisiere Funkmodul
Sub Rfm12_init
D = Spitransfer(&H80d7) '433 MHz
'D = spitransfer(&H80e7) '868 MHz
D = Spitransfer(&H82d9)
D = Spitransfer(&Ha67c) '434,15 MHz / 868,3 MHz
D = Spitransfer(&Hc647) '4.8kbps
D = Spitransfer(&H94a4)
D = Spitransfer(&Hc2ac)
D = Spitransfer(&Hca81)
D = Spitransfer(&Hc483)
D = Spitransfer(&H9850)
D = Spitransfer(&He000)
D = Spitransfer(&Hc800)
D = Spitransfer(&Hc000)
D = Spitransfer(&H0000)
Waitms 200
End Sub
Sub Rfm12_setfrequenz
If Frequenz < 800 Then Frequenz = Frequenz * 2
Frequenz = Frequenz - 860
D = Frequenz / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spitransfer(d)
End Sub
Sub Rfm12_empfange
Tt = Timeout * 10
D = Spitransfer(&H82c8)
D = Spitransfer(&Hca83)
Datenbytes = 0
For N = 1 To 10
Ss = 0
T = 0
Do
T = T + 1
Waitus 100
If T > Tt Then Goto Nosignal
Loop Until Miso = 1
D = Spitransfer(&Hb000)
Eingangsdaten(n) = D
Datenbytes = Datenbytes + 1 'Anzahl der empfangenen Bytes merken
Next N
Nosignal:
D = Spitransfer(&H8208)
End Sub
Sub Rfm12_senden
D = Spitransfer(&H8238)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb82d)
Gosub Rfm12_warte
D = Spitransfer(&Hb8d4)
For N = 1 To 10
Gosub Rfm12_warte
D = &HB800 + Ausgabedaten(n)
D = Spitransfer(d)
Next N
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&H8208)
End Sub
Function Spitransfer(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dmiso As Word
Ss = 0
Dmiso = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Mosi = 0
Else
Mosi = 1
End If
Dout = Dout * 2
Dmiso = Dmiso * 2
Dmiso = Dmiso + Miso
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Ss = 1
Spitransfer = Dmiso
End Function
Rfm12_warte:
Ss = 0
Do
Loop Until Miso = 1
Return
Funkirq:
Led1 = 1
Return