He usado DS1307 en mi proyecto que me da los valores de Hour, Min, Sec
pero también se necesitan valores de Milliseconds
. Estoy planeando usar temporizadores con 1 millisecond
y luego sincronizarlos según los segundos de DS1307
.
He hecho el programa para 1 ms de retraso, pero el problema es que no estoy seguro de si está funcionando con 1 ms o no porque usé el parpadeo del led y no podemos ver el parpadeo del led a 1 ms. Mi primera pregunta es, ¿hay alguna manera de que pueda estar seguro de que está demorando 1 ms.?
Ahora digamos si su temporizador de 1 ms exacto. Ahora, cómo sincronizarlo con la sincronización DS1307 . Mi aplicación total es como si recibiera entradas, entonces tengo que mostrar qué entradas están activadas en UART con tiempos exactos (incluidos los milisegundos). Por ejemplo, si la entrada 4 está en ON, entonces:
/*
**some code
*/
if(PORTEbits.RB5 == 1)
{
putsUART1("Input 4 ON, Time: ");
putsUART(TIME);
}
Ahora, este TIME
debería contener los valores de HH:MM:SS:MS
. Hasta ahora puedo mostrar HH:MM:SS
solamente. Tampoco puedo usar sqw/out
porque su PCB hecho a medida y ese pin se deja en blanco. Por favor ayuda
EDIT:
He incluido count ++ en ISR que se incrementa a 1 ms. En while (1) estoy imprimiendo los valores de conteo después de leer sec en la función RTC_read
while(1)
{
RTC_read();
sprintf(TIME,"%s%s:%s%s:%s%s",hr2,hr1,min2,min1,sec2,sec1);
putsUART1(TIME);
putsUART1(" ");
putsUART1(COUNT);
putsUART1("\n");
}
void __ISR(_TIMER_2_VECTOR, ipl3) Timer2Handler(void)
{
mT2ClearIntFlag();
count++;
}
función RTC_read:
/*
* some code
*/
//read sec
while(!I2CReceivedDataIsAvailable(RTC_I2C_BUS));
Nop();
sec = I2CGetByte(RTC_I2C_BUS);
AckI2C2();
while (!I2CAcknowledgeHasCompleted(I2C2));
/*
* Milliseconds
*/
if(count >= 999)
{
count = 0;
}
else
{
sprintf(COUNT,"%d",count);
}