¿Por qué arroja números basura un contador con PIC16F877?

Bueno, el error es que en la sección de horas, las convierto a segundos y suma genial, hasta que llega a 18 horas me arroja basura.
Les muestro el código para ver si encuentran algún error.
PHP:
#include <16f877.h>

#fuses HS
#fuses NOWDT
#fuses NOPROTECT
#fuses NODEBUG
#fuses NOLVP
#byte Puerto_A=05
#byte Puerto_B=06
#byte Puerto_C=07
#byte Puerto_D=8
#byte Puerto_E=9
#Use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_c6,rcv=PIN_c7)
#include <lcd.c>

////****variables globales****/////
unsigned long int h_1;
long int n,h,m,i,s,suma;
long int m_1;


///***************************///



#INT_RB
conteo_1()

{delay_ms (10);



if (bit_test (Puerto_B,5)) //Peticion de Hora
{
lcd_gotoxy(2,1);
printf (lcd_putc,"H:%lu",h);


h_1 = ((h*3600));
h=h+1;
// lcd_gotoxy(2,2);
// printf (lcd_putc,"t:%lu",h_1);


}

if (bit_test (Puerto_B,6)) //Peticion de Minutos
{
lcd_gotoxy(7,1);
printf (lcd_putc,"M:%lu",m);

m_1 = (m*60);
m=m+1;
}

if (bit_test (Puerto_B,7)) //Peticion de Segundo
{
lcd_gotoxy(12,1);
printf (lcd_putc,"S:%lu",s);
s=s+1;

}

if(bit_test(Puerto_B,4))
{
//Puerto_C=0b00010000;
//delay_ms(2000);
//Puerto_C=0b00000000;
//delay_ms(2000);
lcd_gotoxy(1,2);
printf (lcd_putc,"%lu",n);
n = n +1;
}
// Suma //
suma = h_1 + m_1 + s;
lcd_gotoxy(2,2);
printf (lcd_putc,"Total:%lu",suma);

if (n > suma)
{
lcd_putc("\f");
lcd_gotoxy(2,2);
printf (lcd_putc,"Stop");


}
//mostar en pantalla lcd
}






main()
{n=0,m=0,h=0,s=0;

Set_Tris_A(0b00000000);
Set_Tris_B(0b11111111);
Set_Tris_C(0b10000000);
Set_tris_D(0b00000000);
Set_tris_E(0b00000000);

lcd_init();
//lcd_putc ("\f");


enable_interrupts(INT_RB);
enable_interrupts(Global);




lcd_gotoxy (i,1);
printf (lcd_putc,"Proyecto ");
lcd_gotoxy (i,2);
printf (lcd_putc,"Electronica");
delay_ms (300);

for (i=0;i<20;i++)
{
lcd_gotoxy (i,1);
printf (lcd_putc,"Proyecto ");
lcd_gotoxy (i,2);
printf (lcd_putc,"Electronica");
delay_ms (200);
}
printf (lcd_putc,"Iniciando.");
for (i=11;i<20;i++)
{
lcd_gotoxy (1,1);
printf (lcd_putc," Iniciando.");
lcd_gotoxy (i,1);
printf (lcd_putc,".");
delay_ms(200);
}
lcd_putc("\f");
lcd_gotoxy(2,1);
printf (lcd_putc,"H:%lu",h);
lcd_gotoxy(7,1);
printf (lcd_putc,"M:%lu",m);
lcd_gotoxy (12,1);
printf (lcd_putc,"S:%lu",s);



For(;
{



//printf ("total :");

/*
delay_ms (150);

if (bit_test (Puerto_B,0)) //peticion de hora
{
lcd_gotoxy(2,1);
printf (lcd_putc,"H:%lu",h);
h=h+1;

}

if (bit_test (Puerto_B,2)) //Peticion de Minutos
{
lcd_gotoxy(11,1);
printf (lcd_putc,"M:%lu",m);
m=m+1;

}
if (bit_test (Puerto_B,5)) //Peticion de Segundos
{
lcd_gotoxy(6,1);
printf (lcd_putc,"S:%lu",s);
s=s+1;

} */






}

}
 
Última edición por un moderador:
Lo del fallo creo que es porque 18 * 3600 = 64 800, así que en 736 segundos más, desbordará el tamaño de 16 bits.
 
Última edición por un moderador:
Lo del fallo creo que es porque 18 * 3600 = 64 800, así que en 736 segundos más, desbordará el tamaño de 16 bits.

A eso ¿Cuál es el tamaño del long int?

Por que además, estas sumando un unsigned long int en un long int (con signo) eso se traduce en que a uno le sobra un bit, que en caso de tenerlo presente en el que emplea signo se vuelven negativos, si el long int es de 16bits entonces su valor positivo máximo será de 32767 para la que tiene signo mientras que la unsigned llegaría a 65535, naturalmente sumar esos valores se volverá caótico si no los controlas.
 
es que CCS no es muy estandar

esta int16 e int32 y sus respectivos unsigned
lo que se diferencia es en usar el printf y el atoi y en modo rs232 no imprimen jaja

solo hay que tener en cuenta eso y no meszclar int16 e int o int32 con int pues generara muchos problemas
 
Atrás
Arriba