Bascom Projektvorstellung KAP/Luftbildfotografie/Steuerung

spelli

Neues Mitglied
12. Nov. 2011
68
0
0
Sprachen
Hallo,

bin Newbie und habe Probleme bei der Kommunikation zweier ATmega8 untereinander.

Um folgendes geht es:

http://www.google.de/search?hl=de&sugexp=ppwl&cp=7&gs_id=13&xhr=t&q=kap+rig&pq=kap+rig&gs_sm=&gs_upl=&bav=on.2,or.r_gc.r_pw.,cf.osb&biw=1527&bih=937&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi

- an einem Drachen hängt eine durch Servos steuerbare Kameraaufhängung
- Kamera wird über das Canon CHDK gesteuert
- UART Verbindung zwischen dem ATmega8 am Boden und in der Luft per XBee 2,4 GHz
- zusätzlich so Features wie GPS, Video Downlink, etc.

Bei der Auswertung des GPS-Befehlssatzes(nur Höhe in vollen Metern anzeigen) bin ich auf die Idee gekommen, einen identischen Befehlssatz:

$GPGGA,191410,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45

wie z. B. $GROUND#quittierung#zellspannung1#zellspannung1#hoehe zu verwenden.

Klappt so weit ganz gut. Problem ist die Auswertung bzw. das Schreiben in den o. g. Befehlssatz, der einfach an die Bodenstation per ATmega8 gesendet wird...

Irgendwo ist da beim Software und Hardware UART der Bock drin...

Hier funktionierts:

Also Höhe anzeigen...

Code:
$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

$hwstack = 32                                               ' default use 32 for the hardware stack

$swstack = 32                                               ' default use 10 for the SW stack

$framesize = 32
                                                'serieller Eingang

Enable Interrupts

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cls
Cursor Off

Dim Gelesen As Byte                                         'eingelesenes Zeichen

Dim Gps_zeichen As Byte
Dim Gpsdaten As String * 98
Dim Gps_header As String * 6
Dim Gps_anzahl As Byte
Dim Gps_teilstring(14) As String * 12
Dim Gps_hoehenteilstring(2) As String * 8
Dim Test1 As String * 10




Open "comb.1:9600,8,N,1" For Input As #1

Cls
Cursor Off
Lcd "GPS"
Wait 2
Cls

