Autor Tema: PROBLEMAS CON EL USO DE INTERRUPCION RTCC DE PIC18F4550  (Leído 1337 veces)

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

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
PROBLEMAS CON EL USO DE INTERRUPCION RTCC DE PIC18F4550
« en: 12 de Septiembre de 2020, 03:00:20 »
Hola amigos!!! espero que puedan ayudarme con este pequeño dilema por favor !!!, he estado trabajando en un programa que consiste configurar 2 bombas de agua a ciertas horas del día, con un máximo de 10 activaciones por cada bomba y una una vez que se active cada proceso, tiene que  durar 5 minutos aprox. luego se desactiva, después esperar hasta la próxima activación. "la rutina que he logrado hacer hasta ahora me funciona bien pero me quedo corto de memoria y tuve que cambiar de un PIC16F877A a un PIC18f4550, mi idea es terminarlo en el nuevo PIC creo que soportara el programa completo cuando lo termine" ##< Cuando cambie la rutina al pic 18f4550 me dejo de funcionar la interrupción y por mas que trato entrar al menu no me deja; el programa se queda pegado!!, por eso quiero pedirle ayuda a ver si me ayudan a encontrar la forma que pueda entrar al menú> " la idea es que una vez que pulse el boton "menu_aceptar" pueda ingresar y continuar con las configuraciones, pero por ahora no pasa del mensaje de bienvenida...y cambia cuando apreto mil veces el boton",
por favor si pueden ayudarme a encontrar la falla!!!!
Código: [Seleccionar]

#include <18f4550.h>
#device adc=10
#fuses NOMCLR,NOWDT,NOPROTECT,NOLVP,HS,RESERVED,NOPUT
#use delay(clock=20000000)
#include <Flex_LCD420.C>
#include <DS1307.c>
#use fast_io(b)
//=========== SE DEFINE BOTONERA =============
#define BUT_START_STOP      PIN_B3
#define BUT_IZQUIERDA       PIN_B4
#define BUT_DERECHA         PIN_B5
#define BUT_MENU_ACEPTAR    PIN_B6
//=============================================
#define LED_START           PIN_C6
#define VALOR_MAX_DISP_COMIDA      1.0f  // VALOR_MAX_NIVEL
#define VALOR_MAX_DISP_AGUA        1.0f   // VALOR_MAX_TEMP 
//=======DIRECCION DE MEMORIA EEPROM INTERNA=================
#define EEP_PORC_1  1   //(DIR_LITROS)      // VERIFICAR DIRECCION DE LA EEPROM INTERNA
#define EEP_PORC_2  2   //(DIR_LITROS)      // VERIFICAR DIRECCION DE LA EEPROM INTERNA
#define EEP_PORC_3  3   //(DIR_LITROS)      // VERIFICAR DIRECCION DE LA EEPROM INTERNA
#define EEP_PORC_4  4   //(DIR_LITROS)      // VERIFICAR DIRECCION DE LA EEPROM INTERNA
#define EEP_PORC_5  5   //(DIR_LITROS)      // VERIFICAR DIRECCION DE LA EEPROM INTERNA
#define DIR_CANT_AGUA         6    //(DIR_TEMPERATURA) // VERIFICAR DIRECCION DE LA EEPROM INTERNA

int sec=05,min=40,hora=01,dia=21,mes=8,anio=20,dow=4; // SE PROGRAMA HORA DE INICIO
char fecha [4];

//=========RUTINAS==================
byte leerNivelAgua(void);
byte leerTemperatura(void);
void leerBotones(void);
void Confi_Disp(void);
void buzzer(byte estado);
void pantalla(byte pantalla);
void controlandoNivel(void);
void controlandoTemperatura(void);
//======= NOMBRES DE LAS PANTALLAS LCD=========
enum { PANTALLA_INICIO = 1,
       PANTALLA_RESUMEN,         //|| PANTALLA_VARIABLES
       PANTALLA_CTRL_COMIDA,     //|| PANTALLA_SET_NIVEL_AGUA
       PANTALLA_CTRL_AGUA,       //|| PANTALLA_SET_TEMPERATURA
       PANTALLA_PROCESO,
       PANTALLA_CTRL_NIVEL,
       PANTALLA_CTRL_TEMPERATURA,
       PANTALLA_CTRL_CLAVE,
       PANTALLA_TERMINADO,
       PANTALLA_CTRL_MTTO_1,PANTALLA_CTRL_MTTO_2,PANTALLA_CTRL_MTTO_3,PANTALLA_CTRL_MTTO_4,
     } pantallaActual = PANTALLA_INICIO;
