Escribí un código para hacer un reloj digital usando timer1 y lo probé con Proteus (un simulador de Arduino). Ese programa se descargó en un Atmega8 y se conectó a una pantalla LCD. Los segundos se cuentan perfectamente en 1 segundo de duración. Pero cuando segundo, los minutos y las horas se incrementan a más de 60, veo problemas. Para limitar esos valores, he escrito estas instrucciones:
if (second==60)
{
second=0;
}
Pero cuando los segundos llegan a 59, la pantalla LCD muestra el valor del segundo siguiente al azar. Por ejemplo: 59,09,19,29,39,49,59 ..... 99,10,11,12,13,14.
Mi código:
unsigned int second=0;
unsigned int minute=0;
void init_timer1(void);
int main(void)
{
init_timer1();
sei();
Init_LCD();
while(1)
{
goto_position_X_Y(1,0); //first line first position
sprintf(lcd,"second=%d",second);
Send_A_String(lcd);
goto_position_X_Y(2,0); // second line first position
sprintf(lcd,"minute=%d",minute);
Send_A_String(lcd);
}
}
void init_timer1(void)
{
TCCR1B |=(1<< CS12); // prescaler set 256;new freq=31250;
TCCR1B |=(1<< WGM12);
TCNT1 =0;
OCR1A= 3107; // 16 bit max count value 65535,
TIMSK |=(1<< OCIE1A) ;
}
ISR(TIMER1_COMPA_vect)
{
second++;
if(second==60)
{
second=0;
}
minute=minute+(second/60);
if(minute==60)
{
minute=0;
}
}
¿me puede sugerir que se puede producir un problema en el programa de lcd? Código:
Send_A_String(lcd); function of this instruction.
void Send_A_String(unsigned char*String_data)
{
while (*String _data>0) {
send_A_data(*String_data++) ;
}
}