¿para qué usas los bits de banderas, y por qué en esas posiciones?
Paraque entiendas eso , el EQU en realidad no es para asignar un nombre a un registro, sino es una igualdad, Si vos haces:
Lo que estas haciendo es simplemente decir que Registro1 es una constante, cuando vos luego escribis
Se traduce en
---------
Mi objetivo fue darle "nombre" a los bits del registro Bandera, Para que se entienda esto seria equivalente:
BTFSS Banderas, Habilitado
BTFSS Banderas, Direccion
BTFSS Banderas, 0
BTFSS Banderas, 1
(Aca cometi un error en el codigo, pero creo que lo vas a poder solucionar solo, ya que no funcionaria como te lo pase)
sé la funcion del btfss, pero no el por qué Banderas y Dirección.
Banderas es un registro en el cual uso 2 bits, para determinar el flujo del programa, la direccion del contador si incrementa o decrementa y si esta habilitado el contador para que incremente o decremente..
Y por ultimo el XORLW y ANDLW. Y con cantidad de interrupciones a qué te referís?, cuántos tipos tengo habilitado?
Las interrupciones estan realizadas para el TMR0, como explique vos necesitas 1 segundo entre cuentas (incremento o decremento del display), el mayor problema es que el TMR0 es de 8 bits y usando incluso el preescaler de 1:256 nunca lograrias llegar al segundo.Por ejemplo si usas un cristal de 4Mhz y cargando al TMR0 el valor 60, tendrias una interrupcion cada 0.050176 s, es decir deberias contar 20 interrupciones y recien ahi es que paso 1 segundo. Es recien ahi cuando vas a incrementar o decrementartu display.
Con el XORLW lo que hago es ver si ya pasaron la cantidad de interrupciones, podes pensarlo como una "igualdad".
El unico ANDLW es cuando llamas la tabla y es una proteccion, suponete que existe un problema y en ves de existir un numero de 0 a F en W al momento de llamar la tabla, queda un numero asi: 0x42 , esto significaria que saltaria a otro lugar donde no esta previsto.
Para protegerme de eso, antes de llamar lo que hago es "recortar" el numero que tengo en W, siguiendo el ejemplo
0x42 = 0100 0010
0x0F = 0000 1111
------------------------------
AND = 0000 0010
Es decir lo que tiene el 1 queda como esta y lo que tiene el 0 queda en 0.
aunque también tengo dudas con el Salir_int, es necesario?
El mayor problema de una interrupcion cuando tenes codigo en el loop principal es que W y STATUS se comparten, Si estas en el loop principal y tenes:
MOVLW 0x10
ADDWF Registro,F
Pero si la interrupcion ocurre luego del MOVLW (ya que no tenes control de CUANDO va a ocurrir la interrupcion) puede ocurrir problemas si es que no guardas W y STATUS, Suponete esto, tenes en Registro elvalor 0x20, por lo tanto el resultado de esas instrucciones te deberia dar 0x30, Si ocurre lo anterior entra a la interrupcion vos NO guardas W, modificas el valor del mismo y cuando salis (retfie) queda con el valor W = 0x04, ocurre que el resultado del ADDWF seria 0x24. cambiando el funcionamiento del programa. STATUS ocurre lo mismo, solo pensa que en ves de tener un ADDWF tenes un BTFSS y si seguis la logica tenes el mismo problema.
Ahora el Salir_int, no es un RETFIE solo, sino que tenes que agregarle el codigo (que se encuentra en el datasheet) que reestablece el valor guardado al entrar en la interrupcion de W y STATUS. Como siempre al entrar a la interrupcion GUARDAS W y STATUS, al salir SIEMPRE deberias reestablecerlo, por eso no encontras RETFIE solos, sino que para salir de la interrupcion van a un GOTO Salir_Int, donde estaria ese codigo de reestablecer.
En resumen el programa que propongo es:
Loop principal: revisa el boton y si se detecta, activa/desactiva un bit (bandera, el habilitado) nada mas
Interrupcion:
Revisa que esta habilitado el contador, sino no cuenta (interrupciones) y se queda mostrando siempre lo mismo.
Al momento de estar habilitado, deja pasar el flujo de programa y empieza a contar, cuando se cuenta y se llega al segundo pasa a la otra parte del programa, muestra el digito, y pregunta por si estaba incrementando o decrementando, si incrementa , lo hace y revisa que el resultado este dentro del 0 a 15 ( 0x0 a 0xF) si se paso, es decir queda con 0x10, deberia dejar el valor a mostrar en la proxma entrada como 0xF y ademas cambia el estado del bit de la direccion, asi ahora en ves de incrementar, decrementa.Lo mismo ocurre cuando se decrementa, cuando llega a 0x00 si restas 1 pasa a 0xFF, si detecta eso, pone el numero a 0x00 y pasa la direccion a incrementar.
Lo que verias es:
Display : Va de 0 a F luego de F a 0, y se repite.
En caso de presionar el boton y soltarlo, deja de contar interrupciones, con lo cual jamas va a pasar el segundo, ya que nunca va a llegar al numero de interrupcion ( por que no se cuenta mas_), si presionas de vuelta, dejas que pase y cuente de nuevo, volviendo a funcionar como debe.
Espero que lo entiendas ahora, hay errores seguro, por que lo hice en un bloc de notas mientras comia, y esto lo escribo desde el trabajo