//=====ESTADO DE LAS BOTONERAS ============== 
byte but_start_stop_ant = 0, but_izquierda_ant = 0, but_derecha_ant = 0, but_aceptar_ant = 0;
byte N_porc = 10, agua = 20;
byte cont_buzzer = 0, cont_back_light = 0;
// ======= INTERRUPCION QUE DETECTA QUE SE PULSO LA BOTONERA
#int_RTCC   
void  RTCC_isr(void){
   leerBotones();
}

void main(){
   ds1307_set_date_time(dia,mes,anio,dow,hora,min,sec);
   
   lcd_init();

  // setup_adc_ports(AN0_AN1_AN3);
   setup_adc(adc_clock_internal);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);   //13.2ms
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,155,1);
   setup_ccp1(CCP_OFF);
   set_pwm1_duty(75);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   set_tris_a(0xFF);
   set_tris_c(0x00);
   set_tris_d(0x0F);
   
   N_porc = read_eeprom(EEP_PORC_1);
   agua = read_eeprom(DIR_CANT_AGUA);
   
   if(N_porc > VALOR_MAX_DISP_COMIDA){ write_eeprom(EEP_PORC_1, VALOR_MAX_DISP_COMIDA); N_porc = VALOR_MAX_DISP_COMIDA; }
   if(agua > VALOR_MAX_DISP_AGUA){ write_eeprom(DIR_CANT_AGUA, VALOR_MAX_DISP_AGUA); agua = VALOR_MAX_DISP_AGUA; }
   
   output_high(PIN_C5); cont_back_light = 0;
   pantalla(pantallaActual);
   delay_ms(1000);
   pantallaActual = PANTALLA_RESUMEN; cont_buzzer = 0;
   
   while(TRUE){
      pantalla(pantallaActual);
      if(pantallaActual != PANTALLA_CTRL_NIVEL && pantallaActual != PANTALLA_CTRL_TEMPERATURA){
         output_low(PIN_D0); output_low(PIN_D1);   output_low(PIN_D2); // Para evitar que se quede alguna valvula abierta.
         output_low(PIN_D3);
      }
      if(pantallaActual == PANTALLA_CTRL_NIVEL || pantallaActual == PANTALLA_CTRL_TEMPERATURA){
         output_toggle(PIN_D3);
      }
      if((pantallaActual == PANTALLA_RESUMEN || pantallaActual == PANTALLA_CTRL_NIVEL
         || pantallaActual == PANTALLA_CTRL_TEMPERATURA || pantallaActual == PANTALLA_TERMINADO) && cont_buzzer < 1){
         buzzer(1);
         cont_buzzer++;
      }else{         
         buzzer(0);         
      }
      if(input_state(PIN_C5) == 1 && cont_back_light < 5){
         cont_back_light++;
      }else{
         output_low(PIN_C5);
      }     
      delay_ms(1000);
   }
}

byte leerNivelAgua(void){
   delay_ms(1);
   set_adc_channel(0);
   delay_ms(1);
   return (byte)(read_adc()*VALOR_MAX_DISP_COMIDA/255.0f);
}

byte leerTemperatura(void){
   delay_ms(1);
   set_adc_channel(1);
   delay_ms(1);
   return (byte)(read_adc()*VALOR_MAX_DISP_AGUA/255.0f);
}

