Hola! Saludos a todos los que lean este hilo.
En mi anterior post, dije de presentar un listado del código en ASM de un retardo que es
lo que que se postulaba en su momento (hace algunos meses), por lo tanto voy a cumplir
con lo dicho y sin más, este es el código que propongo:
; Produce un retardo por un tiempo controlado, Xtal de 4 MHz.
; Se requieren unos registros para guardar el valor del retardo en milisegundos
; El valor Alto en 1Ah y el valor Bajo 1B
; Para observar los resultados encendemos un LED y despues del retardo lo apagamos
;
LIST P=PIC16F84
#INCLUDE <P16F84.INC> ;Inclusion de fichero de etiquetas
__CONFIG h'3FF7' ; __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC
errorlevel -302 ; Elimina avisos
;Definicion de equ (igualdades)
PCL equ 0x02 ;Contador de programa
STATUS equ 0x03 ;Registro del estado Aritmético de la ALU
PORTA equ 0x05 ;Puerto A
PORTB equ 0x06 ;Puerto B
OPTION_REG equ 0x81 ;Registro de Configuración multiple
TRISA equ 0x85 ;Registro de configuración del Puerto A
TRISB equ 0x86 ;Registro de configuración del Puerto B
INTCON equ 0x0B ;Registro para el control de Interrupciones
reg0 equ 0x20 ; 19h
reg1 equ 0x21 ; 1A
reg2 equ 0x22 ; 1B
reg3 equ 0x23 ; 1C
reg4 equ 0x24 ; 1D
#define BANK1 bsf STATUS,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf STATUS,5 ;Macro para abreviar el BANCO 0
Org 0 ;Posición 0 de la Memoria de Programa (apuntador)
goto INICIO ;Va a la etiqueta INICIO
;*****************************************************************************
; EN ESTA PARTE DEL PROGRAMA SE ATIENDE LA INTERRUPCION
;QUE EN NUESTRO CASO ES POR FLANCO DE BAJADA EN EL PIN RB0/INT
;*****************************************************************************
Org 4 ;Vector de Interrupción, cuando sucede la interrupción
Inicio: BSF 03,5 ;Ir a page1 para ajustar los puertos
MOVLW 00h ;Cargar 00 en W
MOVWF 05h ;Hacer salida todas las líneas RA
MOVWF 06h ;Hacer salida todas las líneas RB
BCF 03,5 ;Ir a Page0 para seguir programa
CLRF PORTB ; ponemos a 0 portb
MOVLW .1 ; enciende el LED
MOVWF PORTB ;
BCF STATUS,C ; Asegura que ingrese un 0 en PORTB,7
COMF PORTB,1
CALL pausa ; salta a retardo
GOTO $-2 ; va a inicio
; Cargamos los registros 1A y 1B
pausa MOVLW 00 ; cargamos con 00
MOVWF 1Ah ; el archivo 1Ah, geg1
MOVLW 02 ; cargamos con 2
MOVWF 1Bh ; el archivo 1Bh, reg2
CALL Pausa_mS ; Saltamos a la subrutina de tiempo
CALL led ;saltamos a LED para que avise.
; Hemos cargado en 1Ah y 1Bh los valores de los milisegundos que queremos
; en este caso 00 + 02 = 2 mS. Para 15 mS, sería: en 1Ah = 0A y en 1Bh = 05
; Empieza rutina de retardo.
Pausa_mS
MOVF 1B,0 ;Move 1B to W , reg2
MOVWF 19h ;Move W to 19h reg0
Lazo1 MOVLW F8 ;Put 248 cycles in W
MOVWF 1C ;Put 248 into 1C , reg3
Lazo2 MOVLW 0B ;Put 11 cycles in W
MOVWF 1D ;Put 11 into 1D , reg4
Lazo3 DECFSZ 1D,1 ; reg4
GOTO Lazo3
DECFSZ 1C,1 ; reg3
GOTO Lazo2
DECFSZ 19h,1 ; reg0
GOTO Lazo1
INCF 1A,1 ; reg1
DECFSZ 1A,1 ; reg1
GOTO Lazo4
RETURN ;Return to Main etc
Lazo4 MOVLW 64h ;Put 100 loops into W
MOVWF 1B ;Load 1B with 100 reg2
Lazo5 MOVLW F8 ;Put 248 cycles in W
MOVWF 1C ;Put 248 into 1C reg3
Lazo6 MOVLW 0B ;Put 11 cycles in W
MOVWF 1D ;Put 11 into 1D reg4
Lazo7 DECFSZ 1D,1 ; reg4
GOTO Lazo7
DECFSZ 1C,1 ; reg3
GOTO Lazo6
DECFSZ 1B,1 ; reg2
GOTO Lazo5
DECFSZ 1A,1 ; reg1
GOTO Lazo4
RETURN ;Return a Principal etc
END
Es un poco largo, sin duda, sin embargo espero que le sirva a mucha gente que anda buscando
una forma sencilla de hacer un retardo de un número de milisegundos muy concreto. Por este
motivo lo muestro en este hilo.
Saludos de Vicente.