Do
        Gps_zeichen = Inkey(#1)                             ' Zeichen einlesen

      If Gps_zeichen = 36 Then Input #1 , Gpsdaten Noecho   ' ist "$"  vorhanden, dann Daten/SoftUART #1 einlesen

         Gps_header = Mid(gpsdaten , 1 , 5)

         If Gps_header = "GPGGA" Then
            Cls
            Gps_anzahl = Split(gpsdaten , Gps_teilstring(1) , ",")
            Gps_anzahl = Split(gps_teilstring(10) , Gps_hoehenteilstring(1) , ".")
            Gpsdaten = ""
            Lcd Gps_hoehenteilstring(1)

            Test1 = Gps_hoehenteilstring(1)

            Print Test1

         End If

Loop
End


hier nicht mehr:


Code:
$regfile = "m8def.dat"
' Sendesyntax to GROUND: §GROUND#quittierung#zellspannung1#zellspannung2#gpshoehe#nn#
'
' Sendesyntax to KAPRIG: §KAPRIG#commands#nn#nn#nn#nn#
$crystal = 4000000
$framesize = 100                                            ' die Größe des Frames
 $swstack = 100                                             ' die Größe des Software-stacks
 $hwstack = 100



Pwr_all Alias Portb.0
Pwr_video Alias Portb.2
'Pwr_gps Alias Portb.3
Usb Alias Portb.4

Config Servos = 2 , Servo1 = Portc.4 , Servo2 = Portc.5 , Reload = 10       ' Servos definieren

Config Pwr_all = Output
Config Pwr_video = Output
'Config Pwr_gps = Output
Config Usb = Output

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cls
Cursor Off

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


Enable Interrupts

Declare Sub Rs232

Const Adc_multi = 0.0048828125                              ' = 5.0 / 1024.0 -> ADC auflösen


Dim Gps_zeichen As Byte
Dim Gpsdaten As String * 98
Dim Gps_header As String * 6
Dim Gps_anzahl As Byte
Dim Gps_teilstring(14) As String * 12
Dim Gps_hoehenteilstring(2) As String * 5
Dim Gpshoehe As String * 5

Dim Spannung1 As Word
Dim Spannung2 As Word
Dim Zellspannung1_orig As Single
Dim Zellspannung2_orig As Single
Dim Zellspannung1 As String * 5
Dim Zellspannung2 As String * 5

Dim Befehls_zeichen As Byte
Dim Befehlsdaten As String * 101
Dim Befehls_header As String * 7
Dim Befehls_anzahl As Byte
Dim Befehls_teilstring(6) As String * 21

Dim Quittierung As String * 21


Open "COMB.1:9600,8,N,1" For Input As #1



Pwr_all = 1
Pwr_video = 1
'Pwr_gps = 1

Print "KaprigCtrlRx"
Lcd "KaprigControlRx"
Wait 1
Cls

Do







      '==========GPS-Auswertung (NL-504ETT)=====================================

      Gps_zeichen = Inkey(#1)                               ' Zeichen einlesen

      If Gps_zeichen = 36 Then Input #1 , Gpsdaten Noecho   ' ist "$"  vorhanden, dann Daten/SoftUART #1 einlesen >> gpsdaten

         Gps_header = Mid(gpsdaten , 1 , 5)
         If Gps_header = "GPGGA" Then                       'wenn GPGGA Befehlssatz, dann

         Print Gpsdaten
            Cls
            Gps_anzahl = Split(gpsdaten , Gps_teilstring(1) , ",")       ' nur Höhe herausziehen
            Gps_anzahl = Split(gps_teilstring(10) , Gps_hoehenteilstring(1) , ".")       'nur Höhe in Metern, vor dem "." herausziehen
            Gpsdaten = ""

            Gpshoehe = Gps_hoehenteilstring(1)

            Locate 2 , 1
            Lcd Gpshoehe

         End If


      '==========Rx Prüfen auf Befehlseingänge==================================     ' Syntax >> KAPRIG#10ZeichenbefehlA#10ZeichenbefehlB#usw. <<

      Befehls_zeichen = Inkey()

      If Befehls_zeichen = 36 Then Input , Befehlsdaten Noecho

         Befehls_header = Mid(befehlsdaten , 1 , 6)         ' eigenen Befehlssatz auf Header "KAPRIG" prüfen
         If Befehls_header = "KAPRIG" Then

            Befehls_anzahl = Split(befehlsdaten , Befehls_teilstring(1) , "#")
            Befehlsdaten = ""
            Gosub Kamerabefehle

         End If

      Call Rs232                                            '''''''''''''''''''''''

Loop
End






'----------------Befehlsbibliothek "Kamerabefehle"------------------------------

Kamerabefehle:                                              ''''''''''''''''''''''''''''''''''''
    Select Case Befehls_teilstring(2)

      Case "TAKEPHOTO"                                      ' Lese Befehl  ein und schalte USB-Port der Canon                                               ' Kamera (Stichwort CHDK) für 100 ms ==>> Starten7Bedienen von Script in Kamera!
      Locate 2 , 1
      Lcd Befehls_teilstring(2)
      Pwr_all = 0
      Waitms 500
      Pwr_all = 1
      Quittierung = "Photo is taken"
      Waitms 500
      Quittierung = ""
      Cls

      Case ""
      Case ""

    End Select



    Select Case Befehls_teilstring(3)

            Case "hoehe"

            Locate 2 , 1
            Lcd Befehls_teilstring(3) ""


    End Select

Return





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

Sub Rs232:                                                  ''''''''''''''''''''''''
    Print "§GROUND#" ; Quittierung ; "#" ; Zellspannung1 ; "#" ; Zellspannung2 ; "#" ; Gpshoehe ; "#" ; "#"
End Sub

Ich find das Problem nicht!
Danke und Gruß
Christoph
 
Hallo,

kann mir keiner helfen? Ich würde sonst nur auf den ATmega644P ausweichen können. In SMD habe ich schon mehrmals etwas gelötet, möchte hier aber auf ein DIP Gehäuse zurückgreifen können!

Danke, Christoph
 
Hi Christoph,

kann mir keiner helfen?
Gedult ... Das ist hier ein Forum und keine Hilfsfabrik ;)

Bei manchen Foren wartet man ne Woche bis der erste was schreibt. Es muß ja erst einmal jemand im Forum sein der sich mit der Programmiersprache und dann mit dem Problem auseinandersetzen kann. Außerdem braucht man auch Zeit dafür. Manche haben auch noch ne Familie, nen Job oder grade was anderes zu tun. Schnell mal ne kurze Info reinwerfen ist nicht das Ding. Aber sich in zwei fremde Programme einarbeiten, verstehen, vergleichen und dann den Fehler finden dauert teilweise ne halbe Stunde oder länger die man nicht mal eben zur Verfügung hat.

So und jetzt geh ich wieder Daten schaufeln (der Labor-PC braucht ne Neuinstallation) ...

Gruß
Dino
 
Hallo Dino,

Da hast du natürlich recht.

Ich beisse mir die Zähne aus und vermute, dass es an einer kleinen Inkompatibilität o. ä. liegt...
 
Hi,

Ich beisse mir die Zähne aus und vermute, dass es an einer kleinen Inkompatibilität o. ä. liegt...
manchmal sieht man den Wald vor Bäumen nicht. Pack dir nen Character-LCD dran (4Bit-Betrieb braucht nur 6 Atmel-Pins) und laß dir interne Werte aus dem Programm anzeigen. Pack erstmal nur das dran was du wirklich für diesen Teil brauchst.

Dein Mega8 ist nach deinem Schaltplan auch ziemlich ausgeknautscht. Mach dir mal ne Liste was du eigentlich wofür benötigst und versuche das mit den Pins des Atmels in Einklang zu bringen. Ich hab da ja jetzt ne Menge zum Plan geschrieben. An deiner Power-Spar-ULN2003-Schaltung ist nach meiner Meinung das größte Einsparpotential und da hast du auch den größten Bock drin der dir nachher in den Hintern treten wird. Da mußt du als erstes ansetzen. Erstmal die Hardware genau durchplanen. Wenn es dann immer noch nicht klappt kannst du immer noch nen Mega644 nehmen.

Wenn du mehr Speicher brauchst dann gibt es zum Mega8 auch noch den Pinkompatiblen Mega168 oder Mega328 (den 328er gibts grade bei Dirk im Shop, sonst schlecht zu bekommen). Die Register sind da aber ein klein wenig vom Namen unterschiedlich. Du müßtest also eventuell das Programm anpassen. Das wird dir aber zum Mega644 auch passieren.

Gruß
Dino
 
Hallo auch hier,

es ist so, dass die Schaltung bislang auf dem Steckboard besteht. Ein LCD habe ich hier sogar auch schon angeschlossen.
Die Print-Befehle schaue ich mir über ein XBee/USB Explorer Modul im PC-Terminal an!

Ich habe auch schon ein Teststring definiert gesetzt und ausgelesen (also ohne Input und Inkey).
Die If-Bedingung wird auch erfolgt (gps_zeichen = 36), da ich dann einen Printbefehl ausgebe...
Inkey funktioniert meines Erachtens nach auch...

Aber ich gehe auch hier noch einmal alles durch.

Danke dir aber!
 
Hallo,

ich möchte hier nochmal meinen aktuellen Code posten. Ich hatte bislang immer das Problem, dass die Höhe aus dem GPS-Auswerteteil nicht eingelesen werden konnte.

Ich komme nur leider sehr selten dazu, mich dem Programm bzw. dem Projekt zu widmen, jedoch habe ich das ganze Programm nochmal durchgeschaut!

Komischerweise hatte ich auf einmal die angezeigte Höhe im LCD und diese wurde auch über meinen Befehlssatz
Code:
$Ground#quittierung#spannung1#spannung2#HÖHE!#
per RS232/UART ausgegeben...


ausgegeben. Das ganze ist aktuell noch auf dem Steckbrett und ich arbeite noch mit einem ATmega8 und einer RS232-Verbindung zu meinem PC.

Dann habe ich das LCD berührt und auf allen vier Zeilen waren kryptische Zeichen und die Höhe war dann auf einmal nicht mehr da, also nicht auf dem LCD und per RS232/UART ausgegeben...

Jetzt hatte ich einen Wackler am GPS Modul vermutet, allerdings läuft das einwandfrei mit dem Testprogramm weiter oben.

Vielleicht kann jmd. über die Bereiche der Befehls- und GPS-Auswertung schauen. Irgendwo muss da ein Patzer sein!

Danke,
Christoph

Code:
$regfile = "m8def.dat"
$crystal = 7372800                                          ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 32
$swstack = 32
$framesize = 32


Pwr_all Alias Portb.0                                       'Abschaltung der Servos und LM2675 (5V für GPS, Video 5,8 GHz Tx)


'Variablen
Dim Spannung1 As Word
Dim Spannung2 As Word
Dim Zellspannung1_orig As Single
Dim Zellspannung2_orig As Single
Dim Zellspannung1 As String * 5
Dim Zellspannung2 As String * 5

Dim Quittierung As String * 21
Dim Gpshoehe As String * 5

Dim Gps_zeichen As Byte
Dim Gpsdaten As String * 98
Dim Gps_header As String * 6
Dim Gps_anzahl As Byte
Dim Gps_teilstring(14) As String * 12
Dim Gps_hoehenteilstring(2) As String * 8


Dim Befehls_zeichen As Byte
Dim Befehlsdaten As String * 101
Dim Befehls_header As String * 7
Dim Befehls_anzahl As Byte
Dim Befehls_teilstring(6) As String * 21

Const Adc_multi = 0.0048828125                              ' = 5.0 / 1024.0 -> ADC auflösen
Pwr_all = 1                                                 ' bei Systemstart Peripherie auf ON


'Portkonfiguration / Initialisierung
Config Pwr_all = Output


Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 4
Cls
Cursor Off

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


Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 128
Open "com1:" For Binary As #1

Open "COMC.5:9600,8,N,1" For Input As #2                    'PC5 = RxD SoftUART / GPS


Declare Sub Xbee                                            ' Senderoutine, um $GROUND#... permanent zu senden


Enable Interrupts


Print "KaprigPRINT"

Locate 1 , 1
Lcd "KaprigControlRxZ1"
Locate 2 , 1
Lcd "KaprigControlRxZ2"
Locate 3 , 1
Lcd "KaprigControlRxZ3"
Locate 4 , 1
Lcd "KaprigControlRxZ4"
Wait 1
Cls


Do

   '==========Überwachung von Zelle1 und Zelle2===============================

   Spannung1 = Getadc(0)                                    ' Zelle1 messen und berechnen
   Zellspannung1_orig = Spannung1 * Adc_multi
   Zellspannung1 = Fusing(zellspannung1_orig , "#.#")


   Spannung2 = Getadc(1)                                    ' Zelle2 messen und berechnen
   Zellspannung2_orig = Spannung2 * Adc_multi
   Zellspannung2 = Fusing(zellspannung2_orig , "#.#")


   If Zellspannung1_orig <= 3.2 Then                        ' Zellspannung1 unter/gleich 3,2 Volt dann...
      Gosub Lipo_saver
   End If

   If Zellspannung2_orig <= 3.2 Then                        ' Zellspannung2 unter/gleich 3,2 Volt dann...
      Gosub Lipo_saver
   End If

   Start Adc                                                ' möglicherweise gstoppten ADC ("Lipo_saver") wieder starten





   '==========LCD-Darstellung================================================

   Locate 1 , 1
   Lcd "Spannung Z1: " ; Zellspannung1 ; " V"
   Locate 2 , 1
   Lcd "Spannung Z2: " ; Zellspannung2 ; " V"


   '==========Rx Prüfen auf Befehlseingänge==================================

   Befehls_zeichen = Inkey(#1)                              ' Zeichen einlesen

   If Befehls_zeichen = 36 Then Input #1 , Befehlsdaten Noecho       ' ist "$"  vorhanden, dann Daten/HardUART einlesen >> Befehlsdaten

      Befehls_header = Mid(befehlsdaten , 1 , 6)            'ersten 6 Zeichen nach Befehls_header einlesen
      If Befehls_header = "KAPRIG" Then                     'wenn KAPRIG Befehlssatz, dann

         Befehls_anzahl = Split(befehlsdaten , Befehls_teilstring(1) , "#")       'aus Befehlsdaten in 6 Teilstrings/Arrays, getrennt durch "#", aufteilen
         Befehlsdaten = ""                                  'befehlsdaten leeren
         Gosub Commands                                     ' Auswertung der Befehle/Teilstrings in Subroutine "commands"

      End If


   '==========GPS-Auswertung (NL-504ETT)=====================================

   Gps_zeichen = Inkey(#2)                                  ' Zeichen einlesen

   If Gps_zeichen = 36 Then Input #2 , Gpsdaten Noecho      ' ist "$"  vorhanden, dann Daten/SoftUART #1 einlesen >> Gpsdaten

      Gps_header = Mid(gpsdaten , 1 , 5)                    'ersten 5 Zeichen nach Gps_header einlesen
      If Gps_header = "GPGGA" Then                          'wenn GPGGA Befehlssatz, dann

         Cls
         Gps_anzahl = Split(gpsdaten , Gps_teilstring(1) , ",")       'aus Gpsdaten in 14 Teilstrings/Arrays, getrennt durch ",", aufteilen
         Gps_anzahl = Split(gps_teilstring(10) , Gps_hoehenteilstring(1) , ".")       'Teilstring 10, Höhe xxx.xx, aufteilen in Wert vor dem "."
         Gpsdaten = ""                                      'gpsdaten leeren
         Lcd Gps_hoehenteilstring(1)
         Gpshoehe = Gps_hoehenteilstring(1)                 'gpshoehe = Höhe in Metern vor dem Komma über Meeresspiegel

         Locate 3 , 1
         Lcd "Gps-Höhe: " ; Gpshoehe ; " Meter"

      End If


   Call Xbee                                                ' kontinuierliches Senden der Parameter

Loop
End



'----------------Befehlsbibliothek "Commands"-----------------------------------

Commands:
   Select Case Befehls_teilstring(2)

     Case "TAKEPHOTO"                                       ' Teilstring(2) auswerten auf "TAKEPHOTO"
     Locate 4 , 1
     Lcd Befehls_teilstring(2)
     Pwr_all = 0
     Waitms 500
     Pwr_all = 0
     Quittierung = "Photo is taken"
     Waitms 500
     Quittierung = ""
     Cls
     Pwr_all = 1

     Case ""
     Case ""

   End Select



   Select Case Befehls_teilstring(3)                        ' hier optionale Auswertung von weiteren Teilstrings

     Case ""

     Locate 4 , 1
     Lcd Befehls_teilstring(3) ""

   End Select

Return



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

Lipo_saver:
   Quittierung = "LiPo-Saver!"                              ' Quittierung an Bodenstation
   Stop Adc                                                 ' ADC abschalten um Strom zu sparen
   Stop Ac                                                  ' AC abschalten um Strom zu sparen
   Pwr_all = 0                                              ' testweise Ausgabe PWR_all = 0 --> hier: LED an!
   Locate 4 , 1
   Lcd "LiPo-Saver!"
   Waitms 500
   Quittierung = ""                                         'Quittierung löschen
   Cls
   Pwr_all = 1

Return



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

Sub Xbee

    Print "$GROUND#" ; Quittierung ; "#" ; Zellspannung1 ; "#" ; Zellspannung2 ; "#" ; Gpshoehe ; "#" ; "#"

End Sub
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)