Finalizamos en esta publicación la construcción del faro decorativo, mostrando el software del PIC, para encender el faro.
MATERIALES Y HERRAMEINTAS:
- Programador PIC
- Computador para programar (Con software de programación PIC)
- Microcontrolador PIC16F629, Leds(x3) y resistencias de 220 ohm(x3)
- Circuito Impreso
- Cables e interruptor
- Software para pruebas (Opcional)
PRECAUCIÓN: Se requiere tener conocimientos y habilidad en electrónica y programación assembler.
ATENCIÓN: No nos hacemos responsables de los daños personales y/o materiales, causados por una mala manipulación, mal montaje, desconocimiento técnico o del uso indebido de esta guía.
INTRODUCCIÓN:
Tras un largo parón obligado, por fin mostramos el programa usado en el faro de la publicación anterior, para el montaje de una maqueta de un faro con tres luces Led, que van alternando su iluminación, intentando simular la cadencia rotatoria de un faro.
PROCESO:
Antes de nada, se ha de tener claro como queremos que funcione la cadencia de encendido. Con esto estipulado, dibujamos un diagrama de flujo, para determinar cómo poner en práctica el software. Y a partir de este diagrama de flujo, empezamos a redactar el programa.
Una vez tenemos el programa, lo podemos probar y compilar mediante el software de Microchip®, denominado MPLAB. Con este, podemos depurarlo, y una vez terminado, compilarlo, para generar el archivo ASM, que usaremos para grabar el software en el PIC.
Adicionalmente, podemos también usar un software de simulación, (Por ejemplo; PROTEUS), en el que podemos hacer funcionar el hardware y el software, sin montarlo físicamente.
ESQUEMA:
Así es como queda el esquema del circuito. Como se puede comprobar es extremadamente simple, ya que se ha intentado usar el menor numero de componentes posibles.
De hecho, el reloj, que por norma general se suele usar externamente, ya sea Cristal, RC,
etc. se ha optado por el reloj interno, para economizar componentes, y por lo
tanto, diseño del circuito.
Por último, ya podemos grabar el software, tal y como vimos en la entrada PICKIT 2 MICROCHIP® (Clon), y por fin, podemos ponerlo a prueba.
En el siguiente vídeo, os mostramos las pruebas, antes de su construcción definitiva:
Ya solo nos queda montarlo en la maqueta del faro, y comprobar su funcionamiento
real.
Debido a la sencillez del diseño, se ha optado por una placa
estándar sin diseño PCB y reducir al máximo su tamaño.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcChVObdh7pk2NGDp5uZIZ_l_0oVBmaR14eXDRBP3WG6wduFrB3UqB87Qr-nvS7LSvYX4rT2l6p4jX-XW-2ZU8tz07O8mg97svABA0lMnWoWGS2pJDIwKvwBdl8jm1QrhcQZpRl2b_2Fvv9y_MwgJqqDZwrUdNiFTloyLBMUa40RZabCDHK47YZiuMVLQ/s320/20220428_141136.jpg)
SOFTWARE:
Para terminar, os mostramos el listado de software en Assembler, que está instalado el el PIC 16F629. Comprobado y funcionando.
El funcionamiento, como se vio en el diagrama de flujo anterior, es un bucle permanente, secuenciando el encendido de
un led tras otro, usando la propiedad PWM (Pulse Width Modulated, u
Onda Modulada en Anchura, es decir modulación por pulsos), la cual varia el tiempo (ancho) de cada pulso
de encendido del led, dando la sensación de ir encendiéndose y apagándose
progresivamente, ya que el ojo humano, no percibe los pulsos velocidades altas.
En la siguiente imagen, se muestra el principio de como se regula el ancho de pulso, para generar la sensación de encendido/apagado progresivo, o regulación de intensidad de luz de los LED:
Si los tiempos de encendido/apagado, no encajan con los gustos del lector, pueden ser modificados según apetezca.
Por fin, este es el listado:
;*******************************************************************;
; PROGRAMA LIGHTHOUSE.asm FECHA: XX XXXXX 2022 ;
; Programa para generar pulsos PWM para 3 LED de un FARO a escala ;
; Usa los puertos RA0,1 y 2 (Pin 5,6 y 7) ;
; Revisión: 4.0 Programa para PIC16F629 ;
; Velocidad de Reloj: 4Mhz (1Mhz=1us) ;
; WatchDog = OFF Tipo Reloj: INTERNO PIC ;
; Autor: XANUR (XMG) Por: XANUR2001/ ACME 2024 ;
; Compilado en : MPLAB X IDE v2.05 (MICROCHIP) ;
; Probado con PROTEUS Labcenter 7.7 (ISIS Professional) ************;
; ******************************************************************;
; ---------------------------------------------------------------------------------------------------
; Licencia Creative Commons BY-NC-SA (attribution - Non Commercial - Share Alike)
; El proyecto puede ser hecho y modificado por los lectores para uso privado y sin fines comerciales
; Es necesario indicar en posibles publicaciones el autor (XANUR2001 o XANUR.ES)
; ---------------------------------------------------------------------------------------------------
ERRORLEVEL -302
INCLUDE <p12f629> ; Librería del PIC que utilizaremos
LIST P =12F629, r=DEC, n=66
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
; Configuración de Registros para:
; Protección Código=OFF
; Protección Datos=OFF
; Brown-Out Reset=OFF
; Watch Dog=ON
; Power Up Timer=ON
; OSC Reloj Interno=ON
; ---------------------------------------------------------------------------------------------------
; Pines del micro-controlador
; ---------------------------------------------------------------------------------------------------
#define Led1 GPIO,0 ; pin luz Ledfaro1
#define Led2 GPIO,1 ; pin luz Ledfaro2
#define Led3 GPIO,2 ; pin luz Ledfaro3
; ---------------------------------------------------------------------------------------------------
Variables
; ---------------------------------------------------------------------------------------------------
cblock 20H ; Origen ficticio.
Ledfaro1 ; variable intensidad canal luz de Ledfaro1 (blanco)
Ledfaro2 ; variable intensidad canal luz de Ledfaro2 (blanco)
Ledfaro3 ; variable intensidad canal luz de Ledfaro3 (blanco)
TimerReg ; variable usada para la temporización del Ledfaro1 y de la Ledfaro2
RegPwm ; registro que permite la regulación de la intensidad de los canales PWM
DlyTrans ; variable usada para la temporización de las Transiciones
endc
; ---------------------------------------------------------------------------------------------------
; MACRO Cambio página de la RAM del Micro
; ---------------------------------------------------------------------------------------------------
PAG_RAM0 MACRO
bcf STATUS,RP0
ENDM
PAG_RAM1 MACRO
bsf STATUS,RP0
ENDM
; ---------------------------------------------------------------------------------------------------
; MACRO Channel PWM Refresh
; Sirve para crear la modulación PWM que controla la intensidad luminosa.
; Los parámetros de entrada de la macro son:
; CHANREG = registro del canal luminoso (Ledfaro1, Ledfaro2 o Ledfaro3)
; PWMCOUNT: contador que explora el duty cycle (es necesario incrementarlo continuamente entre 0 y 255)
; PORT,PIN: el puerto y el pin de salida del canal (por ejemplo GPIO,0)
; ---------------------------------------------------------------------------------------------------
PwmChRefr MACRO CHANREG,PWMCOUNT,PORT,PIN
movf CHANREG,W
subwf PWMCOUNT,W
btfss STATUS,C
bsf PORT,PIN
btfsc STATUS,C
bcf PORT,PIN
ENDM
; ---------------------------------------------------------------------------------------------------
; Vector de arranque del Micro
; ---------------------------------------------------------------------------------------------------
ORG 0
goto main
ORG 10h
; ---------------------------------------------------------------------------------------------------
; SUBRUTINAS
; ---------------------------------------------------------------------------------------------------
; Rutina de Calibración del oscilador interno
; ---------------------------------------------------------------------------------------------------
CalibrarOsc
Retlw 0x80 ;Ajusta el Oscilador 4MHz (+/-2%)
Return
SetValorRetardo
movlw 0x03 ;valor del bucle para el segundo
movwf DlyTrans ;Ratardo entre Transiciones
return ; Mayor valor, más tiempo entre transiciones
;
SetVariablesCero
clrf Ledfaro1 ;LedFaro1 apagado
clrf Ledfaro2 ;LedFaro2 apagado
clrf Ledfaro3 ;LedFaro1 apagado
clrf RegPwm ;Variable PWM a 0
clrf TimerReg ;Variable TimerReg a 0
return
;
; ---------------------------------------------------------------------------------------------------
; Actualiza los 3 canales luminosos con PWM
; ---------------------------------------------------------------------------------------------------
; usa la macro PwmChRefr
PwmRefresh
PwmChRefr Ledfaro1,RegPwm,Led1
PwmChRefr Ledfaro2,RegPwm,Led2
PwmChRefr Ledfaro3,RegPwm,Led3
retlw 0
; ---------------------------------------------------------------------------------------------------
; MAIN
; ---------------------------------------------------------------------------------------------------
main
bcf INTCON,GIE ; Ningún interruptor global activado
bcf INTCON,PEIE ; Ningún interruptor periférico activado
PAG_RAM0 ; Selecciona el Banco 0 de la RAM
movlw B'00000111' ; Set de los puertos como entradas/salidas
movwf CMCON ; hemos llegado donde empezamos
;
PAG_RAM1 ; Selecciona el Banco 1 de la RAM
movlw 08h ; Set de los puertos como entradas/salidas
movwf GPIO ; Subrutina para hacer el retardo entre los movimientos de bits.
call CalibrarOsc ; Llamada a la rutina para calibrar...
movwf OSCCAL ; ...el oscilador interno
;
bcf STATUS,RP0 ; Volver al Banco 0
clrf GPIO
clrf Ledfaro1 ; registro intensidad Ledfaro1 (luz apagada)
clrf Ledfaro2 ; registro intensidad Ledfaro2 (Luz apagada)
clrf Ledfaro3 ; registro intensidad Ledfaro3 (luz apagada)
call SetValorRetardo; Llamada set valor retardo.
; ----------------------------------------------------------------------------------------------------
; CICLO DE TRABAJO PRINCIPAL (LOOP)
; ----------------------------------------------------------------------------------------------------
Ciclo
;
; ----------------------------------------------------------------------------------------------------
; FADE IN/OUT" LED1
; ----------------------------------------------------------------------------------------------------
; Valores iniciales de los LED´s y PWM
call SetVariablesCero
; "fade in" luz LedFaro1
TransicionLed1Jp1
clrwdt ; Actualiza watchdog para resetear automáticamente. si se bloquea
call PwmRefresh ; Llama la subrutina que actualiza la luces
incfsz RegPwm,f ; 255 veces (genera la onda pwm)
goto TransiccionLed1Jp1
decfsz DlyTrans,f ; Segundo loop para disminuir la velocidad...
goto TransiccionLed1Jp1 ;...entre transiciones
;
call SetValorRetardo ; Llamada set valor retardo
incfsz Ledfaro1,w ; 255 veces (genera la onda pwm)
incf Ledfaro1,f ; Aumenta la luz LedFaro1
incfsz TimerReg,f
goto TransiccionLed1Jp1
call SetValorRetardo ; Llamada set valor retardo
; "Fade Out" Luz Ledfaro1
TransicionLed1Jp2
clrwdt ; Actualiza watchdog para resetear automáticamente. si se bloquea
call PwmRefresh ; Llama la subrutina que actualiza la luces
incfsz RegPwm,f ; 255 veces (genera la onda pwm)
goto TransiccionLed1Jp2
decfsz DlyTrans,f ; Segundo loop para disminuir la velocidad...
goto TransiccionLed1Jp2 ; ...entre transiciones
;
call SetValorRetardo ; Llamada set valor retardo
decf Ledfaro1,f ; Disminuye la Luz Ledfaro1
incfsz TimerReg,f
goto TransicionLed1Jp2
call SetValorRetardo ; Llamada set valor retardo
;
; ----------------------------------------------------------------------------------------------------
; FADE IN/OUT" LED2
; ----------------------------------------------------------------------------------------------------
; Valores iniciales de los LED´s y PWM
call SetVariablesCero
; "fade in" luz LedFaro2
TransicionLed2Jp1
clrwdt ; Actualiza watchdog para resetear automáticamente. si se bloquea
call PwmRefresh ; Llama la subrutina que actualiza la luces
incfsz RegPwm,f ; 255 veces (genera la onda pwm)
goto TransiccionLed2Jp1
decfsz DlyTrans,f ; Segundo loop para disminuir la velocidad...
goto TransiccionLed2Jp1 ;...entre transiciones
;
call SetValorRetardo ; Llamada set valor retardo
incfsz Ledfaro2,w ; 255 veces (genera la onda pwm)
incf Ledfaro2,f ; Aumenta la luz LedFaro2
incfsz TimerReg,f
goto TransiccionLed2Jp1
call SetValorRetardo ; Llamada set valor retardo
; "Fade Out" Luz Ledfaro2
TransicionLed2Jp2
clrwdt ; Actualiza watchdog para resetear automáticamente. si se bloquea
call PwmRefresh ; Llama la subrutina que actualiza la luces
incfsz RegPwm,f ; 255 veces (genera la onda pwm)
goto TransiccionLed2Jp2
decfsz DlyTrans,f ; Segundo loop para disminuir la velocidad...
goto TransiccionLed2Jp2 ; ...entre transiciones
;
call SetValorRetardo ; Llamada set valor retardo
decf Ledfaro2,f ; Disminuye la Luz Ledfaro2
incfsz TimerReg,f
goto TransicionLed2Jp2
call SetValorRetardo ; Llamada set valor retardo
;
; ----------------------------------------------------------------------------------------------------
; FADE IN/OUT" LED3
; ----------------------------------------------------------------------------------------------------
; Valores iniciales de los LED´s y PWM
call SetVariablesCero
; "fade in" luz LedFaro3
TransicionLed3Jp1
clrwdt ; Actualiza watchdog para resetear automáticamente. si se bloquea
call PwmRefresh ; Llama la subrutina que actualiza la luces
incfsz RegPwm,f ; 255 veces (genera la onda pwm)
goto TransiccionLed3Jp1
decfsz DlyTrans,f ; Segundo loop para disminuir la velocidad...
goto TransiccionLed3Jp1 ;...entre transiciones
;
call SetValorRetardo ; Llamada set valor retardo
incfsz Ledfaro3,w ; 255 veces (genera la onda pwm)
incf Ledfaro3,f ; Aumenta la luz LedFaro3
incfsz TimerReg,f
goto TransiccionLed3Jp1
call SetValorRetardo ; Llamada set valor retardo
; "Fade Out" Luz Ledfaro3
TransicionLed3Jp2
clrwdt ; Actualiza watchdog para resetear automáticamente. si se bloquea
call PwmRefresh ; Llama la subrutina que actualiza la luces
incfsz RegPwm,f ; 255 veces (genera la onda pwm)
goto TransiccionLed3Jp2
decfsz DlyTrans,f ; Segundo loop para disminuir la velocidad...
goto TransiccionLed3Jp2 ; ...entre transiciones
;
call SetValorRetardo ; Llamada set valor retardo
decf Ledfaro3,f ; Disminuye la Luz Ledfaro3
incfsz TimerReg,f
goto TransicionLed3Jp2
call SetValorRetardo ; Llamada set valor retardo
;
; Al finalizar la Transición, vuelve a iniciar el ciclo
; ----------------------------------------------------------------------------------------------------
goto Ciclo
;
; ----------------------------------------------------------------------------------------------------
; Servicio de Interrupciones: NO USADO
; ----------------------------------------------------------------------------------------------------
service_int
retfie
;
; ----------------------------------------------------------------------------------------------------
; org 0x3FF
; end ; FIN PROGRAMA
; ----------------------------------------------------------------------------------------------------
IMPORTANTE: Al no poder de disponer de todo el tiempo suficiente, lamentamos comunicar que no podremos atender cuestiones o resolver dudas referentes al funcionamiento del software publicado. ¡Disculpad las molestias!
ENLACES.
Software PICKit2 ® Programmer (y otros recursos en Microchip®) :
https://www.microchip.com/en-us/development-tool/PG164120
Programador JDM del Blog XANUR:
https://blog-xanur.blogspot.com/2022/06/programador-pic-jdm.html
PCB Domésticos de Blog XANUR:
https://blog-xanur.blogspot.com/2022/03/prototipos-pcb-domesticos.html
WinPic800:
http://www.winpic800.com/
IC-PROG:
http://ic-prog.com/
MPLAB:
https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide
PIC 2F629 Data Sheet:
https://ww1.microchip.com/downloads/en/devicedoc/41190c.pdf
© Se permite reproducción total o parcial de este contenido, siempre y cuando se reconozca la fuente de información utilizada y se incluya el enlace a este artículo.
Equipo Xanur©2024.