Buenos dias, estoy empezando a hacer mis primeros programas utilizando timers e interrupciones, este tiene el objetivo de capturar la tecla pulsada utilizando la interrupcion por cambio de estado del RB4-RB7, esa parte funciona bien, sin embargo le agregue el uso del timer 0, para cada segundo mardarlo a leer una temperatura y desplegarla en la parte baja del lcd, esto ultimo no lo realiza y no logro dar con el error o quizas estoy planteando mal el programa, alguien podria echarme un cable? saludos gracias.
#include <16f877a.h>
#fuses XT,NOWDT
#use delay (clock=4M)
#define lcd_data_port getenv("sfr:portd")
#define lcd_enable_pin pin_d0
#define lcd_rs_pin pin_d1
#define lcd_rw_pin pin_d2
#define use_portb_kbd true
#include <lcd.c>
#include <KBD4x4.c>
#BYTE INTCON=getenv("sfr:INTCON")
#BYTE TRISA=getenv("sfr:INTCON")
#BYTE TRISB=getenv("sfr:TRISB")
#BYTE TRISD = getenv("sfr:trisd")
#BYTE OPTION_REG=getenv("sfr:OPTION_REG")
#BYTE ADCON0=getenv("sfr:ADCON0") //REGISTROS del ADC
#BYTE ADCON1=getenv("sfr:ADCON1")
#BYTE ADRESH=getenv("sfr:ADRESH")
#BYTE ADRESL=getenv("sfr:ADRESL")
#BYTE TMR0=getenv("sfr:TMR0")
#define resolucion 0.004882
#define resCelcius 0.4882
char k;
int contador = 0; //Contador usado para el timer
void muestraBoton(); //prototipos de funciones
int16 LectorADC();
void procesoLeeTemp();
#INT_RB
void servicioIntRB() //rutina de interrupcion
{
k = kbd_getc();
bit_clear(INTCON,0);; //bandera de la interrupcion a 0 nuevamente
muestraBoton();
}
#INT_TIMER0
void servicioInttmr0() //rutina de interrupcion
{
contador++;
TMR0=22; //Se recarga el timer
bit_clear(INTCON,2); //Se vuelve a poner a 0 el bit de bandera de desbordamiento
if (contador == 17) //si ha transcurrido un segundo
{
contador = 0;
procesoLeeTemp();
}
}
void main()
{
TRISA = 0x1; //Pin RA0 como entrada para analogico
TRISB = 0xff; //puerto b como entrada
TRISD = 0x00; //puerto d como salida
port_b_pullups(true);
lcd_init();
kbd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"iniciando");
delay_ms(1000);
lcd_putc("\f"); //se borra la pantalla
lcd_gotoxy(1,1);
printf(lcd_putc,"Teclado con");
lcd_gotoxy(1,2);
printf(lcd_putc,"interrupciones");
delay_ms(2000);
lcd_putc("\f");
lcd_gotoxy(1,2);
printf(lcd_putc,"Temp = ");
OPTION_REG=0b00000111; //preescaler 1:256
ADCON0 = 0x81;
ADCON1 = 0xCE;
INTCON = 0xA8; ////habilitacion global de interrupcion, habilitacion de int por cambio de estado RB4-RB7,flag RBIE a 0,habilitacion int timer0
TMR0=22; //se carga con un valor de 256 - 22, para contar 60ms
while(true)
{
}
}
void muestraBoton()
{
if (k!=0)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"tecla pulsada: %c",k);
}
}
void procesoLeeTemp()
{
float temp = 0.0;
int16 retAnalogico = 0;
retAnalogico = LectorADC();
temp = resCelcius * retAnalogico;
lcd_gotoxy(7,2);
printf(lcd_putc, "%3.1f",temp);
}
int16 LectorADC()
{
int16 analogico = 0;
delay_ms(1); //tiempo de establecimiento
bit_set(ADCON0,2); //inicia conversion
while(bit_test(ADCON0,2)); //se espera a que termine la conversion
analogico = ADRESH <<8; //desplazmos 8 veces a la izquierda
analogico = analogico | ADRESL; //se realiza operacion or
return analogico;
}