PIC16F887 & Assembler: Configurar oscilador interno - LED Intermitente

 

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:
El código con la configuración del oscilador y el retardo es el siguiente.
;*******************************************************************************
;*
;* 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:
Aquí se puede observar en el osciloscopio la frecuencia de oscilación del pin RD0.


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:

Publicar un comentario

0 Comentarios