C Optischer Drehencoder / MEGA32 ohne INT´s

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo,


Ich habe mal wieder ein kleines Problemchen.
Nun möchte ich meinen Drehencoder gerne ohne Interrupts auswerten (Polling)

Mein bisheriger Code...

Code:
        Enc_State_new = (PIND & 0b00000011);
        
        if (Enc_State_new != Enc_State_old)
        {
            Enc_Counter++;
        }
        Enc_State_old = Enc_State_new;

Damit kann ich aber leider nicht die "Drehrichtung" auswerten.

Wenn ich die beiden Phasen (PHASE_A & PHASE_B) miteinander vergleiche klappt das auch nicht.

Jemand eine Idee?
 
Hallo,

ob du die Auswertung des Encoders per Interrupt oder durch Polling auslöst ist letztlich egal.
Wichtig ist, beide Signale (A und B) jeweils alt und neu zu vergleichen, daraus ergibt sich die Drehrichtung (also ++ oder --), schau dir mal die Taktdiagramme von Encodern an.
Oft gibt es im Datenblatt auch eine Matrix aus der man die Drehrichtung ableiten kann.
Nachteil beim Polling, du musst bei jedem Aufruf prüfen, ob eine Änderung zum vorherigen Zustand aufgetreten ist und falls du zu selten pollst, gehen Encoderschritte verloren, was zur Fehlinterpretation der Richtung führen kann.

Gruss
- gp177 -
 
Ich habe das jetzt so verwirklicht... kann man da noch etwas optimieren?

Code:
[FONT=Arial][FONT=Consolas][SIZE=2][FONT=Consolas]void read_Encoder(void)
{

    /*

    Rechtsdrehung

    00 -> 01 -> 11 -> 10 -> 00

    Linksdrehung

    00 -> 10 -> 11 -> 01 -> 00

    */

    Enc_State_new = (PIND & 0b00000011);

    if ((Enc_State_new != Enc_State_old) && (MenueStatus && 0xF6))

    {

        if (Enc_State_new == 0x01)
        {

            if (Enc_State_old == 0x00)
            {
                short_Beep();
                MenueStatus++;
            }
            else
            {
                SUMMER_AN;
                if ((MenueStatus & 0xFE))
                {            
                    short_Beep();    
                    MenueStatus--;
                }
                

            }
        }

        if (Enc_State_new == 0x03)
        {

            if (Enc_State_old == 0x01)
            {
                short_Beep();
                MenueStatus++;
            }
            else
            {
                
                if ((MenueStatus & 0xFE))
                {
                    short_Beep();
                    MenueStatus--;
                }
            }

        }

        if (Enc_State_new == 0x02)
        {
            if (Enc_State_old == 0x03)
            {
                short_Beep();
                MenueStatus++;
            }
            else
            {
                
                if ((MenueStatus & 0xFE))
                {
                    short_Beep();
                    MenueStatus--;
                }
            }

        }

        if (Enc_State_new == 0x00)
        {
            if (Enc_State_old == 0x02)
            {
                short_Beep();
                MenueStatus++;
            }
            else
            {
                
                if ((MenueStatus & 0xFE))
                {
                    short_Beep();
                    MenueStatus--;
                }
            }

        }

    }

    Enc_State_old = Enc_State_new;

}[/FONT][/SIZE][/FONT][/FONT]
 
Optimieren kann man so ziemlich jedes Programm, getreu dem alten Lehrsatz: "Jedes Programm lässt sich um mindestens ein Byte verkürzen und leistet immernoch dasselbe".
Aber Spass beiseite - ich bin nicht so der C Programmierer aber ich denke es gibt in C auch so etwas wie einen CASE-Verteiler, ist evtl. übersichtlicher als die vielen IFs.

- gp177 -
 
...denke es gibt in C auch so etwas wie einen CASE-Verteiler, ist evtl. übersichtlicher als die vielen IFs...
nur bevor Janiiix jetzt falsche Schlüsse zieht - dadurch wird das im Code eventuell übersichtlicher - im Maschienencode sind auch das nur mehrere Compares (IFs). Nennt sich glaube ich switch...case...
(Aber auch ich bin kein C'ler)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)