Siguiendo con nuestros ejemplos en ASM, toco el turno de usar otro microcontrolador, tal cual dice el titulo, hoy tocara usar el oscilador interno, el cual configuraremos a 8MHz, para mostrar el funcionamiento realizamos una pequeña rutina, en el cual cambiamos el estado de un LED cada medio segundos.
Circuito:
El circuito es muy sencillo, simplemente un LED con su debida resistencia conectado el pin RD0 de muestro microcontrolador, no olvidar MCLR a VCC ya sea con un puente o una resistencia de 10K, claro físicamente deben de alimentar el microcontrolador con VCC=5V. En cuanto a la configuración de oscilador, solo debemos revisar el datasheet el cual nos indica claramente la ruta a seguir.
Código:
Código:
El código con la configuración del oscilador y el retardo es el siguiente.
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_005: Led intermitente - Uso del oscilador interno en el PIC16F887 | |
;* | |
;******************************************************************************* | |
;* FileName: main.asm | |
;* Processor: PIC16F887 | |
;* Complier: MPASM v5.77 | |
;* Author: Pedro Sánchez (MrChunckuee) | |
;* Blog: http://mrchunckuee.blogspot.com/ | |
;* Email: mrchunckuee.psr@gmail.com | |
;* Description: LED intermitente en RD0 cada 0.5 segundos, se uso el | |
;* oscilador interno a 8MHz | |
;******************************************************************************* | |
;* Rev. Date Comment | |
;* v0.0.0 15/03/2019 - Creación del firmware | |
;* v0.0.1 06/10/2019 - Correccion de MCU_Init, fisicamente no trabajaba, | |
;* ademas faltaba desabilitar los canales analogicos. | |
;******************************************************************************* | |
;********** C A B E C E R A **************************************************** | |
list p=16f887 ;Identifica el PIC a usar | |
#include <P16F887.INC> ;Cabecera que define los registros del MCU | |
;********** F U S E S ********************************************************** | |
; Bits de configuración del MCU | |
; CONFIG1 | |
__CONFIG _CONFIG1, _FOSC_INTRC_NOCLKOUT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF | |
; CONFIG2 | |
__CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF | |
;********** V A R I A B L E S ************************************************** | |
;Declaracion de constantes | |
ContadorA EQU 0x20 ; Seleccionamos posicion de la RAM y guardamos | |
; ContadorA usado para el retardo | |
; 0x20 es donde inicia la SRAM del PIC | |
ContadorB EQU 0x21 ; Guardamos ContadorB usado para el retardo | |
ContadorC EQU 0x22 ; Guardamos ContadorC usado para el retardo | |
Led EQU 0 ; Definimos RD0 como Led | |
;********** I N I C I O * D E * P R O G R A M A ******************************** | |
ORG 0x00 ; Aqui comienza el micro despues del reset | |
GOTO MCU_Init ; Configuramos el ADC | |
ORG 0x04 ; Origen del programa, para evita vector de interrupcion | |
RETURN | |
;********** C O F I G U R A * M C U ******************************************** | |
MCU_Init | |
BANKSEL ANSEL | |
CLRF ANSEL ;digital I/O | |
BANKSEL OSCCON | |
movlw 0x71 ;Cargo valor a w | |
movwf OSCCON ;Oscilador interno 8MHz --> IRCF<2:0> = 1, CCS = 1 | |
BANKSEL TRISD | |
MOVLW 0x00 | |
MOVWF TRISD ;all PORTD outputs | |
BANKSEL PORTD | |
CLRF PORTD ;Clear PORTD | |
;********** C O D I G O * P R I N C I P A L ************************************ | |
Loop | |
bsf PORTD,Led ; Encendemos Led | |
call Retardo_500ms | |
bcf PORTD,Led ; Apagamos Led | |
call Retardo_500ms | |
goto Loop ; Regresamos para repetir tareas | |
;********** C O D I G O * R E T A R D O S ************************************** | |
; Considerando Fosc=8MHz, ciclo maquina (cm) = 0.5uS | |
; 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 + 4N + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=10 | |
; Time = 5 + 40 + 4000 + 996000 ciclos maquina | |
; Time = 1000045 * 0.5uS = 0.5 segundos | |
Retardo_500ms ; 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 ;Fin del programa |
Resultado:
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.
Bibliografía:
- Microchip, "PIC16F882/883/884/886/887 Data Sheet", http://ww1.microchip.com/downloads/en/devicedoc/41291d.pdf
- Pedro Sanchez (MrChunckuee), "MPLAB X & ASM: Crear retardos - LED Intermitente", https://mrchunckuee.blogspot.com/2015/07/MPASM-002.html
0 Comentarios