Siguiendo con nuestros ejemplos en ensamblador y el PIC16F84A, toca el turno de hacer retardos por software, para ponerlos en practica haremos que un LED conectado en RB0 cambie su estado cada 1 segundo.
Circuito:
El circuito utilizado es el siguiente y esta muy básico, tenemos lo que ya veníamos manejando anteriormente, un cristal de cuarzo de 4MHz y sus debidos condensadores cerámicos de 22pF para el oscilador (esta configuración se usara constantemente en las siguientes practicas), un botón de Reset como lo recomienda el fabricante y un LED conectado a RB0 con su debida resistencia de 330 Ohms:
Circuito:
El circuito utilizado es el siguiente y esta muy básico, tenemos lo que ya veníamos manejando anteriormente, un cristal de cuarzo de 4MHz y sus debidos condensadores cerámicos de 22pF para el oscilador (esta configuración se usara constantemente en las siguientes practicas), un botón de Reset como lo recomienda el fabricante y un LED conectado a RB0 con su debida resistencia de 330 Ohms:
Código:
A continuación se muestra el firmware, explicado breve mente en cada linea:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;******************************************************************************* | |
;* | |
;* ASM_002: Retardos - LED Intermitente | |
;* | |
;******************************************************************************* | |
;* FileName: main.asm | |
;* Processor: PIC16F84A | |
;* Complier: MPASM v5.55 | |
;* Author: Pedro Sánchez (MrChunckuee) | |
;* Blog: http://mrchunckuee.blogspot.com/ | |
;* Email: mrchunckuee.psr@gmail.com | |
;* Description: Cambiar el estado del LED conectado en RB0 cada 1 segundo | |
;* Oscilador XT=4MHz | |
;******************************************************************************* | |
;* Rev. Date Comment | |
;* v1.00 08/06/2015 Creación del firmware | |
;******************************************************************************* | |
;********** C A B E C E R A **************************************************** | |
list p=16F84A ;Identifica el PIC a usar | |
#include <P16F84A.INC> ;Libreria del PIC | |
;********** F U S E S ********************************************************** | |
; _CP_OFF Se desactiva proteccion de codigo | |
; _WDT_OFF Se desactiva el Watchdog Timer | |
; _PWRTE_ON Se activa el Power-Up Timer | |
; _XT_OSC Se usa oscilador externo XT | |
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC | |
;********** V A R I A B L E S ************************************************** | |
ContadorA EQU 0x0C ; Seleccionamos posicion de la RAM y guardamos | |
; ContadorA usado para el retardo | |
; 0x0C es donde inicia la SRAM del PIC | |
ContadorB EQU 0x0D ; Guardamos ContadorB usado para el retardo | |
ContadorC EQU 0x0E ; Guardamos ContadorC usado para el retardo | |
Led EQU 0 ; Definimos Led como RB0 | |
;********** C O N F I G * P U E R T O S **************************************** | |
RESET org 0x00 ; Aqui comienza el micro despues del reset | |
goto Inicio ; Salto a la etiqueta Inicio | |
org 0x05 ; Origen del codigo de programa | |
Inicio | |
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1 | |
movlw b'11111110' ; Cargamos 11111110 a W | |
movwf TRISB ; Cargamos W en TRISB, RB0 como salida | |
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 | |
bcf PORTB,Led ; Comienza con el LED apagado | |
;********** C O D I G O * P R I N C I P A L ************************************ | |
Bucle | |
bsf PORTB,Led ; Encendemos Led | |
call Retardo_1s | |
bcf PORTB,Led ; Apagamos Led | |
call Retardo_1s | |
goto Bucle ; Regresamos para repetir tareas | |
;********** C O D I G O * R E T A R D O S ************************************** | |
; Considerando Fosc=4MHz, ciclo maquina (cm) = 1uS | |
; Time = 2 + 1 + 1 + N + N + MN + MN + KMN + (K-1)MN + 2MN + 2(K-1)MN + (M-1)N | |
; + 2N + (M-1)2N + (N-1) + 2 + 2(N-1) + 2 | |
; Time = (5 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=10 | |
; Time = 5 + 40 + 4000 + 996000 ciclos maquina | |
; Time = 1000045 uS = 1 segundo | |
Retardo_1s ; 2 ciclo máquina | |
movlw d'10' ; 1 ciclo máquina. Este es el valor de "N" | |
movwf ContadorC ; 1 ciclo máquina. | |
Retardo_BucleExterno2 | |
movlw d'100' ; Nx1 ciclos máquina. Este es el valor de "M". | |
movwf ContadorB ; Nx1 ciclos máquina. | |
Retardo_BucleExterno | |
movlw d'249' ; MxNx1 ciclos máquina. Este es el valor de "K". | |
movwf ContadorA ; MxNx1 ciclos máquina. | |
Retardo_BucleInterno | |
nop ; KxMxNx1 ciclos máquina. | |
decfsz ContadorA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar). | |
goto Retardo_BucleInterno ; (K-1)xMxNx2 ciclos máquina. | |
decfsz ContadorB,F ; (M-1)xNx1 cm (si no salta) + Nx2 cm (al saltar). | |
goto Retardo_BucleExterno ; (M-1)xNx2 ciclos máquina. | |
decfsz ContadorC,F ; (N-1)x1 cm (si no salta) + 2 cm (al saltar). | |
goto Retardo_BucleExterno2 ; (N-1)x2 ciclos máquina. | |
return ; 2 ciclos máquina. | |
end |
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
0 Comentarios