void leerBotones(void){
   if(input(BUT_START_STOP) == 1 && but_start_stop_ant == 0){
      output_high(PIN_C5); cont_back_light = 0;
      but_start_stop_ant = 1;
      if(pantallaActual == PANTALLA_RESUMEN && input_state(LED_START) == 0){
         output_high(LED_START); pantallaActual = PANTALLA_CTRL_NIVEL; cont_buzzer = 0;
      }else if(pantallaActual == PANTALLA_RESUMEN && input_state(LED_START) == 1){
         output_low(LED_START); pantallaActual = PANTALLA_RESUMEN;
      }else if(pantallaActual == PANTALLA_TERMINADO){
         pantallaActual = PANTALLA_RESUMEN;
      }else if(pantallaActual == PANTALLA_CTRL_NIVEL || pantallaActual == PANTALLA_CTRL_TEMPERATURA){
         pantallaActual = PANTALLA_RESUMEN; output_low(LED_START);
      }
   }else if(input(BUT_START_STOP) == 0 && but_start_stop_ant == 1){
      but_start_stop_ant = 0;
   }
   if(input(BUT_IZQUIERDA) == 1 && but_izquierda_ant == 0){
      output_high(PIN_C5); cont_back_light = 0;
      but_izquierda_ant = 1;
      if(pantallaActual == PANTALLA_CTRL_COMIDA && N_porc > 0){ N_porc--; }
      if(pantallaActual == PANTALLA_CTRL_AGUA && agua > 0){ agua--; }
   }else if(input(BUT_IZQUIERDA) == 0 && but_izquierda_ant == 1){
      but_izquierda_ant = 0;
   }
   if(input(BUT_DERECHA) == 1 && but_derecha_ant == 0){
      output_high(PIN_C5); cont_back_light = 0;
      but_derecha_ant = 1;
      if(pantallaActual == PANTALLA_CTRL_COMIDA && N_porc < 5){ N_porc++;}
      if(pantallaActual == PANTALLA_CTRL_AGUA && agua < 2 ){ agua++;}
   }else if(input(BUT_DERECHA) == 0 && but_derecha_ant == 1){
      but_derecha_ant = 0;
   }
   if(input(BUT_MENU_ACEPTAR) == 1 && but_aceptar_ant == 0){
      output_high(PIN_C5); cont_back_light = 0;
      but_aceptar_ant = 1;
      if(pantallaActual == PANTALLA_RESUMEN){
         pantallaActual = PANTALLA_CTRL_COMIDA;
      } else if(pantallaActual == PANTALLA_CTRL_COMIDA){
         pantallaActual = PANTALLA_CTRL_AGUA;
         Confi_Disp();
      } else if(pantallaActual == PANTALLA_CTRL_AGUA){
         pantallaActual = PANTALLA_CTRL_CLAVE;
         write_eeprom(DIR_CANT_AGUA, agua);
      }else if(pantallaActual == PANTALLA_CTRL_CLAVE){
         pantallaActual = PANTALLA_CTRL_MTTO_1;
      } else if(pantallaActual == PANTALLA_CTRL_MTTO_1){
         pantallaActual = PANTALLA_CTRL_MTTO_2;
      }else if(pantallaActual == PANTALLA_CTRL_MTTO_2){
         pantallaActual = PANTALLA_CTRL_MTTO_3;
      }else if(pantallaActual == PANTALLA_CTRL_MTTO_3){
         pantallaActual = PANTALLA_CTRL_MTTO_4;
      }else if(pantallaActual == PANTALLA_CTRL_MTTO_4){
         pantallaActual = PANTALLA_RESUMEN;
      }else if(pantallaActual == PANTALLA_TERMINADO){
         pantallaActual = PANTALLA_RESUMEN;
      }
   }else if(input(BUT_MENU_ACEPTAR) == 0 && but_aceptar_ant == 1){
      but_aceptar_ant = 0;
   }
}

void buzzer(byte estado){
   if(estado == 1){
      setup_ccp1(CCP_PWM);
   }else{
      setup_ccp1(CCP_OFF);
   }
}

