Reloj con LCD en ensamblador para PIC16F84A

Estoy haciendo un reloj con lcd, y en una de las subrutinas (que apenas estoy experimentando para después hacer el código) tengo este problema:
START ;etiqueta
CALL Retardo_1s ;retardo de 1 segundo
INCFSZ SEG1 ;incrementa el segundo
CALL TIEMPO ;actualiza el lcd
GOTO START ;vuelve a la etiqueta y repite el proceso
En esa subrutina (que es para los segundos) necesito que se vaya incrementando 0,1,2,3,etc y después del incremento se tiene que actualizar el lcd y pasar por ejemplo de 00:00:00 a 00:00:01, entonces voy a la subrutina que lo actualiza y vuelvo para que se incremente de nuevo, y hay esta el problema, como el comando hace que cuando llegue al máximo de bits (255) salte una instrucción, salta la instrucción del llamado que hice y por ende va al goto y así entra en un bucle.
Adjunto el asm, librerías y simulación por si no entendieron algo de lo que explique o quieren ver las subrutinas.
 

Adjuntos

  • RELOJ_LCD.rar
    20.9 KB · Visitas: 14
Ya lo solucione y lo publico por si otro tuvo el mismo problema
START; etiqueta
CALL Retardo_1s;retarda 1 segundo
INCFSZ SEG1;incrementa un segundo
BTFSC STATUS,Z;¿el flag z es 0? Cuando es 0 es porque la resta(hecha en la subrutina tiempo) no dio 0, si se pone en 1 es porque dio 0
GOTO INICIO ;si es 1 vuelve a empezar el contador
CALL TIEMPO ;si es 0 se actualiza el lcd
GOTO START ;vuelve a incrementar
 
Última edición:
Creo este tema porque es el tercer problema que tengo(soy nuevo en la electrónica) y para no estar creando temas con cada problema pongo todos en este.
Es un reloj en lcd con hora, minuto y segundo(no a tiempo real) y sin usar el timer0.
el problema que tengo ahora es que cada vez que llega a una decima de segundos en vez de poner por ejemplo 10 pone 1A y así con todos.
Adjunto la simulación, el asm y las librerías.
 

Adjuntos

  • RELOJ_LCD.rar
    20.9 KB · Visitas: 12
El problema que tengo ahora es que cada vez que llega a una décima de segundo, en vez de poner, por ejemplo, 10, pone 1A y así con todos.
Para eso eran los ejemplos que subí, para que vieras cómo se deben mostrar los dígitos y no reinventar el hilo negro.
Si quieres usar o no el Timer 0, ya es otra cosa.
 
Una forma (Falta muchas cosas, es solo la idea):

Código:
INCF    Segundos, f        ; Incremento los segundos.
MOVLW    60                ;
XORWF    Segundos, w        ; Preparo para preguntar si ya pasaron los 60 para empezar nuevamente de 0.
BTFSS    STATUS, Z        ; Pregunto...
GOTO    Aun_No            ; Aun no llego a los 60 segundos.
CLRF    Segundos        ; Legue a los 60. Borro el registro para que muestre 0 en vez de 60 y comience nuevamente.
INCF    Minutos, f        ; Como ya pasaron 60 segundos incremento minutos.
...
Rutinas para comprobar cuando se llega a 60 minutos, 24 horas, etc... Ajustando todo de acorde a cada caso.
...

Aun_No:
...
Rutina para mostrar los datos, etc...
...

El problema que tengo ahora es que cada vez que llega a una decima de segundos en vez de poner por ejemplo 10 pone 1A y así con todos.

No revise el código ni nada, pero suena que estas en base hexadecimal. Después de llegar a "10" sigue "A" y al mostrarlo en el display de seguro solo muestra A y el 1 del 10 anterior, osea que A reemplaza al 0 quedando 1A. Revisa que no venga de ahí el problema. Puede que haya alguna función que muestre en decimal, otra en hexadecimal, etc.
 
Para eso eran los ejemplos que subí, para que vieras cómo se deben mostrar los dígitos y no reinventar el hilo negro.
Si quieres usar o no el Timer 0, ya es otra cosa.
Yo pensaba que me decías en la forma de incrementar, y porque lo que estoy viendo esos relojes trabajan con binario, vos que me recomendas, que haga el código con binario o hexadecimal? que es el que estoy haciendo.
Una forma (Falta muchas cosas, es solo la idea):
Si yo maso menos hice ese código, esto es lo que hice hasta ahora:
Código:
START1S ;etiqueta
CALL Retardo_1s ;retarda 1 segundo
INCFSZ SEG1 ;incrementa segundo
BTFSC STATUS,Z ; pregunta si el flag z esta en 0
GOTO START10S,si esta en 1 incrementa las decima de segundo
CALL TIEMPO ;si esta en 0 actualiza en lcd
GOTO START1S ;vuelve a la etiqueta
START10S
INCFSZ SEG2 ;incrementa la decima de segundo
BTFSC STATUS,Z ;pregunta si el flag z esta en 0
GOTO INICIO   ;si esta en 1 reinicia el reloj(esto es temporal)
CALL TIEMPO ;si esta en 0 actualiza el lcd
CALL START ;carga SEG1 con d'246'
GOTO START1S ;vuelve y hace lo mismo
No revise el código ni nada, pero suena que estas en base hexadecimal. Después de llegar a "10" sigue "A" y al mostrarlo en el display de....
Si esta en hexadecimal y por eso cargo los registros con 246 para que solo lo incremente 9 veces y antes de actualizar el lcd le resta 246.Igualmente lo raro es que cuando llega a 59 segundos se restaura normal y aparece 00.
 
Última edición:
Atrás
Arriba