Quadrature Enconder - Beta release

General discussion on mikroC.
Post Reply
Author
Message
netomx
Posts: 10
Joined: 30 Jul 2011 07:17

Quadrature Enconder - Beta release

#1 Post by netomx » 05 Aug 2011 06:33

Hello! I'll give you my alpha release to read a quadrature encoder and display it on a 16x2 LCD. It is in an alpha stage, and it is not using an interrupt, for now... but it will!

Here's the code:

Code: Select all

/*
Trabajo final de Microcontroladores. Se usa PIC16F877A con un reloj HS de 4MHz.
Entrada del encoder en B.0 y B.1 usanso interrupciones en el B0
Pantalla LCD de 16x2 8bits en puertos A y D.

Encoder con salidas de voltaje.
*/

char *texto="Bienvenido", *texto2="0000000"; //Iniciando variables.
int a=0, viejoa=0; //Variables del contador de pulsos

void inicializa() {
// Inicializar opciones del MCU
CMCON = 0x07; //Desactivar comparadores
ADCON1=0b00000110;  //Salidas digitales
//OPTION_REG.NOT_RBPU=0; DESACTIVO PULL UP PARA PUERTO B
// Inicializar puertos para E/S
TRISA = 0; //Control del LCD
TRISD=0; //Control del LCD
TRISB = 0b11111111; //ENCODER en 0 y 1
// Inicializar puertos de salidas a logico 0
PORTA=0;
PORTD=0;
// Inicializar LCD de 16x2, 8bits
Lcd8_Config(&PORTA,&PORTD,1,3,2,7,6,5,4,3,2,1,0);
Lcd8_Cmd(LCD_CURSOR_OFF);
//Imprimir el texto inicial
Lcd8_Out(1, 1, texto);
//Inicializo el arreglo con datos del encoder
OPTION_REG.INTEDG=0;   //Activo la interrupcion que detecte cuando A baje.
INTCON.GIE = 1;       //Activando interrupciones.
INTCON.INTE = 1;
}

void interrupt() { //la funcion de interrupcion.
if (INTCON.INTF == 1) { //verifico si el bit esta activo
if (PORTB.F1==0)  //si el canal B esta en 0, sumo, si no, resto.
a++;
else
a--;
INTCON.INTF =0;  //desactivo el bit de la interrupcion.
}
}

void main() {
inicializa(); //Inicializo todas las variables.
while(1)
{
if (viejoa!=a) //Si detecto cambio en viejoa, lo pongo en la LCD
{
IntToStr(a, texto2); //Convierto el contador de pulsos A hacia texto.
Lcd8_Out(2, 1, texto2);  //Despliego el texto.
viejoa=a; //Actualizo la variable de viejoa.
} //fin del IF
} //fin del WHILE
} //fin de la rutina MAIN

If anyone needs a help with the language, just ask!

**EDIT 1: I update it because I now use interrupts, and it works GREAT! No count misses! Using a quadrature with external Schmitt Triggers (6N137) and a 12-24VDC encoder with 1000 pulses (obviously using the 1.5kOhms resistor).

Post Reply

Return to “mikroC General”