void pantalla(byte pantalla){
   if(pantalla == PANTALLA_INICIO){
      ds1307_get_date(dia,mes,anio,dow); // muestra la fecha
      ds1307_get_time(hora,min,sec);// muestra la hora
      ds1307_get_day_of_week(fecha);// muestra dia de la semana
      lcd_gotoxy(1,1); printf(LCD_PUTC, "%s %02u/%02u/20%02u",fecha,dia,mes,anio);
      lcd_gotoxy(5,2); printf(LCD_PUTC, "%02u:%02u:%02u",Hora, min, sec);
     
   }else if(pantalla == PANTALLA_RESUMEN){
      ds1307_get_time(hora,min,sec);// muestra la hora
      lcd_gotoxy(1,1); printf(LCD_PUTC, ">C:%u /%u - A:%u /%u",leerNivelAgua(),N_porc,leerTemperatura(),agua,);
      lcd_gotoxy(1,2); printf(LCD_PUTC, "[STOP]  %02u:%02u:%02u",Hora, min, sec);
     
   }else if(pantalla == PANTALLA_CTRL_COMIDA){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "BOMBA DE RIEGO NORTE  ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, ">%02u   MAX [5]  ", N_porc);
   }else if(pantalla == PANTALLA_CTRL_AGUA){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "BOMBA DE RIEGO SUR    ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, ">%02u   MAX [2]  ", agua);
   }else if(pantalla == PANTALLA_CTRL_NIVEL){
      lcd_gotoxy(1,1); printf(LCD_PUTC, " CONTROL NIVEL  ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "     %02u | %02u    ", N_porc, leerNivelAgua());
      controlandoNivel();
   }else if(pantalla == PANTALLA_CTRL_TEMPERATURA){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "CTRL TEMPERATURA");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "     %02u | %02u    ", agua, leerTemperatura());
      controlandoTemperatura();
   }else if(pantalla == PANTALLA_TERMINADO){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "     PROCESO    ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "    TERMINADO   ");
   }else if(pantalla == PANTALLA_CTRL_CLAVE){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "     INGRESE    ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "     CLAVE  <>    ");
   }else if(pantalla == PANTALLA_CTRL_MTTO_1){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "CHECK LIST N\3371 ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "BOMBA DE RIEGO SUR   [OFF]");
    //lcd_gotoxy(1,2); printf(LCD_PUTC, "BOMBA DE RIEGO SUR   [ON]");
   }else if(pantalla == PANTALLA_CTRL_MTTO_2){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "CHECK LIST N\3372   ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "BOMBA DE RIEGO NORTE [OFF]  ");
    //lcd_gotoxy(1,2); printf(LCD_PUTC, "BOMBA DE RIEGO NORTE [ON ]  ");
   }else if(pantalla == PANTALLA_CTRL_MTTO_3){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "CHECK LIST N\3373 ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "B.DESAGUE [OFF] ");
    //lcd_gotoxy(1,2); printf(LCD_PUTC, "B.DESAGUE [ON ] ");
   }else if(pantalla == PANTALLA_CTRL_MTTO_4){
      lcd_gotoxy(1,1); printf(LCD_PUTC, "CHECK LIST N\3374 ");
      lcd_gotoxy(1,2); printf(LCD_PUTC, "5 LEDS    [OFF] ");
    //lcd_gotoxy(1,2); printf(LCD_PUTC, "5 LEDS    [ON ] ");
   }
}
void controlandoNivel(void){
   // agregar una estrategia de control
   if(N_porc > leerNivelAgua()){
      output_high(PIN_D0);
   }else{
      output_low(PIN_D0); cont_buzzer = 0;
      pantallaActual = PANTALLA_CTRL_TEMPERATURA;
   }
}
void Confi_Disp (void)
{
   switch(N_porc){
   case 1:
   lcd_gotoxy(1,1); printf(LCD_PUTC, "BOMBA 1 ACTIVACION 1");
   lcd_gotoxy(1,2); printf(LCD_PUTC, "HORA");
   break;
   case 2:
   lcd_gotoxy(1,1); printf(LCD_PUTC, "BOMBA 1 ACTIVACION 2");
   lcd_gotoxy(1,2); printf(LCD_PUTC, "HORA");
 
   break;
   case 3:
   lcd_gotoxy(1,1); printf(LCD_PUTC, "BOMBA 1 ACTIVACION 3");
   lcd_gotoxy(1,2); printf(LCD_PUTC, "HORA");
   
   break;
 write_eeprom(EEP_PORC_1, N_porc);
}
}

void controlandoTemperatura(void){
   // agregar una estrategia de control
   if(agua > leerTemperatura()){
      output_high(PIN_D1);
   }else{
      output_low(PIN_D1); cont_buzzer = 0;
      pantallaActual = PANTALLA_TERMINADO;
   }

« Última modificación: 12 de Septiembre de 2020, 03:05:36 por ciberik »


 

anything