Retardo básico en un PIC

Muy buenos días a todos. Soy nuevo utilizando el lenguaje de ensamblador y tengo como proyecto realizar un retardo para un pic16f84a el cual al encienda un led y espere 1 minuto con 15 segundos encendido, espero y me puedan apoyar con algunos consejos a cerca de como utilizar los ciclos de retardo y como anidar dichos ciclos. Gracias y que tengan un buen día.
 
Hasta el momento llevo esto:

N=33
M=97
P=100

Con estos valores me da un aproximado de 1 segundo.
Código:
LIST p=16f84a

#include <p16f84a.inc>


;*********************************************************************************************************************************


_config_CP_OPP & _WDT_OFF & _PWRTE_ON & _XT_OSC


;****************************************VARIABLES QUE ASIGNA EL DESTINO DONDE SE GUARDA


w EQU 0x00        ; EL RESULTADO SE GUARDA EN W

f EQU 0x01        ;EL RESULTADO SE GUARDA EN EL REGISTRO


;****************************************DECLARACION DE VARIABLES


PORTA    EQU 0x05    ;DECLARACION DEL PUERTO A

PORTB    EQU 0x06    ;DECLARACION DEL PUERTO B

STATUS    EQU 0x03    ;DECLARACION DE ESTADO

RP0        EQU 0x05    ;BIT RP0 DEL REGISTRO STATUS


;*********************************************************************************************************************************


CONTA1 EQU 0x0C        ;REGISTRO UTILIZADO PARA EL RETARDO

CONTA2 EQU 0x0D        ;REGISTRO UTILIZADO PARA EL RETARDO

CONTA3 EQU 0x0E        ;REGISTRO UTILIZADO PARA EL RETARDO


;********************************************************************************************************************************


        ORG        0x000       

        goto    main            ;REGRESA AL INICIO DEL PROGRAMA

        ORG        0x05            ;INICIO DEL PROGRAMA


main    bcf        STATUS,RP0        ;SELECCIONA LA PAGINA 1 DE LA MEMORIA PARA TENER ACCESO AL TRIS

        clrf    TRISB            ;SELECCIONA EL PUERTO B COMO SALIDA

        bcf        STATUS,RP0        ;VUELVE A LA PAGINA 0

        clrf    PORTB            ;APAGA LOS LEDS DEL PUERTO

        clrf    CONTA1            ;LIMPIA LOS REGITROS DEL CONTADOR DEL RETARDO

        clrf    CONTA2            ;LIMPIA LOS REGITROS DEL CONTADOR DEL RETARDO

        clrf    CONTA3            ;LIMPIA LOS REGITROS DEL CONTADOR DEL RETARDO


;*********************************************************************************************************************************


RETARDO

        movlw    P            ;1

        movwf    CONAT3        ;1

CICLO3    movlw    M            ;1

        movwf    CONTA2        ;1

CICLO2    movlw    N            ;1

        movwf    CONTA1        ;1

CICLO    decfsz    CONTA1,f    ;1*(N-1)+1

        goto    CICLO        ;2*(N-1)

        decfsz    CONTA2,f    ;1*(M-1)+1

        goto    CICLO        ;2*(M-1)

        decfsz    CONTA2,f    ;1*(P-1)+1

        goto    CICLO        ;2*(P-1)
 
¿ Y el resto del programa ?

¿ Donde asignas el valor a las letras que usas como constantes P, M, N ?

Además si luego de finalizar un nido llamas siempre a "CICLO", la cuenta ahora empezará desde 0xFF y los cálculos ya no serán correctos.
 
Atrás
Arriba