TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
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)
#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 :(
-
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)
#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
-
Amigo revisa estas sentencias.
if ((input_state(A)==0)&(input_state(B)==0)){
valor++;
}
creo que debería ser :
if ((input_state(A)==0) && (input_state(B)==0)){
valor++;
}
El operando lógico inclusivo And en leguaje C es && no &
Espero haberte ayudado