Hola a todos,tengo ganas de hacer un control de temperatura,este programa usualmente registra la temperatura y la visualiza en pantalla y eventualmente(mediante int rb)visualiza en pantalla un numero de hasta 2 digitos,el problema es ke no se porke no retorna de la interrupccion si el segundo digito es 0,mi idea ademas tbm es cargar un timer luego de cada pulsacion(aunke aun no manejo el timer)para ke no se cuelgue esperando la pulsacion,bue gracias despues vere como puedo usar ese dato.Salu2
//Este es el primer paso hacia el control de temperatura.Idea:que usualmente sea un sensor y ocacional o
//eventualmente presente en pantalla el numero correspondiente a la tecla oprimida.
#include <16f877.h>
#device adc=10
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=6
//#include <Rutina escaneo de teclado 4x3 en C.c>
#use fast_io(D)
char TECLA_PULSADA,digitos;
float const P=0.002219; //P=(5-2.73)/1023
float voltaje,temperatura; //Declaro estas variables como globales.
unsigned long int bin_lectura; //Si bien trabajare con un dato entero de 10 bits.
char escan_teclado()
{
int tecla;
int i=0;
int vect[5]={0x0E,0x0D,0x0B,0x07,0};
char matriz_teclado[4][3]={'1','2','3','4','5','6','7','8','9','*','0','#'};
while(i<4)
{
portb=vect
;
if(!input(PIN_B4))
{
tecla=0;
tecla=matriz_teclado[tecla];
}
if(!input(PIN_B5))
{
tecla=1;
tecla=matriz_teclado[tecla];
}
if(!input(PIN_B6))
{
tecla=2;
tecla=matriz_teclado[tecla];
}
i++;
}
return(tecla);
}
#int_rb //CCS habilita(una vez fuera)e inhabilita(para ke no se produzca de nuevo la int. mientras se la trata) la int. automaticamente.
void exploracion_teclado(void)
{
port_b_pullups(TRUE);
digitos=0;
while(digitos<2)
{
TECLA_PULSADA=escan_teclado();
if(TECLA_PULSADA!=0)
{
if(digitos==0)
printf(lcd_putc,"\fUMBRAL INF. C=%c",escan_teclado());
else
{
printf(lcd_putc,"%c",escan_teclado());
}
delay_ms(500);
++digitos;
}
}
// while(!input(PIN_B4)||!input(PIN_B5)||!input(PIN_B6)||!input(PIN_B7)); //Leo el portb(esto es necesario por problemas con CCS)y al mismo tiempo utilizo solo el flanco descendente como condición de ejecución.
portb=0x00;
}
main()
{
set_tris_b(0xf0);
set_tris_d(0x00); //Puerto D como salida.
lcd_init();
enable_interrupts(global);
enable_interrupts(int_rb);
while(1)
{
set_tris_a(0x0D); //Configuro RA0,RA2(Vref-) y RA3(Vref+) como entradas.
setup_adc(adc_clock_internal); //Pongo en marcha módulo A/D.
delay_us(20);
setup_adc_ports(AN0_VREF_VREF);
set_adc_channel(0); //El canal analogo a emplear será RA0/AN0.
delay_us(20); //Tiempo de adquisición del dato.
bin_lectura=read_adc();
setup_adc(ADC_OFF);
delay_us(20);
voltaje=(bin_lectura*P)+2.73;
temperatura=(voltaje/0.01)-273;
printf(lcd_putc,"\fTEMPERATURA=%.3f C",temperatura);
delay_ms(100);
lcd_putc("\f"); //Borro LCD.
}
}