TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: karpic en 09 de Febrero de 2008, 20:42:05

Título: Problemas con interupcion timer0
Publicado por: karpic en 09 de Febrero de 2008, 20:42:05
Con este código no me funciona

while(true)
      {
   V=read_float_eeprom(20);
   
   X=250;
   Y=300;
     
   IF (contador == X){
               OUTPUT_HIGH(PIN_A2);
               }
   IF (contador == Y){
               OUTPUT_LOW(PIN_A2);
               contador = 0;
               }

Y con este otro si

while(true)
      {
         
   IF (contador == 250){
               OUTPUT_HIGH(PIN_A2);
               }
   IF (contador == 300){
               OUTPUT_LOW(PIN_A2);
               contador = 0;
               }

le asigno variables por que necesito variar el tiempo en el que se activa el pinA2.

Alguien me puede decir el porque no me funciona o darme otra solución.

             
Título: Re: Problemas con interupcion timer0
Publicado por: RedPic en 09 de Febrero de 2008, 21:14:31
Si se te queda siempre en High puede ser por el tipo de variable que hayas definido Contador, X ó Y, si son Int8 solo pueden alcanzar 8 bits, o sea 255 y no controlaras nunca el valor de 300 ... Si es así debes declararlas como Int16. V no lo usas ¿No?.

Título: Re: Problemas con interupcion timer0
Publicado por: karpic en 09 de Febrero de 2008, 21:18:11
Si es asi se queda en high, V no la he puesto para no liar, pero es con la que pretendo controlar el tiempo. las variables las tengo como float.
Título: Re: Problemas con interupcion timer0
Publicado por: RedPic en 09 de Febrero de 2008, 21:22:04
El tenerlas como float ¿es por algo en especial? Quiero decir ¿necesitas decimales para algo? Porque si no los necesitas estas desperdiciando mucho de todo. Si no necesitas los decimales trabaja con enteros Int8 o Int16 y ya veras como te funciona mejor. Otra cosa, ¿Quien o como incrementa Contador?

Título: Re: Problemas con interupcion timer0
Publicado por: karpic en 09 de Febrero de 2008, 21:27:33
Te pongo el código completo, es el control de una incubadora, y desde un menu controlo la temperatura, humedad y volteo de los huevos. he cambiado las variables a int16 y ahora se queda siempre en low.


#include <16F876.h>
#include <internal_eeprom.c>

#use delay(clock=4000000)

#fuses xt,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT

#define use_portb_lcd TRUE

#include "LCD.c"
#include <sht11.h>
int16 contador;
#int_timer0
void INTERRUPTION()
   {
    contador ++;
    set_timer0(0x06);
   }

//#byte port_c=0x07

//******************************************************************************
// input(pin_C0) Pulsador de menu y ok
// input(pin_C1) Pulsador de flecha abajo (mas)
// input(pin_C2) Pulsador de flecha arriba (menos)
//******************************************************************************

short actualizar;
typedef union
{
   int16 i;
   float f;

} valor;
valor humedad, temperatura;
byte errorsht11,checksum;
unsigned test=1;//, i;
int8 testado;
float T, H, V;
int16 X, Y;

//int16 tiempo;

///LLAMADA FUNCION INTERRUPCION

   //INTERRUPCION
 


void sonda(){

//while ( !input(PIN_A0) );//while(true)
//   {

      errorsht11=0;
      errorsht11+=sht11_medicion((byte*) &humedad.i, &checksum, HUMI);     //measure humidity
      errorsht11+=sht11_medicion((byte*) &temperatura.i, &checksum, TEMP); //measure temperature
      if(errorsht11!=0)                                                    //in case of an error: connection reset
      {
         printf(lcd_putc,"\n\rerror:%U", errorsht11);
         sht11_hard_reset();
        }
      else
      {
         humedad.f=(float)humedad.i;                              //converts integer to float
         temperatura.f=(float)temperatura.i;                      //converts integer to float
         sht11_calculos(&humedad.f, &temperatura.f);              //calculate humidity, temperature
      }

      lcd_gotoxy(1,1);
      printf(lcd_putc,"  Temp.  Humedad");

      lcd_gotoxy(0,2);
      printf(lcd_putc," %2.2f",temperatura.f);
      IF (temperatura.f < (read_float_eeprom(1)-2)) output_high(pin_A0);
      IF (temperatura.f > (read_float_eeprom(1)+2)) output_low(pin_A0);
      IF (humedad.f < (read_float_eeprom(10)-2)) output_high(pin_A1);
      IF (humedad.f > (read_float_eeprom(10)+2)) output_low(pin_A1);
      lcd_send_byte(1,0b11011111);
      printf(lcd_putc,"C  %2.2f%%HR",humedad.f);

      actualizar=true;
      delay_ms(100);
   }
//   pulsador();
//   }
     
      void menus()
      {
     
      switch (testado){
      case 1:
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("1 Temperatura");
      break;
     
      case 2:
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("2 Humedad");
      break;
     
      case 3:
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("3 Volteo");
      break;
     
      case 4:
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("4 Salir");
      break;
            }
      }
     
      void menus2()
      {
      switch (testado){
      case 1:
      delay_ms(100);
      T=read_float_eeprom(1);
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("Set Grados ");
      lcd_putc(223);
      //for(i=200;i!=255;i++)
      //{
      //lcd_gotoxy(1,1);
      //lcd_putc(i);
      //printf(lcd_putc,"%u",i);
      //delay_ms(1000);
      //};
      lcd_putc("C");
      lcd_gotoxy(5,2);
      printf(lcd_putc,"%1.1f",T);
     
     
      while(input(pin_C0))
      {
      if (!input(pin_C1))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C1));             //si es asi, espero a que se libere
         T=T+0.10;
         if (T>40) T=15.00;
         lcd_gotoxy(5,2);
         printf(lcd_putc,"%1.1f",T);
         }
         if (!input(pin_C2))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C2));             //si es asi, espero a que se libere
         T=T-0.10;
         if (T<15) T=40.00;
         lcd_gotoxy(5,2);
         printf(lcd_putc,"%1.1f",T);
         }
      }
      while (!input(pin_C0));
      write_float_eeprom(1,T);
      break;
     
      case 2:
      delay_ms(100);
      H=read_float_eeprom(10);
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("Set Humedad %");
      lcd_gotoxy(5,2);
      printf(lcd_putc,"%1.1f",H);
     
     
      while(input(pin_C0))
      {
      if (!input(pin_C1))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C1));             //si es asi, espero a que se libere
         H=H+0.10;
         if (H>90) H=40.00;
         lcd_gotoxy(5,2);
         printf(lcd_putc,"%1.1f",H);
         }
         if (!input(pin_C2))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C2));             //si es asi, espero a que se libere
         H=H-0.10;
         if (H<40) H=90.00;
         lcd_gotoxy(5,2);
         printf(lcd_putc,"%1.1f",H);
         }
      }
      while (!input(pin_C0));
      write_float_eeprom(10,H);
      break;
     
      case 3:
      delay_ms(100);
      V=read_float_eeprom(20);
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("Set Volteo minu-");
      lcd_gotoxy(1,2);
      lcd_putc("tos");
      lcd_gotoxy(5,2);
      printf(lcd_putc,"%3.0f",V);
     
     
      while(input(pin_C0))
      {
      if (!input(pin_C1))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C1));             //si es asi, espero a que se libere
         V=V+1;
         if (V>120) V=0;
         lcd_gotoxy(5,2);
         printf(lcd_putc,"%3.0f",V);
         }
         if (!input(pin_C2))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C2));             //si es asi, espero a que se libere
         V=V-1;
         if (V<0) V=120;
         lcd_gotoxy(5,2);
         printf(lcd_putc,"%3.0f",V);
         }
      }
      while (!input(pin_C0));
      write_float_eeprom(20,V);
      break;
     
      case 4:
      test=0;
      break;
            }   
      }

