Problema con ciclo for (ccs- pic C compiler) pic 18f4550

#1
Buenos días. Tengo un problema con mi ciclo for en un programa que estoy haciendo.
Mi proyecto es un diseñar un reloj con el pic18f4550 y mostrarlo en un lcd.
He usado ciclos for para llevar la cuenta de los segundos, los minutos y las horas con sus temporizadores.
El programa trabaja bien, se respetan los tiempos y todo funciona perfectamente.
Mi problema es que cuando el segundero termina un ciclo y debe volver a cero, no lo hace, sino que comienza a mostrar una serie de números y al llevar 10 números vuelve a la normalidad.
Para que lo vean más gráficamente es así:

segundero= 57, 58, 59, 09, 19, 29, 39, 49, 59, 69, 79, 89, 99, 10, 11... Y luego funciona correctamente hasta que vuelve a terminar el ciclo, es decir, hasta que llega a 59 y vuelve con el mismo error.
He probado con no mostrar el valor que el ciclo for aumenta, sino otra variable distinta y me tiene el mismo problema.
Espero alguno de ustedes pueda ayudarme.
Abajo les anexo la parte del código a ver que me recomiendan.
Código:
for (hora=0;hora<=12;hora++)// ciclo para la hora
   {  lcd_gotoxy(4,3);
     printf(LCD_PUTC,"%i",h); 
     h++;
      for (minu=0;minu<=59;minu++) // ciclo para los minutos
         {
           lcd_gotoxy(7,3);
           printf(LCD_PUTC,"%i",m); 
              m++;
               for (segu=0; segu<60; segu++)  // ciclo para los segundos
               {for (i=0;i<=1;i++)
                   {
                      bit_clear(pir1.0);
                     set_timer1(0xBDC);
            
                     while(!PIR1);
     
                   }
                  lcd_gotoxy(10,3);
                   printf(LCD_PUTC,"%i",s);
                  s++;
                }
               s=0;          
           
         }
    m=0;
    
   }
h=0;
El programa compila perfectamente, y la simulación es en proteus.
 
Última edición por un moderador:
#2
Está medio raro.

Yo haría una interrupción para un segundo, obviamente la debes calcular.

Código:
#int_RTCC 
void clock_isr() 
{
seg++;
set_timer0(numero); 
}

void main()
{

//configura tu interrupcion
while(1)
{
if(seg>=60)
{
seg=0;
min++;
if(min>=60)
{
min=0;
hora++;
}
}

//aca imprimes todo

}//while

}//void
 
Última edición por un moderador:
#3
El problema está en los printf... cuando sacas cantidades que son menores de diez, lo hacen con sólo un dígito: 0, 1, 2, 3...

Como los estás colocando en posiciones fijas, con lcd_gotoxy(), después de pintar '59', al querer pintar el valor de '0' (un dígito), sólo sobreescribe el primer dígito (el '5'). Por eso vemos un '09'. Y luego vemos un '19', y así.

La solución es hacer que los printf siempre escriban dos dígitos:
PHP:
for (hora = 0; hora <= 12; hora++) {        // ciclo para la hora
    lcd_gotoxy(4,3);
    printf(LCD_PUTC,"%02i",hora); 

    for (minu = 0; minu < 60; minu++) {        // ciclo para los minutos
        lcd_gotoxy(7,3);
        printf(LCD_PUTC,"%02i",minu); 

        for (segu = 0; segu < 60; segu++) {     // ciclo para los segundos
            for (i = 0; i < 2; i++) {
                bit_clear(pir1.0);
                set_timer1(0xBDC);
                while(!PIR1);
            }
            lcd_gotoxy(10,3);
            printf(LCD_PUTC,"%02i",segu);
        }
    }
}
La solución que te da Trilo-byte es mucho mejor. Esta es mi versión:
PHP:
hora = minuto = segundo = 0;
while(1) {
    lcd_gotoxy(4,3);
    printf(LCD_PUTC,"%02d:%02d:%02d", hora, minuto, segundo);

    for (i=0; i < 2; i++) {
        bit_clear(pir1.0);
        set_timer1(0xBDC);
        while(!PIR1);
    }

    segundo = ++segundo % 60;      // incrementamos segundo 00 -> 59
    if (0 == segundo) {
        minuto = ++minuto % 60;    // incrementamos minuto 00 -> 59
        if (0 == minuto) {
            hora = ++hora % 24;    // incrementamos hora 00 -> 23
        }
    }
}
 
Última edición:
Arriba