-         

+ Antworten
Ergebnis 1 bis 7 von 7

Thema: ..blöder Drehknopf, jemand ne Idee?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370

    ..blöder Drehknopf, jemand ne Idee?

    Anzeige

    Hi, also folgendes Problem:

    ich versuche die impulse von nem drehknopf zu entschlüsseln, das sollte eigentlich ganz einfach sein: er hat 3 pins:

    1) zb: Masse
    2) wenn drehung links dann wird dieser pin erst geändert von 1) nach OPEN und dann wieder nach 1)
    3) wenn drehung rechts dann wird dieser pin erst geändert von 1) nach OPEN und dann wieder nach 1)
    also je nach dem in welche richtung du das teil drehst wechselt der zustand an Pin 2 oder 3 zuerst (wenn ich das ding richtig verstanden habe)

    jemand ne idee? ich habs mit 2 interrupts probiert (je nachdem welcher zuerst auslöst) aber das geht irgendwie nicht.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    33
    Beiträge
    1.780
    Ich hab Drehimpulsgeber von Conrad, und dafür gibt es ein ganz ordentliches Datenblatt

    Auf Seite 6 steht nicht nur wie man das Ding anschliessen sollte, sondern auch wie man die Impulse auswerten kann
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.02.2004
    Ort
    Starnberg
    Alter
    39
    Beiträge
    170
    Eigentlich reicht dafür ein Interrupt aus. Eines der Signale schließt du an einen Interrupt-Eingang (am besten mit Flanken-Erkennung), das andere an einen ganz gewöhnlichen Eingang. Bei Eintreten des Interrupts schaust du in der Interrupt-Routine nach, ob der andere schon High, bzw. Low ist. Daraus kannst du die Drehrichtung bestimmen.

    Ich habe das bisher nur in C Programmiert, sollte aber in Basic nicht anders gehen.

    Grüsse, Martin

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    hatte das teil ausgeschlachtet und nur gesehen wie es vorher angeschlossen war. hast du einen Bascom code dafür? funktioniert er? ich werd morgen mal probieren wie das beispiel mit dem 1 interrupt geht. ich muss mir angewöhnen nich so kompliziert zu denken.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    Hallo,
    Eigentlich reicht dafür ein Interrupt aus. Eines der Signale schließt du an einen Interrupt-Eingang (am besten mit Flanken-Erkennung), das andere an einen ganz gewöhnlichen Eingang. Bei Eintreten des Interrupts schaust du in der Interrupt-Routine nach, ob der andere schon High, bzw. Low ist. Daraus kannst du die Drehrichtung bestimmen.
    Diese Methode ist schön einfach und funktioniert einwandfrei.
    Aber man erhält damit nur ein Viertel der möglichen Auflösung des Drehgebers.
    Eine "volle" Auswertung der Drehgebersignale erfordert etwas mehr Aufwand.
    Das lässt sich mir einem AVR am einfachsten und mit der geringsten Rechenzeit
    mit einer kleinen State-Machine realisieren.

    Gruß Jan

    Code:
    ;für Atmel AtMega8
    ;Codebeispiel für vollständige Drehgehberauswertung.
    ;Die Signale A und B des Drehgebers 
    ;sind an PortD Bit0 und Bit1 angeschlossen.
    ;in dgpos (R17) steht die aktuelle Drehgeberposition (8-Bit weit) .
    
    
    .NOLIST
    .INCLUDE "m8def.inc"
    .LIST
    
            .DEF temp   = r16
            .DEF dgpos  = r17      ;Drehgeberposition
            .DEF ast    = r18      ;alter Zustand Drehgeber
     
    
    dgstart:
            ldi temp,0b00000011
            out ddrd,temp                ;Portd 0 und 1 auf Ouput setzen, Rest Input
            in ast,portd                 ;einmal den aktuellen PortZustand holen
            andi ast,0b00000011          ;Drehgeber-Bits maskieren
            clr dgpos                    ;Drehgeber-Position auf 0 setzen
    		      
    dgloop: in temp,portd                ;aktuellen PortZustand holen
            andi temp, 0b00000011        ;Drehgeber-Bits maskieren
            lsl ast                      ;*2
            lsl ast                      ;*2
            add ast,temp                 ;alter Zustand mal 4 plus neuer Zustand
            ldi ZL,low(dgtab<<1)         ;Zeiger Z auf Tabellenanfang setzen
            ldi ZH,high(dgtab<<1)
            add ZL,ast                   ;zum Zeiger addieren
            clr ast
            adc ZH,ast
            lpm                          ;Tabelleneintrag holen
            add dgpos,r0                 ;auf Position draufaddieren
            mov ast,temp                 ;neuer Zustand wird alter Zustand
            rjmp dgloop                  ;fertig
    
    
    ;Diese Tabelle enthält die Positionsänderungen 
    ;des Drehgebers entsprechend der Zustandsänderungen
    ;der Drehgebersignale.
    dgtab: .db 0,1,-1,0
           .db -1,0,0,1
           .db 1,0,0,-1
           .db 0,-1,1,0
           
           
    ;Ende

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    03.06.2004
    Beiträge
    12
    Es gibt dafür eine neue Funktion im BASCOM-AVR. Diese und einige anderen werden im meinem Buch BASCOM-AVR Sprachbefehle beschrieben.

    Beispeil für dein Preblem habe ich nachfollgend aufgeführt.


    ENCODER (>=1.11.7.7)

    Beschreibung:
    Liest den Pulse von einem Drehencoder aus.


    Syntax:
    Var = ENCODER(pin1, pin2, LeftLabel, RightLabel, wait)


    Bemerkungen:
    Var Die Zielvariable, die mit dem Ergebnis zugeordntet wird
    Pin1 und Pin2 Das sind die Namen der PINs des Drehencoders deren Ausgänge verbunden werden.Beide Pins müssen an dem Selben PIN Register verbunden sein. Z.B. Pinb.0 und Pinb.7 ist korrekt, wogegen Pinb.0 und Pina.0 falsch ist.
    LeftLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach links ausgeführt wird.
    RightLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach rechts ausgeführt wird.
    wait Der Wert 0 wird nur für Drehung/Puls überprüft. Der Wert 1 hält das Programm an bis der Benutzer an den Drehencoder wieder dreht.

    · Der Bezeichner wird durch den Encoder aufgerufen und muss mit einer RETURN Anweisung abgeschlossen werden.
    · Der Pin muss in Eingabe Modus definiert sein. Wird der Pin nicht explizit gesetzt arbeiten alle Pins in Eingabe Modus.
    · Die Pull Up Wiederstände müssen durch das schreiben einer logischen 1 an den Portregistern, wie in dem Beispiel gezeigt, aktiviert werden.

    Die Drehencoder werden in vielen Schaltungen eingesetzt. Einige Drehendoder werden auch als Schalter benützt. Ein Beispiel eines Drehencoders:

    Seitdem die Mikroprozessoren interne Pull up wiederstände besitzen, werden keine Externe Pull up Wiederstände bei den meisten Encoders mehr gebraucht.


    Beispiel:

    Code:
    'Ein Encoden hat 2 Ausgangspins und ein Massepin.
    'Es werden die Ausgangspins mit Pinb.0 und Pinb.1 verbunden.
    'Es können verschiedene Pins gewählt werden, solange sie an demselben 'Port sind.
    'Die Pins müssen als Eingangspins konfiguriert sein.
    'Diese Funktion arbeitet mit allen Pinregistern (Ports)
    
    $regfile = "m128def.dat"
    $baud = 19200
    $crystal = 4000000
    
    Print "Encoder Test"
    Dim B As Byte
    'wir haben ein Byte gedimmt, weil wir den Zustand des encoder aufrechterhalten möchten.
    
    Portb = &B11 ' Aktivierung des Pull up Registers
    
    Do
       B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
                                                    ' ^--- 1 warte auf eine 
                                                           Drehung
                                     ' ^--------^--------- Bezeichner die 
                                                           aufgerufen werden 
                    ' ^-------^--------------------------- Port PINs
       Print B
       Waitms 10
    Loop
    
    End
    
    'so, während Sie PINB0 und PINB7 wählen können, müssen beide Pins demselben Port angehören. Diese Funktion arbeitet mit allen Ports der PIN Registern.
    
    Links:
    Print "Drehung nach links"
    Return
    
    Rechts:
    Print " Drehung nach rechts"
    Return
    
    End

    Ansonsten viel Spass mit der Programmierung.

    Gruß
    Meissner

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    09.07.2006
    Alter
    33
    Beiträge
    53
    Zitat Zitat von Meissner
    Es gibt dafür eine neue Funktion im BASCOM-AVR. Diese und einige anderen werden im meinem Buch BASCOM-AVR Sprachbefehle beschrieben.

    Beispeil für dein Preblem habe ich nachfollgend aufgeführt.


    ENCODER (>=1.11.7.7)

    Beschreibung:
    Liest den Pulse von einem Drehencoder aus.


    Syntax:
    Var = ENCODER(pin1, pin2, LeftLabel, RightLabel, wait)


    Bemerkungen:
    Var Die Zielvariable, die mit dem Ergebnis zugeordntet wird
    Pin1 und Pin2 Das sind die Namen der PINs des Drehencoders deren Ausgänge verbunden werden.Beide Pins müssen an dem Selben PIN Register verbunden sein. Z.B. Pinb.0 und Pinb.7 ist korrekt, wogegen Pinb.0 und Pina.0 falsch ist.
    LeftLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach links ausgeführt wird.
    RightLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach rechts ausgeführt wird.
    wait Der Wert 0 wird nur für Drehung/Puls überprüft. Der Wert 1 hält das Programm an bis der Benutzer an den Drehencoder wieder dreht.

    · Der Bezeichner wird durch den Encoder aufgerufen und muss mit einer RETURN Anweisung abgeschlossen werden.
    · Der Pin muss in Eingabe Modus definiert sein. Wird der Pin nicht explizit gesetzt arbeiten alle Pins in Eingabe Modus.
    · Die Pull Up Wiederstände müssen durch das schreiben einer logischen 1 an den Portregistern, wie in dem Beispiel gezeigt, aktiviert werden.

    Die Drehencoder werden in vielen Schaltungen eingesetzt. Einige Drehendoder werden auch als Schalter benützt. Ein Beispiel eines Drehencoders:

    Seitdem die Mikroprozessoren interne Pull up wiederstände besitzen, werden keine Externe Pull up Wiederstände bei den meisten Encoders mehr gebraucht.


    Beispiel:

    Code:
    'Ein Encoden hat 2 Ausgangspins und ein Massepin.
    'Es werden die Ausgangspins mit Pinb.0 und Pinb.1 verbunden.
    'Es können verschiedene Pins gewählt werden, solange sie an demselben 'Port sind.
    'Die Pins müssen als Eingangspins konfiguriert sein.
    'Diese Funktion arbeitet mit allen Pinregistern (Ports)
    
    $regfile = "m128def.dat"
    $baud = 19200
    $crystal = 4000000
    
    Print "Encoder Test"
    Dim B As Byte
    'wir haben ein Byte gedimmt, weil wir den Zustand des encoder aufrechterhalten möchten.
    
    Portb = &B11 ' Aktivierung des Pull up Registers
    
    Do
       B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
                                                    ' ^--- 1 warte auf eine 
                                                           Drehung
                                     ' ^--------^--------- Bezeichner die 
                                                           aufgerufen werden 
                    ' ^-------^--------------------------- Port PINs
       Print B
       Waitms 10
    Loop
    
    End
    
    'so, während Sie PINB0 und PINB7 wählen können, müssen beide Pins demselben Port angehören. Diese Funktion arbeitet mit allen Ports der PIN Registern.
    
    Links:
    Print "Drehung nach links"
    Return
    
    Rechts:
    Print " Drehung nach rechts"
    Return
    
    End

    Ansonsten viel Spass mit der Programmierung.

    Gruß
    Meissner

    Super! Danke für die Info =D>

+ Antworten

Berechtigungen

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