Autor Tema: Problema con adc y interrupcion Rb0  (Leído 1102 veces)

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

Desconectado benlocu

  • PIC10
  • *
  • Mensajes: 2
Problema con adc y interrupcion Rb0
« en: 09 de Mayo de 2013, 20:39:17 »
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);
  }
 
 
}

Desconectado benlocu

  • PIC10
  • *
  • Mensajes: 2
Re: Problema con adc y interrupcion Rb0
« Respuesta #1 en: 15 de Mayo de 2013, 18:31:29 »
Hola de nuevo.
Despues de darle muchas vueltas a la cabeza, el problema estaba en el delay que hacia dentro de la propia interrupción RB0. Simplemente eliminarla y todo funciona correctamente.

Para generar un retardo lo que he hecho ha sido programar otra interrupción por timer0 y en ella apagar el pin correspondiente.
Espero haberme explicado.

Muchas gracias a todos.