Aqui os dejo el codigo que hice para la lectura del encoder en simple precision.
///////////////////////////////////////////
// Lectura de Encoder de 2 canales //
// SIMPLE PRECISION //
// //
// Por: JJcorps //
///////////////////////////////////////////
#include <16F876.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
char BorraLCD=12;
int16 pasos=0;
int sentido=1;
#int_EXT
void EXT_isr(void)
{
if(input(PIN_B1)) //Miro el estado de el otro canal q me indica el sentido
{
sentido=1;
pasos=pasos+1;
}
else
{
sentido=0;
pasos=pasos-1;
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
while(1)
{
printf("%cPasos: %Li\rSentido: ",BorraLCD,pasos);
if(sentido==1)
printf("derecha");
else
printf("izquierda");
delay_ms(100);
}
}
Un canal lo tengo conectado a la interrupcion externa y el otro canal lo tengo conectado al pin B1. La filosofia para saber el sentido del encoder es de la siguiente manera:
La interrupcion externa interrumpe por flanco de subida (creo, pero da igual) Si nos fijamos en la imagen de mi anterior post, los flancos de subida del canal A (mirando de izquierda a derecha) corresponden con el estado a nivel alto del canal B, y si nos fijamos ahora de derecha a izquierda corresponde con el nivel bajo del canal B. Ya que asi funciona el encoder el problema del sentido esta resuelto.
Para saber lo que ha avanzado simplemente tenemos que contar los pulsos que da un canal.