Resta de tiempos

#1
Hola amigos! Necesito ayuda con un problema que tengo..

Estoy progamando un pic 16f877A (con PIC C de CCS), tengo como datos dos tempos, es decir tiempo1= HH:MM:SS y tiempo2= hh:mm:ss y necesito extraer uno tercero que es la cantidad de tiempo (tiempo3) que falta para llegar desde tiempo2 hasta tiempo1, por ejemplo:

caso 1: tiempo1 y tiempo2 son el mismo dia:

tiempo1=12:00:00
tiempo2=15:30:00
tiempo3=03:30:00

caso 2: tiempo1 es un dia y tiempo2 es una hora del dia siguiente

tiempo1=12:00:00
tiempo2=06:00:00
tiempo3=18:00:00


necesito algun algoritmo que pueda resolver ese problema..
Agradecido desde ahora por la atencion..
 
#2
Y que hacés cuando la diferencia es mayor de 1 día?

Ej:
tiempo1 = 12:00:00
tiempo2 = 16:00:00 del día siguiente
tiempo3 = 28 hs --> en que formato lo guardás?
 
#3
Creo que lo mejor seria pasar las horas, mimutos a segundos de ahi te sale el tiempo total de segundos y luego haces la resta con el valor deseado. Al final tranasformas los segundos en horas y minutos
 
#4
Gracias por las respuestas!
La difencia es un maximo de 24 hs..

La opcion de pasar tiempo1 y tiempo2 a segundos ya lo realice pero no sé el porqué de que me realiza un calculo erroneo.. pero voy a seguir probando..
 
#5
Hola.
los tiempos están en bcd.creo que deberías convertirlo a binario antes de hacer la resta o restar en bcd,quizás sea esto por lo que el resultado no sale bien.

36 en bcd es 00100110
36 en binario es 00010100

Un saludo
 
#6
Sin convertir nada podes hacerlo asi:

Código:
struct TIEMPO {signed int hh,mm,ss ;} t1 , t2 , t3 ;

    ..................................
    ..................................

    // ------ Diferencia de tiempo t3  [hh:mm:ss]  ----
    
    if((t3.ss=t2.ss-t1.ss)<0) { t3.ss+=60 ; t2.mm-- ; }
    if((t3.mm=t2.mm-t1.mm)<0) { t3.mm+=60 ; t2.hh-- ; }
    if((t3.hh=t2.hh-t1.hh)<0)   t3.hh+=24 ;
    
    // -----------------
 
#7
... La opcion de pasar tiempo1 y tiempo2 a segundos ya lo realice pero no sé el porqué de que me realiza un calculo erroneo.. pero voy a seguir probando..
Supongo que tuviste en cuenta que representar 23:59:59 son 86400 segundos y que necesitas una variable de mas de 16 bits para guardarla... no será por eso que no te funciona ???

El algoritmo de Eduardo evita este problema.

Saludos
 
#9
Si usas un reloj calendario, mejor que mejor. Es bueno saber que el fabricante ya no vendi ni fabrica el PIC16F877A, su sustituto es el 16F887 con mejores prestaciones. Microchip avisó con una noticia un año de antelación.
 
Arriba