- 3D-Druck Einstieg und Tipps         
Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 67

Thema: RC-Empfänger Auswerten

  1. #21
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Anzeige

    Praxistest und DIY Projekte
    Wenn ich die Variabeln als Byte deklariere welchen unterschied macht dass?
    Bist Du sicher, dass Du mit dem Bascom-Lernen wirklich ganz, ganz vorne angefangen hast?

    Die Idee hinter meinem Ansatz ist die, den Timer überhaupt nicht mit irgendwelchen Werten vorzulanden, sondern ihn permanent durchlaufen zu lassen. Von 0 bis 255, und dann wieder von 0 bis 255, usw.

    Wenn die Flanke des Signals steigt, übergibst Du den gerade aktuellen Timer-Wert an eine Variable, nennen wir sie mal Start. Wenn die Flanke fällt, hat der Timer logischerweise ein Stückchen weitergezählt, und in diesem Moment übergibst Du seinen neuen Wert an eine zweite Variable, die ich originellerweise Stop genannt habe.

    Die Differenz zwischen Stop und Start ist die Anzahl der Schritte, die der Timer während der High-Phase des Impulses weitergezählt hat.

    Weil man Byte-Variablen "über den Nullpunkt hinweg" subtrahieren kann, ist es dabei vollkommen egal, bei welchem Timer-Wert Du die Messung anfängst. Vielleicht wird das an einem Beispiel klarer:

    Angenommen, es vergehen 50 Timer-Takte während der High-Phase des Impulses. Egal, bei welchem Wert der Timer im Moment des L/H-Überganges ist: Die Differenz ist immer 50!

    Start = 25, Stop = 75, Stop-Start = 50
    Start = 130, Stop = 180, Stop - Start = 50
    Start = 220, Stop = 24 (weil der Timer inzwischen einmal "übergelaufen" ist), 24 - 220 ergibt auf Byte-Ebene aber auch wieder 50. Das ist so - probier´s mal aus!!

    Und weil Timer1 16Bits umfasst, müsste man für die Verwendung dieses Timers die Variablen Start, Stop und Differenz als Words dimensionieren. Timer0 und 2 haben nur 8 Bits, deshalb reichen hierfür Bytes aus.

    BTW: Hast Du schon mal mit einem Timer ´ne LED zum blinken gebracht?

  2. #22
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, LED Ja habe ich dafür ist das ganze ja gedacht
    Ich habe soeben dein Code ausprobiert und für mich sieht die Ausgabe der Zahlen willkürlich aus! Ungefähr so: 1 250 168 5 8 154 75 142 usw.
    Mache ich was Falsch? Ich habe von einen Normalem Empfänger den Impulspol einfach an den PD2 (Int0) angschlossen - is dass richtig? Was der Unterschied zwischen Byte und Word ist is mir Klar nur welchen vorteil dass bringen soll net
    Gruß
    MiniMax

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Okay - also die einfachere Variante mit nur einem Kanal. Die ganz blöden Fragen gleich mal vorneweg (sorry, aber daran liegt´s sooo oft):

    - Die Masse des RX ist auch mit der Board-Masse verbunden?
    - Der Controller läuft auch wirklich auf 16 MHz?

    Wenn ja, wäre hier mal ein Code-Vorschlag für einen Kanal an INT0:

    Code:
    $regfile=m32def.dat
    $Crystal=16000000
    
    (Config LCD.........)
    
    Config Timer2=Timer, Prescale=256
    Start Timer2
    
    Config INT0=Change
    On INT0 Flanke
    Enable INT0
    Enable Interrupts
    
    Dim Start1 as Byte
    Dim Stop1 as Byte
    Dim Impuls as Byte
    Fim Flag as Bit
    
    Do
    
    If Flag = 1 then
     Flag = 0
     Impuls = Stop1 - Start1
     Locate 1,1
     LCD Impuls; "   "  (die Leerzeichen, weil Impuls 2- oder 3stellig sein kann)
    End if
    
    Loop
    
    Flanke:
    
    If PIND.2=1 then 
     Start1 = Timer2
    Else
     Stop1 = Timer2
     Flag = 1
    End if
    
    Return
    Müsste eigentlich klappen...


    EDIT: Bei Start und Stop als Variablen meckert Bascom natürlich - sorry, da habe ich gepennt. Nenn´ sie Start1 und Stop1 (oder Max und Moritz, wie immer Du willst...)

  4. #24
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, Masse des Empfängers is ja am Akku Drann und der µC is am Netzgerät = 2 Schaltkreise. Muss ich masse vom Empfänger noch zusätzlich an den µC Masse hängen?
    Gruß
    MiniMax

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Aber hallo - irgendeine Verbindung müssen die Massen der beiden Stromkreise haben, sonst kann´s nicht funktionieren!

    Ob Du auf der einen Seite das Board oder das Netzteil nimmst ist egal, und auf der anderen Seite kann´s der Akku oder der RX sein. Aber beide Seiten müssen miteinander verbunden sein!!

  6. #26
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, es funktioniert Trotzdem net! selbst wenn ich beide Masse pole Verbinde vom Akku und vom Netzteil

    Hier mal mein Code:

    Code:
    $regfile = "m32def.dat"                                     ' specify the used micro
    $crystal = 16000000                                         ' used crystal frequency 16mHz
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    $baud = 9600
    
    Config Porta.0 = Output
    Config Porta.1 = Output
    Config Porta.2 = Output
    Config Porta.3 = Output
    Config Porta.4 = Output
    Config Porta.5 = Output
    Config Porta.6 = Output
    
    Flashlinks Alias Porta.0
    Flashrechts Alias Porta.1
    Baconheck Alias Porta.2
    Flashheck Alias Porta.3
    Landescheinwerfer Alias Porta.4
    Posilightlirot Alias Porta.5
    Posilightregruen Alias Porta.6
    
    
    Timer1 = 3000
    Config Timer1 = Timer , Prescale = 8
    Enable Timer1
    Stop Timer1
    On Timer1 Flash
    
    Gosub Flashoff
    Gosub Landescheinwerferoff
    Gosub Posilightsoff
    
    Dim V As Byte
    Dim Flasher As Byte
    Dim Posi As Byte
    Declare Sub Flash
    
    
    Config Timer2 = Timer , Prescale = 128
    Start Timer2
    
    Dim Start1 As Byte
    Dim Stop1 As Byte
    Dim Impuls1 As Byte
    Dim Flag1 As Bit
    
    Dim Start2 As Byte
    Dim Stop2 As Byte
    Dim Impuls2 As Byte
    Dim Flag2 As Bit
    
    Config Int0 = Change
    On Int0 Impuls1
    Enable Int0
    
    Config Int1 = Change
    On Int1 Impuls2
    Enable Int1
    
    
    
    Enable Interrupts
    Start Timer1
    
    
    
    Do
    Gosub Flashon
    Gosub Landescheinwerferoff
    Gosub Posilightsoff
    
    If Flag1 = 1 Then
     Flag1 = 0
     Impuls1 = Stop1 - Start1
    Print Impuls1
    
    End If
    
    If Flag2 = 1 Then
     Flag2 = 0
     Impuls2 = Stop2 - Start2
     Print Impuls2
    
    End If
    
    Loop
    
    
    
    Impuls1:
    If Pind.2 = 1 Then
     Start1 = Timer2
    Else
     Stop1 = Timer2
     Flag1 = 1
    End If
    Return
    
    Impuls2:
    If Pind.3 = 1 Then
     Start2 = Timer2
    Else
     Stop2 = Timer2
     Flag2 = 1
    End If
    Return
    
    
    
    
    
    
    Flash:
    Stop Timer1
    If V = 0 Then
    Set Flashlinks
    Set Flashrechts
    Set Flashheck
    End If
    
    If V = 1 Then
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    End If
    
    If V = 2 Then
    Waitms 30
    End If
    
    If V = 3 Then
    Waitms 30
    End If
    
    ...
    
    'Enable Interrupts
    Incr V
    Start Timer1
    Timer1 = 3000
    Return
    
    
    Flashon:
    If Flasher = 0 Then
    Start Timer1
    Flasher = 1
    End If
    Return
    
    Flashoff:
    Stop Timer1
    Flasher = 0
    Return
    
    
    
    Landescheinwerferon:
    If Landescheinwerfer = 0 Then
    Set Landescheinwerfer
    End If
    Return
    
    Landescheinwerferoff:
    If Landescheinwerfer = 1 Then
    Reset Landescheinwerfer
    End If
    Return
    
    Posilightson:
    If Posi = 0 Then
    Set Posilightlirot
    Set Posilightregruen
    Posi = 1
    End If
    Return
    
    Posilightsoff:
    If Posi = 1 Then
    Reset Posilightlirot
    Reset Posilightregruen
    Posi = 0
    End If
    Return
    Ich bekomme beim Print immer nur 0?!?
    Ich hoffe dass ich dort einen Fehler drinne Habe
    Gruß
    MiniMax

  7. #27
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Wow - das sieht nach einem gigantischen Flieger aus

    Ich wusste nicht, dass Du mit Print arbeitest. Dieser Befehl braucht immer ene ganze Zeit - und so wie der Code gerade ist, wird der Print-Befehl nach jedem (!) Impuls ausgeführt. Das heißt etwa 50 mal pro Sekunde. Das könnte problematisch sein.

    Du könntest mal zwei Zähler etablieren (z.B. Z1 und Z2 als Bytes). In den Interrupt-Routinen lässt Du Z jedesmal um eins hochzählen, wenn ein Impuls fertig ist.

    In der Hauptroutine könntest Du dann so dafür sorgen, dass z.B. nur nach jedem 50. Impuls grprintet wird. Also insgesamt etwa so:

    Code:
    ...
    ...
    Do
    
    If Flag1 = 1 then
     Flag 1 = 0
     Impuls1 = Stop1 - Start1
      If Z1 = 50 then
       Print Impuls
       Z1 = 0
      End if
    End if
    
    (analog das gleiche für Start2, Stop2, Impuls2 und Z2)
    
    Loop
    ...
    
    
    Impuls1:
    
    If Pind.2 = 1 Then
     Start1 = Timer2
    Else
     Stop1 = Timer2
     Flag1 = 1
     Z1 = Z1 + 1
    End If
    
    Return 
    ...
    ...
    Sonst fallen mir auf den ersten Blick keine Fehler auf...

  8. #28
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, naja aber warum bekomme ich nur nullen im Print?
    Gruß
    MiniMax

  9. #29
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Ich bekomme immer Verschiedene Werte
    Die LEDs zucken und flacker wie die Lust und Laune haben. Die Knüppel stellelungen schlagen nur geringfügig ein - hast du nen tipp`?
    Gruß
    MiniMax

  10. #30
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich hab's jetzt auch mal versucht die Impulslängen der Servosignale mit Bascom zu messen. Mit dem Pulsein-Befehl habe ich es nicht geschafft, aber mit einer einfachen Zählschleife funktioniert es recht gut:

    Code:
    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    $baud = 38400
    
    Dim A As Byte
    Dim Counter As Integer
    
    Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
    
    Config Portc.0 = Output
    
    'Servo(1) = 100
    
    Enable Interrupts
    
    Do
       Print
       Print "----------------"
       For Servo(1) = 30 To 150 Step 10
          Waitms 500
          Counter = 0
    
          Do                                                    ' Warten bis aktiver Impuls zu Ende
             A = Pinc.0
          Loop Until A = 0
    
          Do                                                    ' Warten bis Pause fertig
             A = Pinc.0
          Loop Until A = 1
    
          Do
             A = Pinc.0
             Incr Counter                                      ' Zähler erhöhen
             'Waitus 2
          Loop Until A = 0                                      ' Solange impuls ansteht
    
          Counter = Counter - 149                              ' Wert für Mittelstellung abziehen
    
          Print "Winkel:" ; Servo(1)
          Print "Zähler: " ; Counter
          Print
       Next
    Loop
    Das Programm erzeugt mit Config Servos seine eigenen Impulse und misst dann deren Länge mit einer Zählschleife. Der Drehbereich meines angeschlossenen Servos ist 30 bis 150. Die Zählwerte sind ohne Verzögerung durch waitus in der Zählschleife und ohne Korrektur von 49 bis 249:
    Code:
    Winkel:30
    Zãhler: 49
    
    Winkel:40
    Zãhler: 66
    
    Winkel:50
    Zãhler: 82
    
    Winkel:60
    Zãhler: 99
    
    Winkel:70
    Zãhler: 116
    
    Winkel:80
    Zãhler: 133
    
    Winkel:90
    Zãhler: 149
    
    Winkel:100
    Zãhler: 166
    
    Winkel:110
    Zãhler: 183
    
    Winkel:120
    Zãhler: 199
    
    Winkel:130
    Zãhler: 216
    
    Winkel:140
    Zãhler: 233
    
    Winkel:150
    Zãhler: 249
    Mit Korrektur -149 erhalte ich folgende Werte:
    Code:
    Winkel:30
    Zãhler: -100
    
    Winkel:40
    Zãhler: -83
    
    Winkel:50
    Zãhler: -66
    
    Winkel:60
    Zãhler: -50
    
    Winkel:70
    Zãhler: -33
    
    Winkel:80
    Zãhler: -16
    
    Winkel:90
    Zãhler: 0
    
    Winkel:100
    Zãhler: 17
    
    Winkel:110
    Zãhler: 34
    
    Winkel:120
    Zãhler: 50
    
    Winkel:130
    Zãhler: 67
    
    Winkel:140
    Zãhler: 84
    
    Winkel:150
    Zãhler: 100
    Bin ich jetzt selbst etwas überrascht wie gut das passt ;) Für schneller getaktete Kontroller kann man in der Zählschleife noch etwas mit waitus spielen. Bei 16MHz muss man vermutlich nur den Zählwert halbieren.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests