Autor Tema: Problemas con interupcion timer0  (Leído 1617 veces)

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

Desconectado karpic

  • PIC10
  • *
  • Mensajes: 35
Problemas con interupcion timer0
« 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.

             

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problemas con interupcion timer0
« Respuesta #1 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?.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado karpic

  • PIC10
  • *
  • Mensajes: 35
Re: Problemas con interupcion timer0
« Respuesta #2 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.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problemas con interupcion timer0
« Respuesta #3 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?

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado karpic

  • PIC10
  • *
  • Mensajes: 35
Re: Problemas con interupcion timer0
« Respuesta #4 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");

}


 

anything