Hola socket, mira hace tiempo relizé un programa en Mikrobasic para trabajar con un encoder y que me pudiera arrojar el sentido de giro así como las revoluciones que da una posible flecha a la que se acopla el encoder, esta aplicación fué solo un ejercicio que hice pero que no tenía en su momento algun uso específico, espero te pueda servir de referencia.
Saludosprogram Encoder
rem programa para trabajo con encoder optico incremental salida en cuadratura
'Entrada A y B que representan las señales de salida del encoder
symbol VA = porta.0 'Alias designados para cad pin entrada del PortA
symbol VB = porta.1
symbol Sent = porta.2
dim E as byte
dim conta,vuelta as byte
dim msj1,msj2 as char[8]
dim salida1 as string[3]
dim salida2 as string[3]
sub procedure sentido 'Rutina que imprime en el LCD sentido de giro
if sent=1 then
lcd_out(2,10,msj1)
end if
if sent=0 then
lcd_out(2,10,msj2)
end if
end sub
main:
adcon1=7
TRISA=3
TRISB=0
TRISC=0
conta=0
E=0
msj1="Der >>>"
msj2="Izq <<<"
vuelta=0
Lcd_Init(PORTB) 'Initializa LCD en PORTB
Lcd_Cmd(Lcd_CURSOR_OFF) 'Cursor apagado
lcd_out(1,1,"*Encoder optico*")
Lcd_out(2,1," Incremental V1")
delay_ms(300)
Lcd_Cmd(Lcd_Clear)
Inicio:
If (E=2) and ((VA=1) and (VB=1)) then
E=3
sent=1
sentido
inc(conta)
end if
If (E=2) and ((VA=0) and (VB=0)) then
E=0
sent=0
sentido
dec(conta)
end if
If (E=3) and ((VA=1) and (VB=0)) then
E=1
sent=1
sentido
inc(conta)
end if
If (E=3) and ((VA=0) and (VB=1)) then
E=2
sent=0
sentido
dec(conta)
end if
If (E=1) and ((VA=0) and (VB=0)) then
E=0
sent=1
sentido
inc(conta)
end if
If (E=1) and ((VA=1) and (VB=1)) then
E=3
sent=0
sentido
dec(conta)
end if
If (E=0) and ((VA=0) and (VB=1)) then
E=2
sent=1
sentido
inc(conta)
end if
If (E=0) and ((VA=1) and (VB=0)) then
E=1
sent=0
sentido
dec(conta)
end if
rem **Verifica si se cumplió el número de pulsos para alcanzar una revolución**
if conta=15 then
vuelta=vuelta + 1
conta=0
end if
rem *****Preparación de salida al LCD******
ByteToStr(conta, salida1) 'Convierte variables byte a string
ByteToStr(vuelta, salida2)
Lcd_Out(1, 1, salida1) 'Imprime número de pulsos recibidos
Lcd_Out(2, 1, salida2) 'Imprime número de giros realizados
Lcd_Out(2, 5, "Rev") 'Imprime unidad de revolución
Lcd_Out(1, 5, "Pulsos") 'Imprime unidad de pulsos
goto inicio 'Repite el ciclo de medición
end.