- 12V Akku mit 280 Ah bauen         
Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 67

Thema: RC-Empfänger Auswerten

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Anzeige

    Praxistest und DIY Projekte
    hab jetzt nochmal ein neues Programm geschrieben, welches mit weniger Hardware auskommt (also nur 2 ext. Interrupts) und sonst nichts
    Dadurch hast du nicht immer diese blöde Timer-isr und hast mehr Zeit für andere sachen.
    Hier mal der Code:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdbus = 4
    Initlcd
    Cls
    Cursor Off
    
    Config Pind.2 = Input
    Portd.2 = 0
    
    Config Pind.3 = Input
    Portd.3 = 0
    
    
    Config Int0 = Rising
    On Int0 Kanal_1
    Enable Int0
    
    Config Int1 = Rising
    On Int1 Kanal_2
    Enable Int1
    
    Dim Kanal(2) As Word
    Dim Rc(2) As Word
    
    
    Enable Interrupts
    
    
    Do
    
    Locate 1 , 1
    Lcd "Servo(1): " ; Rc(1) ; "   "
    Locate 2 , 1
    Lcd "Servo(2): " ; Rc(2) ; "   "
    
    Waitms 100
    
    Loop
    
    End
    
    Kanal_1:
    While Pind.2 = 1
    Waitus 10
    Incr Kanal(1)
    Wend
    Rc(1) = Kanal(1)
    Kanal(1) = 0
    Return
    
    Kanal_2:
    While Pind.3 = 1
    Waitus 10
    Incr Kanal(2)
    Wend
    Rc(2) = Kanal(2)
    Kanal(2) = 0
    Return
    Aber hier noch die Antworten auf deine Frage, falls du lieber den ersten Code verwenden möchtest:
    Im label "Servo_input" schreibst du nach "Servo_wert_read = Servo_wert " noch "servo_wert = 0".
    Das mit dem disablen der Interrupts kannst du dir sparen, da diese sowieso standartmäßig disabled sind (also in isr's)
    Solltest du es doch verwenden wollen (aus welchen Gründen auch immer), könntest du auch "Disable Timer1" schreiben, dann wird nur dieser disabled.

    Gruß
    Chris

  2. #12
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, ok Also ich werde den 2. Code nehmen! Ich habe den Timer1 jetzt mit "Stop Timer1" Angehalten und mit "Start Timer1" gestartet. Wenn ich deinen Code richtig verstehe, springt der nurnoch bei einer Änderung des Schaltzustandes in die ISR ?? RC(1 bzw. 2) sind die Zustände mit 0 bis 225 ?
    Gruß
    MiniMax

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von radbruch
    Könnte man das nicht auch mit dem Pulsein-Befehl lösen?
    Gute Idee werde ich mal testen.

    Richard

  4. #14
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi,
    @Chris: Dein Code funkt I wie net! Ich Teile Rc(1) / 100 und gehe damit in ne If then else endif schleife rein aber die LED's leuchten net und per Print befehl bekomme ich nur zahlen um 1000 und net Tiefer (also org wert) egal ob ich den Knüppel ändere Und dein Erster Code Liefert nur nullen
    Hast du nen Tipp?
    Gruß
    MiniMax

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Wieviele Empfängerausgänge willst Du denn messen? (Weil Che Guevara einen Code für 2 Pulslängen reingestellt hat)

    128 bedeutet z.b., dass das signal 128ms lang high ist und 255-128=127ms low ist.
    Das ignoriert aber die Tatsache, dass RC-Impulse eine ziemlich kleines Impuls/Pausen-Verhältnis haben! Die Impulse dauern zwischen 0,8 und 2 ms, währen die Pause ca. 20ms dauert.

    Außerdem ist es u.U. ungünstig, den Controller länger in einer ISR festzunageln, wie es hier durch die While..Wend-Schleife geschieht:
    Code:
    Kanal_1:
    While Pind.2 = 1
    Waitus 10
    Incr Kanal(1)
    Wend
    Rc(1) = Kanal(1)
    Kanal(1) = 0
    Return
    Wenn Du es nicht mit dem ja bereits vorgeschlagenen Pulsein-Befehl machen möchtest, hätte ich eine ziemlich einfache Lösung. Müsste nur wissen, mit welchen Takt der Controller läuft.

  6. #16
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, der Controller läuft mit 16 MHZ! Ich benötige nur 2 Kanäle!
    Gruß
    MiniMax

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Okay - 2 Kanäle, handelsübliche Impulslängen von 0,8 - 2,0 ms, 16 MHz Taktfrequenz.

    Wenn Du mit Timer1 ohne Prescaler arbeitest, zählt er während eines kurzen Impulses (0,8ms) um 12.800 weiter, während eines langen Impulses (2ms) um 32.000 - stimmt´s?

    Der Code liefert Dir erstmal die beiden Impulsdauern in dieser Form, d.h. als Word-Variablen zwischen 12.800 und 23.000. Wie Du sie dann in %-Angaben oder sonstwas verwurstest, bleibt Dir überlassen

    Die Idee ist die, den Timer einfach durchlaufen zu lassen. Außerdem konfigurierst Du zwei Interrupt-Eingänge auf "Change", für jeden Kanal einen.

    In der ISR fragst Du den Level des auslösenden Pins ab. Ist er 1 (d.h. Impuls hat gerade begonnen), weist Du einer Variablen "Start" den aktuellen Timerwert zu. Ist der Pin 0 (d.h. der Impuls ist zu Ende), weist Du einer Variablen "Stop" wiederum den aktuellen Timerwert zu - und setzt ein Flag.

    In der Hauptschleife fragst Du das Flag ab. Ist es 1, subtrahiertst Du einfach "Stop" - "Start". Dadurch, dass man auch über den Wert 0 hinweg subtrahieren kann, ist es egal, wenn der Timer während des Impulses überläuft. Die Differenz entspricht der Impulslänge und liegt zwischen 12.800 und 32.000.

    Konkret also etwa so:


    Code:
    ...
    ...
    
    Config Timer1 = timer
    Start timer1
    
    Dim Start1 as word
    Dim Stop1 as word
    Dim Impuls1 as word
    Dim Flag1 as bit
    
    Dim Start2 as word
    Dim Stop2 as word
    Dim Impuls2 as word
    Dim Flag2 as bit
    
    Config Int0=Change
    On Int0 Impuls1
    Enable Int0
    
    Config Int1=Change
    On Int1 Impuls2
    Enable Int1
    
    Enable Interrupts
    
    Do
    
    If Flag1 = 1 then
     Flag1 = 0
     Impuls1 = Stop1 - Start1
     Locate 1,1
     Lcd Impuls1
    End if
    
    If Flag2 = 1 then
     Flag2 = 0
     Impuls2 = Stop2 - Start2
     Locate 2,1
     LCD Impuls2
    End if
    
    Loop
    
    Impuls1:
    If Pind.2=1 then
     Start1 = Timer1
    Else
     Stop1 = Timer1
     Flag1 = 1
    End if
    Return
    
    Impuls2:
    If Pind3 = 1 then
     Start2 = Timer1
    Else
     Stop2 = Timer1
     Flag2 = 1
    End if
    Return
    Ist ungeprüft, weil ich 1. gerade nicht @home bin und 2. noch nie sowas wie einen Mega32 in den Händen hatte Müsste aber funktionieren...

    Gruß,

    Daniel

  8. #18
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, Welche Variable ist denn die zwischen 12.800 und 23.000 ?? Impuls 1 u 2?
    Ich habe den Timer1 bereits in Verwendung daher kann ich dass auch mit Timer2 machen?
    Gruß
    MiniMax

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Hi, Welche Variable ist denn die zwischen 12.800 und 23.000 ?? Impuls 1 u 2?
    Beide: Impuls1 und Impuls2!

    Ich habe den Timer1 bereits in Verwendung daher kann ich dass auch mit Timer2 machen?
    Das hättest Du auch schon mal früher sagen können

    Da Du den Code ja wahrscheinlich nicht nur abtippen willst, sondern ihn auch verstanden hast ( ) sei nur am Rande angemerkt, dass das natürlich auch mit dem Timer2 geht! Da der aber nur 8 Bit hat, müsstest Du die Variablen Start1/2, Stop1/2 und Impuls1/2 als Bytes deklarieren.

    Wenn er bei 16 MHz eine Impulslänge von 2ms zählen soll, würde ein Prescaler von 128 gerade mal so ausreichen. 256 wäre sicherer, würde aber eine nicht so gute Auflösung bringen.

    Klar?

  10. #20
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Ähmm nicht wirklich?!?!?! Also Timer2 = Timer Prescale128
    und dann den Start wert -- wie groß soll der sein? Wenn ich die Variabeln als Byte deklariere welchen unterschied macht dass? Oder ist die Vorwahl egal und ich nehme nur nen Prescale von 256?
    Gruß
    MiniMax

Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad