TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: zeusjorg en 06 de Enero de 2014, 17:59:27

Título: Aportacion: Encoder rotativo en CCS.
Publicado por: zeusjorg en 06 de Enero de 2014, 17:59:27
Buenas tardes.

Bueno es una pequeña aportacion.
Es utilizar un encoder rotativo de los que tienen posiciones. bueno me refiero a que hace clicks cuando los rotas. no se como se le llama.
Funciona con codigo grey de dos bits.
Es un pequeño programa en CCS, usando la interrupcio exterior por RB0.
El pic16f877a a 10mhz, LCD de 20X2 y un encoder rotativo.

la conexion del encoder es:

(http://www.mcmanis.com/chuck/robotics/projects/images/encoder-circuit.gif)[/URL]

Adjunto un RAR con el codigo y la simulacion en proteus.

Se que habra muchos ejemplos y mejores.
Bueno este me va a las mil maravillas. y es un codigo muy sencillo.
Es muy util para utilizarlos en menus, en audio digital...

Espero que os guste.

saludos

Título: Re: Aportacion: Encoder rotativo en CCS.
Publicado por: anthony123 en 28 de Julio de 2014, 14:16:33
Estoy modificando el código para un 16F628 y no me dá la simulación, coloqué algo asi:
(mi idea es hacer un contador multiplexado de 40 a 200 con el encoder rotatorio mecánico)

Código: [Seleccionar]
#include <16F628A.h>
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define LED1  PIN_B2
#define LED2  PIN_B3


byte valor=39;
byte valorant=202;
//signed
#define A PIN_B0 //PORTB RB0 A ENCODER A
#define B PIN_B1 //PORTB RB1 A ENCODER B
#INT_EXT
ext_isr(){
if ((input_state(A)==0)&(input_state(B)==0)){
valor++;
}
if ((input_state(A)==0)&(input_state(B)==1)){
valor--;
}
}
void main()
{
set_tris_b(0xFF); //Puerto B como entrada
enable_interrupts(int_ext);// habilitar interrupcion ext portb0
ext_int_edge(H_TO_L);     // Deteccion por flag de bajada.
enable_interrupts(GLOBAL);//habilita interrupción global
while(True)
{
WHILE (valorant!=valor) // Imprime en LCD si hay algun cambio de valor
{
if(valor==40){output_high (LED1);}
if(valor==41){
output_high (LED2);
output_low  (LED1);
}
}
}

}

Saludos  :(
Título: Re: Aportacion: Encoder rotativo en CCS.
Publicado por: alev2477 en 28 de Julio de 2014, 23:32:21
Estoy modificando el código para un 16F628 y no me dá la simulación, coloqué algo asi:
(mi idea es hacer un contador multiplexado de 40 a 200 con el encoder rotatorio mecánico)

Código: [Seleccionar]
#include <16F628A.h>
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define LED1  PIN_B2
#define LED2  PIN_B3


byte valor=39;
byte valorant=202;
//signed
#define A PIN_B0 //PORTB RB0 A ENCODER A
#define B PIN_B1 //PORTB RB1 A ENCODER B
#INT_EXT
ext_isr(){
if ((input_state(A)==0)&(input_state(B)==0)){
valor++;
}
if ((input_state(A)==0)&(input_state(B)==1)){
valor--;
}
}
void main()
{
set_tris_b(0xFF); //Puerto B como entrada
enable_interrupts(int_ext);// habilitar interrupcion ext portb0
ext_int_edge(H_TO_L);     // Deteccion por flag de bajada.
enable_interrupts(GLOBAL);//habilita interrupción global
while(True)
{
WHILE (valorant!=valor) // Imprime en LCD si hay algun cambio de valor
{
if(valor==40){output_high (LED1);}
if(valor==41){
output_high (LED2);
output_low  (LED1);
}
}
}

}

Saludos  :(

Saludos,
Amigo veo que compila al menos, el problema debe estar en lo que hace, ya te digo
Título: Re: Aportacion: Encoder rotativo en CCS.
Publicado por: alev2477 en 28 de Julio de 2014, 23:42:58
Amigo revisa estas sentencias.

Código: [Seleccionar]
if ((input_state(A)==0)&(input_state(B)==0)){
valor++;
}

creo que debería ser :

Código: [Seleccionar]
if ((input_state(A)==0) && (input_state(B)==0)){
valor++;
}


El operando lógico inclusivo And en leguaje C es && no &

Espero haberte ayudado