Hola a todos.
Antes de nada, quería agradecerles por toda la información que aquí he venido leyendo desde hace muchísimo tiempo y debo decir que además los tutoriales que he encontrado aquí en assembler han sido muchísimo más fáciles de entender que cualquiera que haya visto en cualquier otro sitio, incluido el libro que me compré y que también gozaba de buena fama.
Después de mucho tiempo he decidido empezar activamente a intentar programar algo por mí mismo pero ya me he topado con problemas.
El ejemplo es para hacer parpadear un led en el puerto A del 16F84A.
Si programo el pic con este programa tal cual está, no hay problema y funciona perfecto. Pero decidí experimentar con los retardos generados por el programita PicDelay y ahí empezaron los problemas porque nunca se apagaba.
Así que decidí hacer algo más sencillo que era encender el led, esperar un tiempo y luego apagarlo y que se quedara apagado. Pero nunca se apaga y siempre está encendido.
Quisiera que me echaran una mano a ver dónde puedo estar fallando.
Muchas grancias de antemano por su tiempo.
Primero les pongo el programa original que hace que el led parpadee:
;*****Establecimiento constantes ****
STATUS equ 03h ; Dirección del registro STATUS
TRISA equ 85h ; Dirección del registro triestado para el Puerto A.
PORTA equ 05h ; Dirección del Puerto A.
CONTADOR1 equ 08h ; Primer contador para nuestros bucles de retardo.
CONTADOR2 equ 09h ; Segundo contador para nuestros bucles de retardo.
;;****Configuración del Puerto****
bsf STATUS,5 ; Cambiamos al banco 1Switch to Bank 1
movlw 00h ; Ponemos los pines del puerto A ...
movwf TRISA ; ...como salidas.
bcf STATUS,5 ; Volvemos al Banco 0.
;;****Encendido del LED ****
Inicio movlw 02h ; Encendemos el LED poniendo primero el valor...
movwf PORTA ; ... en el registro w y después al puerto;
;****Inicio del buble de retardo 1****
Bucle1 decfsz CONTADOR1,1 ; Restamos 1 a 255.
goto Bucle1 ; Si CONTADOR es cero, continuamos.
decfsz CONTADOR2,1 ; Restamos 1 a 255
goto Bucle1 ; Volvemos al inicio de nuestro bucle
; Este retardo cuenta hacia atrás ...
; ...desde 255 a 0, 255 veces.
;;****Retardo terminado, ahora apagamos el LED ****
movlw 00h ; Apaga el LED poniendo primero el valor ...
movwf PORTA ; ... en el registro w y después al puerto
;;****Añadimos otro retardo****
Bucle2 decfsz CONTADOR1,1 ; Este segundo bucle mantiene el LED...
goto Bucle2 ; ...apagado el tiempo suficiente...
decfsz CONTADOR2,1 ; ...para que lo veamos
goto Bucle2 ; ;;****Ahora volvemos al inicio del programa
goto Inicio ; Vuelve al principio y enciende el LED...
; ...de nuevo.
;****Termina el Programa****
end ; Algunos compiladores necesitan esta instrucción.
; y también por si acaso olvidamos poner...
; ... la instrucción 'goto'.
===========
Como les digo, este programa anterior funciona perfecto pero si ahora lo único que quiero es que se encienda, cuente un tiempo y al apagarse se quede apagado no soy capaz de hacerlo funcionar. Siempre se queda encendido.
Como verán, la única diferencia con el otro, es que cuando acaba de contar el tiempo de encendido, directamente le pongo "end" y el resto del contador de apagado lo dejo comentado con " ; ". A ver qué les parece:
;*****Establecimiento constantes ****
STATUS equ 03h ; Dirección del registro STATUS
TRISA equ 85h ; Dirección del registro triestado para el Puerto A.
PORTA equ 05h ; Dirección del Puerto A.
CONTADOR1 equ 08h ; Primer contador para nuestros bucles de retardo.
CONTADOR2 equ 09h ; Segundo contador para nuestros bucles de retardo.
;;****Configuración del Puerto****
bsf STATUS,5 ; Cambiamos al banco 1Switch to Bank 1
movlw 00h ; Ponemos los pines del puerto A ...
movwf TRISA ; ...como salidas.
bcf STATUS,5 ; Volvemos al Banco 0.
;;****Encendido del LED ****
Inicio movlw 02h ; Encendemos el LED poniendo primero el valor...
movwf PORTA ; ... en el registro w y después al puerto;
;****Inicio del buble de retardo 1****
Bucle1 decfsz CONTADOR1,1 ; Restamos 1 a 255.
goto Bucle1 ; Si CONTADOR es cero, continuamos.
decfsz CONTADOR2,1 ; Restamos 1 a 255
goto Bucle1 ; Volvemos al inicio de nuestro bucle
; Este retardo cuenta hacia atrás ...
; ...desde 255 a 0, 255 veces.
;;****Retardo terminado, ahora apagamos el LED ****
movlw 00h ; Apaga el LED poniendo primero el valor ...
movwf PORTA ; ... en el registro w y después al puerto
end
;;****Añadimos otro retardo****
;Bucle2 decfsz CONTADOR1,1 ; Este segundo bucle mantiene el LED...
;goto Bucle2 ; ...apagado el tiempo suficiente...
;decfsz CONTADOR2,1 ; ...para que lo veamos
;goto Bucle2 ; ;;****Ahora volvemos al inicio del programa
;goto Inicio ; Vuelve al principio y enciende el LED...
; ...de nuevo.
;****Termina el Programa****
;end ; Algunos compiladores necesitan esta instrucción.
; y también por si acaso olvidamos poner...
; ... la instrucción 'goto'.