Hallo,

Code ist für eine Steuerung von sog. KAP-Rig, Luftbildaufnahmen von einem Drachen bzw. einem Gestell an der Leine
des Drachens aus!

Das ganze ist noch im Entwicklungsmodus...

ADC hatte ich gelesen, kann noch etwas Strom einsparen. Die gesamte Schaltung soll so wenig wie möglich Strom aufnehmen,
wenn die Spannung unter 6,3 Volt fällt. Ziel ist nicht, diese über Interrupt ooder so aufzuwecken.

Aufwecken halt nur über Neustart bzw. Reset wenn Spannungsversorgung neu angelegt wird!

Bascom Version ist: 2.0.7.1

"Powerdown" wird ganz unten unter "lipo_saver_off" aufgerufen!


Code:
'--------------------------------------------------------------------------
' 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 Portc.4                                       'Abschaltung der Servos und LM2675 (5V f¸r GPS, Video 5,8 GHz Tx)
Pwr_gps Alias Portc.1
Pwr_video Alias Portd.4

Bit0 Alias Portc.2
Bit1 Alias Portd.5
Bit2 Alias Portb.5

Cam_gnd Alias Portd.6

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

Const S1_links = 100                                        'je nach Servo!
Const S1_rechts = 50                                        'je nach Servo!

'--------------------------------------------------------------------------
' 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 * 14
Dim Gpshoehe As String * 13


'---- Command empfangen xxx----

Dim Cmd As Byte



'Dim f¸r GPS einlesen
Dim Gelesen As Byte                                         'eingelesenes Zeichen

Dim Teilstring(14) As String * 12
Dim Anzahl2 As Byte
Dim Gpsdaten As String * 98
Dim Header As String * 6
'Dim Stunde As Byte
Dim Tempstring As String * 2



'---- 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 Swert As Byte

'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------

'---- CONFIG ----

' RS232 Hardware
Config Serialin = Buffered , Size = 1                       ' konfig serial in
Open "COMB.7:9600,8,N,1" For Input As #1                    'PB.7 = RxD SoftUART / GPS


' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'ADC Wandler definieren

' Servo
Config Servos = 1 , Servo1 = Portb.2 , Reload = 10

' 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

Config Bit0 = Output
Config Bit1 = Output
Config Bit2 = Output

Config Cam_gnd = 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

' Servo PIN
Config Portb.2 = 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

Bit0 = 0
Bit1 = 0
Bit2 = 0

Cam_gnd = 1


Swert = 100
Servo(1) = Swert                                            'Servo

'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



' Begr¸flung

   Quittierung = "Hallo"


Wait 2
Cam_gnd = 0
Waitms 150
Cam_gnd = 1
Cam_gnd = 0
Waitms 150
Cam_gnd = 1


'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------

Do






   '========== hier laufen Tests ab ==========================================





   '==========Temperaturmessung mit DS18B20Z 1Wire============================


   1wreset

   1wwrite &HCC
   1wwrite &H44
   Waitms 600

   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 GPS Eingang GPGGA=================================




  Gelesen = Inkey(#1)

   If Gelesen = 36 Then Input #1 , Gpsdaten Noecho          '36 = $
      Header = Mid(gpsdaten , 1 , 5)

      If Header = "GPGGA" Then
         Anzahl2 = Split(gpsdaten , Teilstring(1) , ",")
         Gpsdaten = ""
         Gpshoehe = Teilstring(10)

   End If




   '==========Rx Pr¸fen auf Befehlseing‰nge==================================

  ' Inputbin Cmd


    If Ischarwaiting() = 1 Then
      Cmd = Inkey()
    End If


    Select Case Cmd

    Case "r"
       Clear Serialin
       Cmd = ""
       Quittierung = "rechts"
       Call Xbee
       A = 160
       Compare1a = A
       Pan1 = 0
       Pan2 = 1
       Waitms 70
       Pan1 = 0
       Pan2 = 0


    Case "R"
       Clear Serialin
       Cmd = ""
       Quittierung = "REchts"
       Call Xbee
       A = 160
       Compare1a = A
       Pan1 = 0
       Pan2 = 1
       Waitms 700
       Pan1 = 0
       Pan2 = 0


     Case "l"
       Clear Serialin
       Cmd = ""
       Quittierung = "links"
       Call Xbee
       A = 160
       Compare1a = A
       Pan1 = 1
       Pan2 = 0
       Waitms 70
       Pan1 = 0
       Pan2 = 0


    Case "L"
       Clear Serialin
       Cmd = ""
       Quittierung = "LInks "
       Call Xbee
       A = 160
       Compare1a = A
       Pan1 = 1
       Pan2 = 0
       Waitms 700
       Pan1 = 0
       Pan2 = 0


    Case "+"
       Clear Serialin
       Cmd = ""
       Quittierung = "S1 hoch  "

       Swert = Swert + 10

      Servo(1) = Swert




     Case "U"
       Clear Serialin
       Cmd = ""
       Quittierung = "S1 Hoch  "

       Servo(1) = S1_links


    Case "-"
       Clear Serialin
       Cmd = ""
       Quittierung = "S1 runter  "

       Swert = Swert - 10

       Servo(1) = Swert



    Case "D"
       Clear Serialin
       Cmd = ""
       Quittierung = "S1 Runter  "

       Servo(1) = S1_rechts

    Case "1"
       Clear Serialin
       Cmd = ""
       Quittierung = "LED     "

       Cam_gnd = 0
       Waitms 150
       Cam_gnd = 1


    End Select


     Call Xbee                                              ' kontinuierliches Senden der Parameter


Loop



End






'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------

Lipo_saver_off:
   Quittierung = "LiPo-Saver!"                              ' Quittierung an Bodenstation
   Quittierung = ""                                         'Quittierung lˆschen
   Waitms 500

   Pwr_all = 0                                              ' testweise Ausgabe PWR_all = 0 --> hier: LED an!
   Led_rot = 1

   Disable Adc
   Disable Timer1

   Portb.7 = 0

   Powerdown


Return


'----------------Sonstiges------------------------------------------------------



Link:

Led_rot = 1

Return



No_link:

Led_rot = 0

Return



Sub Xbee

    Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe


End Sub