26 jul 2024

MAQUETA FARO (y II)

 

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) 
DIFICULTADAlta(8/10).

PRECAUCIÓNSe 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.


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:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
;*******************************************************************;
; 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


Esperamos que os haya gustado esta publicación. Si es así, no dudes en compartirla.

© 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.