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