- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 12

Thema: Erkennen der Drehrichtung eines Drehgebers (Inkrementalwertgeber) mit ATtiny13

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ostermann
    Registriert seit
    27.08.2009
    Ort
    Aachen
    Beiträge
    240
    Hallo Robert!

    Es sind auch nur 4 Flanken, auch wenn es 8 Möglichkeiten sind (abhängig vom vorherigen Zustand).

    Aber unabhängig davon würde ich nicht empfehlen, dass mit Interrupts zu machen, sondern einfach die beiden Pins in einem festen Zeitraster samplen und auswerten. Dann braucht man sich über die Flanken keine Gedanken mehr zu machen, und hat auch keine Probleme mit Störimpulsen.

    Mit freundlichen Grüßen
    Thorsten Ostermann
    --
    Wir bewegen Ihre Ideen!
    Intelligente Lösungen mit elektrischen Antrieben.
    http://www.mechapro.de

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hi, Thorsten !
    Über die effektive Durchführung der Auswertung gibt's ja die allgemeine und fundamentale Regel: Es kommt darauf an
    Ich hab das vor einiger Zeit bei einer Anwendung für einen Filmschneidetisch, wo ka kein pieps verlorengehen soll, ebenfalls mit sampeln gemacht und recht einfach AB u. ABvorher zu 4 Bit zusammen gelegt und mit lookup aus einer tabelle die notwendigen werte für counter u. direction bekommen

    Is es nicht so heikel, dann nehm ich für A einen Interrupt, B zeigt dann up/down. Wenn der µC auch noch andere Jobs hat, ist das insgesamt einfacher.

    Bin sicher, es gibt noch mehr methoden und meinungen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2010
    Beiträge
    23
    Danke schon mal für die vielen und schnellen Antworten!!!!
    Aber ich muss euch enttäuschen aber ich bin keine guter Assembler Programmierer ganz im Gegenteil ich Stümper ein bisschen rum aber mehr auch nicht ich versuche mir gerade C beizubringen.

    Ich verstehe die Lösung mit der Tabelle leider nicht. Ein Arbeitskollege der C gut kann hat mir heute diesen Quelle-Code erstelle.

    Code:
    //alte werte müssen global deklariert sein
    
    
    steuerfunktion(void)
    {
        a = portB & 0x8;
        b = portB & 0x10;
    
        if ((a == 1) && (a_old == 0))    P_a = 1;
        else P_a = 0;
    
        if ((b == 1) && (b_old == 0))    P_b = 1;
        else P_b = 0;
    
    
        temp_a = a & P_a;
        temp_b = a & P_b;
    
        portb2 = temp_a & !temp_b;
        portb1 = temp_b & !temp_a;
    
        //Löschen des alten Outputs
        PORTB &= ~0x4;
        PORTB &= ~0x2;
    
        //zurdnung auf Ports (setzen des bits)
        PORTB |= portb2;
        PORTB |= portb1;
    
    
        a_old = a;
        b_old = b;
    }
    Allerdings weiß er nicht wie ich das mit der Ein- und Ausgabe machen kann.

    Kann mir hier vielleicht einer von euch weiterhelfen, denn das Code an sich sollte laut ihn Funktionieren.

    Ich bin für jede kleine Hilfe sehr dankbar!

    Gruß
    Rolf

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Richte deinem Kollegen einen Gruss von mir aus

    Folgendes:
    Code:
        a = portB & 0x8;      // ergibt  0x00  oder 0x08  !!!
        b = portB & 0x10;    // ergibt  0x00  oder 0x10  !!!
    //  daher kann man man nicht auf == 1 abfragen, sondern auf ==0x08 bzw ==0x10 
    //  IMHO aber besser und besser lesbar 
    //  Abfrage auf NULL und   NICHT NULL
        if (a && !a_old)    P_a = 1; else P_a = 0;
        if (b && !b_old)    P_b = 1; else P_b = 0;
    Ich werd' mir aber meine Assembler-routine raussuchen (auswendig erzähl' sonst vielleich einen stiefel)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2010
    Beiträge
    23

    und es geht doch :)

    Habe so eben die Steuerung in Betrieb genommen. Und Sie funktioniert einwandfrei.
    Besten danke für euere Hilfe.

    Das ist der Quellcode mit dem ich meinen ATtiny gefütter haben. Funktioniert sogar alles besser als gedacht

    Gruß
    Rolf

    Code:
    #include <avr/io.h>
    unsigned char chanal_a;
    unsigned char chanal_b;
    unsigned char temp_a;
    unsigned char temp_b;
    unsigned char a_old;
    unsigned char b_old;
    unsigned char Flanke_a;
    unsigned char Flanke_b;
    unsigned char links;
    unsigned char rechts;
    
    #define F_CPU 1000000    // definiert die Frequenz des Microcontrollers 3,68 MHz
    #include <avr/io.h>
    
    int main(void)
    {
    DDRB = DDRB | (1<<PB1) | (1<<PB2) | (1<<PB0) ; // PORTB.1 und PORTB.2 als Ausgang verwenden der rest ist automatisch ein eingang
    
        while(1)    
        {
            PORTB = PORTB & 0xFE;
            chanal_a = ((PINB & 0x8)>>3);
            chanal_b = ((PINB & 0x10)>>4);
    
            if ((chanal_a == 1) && (a_old == 0))
            {
                Flanke_a = 1;
            }        
            else 
            {
                Flanke_a = 0;
            }        
    
            if ((chanal_b == 1) && (b_old == 0))
            {
                Flanke_b = 1;
            }            
            else 
            {
                Flanke_b = 0;
            }        
    
    
            temp_a = chanal_b & Flanke_a;
            temp_b = chanal_a & Flanke_b;
    
            links = ((temp_a == 1) & (temp_b == 0));
            rechts =((temp_a == 0) & (temp_b == 1));
    
    
            //zurdnung auf Ports 
            if ((links==1) && (rechts==0))
            {
                PORTB = PORTB | 0x04;            
            }
            else
            {
                PORTB = PORTB & 0xFD;
            }
            if ((rechts==1) && (links==0))
            {
                PORTB = PORTB | 0x02;
            }
            else
            {
                PORTB = PORTB & 0xFB;
            }        
            a_old = chanal_a;
            b_old = chanal_b;
            
            PORTB = PORTB | 0x01;
        }    
    }

Ähnliche Themen

  1. wechseln der Drehrichtung eines Motors
    Von Stephan_M. im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 01.11.2009, 11:05
  2. Erkennen eines Menschen durch die Erschütterung seines Gang!
    Von sia4fe im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 13.01.2009, 21:31
  3. Antworten: 6
    Letzter Beitrag: 20.12.2007, 13:40
  4. ATmega48 reicht 1V zum erkennen eines Eingangs?
    Von Michael 123 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 12.11.2006, 18:03
  5. Drehrichtung feststellen
    Von Static im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 08.04.2006, 17:09

Stichworte

Berechtigungen

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

12V Akku bauen