Problema con Puerto D y Temporizacion. PIC18F4550

Buenas tardes. Me encuentro realizando unas rutinas de mi trabajo de tesis.
Consiste en verificar unos sensores infrarrojos y su cambio de 1 a 0.

Tengo 3 sensores y están en los bits D0 a D2.

Las estrofas del código son las siguientes.


PROCESO DE LOS CONTENEDORES
Código:
if(BANDERA_CVEGETALES == TRUE)
                                                  {
                                                  
                                                     printf(LCD_PUTC, "\f");
                                                     lcd_gotoxy(1,1);
                                                     lcd_putc("Arroz con");
                                                     lcd_gotoxy(1,2);
                                                     lcd_putc("Vegetales! Bien!");
                                                     lcd_gotoxy(1,3);
                                                     lcd_putc("Iniciemos!:");
                                                     delay_ms(2000);
                                                     printf(LCD_PUTC, "\f");
                                                     do{
                                                        lcd_gotoxy(1,1);
                                                        lcd_putc("Llene el Conten.");
                                                        lcd_gotoxy(1,2);
                                                        lcd_putc("#1 de Arroz");
                                                        lcd_gotoxy(1,3);
                                                        lcd_putc("Ahora.");
                                                        BANDERA_C1 = TRUE;
                                                        BANDERA_CVEGETALES = FALSE;
                                                        }while(BANDERA_C1L == FALSE);
                                                     printf(LCD_PUTC, "\f");
                                                     do{
                                                        lcd_gotoxy(1,1);
                                                        lcd_putc("Contenedor #1");
                                                        lcd_gotoxy(1,2);
                                                        lcd_putc("Lleno. Llene de");
                                                        lcd_gotoxy(1,3);
                                                        lcd_putc("Vegetales el");
                                                        lcd_gotoxy(1,4);
                                                        lcd_putc("Contenedor #2");
                                                        BANDERA_C2 = TRUE;
                                                        }while(BANDERA_C2L == FALSE);
                                                        printf(LCD_PUTC, "\f");
                                                     lcd_gotoxy(1,1);
                                                     lcd_putc("funciona");

PROCESO DE TEMPORIZACION
Código:
#int_TIMER1
void TIMER1_isr(void)                   //Función de interrupción por desbordamiento TMR0
                     {
                         if(BANDERA_C1 == TRUE)                             //Rutina para verificar el Sensor Infrarojo 1
                                              {                            //Si este sensor posee un estado bajo por mas de 10s
                                                if(!input(SENSOR_I1))     //Se asume que efectivamente esta lleno.
                                                                     {
                                                                     cont_c01++;
                                                                     if( cont_c01 >= 100)                      //1000ms - 1Seg
                                                                                          {
                                                                                          cont_c01 = 0;
                                                                                          cont_c10++;
                                                                                          if(cont_c10 >= 10)   //10Seg
                                                                                                            {
                                                                                                            cont_c10 = 0;
                                                                                                            BANDERA_C1L = TRUE;
                                                                                                            BANDERA_C1 = FALSE;
                                                                                                            }
                                                                                          }
                                                                      }
                                              }
                                              
                         if(BANDERA_C2 == TRUE)                             //Rutina para verificar el Sensor Infrarojo 2
                                              {                            //Si este sensor posee un estado bajo por mas de 10s
                                                if(!input(SENSOR_I2))     //Se asume que efectivamente esta lleno.
                                                                     {
                                                                     cont_c02++;
                                                                     if( cont_c02 >= 100)                      //1000ms - 1Seg
                                                                                          {
                                                                                          cont_c02 = 0;
                                                                                          cont_c20++;
                                                                                          if(cont_c20 >= 10)   //10Seg
                                                                                                            {
                                                                                                            cont_c20 = 0;
                                                                                                            BANDERA_C2L = TRUE;
                                                                                                            BANDERA_C2 = FALSE;
                                                                                                            }
                                                                                          }
                                                                     } 
                                              }

}
Espero alguien pueda ayudarme y comentarme donde esta fallando mi código o mi lógica.

El problema está en que entra al primer sensor, el sensor 1, hago el cambio del estado del bit de 1 a 0, y nunca sucede nada, no sale del bucle en pocas palabras.

Adjunto la imagen de la simulación y donde se queda el proceso y no continúa.
 

Adjuntos

  • problema.jpg
    problema.jpg
    160.6 KB · Visitas: 7
Última edición por un moderador:
¿Has comprobado que el PIC entra en la interrupción del timer? Porque si se queda atascado en ese bucle, sin duda es porque la condición BANDERA_C1L == FALSE siempre se cumple.
 
Atrás
Arriba