Autor Tema: Aportacion: Encoder rotativo en CCS.  (Leído 6880 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Aportacion: Encoder rotativo en CCS.
« 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:

[/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


Desconectado anthony123

  • PIC10
  • *
  • Mensajes: 18
Re: Aportacion: Encoder rotativo en CCS.
« Respuesta #1 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  :(

Desconectado alev2477

  • PIC10
  • *
  • Mensajes: 21
Re: Aportacion: Encoder rotativo en CCS.
« Respuesta #2 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
« Última modificación: 28 de Julio de 2014, 23:54:37 por alev2477 »
Al preguntar aprendo y al responder aprendo tambien

Desconectado alev2477

  • PIC10
  • *
  • Mensajes: 21
Re: Aportacion: Encoder rotativo en CCS.
« Respuesta #3 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
Al preguntar aprendo y al responder aprendo tambien


 

anything