Problema programa 80c51

Hola a todos, haciendo un programa me ha surgido una duda existencial. Os lo presento para ver si alguien puede hechar un cable...

El TIMER1 lo tengo programado para contar pulsos de entrada. Como sé que no necesito el TH1 leeré solo lo que se va almacenando en TL1. Bien pues necesito que lo que hay en TL1 nunca sobrepase #09H. Mi idea es ir comparando si lo que hay en TL1 es igual a #09H y si lo es ir a una subrutina.

La subrutina deberia almacenar el número #09H en un registro para no perder el dato y colocar #00H en TL1(para que no adopte al siguiente pulso #0A ya que mi idea es representar lo que se va contando en 20s en 3 displays). A partir de ahora si otra vez rebasa como puedo administrar otros dos registros para las decenas y las centenas?
 
Hace mucho que no uso los 80c51 asi que estoy medio olvidado, pero te haré una sugerencia (que para el T2 funcionaría, no sé para el T1), si fuera para el T2 debes usar el modo autorecarga (Auto-Reload Mode) y cargar los registros RCAP2H y RCAP2L con los valores correspondientes para que cuando el T2 cuente 9 pulsos alcance el rebasamiento (overflow) y por lo tanto se dispare la interrupcion correspondiente. O sea debes cargar los registros de recarga con los valores:
FFFF-9=FFF6, o sea RCAP2H=FF y RCAP2L=F6.
Debes fijarte si el T1 también puede funcionar en Auto Reload Mode.
Saludos.
 
Como te dijieron arriba pone el timer 1 en modo de 8 bits con autorecarga (modo que tambien se lo usa con el puerto serie), y haciendo la cuenta TL1=0xFF-0x09+1 y TH1=0xFF-0x09+1, ese sera el valor de recarga del timer.

Entonces cuando haya 0x09 cuentas, la interrupcion salta debido al desborde, TL1 se carga automaticamente con el valor de TH1, y vuelve a empezar todo de nuevo.
 
Pero creo que haciendolo de ese modo estoy en realidad haciendo lo mismo también... es decir yo estoy contando pulsos de entrada, estos pulsos una vez me pasen 20 segundos ( de esto ya se encarga el timer 0 con su respectivo algoritmo ) los debo representar en 3 displays ( unidades decenas centenas ). El problema principal es que si no pusiera ninguna limitación al timer 1 ( que es el que almacena la cuenta de pulsos), una vez me pasen los 20 segundos el valor de TL1 (registro de los 8 bits bajos de TIMER1) podría adoptar por ejemplo el siguiente valor: 0AH ó 10H. ¿Entonces como representaría yo este número en los 3 displays? No se si la idea que estoy planteando es buena o no. A ver si alguien puede ayudarme

¡¡Gracias a todos por sus respuestas:)!!

**Aclaración**: yo en los displays no quiero el número en hexadecimal como podria ser #AH ó #10H yo quiero números del 1 al 9.
 
Última edición:
Creo que (más bien sospecho) que es lo que quieres hacer:
Quieres contar los pulsos externos e ir mostrando en tiempo real el conteo (suma) de los pulsos durante un lapso de 20s. En este caso debo suponer que son pulsos lentos que te permiten ir refrescando el display a medida que entran los pulsos. Si este es el caso creo que te conviene usar una interrupción externa y en su rutina correspondiente llevas la cuenta de los pulsos, a esa cuenta la pasas a formato BCD y con ese valor (BCD) vas refrescando el display hasta que la interrupción del T0 detenga el conteo y obtengas el conteo total que buscas.
Saludos.
 
Hola wacalo, antes de todo muchas gracias por tu respuesta :).

Te aclaro porque creo que no me expliqué del todo bien. No quiero un lapso de 20 segundos, sinó que quiero mostrar el resultado cada 20 segundos, ¿sabes? Es decir como estoy contando pulsaciones del corazón, ( mi idea es contar pulsaciones durante 20 segundos y luego multiplicar el valor contado por 3 para que haga un promedio digamos como si ubiera contado durante 60 segundos y así no atrasar tanto el conteo)

El problema es que tengo problemas a la hora de poder hacer esta implementación ,como puse en la anterior repsuesta, para poner el resultado en los displays. Pensaba que era un poco tribial, como el típico contador , segundero o minutero. Pero a la hora de hacer el algoritmo observo que no es tan facil.

Creo que más o menos voy entendiendo las respuestas que vays dando. La clave está en pasar el número que tengo en TL1 a una variable auxiliar y luego pasarlo a formato BCD para ponerlo en los displays no? Supongo que en 80C51 debe de haber alguna instrucción para poder hacerlo, entonces sería posible una vez pasado a BCD el número almacenado (#0A ó #10H) representar el número en 3 displays ( unidades decenas centenas) con sus respectivos retardos para poder visualizar el resultado no?
 
Última edición:
Hola de nuevo a todos, ya estoy acabando la realización del programa i me ha surgido una última duda. Quiero poner a cero los 4 bits altos de un registro de 8 bits para que solamente me queden los 4 bits bajos... esto se puede realizar con alguna función lógica como AND, OR,... o una simple multiplicacion binaria...?
 
Estoy mirando en manuales 80c51 a ver si encuentro alguna formade hacerlo con alguna operación lógica. Gracias por responder cosmofulanito!!;);)
 
Atrás
Arriba