Drehimpulsgeber mit dem PIC dekodieren ohne zusätzliche ICs. 
Rotary-Encoder erzeugt ein Interrupt. 
Anschluss über 2 Leitungen.  

// Rotary Encoder inkrementale Drehgeber
// Rotary-Encoder Drehimpulsgeber


#include <16F871.H>
#include <int16CXX.H>
// Speicherschutz12,13,4,5=aus,Debug11=aus,ProgrammFlash9=an,EEpromRead8=an,NiedervoltProgr7=aus
// NiederVoltReset6=an,EinschaltTimer3=an,WachDogTimer2=aus,Oszillator0,1=XC
#pragma config |= 0b.11.111101.11.00.10
#pragma bit En1 @ PORTB.7
#pragma bit En2 @ PORTB.6


#pragma origin 4
bit n1,n2;
char Enkoder;

//***************** Interrupt ****************************************
interrupt int_server( void)
{
    int_save_registers          // W, STATUS (and PCLATH)
    if ( RBIF)                  // Am port B hat sich etwas geändert
    {

        if (En1!=n1)            // Wenn es vom Eingang1 kamm dann wurde Drehimpulsgeber gedreht.
        {
            if (En2==n1)        // Wenn, wehrend Eingang1 geändert wurde, Eingang2 alte Signal hat, dann
            {
                Enkoder--;      // war das Drehung nach Links
                if (Enkoder==14)Enkoder=15;     // Untergrenze des Einstellwertes setzen
            }
            else                // Ansonsten war das Drehung nach Rechts
            {
                Enkoder++;
                if (Enkoder==41)Enkoder=40;     // Obergrenze des Einstellwertes setzen
            }
            n1=En1;             // Zuschtand merken
            n2=En2;
        }

        W = PORTB;              // clear mismatch
        RBIF = 0;               // reset flag

    }
    int_restore_registers       // W, STATUS (and PCLATH)
}
//****************************************************************************

void main(void)
{

    TRISB=0b.1100.0000;     // RB6->En2, RB7->En2 Eingänge zum Drehimpulsgeber
    TRISD=0b.0000.0000;     // 
    PORTD=0;

    GIE=1;       // Interrupts erlauben
    RBIE=1;      // Interrupt von PORTB erlauben

    while(1)
    {
        PORTD=Enkoder;      // Ständige Ausgabe

    }
}
// Michael Dworkin

Zurück