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!!!!
#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;
}