Hallo,
soweit bin ich zufrieden und meine Übertragung per XBee besteht..
Es sendet der "Luftbildsender" einen String: $GROUND#quit-test#7.5#24.4#gpshigh (quittierung / Spannung / Temperatur / GPS-Höhe)
Das funktioniert alles...
Die "Bodenstation" empfängt den o. g. String, teilt ihn auf und stellt die Werte auf einem LCD dar.
Gleichzeitig soll die "Bodenstation" Befehle an den "Luftbildsender" einen Befehl schicken können; in meinem Beispiel einen taster auswerten und daraufhin einen Befehl abschicken, woraufhin sich ein umgebauter Servo (L293D...) am "Luftbildsender" dreht...
Aber irgendwie ist das alles zu langsam! Bzw. dreht sich der Servo erst nach vielen Sekunden - die Sende/Empfangsroutine ist anscheinend zu träge...
Vielleicht mag ja jmd. über den Code rüberschauen:
Bodenstation (Atmega16):
'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------
$regfile = "m16def.dat"
$crystal = 7372800 '7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 9600
'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------
Led_gruen Alias Portb.0
Led_lcd Alias Portb.1
Taster Alias Pind.6
'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------
'Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflösen
'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------
'---- Commands einlesen ----
Dim Quittierung As String * 21
'---- Command senden ----
Dim Cmd As String * 11
'---- Betriebsspannung messen ----
Dim Spannung As Word
Dim Zellspannung_orig As Single
Dim Zellspannung As String * 5
'Dim für lesen
Dim Dollarzeicheneingang As Byte 'Beginn des Datenstrings mit Dollarzeichen
Dim Teildaten(14) As String * 20 ' Array mit den extrahierten Daten
Dim Anzahl As Byte
Dim Datenstring As String * 40
Dim Datenkopf As String * 7
Dim Lcd_command As String * 20
Dim Lcd_voltage As String * 20
Dim Lcd_temperatur As String * 20
Dim Lcd_gps As String * 20
Dim Connect As Byte
'---- LCd Menü ----
'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------
'---- CONFIG ----
' RS232 Hardware
Config Serialin = Buffered , Size = 100 ' konfig serial in
' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren
' LEDs
Config Led_gruen = Output
Config Led_lcd = Output
' Taster
Config Taster = Input
' LCD
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Cursor Off
Deflcdchar 0 , 32 , 32 , 21 , 14 , 4 , 4 , 4 , 4 ' Link-Zeichen
Deflcdchar 1 , 32 , 14 , 31 , 31 , 31 , 31 , 31 , 31 ' battery-full
Deflcdchar 2 , 32 , 14 , 31 , 17 , 17 , 31 , 31 , 31 ' battery-half
Deflcdchar 3 , 32 , 14 , 31 , 17 , 17 , 17 , 17 , 31 ' battery empty
'Interrupts
Enable Interrupts
' sonstige
Start Adc
Declare Sub Xbee ' Senderoutine, um $KAPRIG#... permanent zu senden
'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------
Led_gruen = 1 ' Led-grün OFF
Led_lcd = 0 ' LCD-Beleuchtung ON
Connect = 0
' Begrüßung
Wait 1
Cls
Cursor Off
Locate 1 , 1
Lcd "KaprigControlRxZ1"
Locate 2 , 1
Lcd "KaprigControlRxZ2"
Locate 3 , 1
Lcd "KaprigControlRxZ3"
Locate 4 , 1
Lcd "KaprigControlRxZ4"
Led_lcd = 1
Waitms 200
Led_lcd = 0
Led_gruen = 0
Waitms 100
Led_gruen = 1
Waitms 100
Led_gruen = 0
Waitms 100
Led_gruen = 1
'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------
Cls
Do
'========== hier laufen Tests ab ==========================================
If Taster = 0 Then
Led_lcd = 1
Cmd = "foto"
Locate 1 , 10 'test für sende cmd
Lcd Cmd
Elseif Taster = 1 Then
Led_lcd = 0
Cmd = ""
Locate 1 , 10 'test für sende cmd
Lcd " "
End If
'==========Rx Prüfen auf Befehlseingänge==================================
Dollarzeicheneingang = Inkey()
If Dollarzeicheneingang = 36 Then
Gosub Link
Input Datenstring Noecho '36 ist das Dollarzeichen
Else
Gosub No_link
End If
Datenkopf = Mid(datenstring , 1 , 6)
If Datenkopf = "GROUND" Then
Anzahl = Split(datenstring , Teildaten(1) , "#") '# Trennzeichen der Daten
Datenstring = ""
Gosub Lcd_anzeigen
End If ' --> $GROUND#quit-test#7.5#24.4#gpshigh
'==========Menüstruktur=========================== ========================
'==========Spannung LiPo 2S messen========================================
'(
Spannung = Getadc(3) ' Zelle messen und berechnen
Zellspannung_orig = Spannung * Adc_multi
Zellspannung_orig = Zellspannung_orig * 2
Zellspannung = Fusing(zellspannung_orig , "#.#")
If Zellspannung_orig <= 6.4 Then ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
Gosub Lipo_saver_off
End If
')
'==========Rx Prüfen auf Befehlseingänge==================================
Call Xbee ' kontinuierliches Senden der Parameter
Loop
'Eop:
'Close #2
End
'----------------LCD Anzeigen---------------------------------------------------
Lcd_anzeigen:
Lcd_command = Teildaten(2)
Lcd_voltage = Teildaten(3)
Lcd_temperatur = Teildaten(4)
Lcd_gps = Teildaten(5)
Locate 2 , 1
Lcd "command:" ; Lcd_command
Locate 3 , 1
Lcd "Voltage:" ; Lcd_voltage ; "Volt"
Locate 4 , 1
Lcd "Temp.:" ; Lcd_temperatur ; Chr(223) ; "C"
Locate 4 , 14
Lcd Lcd_gps
Return
'----------------Befehlsbibliothek "Commands"-----------------------------------
Commands:
Return
'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------
Lipo_saver_off:
Return
'----------------XBee Link------------------------------------------------------
Link:
Connect = 1
Led_gruen = 0
Locate 1 , 1
Lcd Chr(0)
Return
'----------------XBee NO Link---------------------------------------------------
No_link:
Connect = 0
Led_gruen = 1
Locate 1 , 1
Lcd "_"
Lcd_command = " "
Lcd_voltage = " "
Lcd_temperatur = " "
Lcd_gps = " "
Return
'----------------Sonstiges------------------------------------------------------
Sub Xbee
Print "$KAPRIG" ; "#" ; Cmd
End Sub
Und der Code vom Luftbildsender (Atmega:
'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 9600
'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------
Pwr_all Alias Portd.2 'Abschaltung der Servos und LM2675 (5V für GPS, Video 5,8 GHz Tx)
Pwr_gps Alias Portd.3
Pwr_video Alias Portd.4
Led_rot Alias Portc.5
Pan1 Alias Portb.0 ' für L293 D
Pan2 Alias Portd.7
'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------
Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflösen
'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------
'---- Betriebsspannung messen ----
Dim Spannung As Word
Dim Zellspannung_orig As Single
Dim Zellspannung As String * 5
'---- Commands ----
Dim Quittierung As String * 21
Dim Gpshoehe As String * 10
'---- Command empfangen ----
Dim Cmd As Byte
'---- GPS-String einlesen ----
'---- Temperaturmessung ----
Dim Temp(9) As Byte
Dim X As Byte
Dim Celsius As Integer
Dim T As Single
Dim Temperatur As String * 5
'---- PWM für A293D ----
Dim A As Byte
'Dim für lesen
Dim Dollarzeicheneingang As Byte 'Beginn des Datenstrings mit Dollarzeichen
Dim Teildaten(3) As String * 10 ' Array mit den extrahierten Daten
Dim Anzahl As Byte
Dim Datenstring As String * 40
Dim Datenkopf As String * 7
'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------
'---- CONFIG ----
' RS232 Hardware
'Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 100 ' konfig serial in
'Open "com1:" For Binary As #1
'Open "COMB.7:9600,8,N,1" For Input As #2 'PB.7 = RxD SoftUART / GPS
' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren
' Timer für PWM
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8
' schaltbare Ausgänge
Config Pwr_all = Output ' GPS- und Video-Modul sowie 5 Volt Versorgung hierfür abschalten
Config Pwr_gps = Output
Config Pwr_video = Output
' Status-LED rot
Config Led_rot = Output
' L293D für Servo als Motor
Config Portb.1 = Output
Config Pan1 = Output 'LD293
Config Pan2 = Output
'1wire für Temp.-Messung
Config 1wire = Portc.0 ' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von Bascom durch Software realisiert
'Interrupts
Enable Interrupts
Enable Timer1
' sonstige
Start Adc
Declare Sub Xbee ' Senderoutine, um $GROUND#... permanent zu senden
'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------
Pwr_all = 0 ' bei Systemstart Peripherie auf OFF
Pwr_video = 0
Pwr_gps = 0
Led_rot = 1 ' Led_rot OFF
Pan1 = 0 'L293D OFF
Pan2 = 0
'LED blinken lassen
Led_rot = 1
Waitms 100
Led_rot = 0
Waitms 100
Led_rot = 1
Waitms 100
Led_rot = 0
Led_rot = 1
Waitms 100
Led_rot = 0
Waitms 100
Led_rot = 1
Waitms 100
Led_rot = 0
'nach einer Sek. Pwr_all ON
Wait 1
Pwr_all = 1
'nach einer weiteren Sek. Pwr_gps ON
Wait 1
Pwr_gps = 1
'nach zweit weiteren Sek. Pwr_video ON
Wait 2
Pwr_video = 1
Wait 5 ' und nach 5 Sekunden Pwr_video wieder OFF
Pwr_video = 0
' Begrüßung
'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------
Do
'========== hier laufen Tests ab ==========================================
Quittierung = "123"
Gpshoehe = "gpshigh"
'==========Temperaturmessung mit DS18B20Z 1Wire============================
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 800
1wreset
1wwrite &HCC
1wwrite &HBE
For X = 1 To 9
Temp(x) = 1wread()
Next
Celsius = Makeint(temp(1) , Temp(2))
T = Celsius / 16
Temperatur = Fusing(t , "##.#")
'==========Spannung LiPo 2S messen========================================
Spannung = Getadc(3) ' Zelle messen und berechnen
Zellspannung_orig = Spannung * Adc_multi
Zellspannung_orig = Zellspannung_orig * 2
Zellspannung = Fusing(zellspannung_orig , "#.#")
If Zellspannung_orig <= 6.4 Then ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
Gosub Lipo_saver_off
End If
'==========Rx Prüfen auf Befehlseingänge==================================
Dollarzeicheneingang = Inkey()
If Dollarzeicheneingang = 36 Then
Input Datenstring Noecho '36 ist das Dollarzeichen
Gosub Link
Dollarzeicheneingang = 0
Else
Gosub No_link
End If
Datenkopf = Mid(datenstring , 1 , 6)
If Datenkopf = "KAPRIG" Then
Anzahl = Split(datenstring , Teildaten(1) , "#") '# Trennzeichen der Daten
Datenstring = ""
Gosub Commands
End If
' --> $KAPRIG#foto
Call Xbee ' kontinuierliches Senden der Parameter
Loop
End
'----------------Befehlsbibliothek "Commands"-----------------------------------
Commands:
If Teildaten(2) = "foto" Then
A = 160
Compare1a = A
Pan1 = 0
Pan2 = 1
Waitms 70
Pan1 = 0
Pan2 = 0
End If
Return
'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------
Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
'Print #1 , "LiPo-Saver!"
Quittierung = "" 'Quittierung löschen
Waitms 500
Pwr_all = 0 ' testweise Ausgabe PWR_all = 0 --> hier: LED an!
Disable Interrupts
Powersave ' sleep
Return
'----------------Sonstiges------------------------------------------------------
Link:
Led_rot = 1
Return
No_link:
Led_rot = 0
Return
Sub Xbee
Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe
End Sub
Lesezeichen