-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: RC-Kanal auslesen mit PULSEIN

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Ort
    Sande (bei Reichelt)
    Alter
    28
    Beiträge
    663

    RC-Kanal auslesen mit PULSEIN

    Anzeige

    Hallo!

    Ich möchte die Pulsbreite eines RC-Empfänger-Kanals auslesen, um später LEDs zu schalten. Hierbei wollte ich als Vorstufe einfach mal die Pulsbreite auslesen... Jedoch zeigt der Controller blind streuende Werte. Mein Code sieht so aus:

    Code:
    '===============================================================================
    ' Compiler
    '===============================================================================
     $regfile = "m32def.dat"                                    'Mega32
     $crystal = 8000000                                         '8Mhz Quarz (intern)
     $baud = 9600
    '-------------------------------------------------------------------------------
    
    
    '===============================================================================
    ' Ein- und Ausgänge
    '===============================================================================
     Config Pind.4 = Input                                      'Empfängersignal
    '-------------------------------------------------------------------------------
    
    
    '===============================================================================
    ' Variablen
    '===============================================================================
     Dim Pulsbreite As Byte
    '-------------------------------------------------------------------------------
    
    '===============================================================================
    '    LCD Parametrieren
    '-------------------------------------------------------------------------------
    
     Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.3 , Db6 = Porta.2 , _
     Db7 = Porta.1 , E = Porta.5 , Rs = Porta.6
    
     Config Lcd = 16 * 2
    
     Cls
     Cursor Off Noblink
    
    '*******************************************************************************
    '* HAUPTPROGRAMM                                                               *
    '*******************************************************************************
    
     Do
       Wait 2
    
       Anfang:
          Pulsein Pulsbreite , Pind , 4 , 0                     'Pulsbreite auslesen
    
          '-- Pulsanzeigen ---------------------------------------------------------
          Cls
          Lcd "Puls: "
          Lcd Pulsbreite
          '-------------------------------------------------------------------------
    
          Waitms 500
    
       Goto Anfang
    
     Loop
    
    '-------------------------------------------------------------------------------
    '===
     End
    '===
    Mache ich irgendetwas komplett falsch ??

    Danke!

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Ort
    Sande (bei Reichelt)
    Alter
    28
    Beiträge
    663
    Oh da fällt mir noch was ein.

    Ist es überhaupt möglich den Empfänger an einen beliebigen Pin des AVRs anzuschließen oder muss dies an einem bestimmten getan werden?

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Ort
    Sande (bei Reichelt)
    Alter
    28
    Beiträge
    663
    Eine andere Mögliche Ursache könnte natürlich die Schaltung sein - ich habe das Empfängersignal direkt an den AVR gelegt, also:
    Empfänger --------------------------- AVR-Pin

    Naja vielleicht kann ja jemand was zum Code bzw. der Schaltung sagen, das wäre sehr nett

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo Björn,

    Pulsein Pulsbreite , Pind , 4 , 0
    dieser Befehl wartet auf einen Low-Puls, Fernsteuerungen haben aber allgemein High-Pulse. Änder die Null in eine Eins um.
    Die Hilfe von Bascom schlägt für die Variable ein Word vor, ein Byte reicht aber normal, weil die Pulslänge nicht viel über den Wert 200 kommt.
    Waitms 500
    nur alle halbe Sekunde? Dein Impuls kommt doch schon nach 20 ms wieder?

    Gruß, Michael

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Ort
    Sande (bei Reichelt)
    Alter
    28
    Beiträge
    663
    Hallo Michael,

    vielen Danke für deine Anwort. Ich habe den Code mal entsprechend geändert. Jetzt sieht er so aus - richtig?

    Code:
    '===============================================================================
    ' Compiler
    '===============================================================================
     $regfile = "m32def.dat"                                    'Mega32
     $crystal = 1000000                                         '1Mhz Quarz
    '-------------------------------------------------------------------------------
    
    
    '===============================================================================
    ' Ein- und Ausgänge
    '===============================================================================
     Config Pind.4 = Input                                      'Empfängersignal
    '-------------------------------------------------------------------------------
    
    
    '===============================================================================
    ' Variablen
    '===============================================================================
     Dim Pulsbreite As Word
    '-------------------------------------------------------------------------------
    
    
    '===============================================================================
    '    LCD Parametrieren
    '===============================================================================
    
     Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.3 , Db6 = Porta.2 , _
     Db7 = Porta.1 , E = Porta.5 , Rs = Porta.6
    
     Config Lcd = 16 * 2
    
     Cls
     Cursor Off Noblink
    '-------------------------------------------------------------------------------
    
    
    '*******************************************************************************
    '* HAUPTPROGRAMM                                                               *
    '*******************************************************************************
    
     Do
       Pulsein Pulsbreite , Pind , 4 , 1                        'Pulsbreite auslesen
    
       Cls                                                      ' LCD Ausgabe
       Lcd "Puls: "
       Lcd Pulsbreite
    
       Waitms 20                                                'Aktualisierungsintervall
     Loop
    
    '-------------------------------------------------------------------------------
    '===
     End
    '===
    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Ort
    Sande (bei Reichelt)
    Alter
    28
    Beiträge
    663
    Hallo nochmal,

    obiger Code funktioniert leider auch nicht - die Pulsbreite liegt bei 600(!).
    Was ist mit der Schaltung? Bei der hab ich komplett ohne Widerstände o.ä. gearbeitet...

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo Björn,
    Was ist mit der Schaltung? Bei der hab ich komplett ohne Widerstände o.ä. gearbeitet...
    der Ausgang vom Empfänger geht direkt in den Eingang des AVR, das paßt.
    Versuch doch bitte mal den Code ohne Waitms 20. Das habe ich nie benutzt.Möglicherweise gibt es Überschneidungen mit dem nächsten Impuls.
    Die Hilfe empfiehlt ein Bitwait vor dem Pulsein-Befehl, um den Puls ganz sicher zu erwischen. Leider bleibt das Programm dann hängen, wenn keine Impulse mehr kommen.
    Das würde dann so aussehen:
    Code:
     Do
    
    Bitwait Pind.4 , Set
    
       Pulsein Pulsbreite , Pind , 4 , 1                        'Pulsbreite auslesen
    
       Cls                                                      ' LCD Ausgabe
       Lcd "Puls: "
       Lcd Pulsbreite
    
       
     Loop
    Vielleicht ist es dir möglich, die Taktfrequenz zu erhöhen, ich könnte mir vorstellen, daß Bascom bei nur 1 MHz ins schwitzen kommt und dadurch Pulse verschnappt

    Gruß, Michael

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Ort
    Sande (bei Reichelt)
    Alter
    28
    Beiträge
    663
    Man kommt voran

    Habe deinen Code probiert ohne Waitms 20. (Quarz 7,3728Mhz).
    Dann habe ich einen Timer genommen der alle Sekunde den Wert anzeigt. Dabei zeigt er bei der einen Richtung 80, bei der anderen 180 (etwa) - ABER, dauernd kommen zwischendurch Werte über 1000 - da wüsste ich jetzt natürlich gerne wie die Zustande kommen. Den Timer hab ich genommen, weil ohne Timer ändert sich die Zahl so schnell dass man nichts erkennen kann (weil immer die richtige Pulsbreite und die 1000er Zahl wechselt).

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo Björn,

    Dabei zeigt er bei der einen Richtung 80, bei der anderen 180 (etwa)
    ja, diese Werte sind ok.

    Dann habe ich einen Timer genommen der alle Sekunde den Wert anzeigt.
    Beachte, daß die Pulsein-Funktion auch einen Timer benutzt. Wenn deine Sekunde denselben benutzt, kann es Probleme geben.

    ändert sich die Zahl so schnell dass man nichts erkennen kann
    du könntest eine weitere Variable einführen, die mit der Pulsvariable verglichen wird. Ist der Pulsein-Wert höher, wird er in der Zusatzvariable gespeichert und angezeigt. Mit so einer max-Funktion findest du schnell Ausreißer.
    Gruß, Michael

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Ort
    Sande (bei Reichelt)
    Alter
    28
    Beiträge
    663
    Also:
    Ich nehme die Timerfunktion raus und füge beim Auslesen etwas ein wie:
    Code:
    If Pulsbreite < 250 Then Ausgabewert = Pulsbreite
    Oder wie war das gemeint?

    Vielen Danke erstmal für deine Hilfe!!

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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