Hola a todos, soy nuevo en esto de los pics y tengo un problema que no veo la solucion. A ver si me podeis echar una mano.
Tengo un Pic 16F876A el cual controla un Lm35 que lee temperatura en + y - (AN0, AN1), y una ldr (AN2).
Muestro la temperatura en un LCD conectado al PORTB.
Esto funciona bien y sin problemas.
Pero al añadir la interrupcion en RB0, deja de funcionar el sensor de temperatura el de la LDR funciona bien.
¿que estoy haciendo mal?
Gracias por vuestra ayuda.
#include "16f876A.h" // Pic a utilizar
#device adc=10 // Usa resolución de 10 bits
#use delay(clock=4000000) // Cristal a utilizar
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect // Fusibles
#include "lcd.c" // Libreria para utilizar LCD por el puerto B
//#use standard_io (D)
#define ON output_high
#define OFF output_low
//DECLARAMOS LAS FUNCIONES (SUBRUTINAS)
void rebotes(); // Rutina para evitar rebotes.
void LDR();
void Temp();
//DECLARO LAS VARIABLES//
float sensor, ref, dif, res, ajustem; //Variables para la ºt.
float nLDR=0, ajusteLDR=0; //Variables para el control de la LDR.
//Variables ajuste ºt y LDR.
///LLAMADA FUNCION INTERRUPCION
#INT_EXT //Hace bien la interrupcion pero no lee el ºt.
void IntRB0()
{
// HAce lo de la interrupcion señal llamada
ON (PIN_C0);
DELAY_ms(1000);
OFF (PIN_C0);
}
void main (void)
{
enable_interrupts(int_ext); //activar interrupcion externa
ext_int_edge(L_TO_H); //configuracion:interrupcion cuando señal esta en alta
enable_interrupts(GLOBAL); //todas las interrupciones activadas
lcd_init(); // Inicia LCD
lcd_putc(" Inicializando \n"); // Saca texto
delay_ms(500);
lcd_putc(" Espere ");
delay_ms(2000);
lcd_putc("\f"); // Limpia pantalla
lcd_putc("Temperatura\n"); // Saca texto
lcd_putc("actual"); // Saca texto
delay_ms(1000);
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc(ADC_CLOCK_DIV_32);
while (1)
{
Temp();
LDR();
}
}
//FUNCIONES (SUBRUTINAS)//
void rebotes()
{
delay_ms(151);
}
void Temp()
{
lcd_gotoxy(9,2); // Acomoda cursor LCD
lcd_putc(" "); // Limpia ese sector de pantalla
lcd_gotoxy(9,2); // Acomoda cursor LCD
// disable_interrupts (INT_EXT); //Deshabilita interrupciones.
set_adc_channel(0);
delay_us(20);
sensor = read_adc();
set_adc_channel(1);
delay_us(20);
ref = read_adc();
////Este es para controlar la LDR
set_adc_channel(2); //Lee el valor para la LDR.
delay_ms(20);
nLDR = read_adc();
// Fin control LDR
if (sensor >= ref) // temperatura positiva
{
dif = sensor - ref; //temperatura positiva
}
else
{
dif = sensor - ref; //temperatura negativa
}
res=dif*(0.48875);
//ajustem = -2.0;
res = res + ajustem;
printf(lcd_putc,"\%02.1fßC ",res); // Simbolo de º es ALT+225
delay_ms(1000);
}
void LDR ()
{
//int16 min=1024, max=0;
//nLdr=nldr*(0.48875);
lcd_gotoxy(9,1);
nLDR = nLDR + ajusteLDR;
printf(lcd_putc,"\%02.1f ßC ",nLDR); // Simbolo de º es ALT+225
delay_ms(100);
// Obtención de mín y max del ADC
// if ( nLDR < min){
// min = nLDR;
// }
// if (nLDR > max){
// max = nLDR;
// }
If (nLDR > 700){
ON (PIN_C2);
}else{
OFF (PIN_C2);
}
}