void pulsador()
   {
   //==================================================================================
   //testado=1;
   menus();
   delay_ms(200);
   while(input(pin_C0))
      {
           
      if (!input(pin_C1))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C1));             //si es asi, espero a que se libere
         testado=testado+1;
         if(testado>4){testado=1;}
         menus();
         }

      if (!input(pin_C2))                   //veo si se presiono xxxxx
         {
         while (!input(pin_C2));             //si es asi, espero a que se libere
         testado=testado-1;
         if(testado==0){testado=4;}
         menus();
         }
      } 
      while (!input(pin_C0));
      menus2();
      //pulsador();
   }

       
void main()
{
//*********************************
      SETUP_COUNTERS(RTCC_INTERNAL,RTCC_DIV_16);
      set_rtcc(0x06);
      ENABLE_INTERRUPTS(GLOBAL);
      ENABLE_INTERRUPTS(INT_TIMER0);
     

      //OUTPUT_LOW(PIN_A2);
   
      //DO   {
      //    OUTPUT_HIGH(PIN_A2);
      //   }WHILE(TRUE);
//*********************************
   
   port_b_pullups(true);
   setup_adc_ports(NO_ANALOGS);
   actualizar=true;
   //write_eeprom(10,T);
   //write_eeprom(20,H);
   //write_eeprom(30,V);
   lcd_init();
   sht11_hard_reset();;
   //V==read_float_eeprom(20);
   //H==read_float_eeprom(10);
   //T==read_float_eeprom(1);
   testado=1;
//   sonda();

while(true)
      {
   V=read_float_eeprom(20);
   //X=V*60;
   X=250;
   Y=300;
     
   IF (contador == X){
               OUTPUT_HIGH(PIN_A2);
               }
   IF (contador == Y){
               OUTPUT_LOW(PIN_A2);
               contador = 0;
               }
   
   //SET_TIMER0(131);// RESET_TIMER0;
   
         if (actualizar)
            {
            sonda();
//          actualizar=false;
            }

         if (!input(pin_C0))
            {
            while (test){pulsador();}
            }
            test=1;
            testado=1;     
            }
//lcd_putc("\f");

}