Realmente la electrónica evoluciona a un ritmo frenético y la verdad es que lo queramos o no, la electrónica del siglo XXI es difícil de entender sin la ayuda de los elementos programables, ocupando sin duda un lugar crucial en este apartado, los microcontroladores, por su gran flexibilidad, bajo precio y altísimas prestaciones, por lo que cada vez mas, dispositivos corrientes (incluso de relativa sencillez), integran en gran parte de su electrónica un microcontrolador o un microprocesador, siendo cada vez mayor la lista de dispositivos y aparatos que utilizan esta tecnología: electrodomésticos, periféricos para ordenadores, teléfonos móviles, etc.
La verdad es que si bien la electrónica en general se ha visto muy mejorada por la simplificación de los componentes necesarios en cualquier proyecto complejo ( piénsese que un microcontrolador integra prácticamente todo lo necesario: CPU, memoria, timers, puertos de E/S, controladores de LCD, etc. ), no lo ha sido así el software requerido para que estos cumplan con el cometido deseado, pues tradicionalmente este se creaba basándose en ensamblador, el cual es un lenguaje muy potente por ser muy cercano a la maquina, si bien como contrapartida, es muy dependiente de esta, y además es de relativa dificultad para todos los aficionados que desean empezar en este mundo y no poseen los conocimientos de programación que se requieren.
Afortunadamente en el mundo de los dispositivos programables recientemente han aparecido nuevos lenguajes más próximos al lenguaje natural (en C o en Basic) que nos pueden ayudar en el desarrollo del software de estos dispositivos: precisamente desde estas líneas intentaremos demostrar la gran sencillez para realizar un proyecto electrónico medianamente complejo basándonos en un simple y barato microcontrolador (en esta ocasión usaremos el PIC16F84A) desde cero usando el sencillísimo lenguaje PIC-BASIC-PRO (en adelante PBP).
A continuación intentaremos transmitir los conocimientos mínimos para que cualquiera que no haya programado ningún PIC, simplemente estudiando las explicaciones siguientes, junto con los ejemplos de porciones del proyecto, pueda iniciarse progresivamente en la comprensión de la programación de estos dispositivos tan potentes, de modo que al final como colofón pueda comprender el programa definitivo, el cual es plenamente funcional, y será encargado de gestionar por completo el proyecto del reloj-temporizador semanal con salida a LCD que se propone.
Tal y como se ha adelantado, el proyecto versara sobre un reloj con display LCD de dos líneas en el que mostraremos información de la hora actual ,el día de la semana y el modo de temporización seleccionado) contando para su control de varios pulsadores ( para ajustes de día de semana, hora y día actual, ajuste de hora de activación y ajuste de modalidad de activación) y dos salidas independientes ( una para la luz de fondo del display y otra para usos varios: buzzer, relé, etc.).
El corazón del circuito tal y como hemos expuesto Serra un PIC16F84 el cual programemos con el código en PBP que más adelante citaremos (aunque la mayoría de las partes de este ya han sido comentadas.
A este conectaremos por un lado los cinco pulsadores, las dos salidas y por otro lado el display LCD.
Respecto a las entradas utilizaremos pulsadores normalmente abiertos conectados a su vez a resistencias de 10k para asegurar que en reposo hay un valor alto.
En cuanto al display, para esta ocasión utilizaremos cualquier LCD de dos líneas compatible con Hitachi 44780, el cual conectaremos al PIC en modo 4 bits (utilizando los 4 bits altos) .El resto de las conexiones del LCD lo haremos según la recomendación de PBP:
Pin 1àgnd
Pin2à+5V
Pin3 à+5v
Pin4(RS) àRA4
Pin5 àN.C.
Pin6(EN) àRB3
Pines7,8,9.10 àN.C.
Pin 11àRA0
Pin 12à RA1
Pin 13à RA2
Pin 14àRA3
Por ultimo, todo el circuito podemos alimentarlo o bien con alimentador filtrado a cuya salida conectaremos un regulador tipo 78L05 y dos condensadores de filtro tanto en la entrada como en la salida de este o bien en su lugar una económica fuente conmutada de 5V ya montada( en cuyo caso no necesitaremos el citado regulador y el circuito será aun más compacto.
El circuito se completa con un diodo de protección a la entrada para evitar cambios de polaridad dado que el circuito lo alimentaremos con un simple alimentador externo reciclado que entregue 5V.
Lista de componentes
R1=47K
R2,R3,R4 ,R5 y R8=10K
R6,R7=470ohm
C1,C2=10Mf/16v
C3,C4=10nF
C5,C6=27pf
Q1=XTAL 4Mhz
U1=78L05
IC1= PIC16F84A
DIS2=display 16 caracteres y 2 lineas (POWERTIP PC1602F)
Varios:
Bloque Diodos leds tricolor( se puede reciclar de una economica lamparita decorativa alimentada con pilas de botón fácilmente localizable en tiendas de decoración) .
S1, S2, S3, S4, S5= pulsadores miniatura normalmente abiertos.
Un zumbador de 5V.
Fuente conmutada de 5v 100mA( por ejemplo se puede recuperar de un cargador de teléfono móvil en desuso).
Caja: usaremos una vieja caja de plástico de disquetes de 3 ½” .
Circuitos Impresos
Dada la sencillez del circuito este circuito puede realizarse muy fácilmente sobre una placa de puntos, o bien sobre una placa de prototipos o si lo desea sobre una simple placa de una cara cuyo diseño se adjunta:
Diseño a doble cara
Dada la extrema sencillez del circuito no se aconseja realizar un circuito impreso de doble cara, pero para el lector que le interese se presenta a continuación junto con las conexiones de este con el resto de componentes.
Conexiones placa doble cara
Conector | FUNCIÓN | CONEXIÓN A |
1 | GND | |
2 | +5V | |
3 | +5V | |
4 | RA0 | PIN 11 LCD |
5 | RA1 | PIN12 LCD |
6 | RA2 | PIN13 LCD |
7 | RA3 | PIN14 LCD |
8 | RA4 | PIN 4 LCD |
9 | RB0 | SALIDA 1 |
10 | RB1 | SALIDA2 |
11 | RB2 | PULSADOR1 |
12 | RB3 | PIN6 LCD |
13 | RB4 | PULSADOR2 |
14 | RB5 | PULSADOR3 |
15 | RB6 | PULSADOR4 |
16 | RB7 | PULSADOR5 |
17 | N.C. | |
18 | N.C. | |
19 | +5V | |
20 | GND |
Pasos para la construcción del prototipo
Paso 1: Compilación del código fuente
El código generado en PBP por si mismo no es apto para ser cargado en el PIC, ya que este solo entiende su propio lenguaje máquina, para lo cual deberemos convertir con un complilador nuestro código escrito en PBP a un código que el micro pueda procesar.
Existe una versión gratuita limitada de PIC Basic Pro en su web oficial http://www.melabs.com/pbpdemo.htm
Como el lector adivinara el entorno del compilador PIC-BASIC-PRO es algo austero (requiere trabajar en línea de comandos y un editor de texto), por lo que por lo general lo normal será usar un entorno de desarrollo Grafico (IDE) donde el editor, grabador, compilador, etc. estén integrados como por ejemplo el MicroCode Studio de la casa Mecanique ,el cual se puede descargar de la siguiente url: http://www.mecanique.co.uk/products/compiler/pbp.html
NOTA: Para aquellos lectores que deseen adquirir directamente el código del proyecto ya compilado y no deseen compilarlos por ellos mismos pueden solicitarlo gratuitamente a: [email protected]
Paso 2: Simulación del código fuente
Con objeto de no estar continuamente programando el PIC, existen simuladores para no tener que realiza ningún prototipo físicamente y de esta manera evaluar el comportamiento global de este antes de estudiar su realización real.
Existen muchos simuladoras, por software (por ejemplo Proteus es el más famoso), pero existe uno especifico para PIC’s: el PIC Simulator de OshonSoft (se puede descargar una versión limitada en http://www.oshonsoft.com/downloads.html )
Suponiendo instalado el software para la simulación del código, realizaremos los siguientes pasos:
- FileàLoad Programà .hex
- ToolsàLCD ModuleàChange LCD Module Color SchemeàLCDtype 2x:2×16,data lines:portA.interface 4 bits Low,RS:A4,E line=B3,r/W:no used
- Tools àMicrocontroller View
- RateàFast
- SimulationàStart
Paso 3: Grabación del PIC
Una vez obtenido el código ensamblado y simulado necesitaremos un simple circuito llamado programador para salvar el .hex en la flash del PIC. Normalmente los programadores más simples están basados en el diseño JDM, siendo el más usual el TE20 ( se puede conseguir fácilmente en http://todoelectronica.com ).
Para poder emplear nuestro grabador, necesitaremos un software grabador que lo permita. Uno de los programas para grabación de PIC’s mas conocidos es el Ic-Prog, el cual se puede descargar gratuitamente de http://www.ic-prog.com/index1.htm
Proceso de Grabación a través del ICPROG con el TE20
Ponemos en marcha en ICPROG 1.06b, si lo iniciamos por primera vez, nos saldrá una pantalla de configuración, si no es el caso, pulsamos la tecla F3 (settingsàHardware), una vez en ella, colocaremos las siguientes opciones:
· Programmer: JDM Programmer
· Ports: Com1 o Com2 dependiendo de donde hallamos colocado el TE20
· I/O Delay: Normalmente, tiene que estar a 5, pero si nos da problemas al programar la eeprom, lo colocaremos en 4.
· Interface: Direct I/O
· Communication: Todas sin activar
Ahora nos vamos a SettingsàOptions, y chequearemos las pestañas:
· I²C: Ambas tienen que estar desactivadas
· Misc: Desactivar la opción de “Enable Vcc control for JDM”
· Programming: Tiene relación con el fuse “CP” (Code Protection) para la protección del PIC tendremos que desactivar ambas casillas, pero si queremos verificar que nuestro PIC o eeprom ha sido bien grabado tendremos que desactivar el fuse “CP” y activaremos cualquiera de la dos casillas, la primera lo verifica al acabar de programar y la segunda mientras programa (se aconseja dejar la primera opción). Si activamos el verificado y el fuse “CP” nos dará el 0000h.
Seguidamente en la parte izquierda de la pantalla seleccionamos los fuses y Oscilator:
FUSES
· “WDT” :Perro Guardián. Cuando el programa entra en un bucle infinito, el WDT se desborda y resetea el PIC
· “PWRT”:Power on Reset. Hasta que el PIC no alcance una tensión de funcionamiento correcta lo mantiene en reset
· “CP”: Code Protection. Protege el código contra lectura.
OSCILATOR
· “LP”:Oscilador de bajo consumo, de frecuencia de 35 a 200Khz.
· “XT”:Oscilador para frecuencias estándar, de 100Khz a 4Mhz
· “HS”:Oscilador de alta velocidad de 4Mhz a 10Mhz (Cristal de Cuarzo) àlo seleccionaremos
· “RC”:Oscilador de bajo coste formado por condensador y resistencia
Finalmente, una vez llegado ha este punto, vamos a comenzar la programación del PIC en nuestro TE20 que debe de estas desenchufado del cable ext. RS232, con las muescas del chip que coincida con las muescas del zócalo de 18 pines. Una vez colocado, enchufamos el TE20 al cable, elegimos el chip (en nuestro caso PIC 16F84) en el menú superior abrimos el archivo compilado (.hex), el oscillator debe de estar en XT y los fuses todos desactivados, el CP lo podemos activar o no, dependiendo de las necesidades.
Ya sólo nos queda cruzar los dedos y darle a Commandà Program all o al icono que tiene un chip con un rayo…
Si tuviéramos algún problema en la grabación del chip bajaríamos la velocidad del puerto donde estuviera enchufado el TE20 a 2400 bits por segundo, pero si persiste el problema consultar en esta URL: https://soloelectronicos.wordpress.com/2008/07/24/como-grabar-un-PIC16fxx-desde-un-portatil-con-el-te20jdm/).
Paso4: Realización del circuito
Como el lector habrá comprobado a lo largo de todos los apartados anteriores, tras el paso de grabación del PIC, ya solo nos queda alimentar este y conexionar todos sus periféricos para que nuestro proyecto cobre vida
En este proyecto, la realización práctica incluye tres partes:
- La placa de control en la que incluiremos los siguientes elementos:
– El circuito del resonador formado por el cristal de cuarzo de 4Mhz y los dos condensadores cerámicos conectados a este .
– La fuente de alimentación de 5voltios 50mA(opcional si o se cuenta con una fuente externa de estas características ), formada por un regulador tipo 75L05(de baja potencia) y lo respectivos condensadores de desacople .
– El zumbador ( que conectaremos a B1).
– Las resistencias de 10K que nos aseguran en valor alto en las entradas asociadas a los pulsadores.
– El microcontrolador programado con el programa descrito.
- La placa del display LCD de dos líneas que se conectara a la placa de control de la siguiente forma:
Pin 1àgnd
Pin2à+5V
Pin3 à+5v
Pin4(RS) àRA4
Pin5 àN.C.
Pin6(EN) àRB3
Pines7,8,9.10 àN.C.
Pin 11àRA0
Pin 12à RA1
Pin 13à RA2
Pin 14àRA3
- La placa de entradas: tal y como se ha descrito en nuestro caso estará constituido por cinco pulsadores normalmente abiertos, los cuales conectaremos directamente a la placa de control a B7, B6, B5, B4, B2, B3 ( recuerde que en esta ya hemos incluido las resistencias de 10K.
Paso 5: Comprobación de resultados
Normalmente si el micro está bien grabado y las conexiones de éste a sus periféricos son correctas el circuito debiera funcionar a la primera sin problemas.
Un buen indicador de funcionamiento es el display LCD, de modo que si este no visualiza nada en su pantalla lo más normal es que sea por de falta de alimentación, en cuyo caso comprobaremos con un polímetro si la tensión de alimentación llega tanto al micro como al LCD.
Si aún llegando alimentación al LCD, en el display de este aparecen solos unos bloques oscuros en las primeras columnas de la primera fila es señal de que o el micro no esta funcionando o las conexiones de este no son correctas, para lo cual comprobaremos en primer lugar que las conexiones del LCD a la placa de control son las correctas: echo esto deberían ya verse caracteres correctos en el LCD.
Si persiste aún el mensaje en el LCD es señal que las conexiones internas son incorrectas por lo que comprobaremos que la resistencia de 47k esta correctamente conectada al pin 6 así como el cristal y los dos condensadores lo están a los pines 15 y 16 del micro.
Una vez el circuito este funcionando ya solo cabe ajustar el reloj interno a la hora actual por lo que en primer lugar ajustaremos el día de semana y la hora actual pulsando sobre el pulsador de días/horas (al pasar 24 horas automáticamente se cambia al día de la semana siguiente hasta llegar al domingo que se vuelve a repetir el ciclo) y después ajustaremos los minutos pulsando directamente sobre el botón de minutos ( al pulsar se va incrementando su valor hasta llegar a 60,momento en el cual vuelve a empezar desde 1.
Seguidamente ajustaremos la hora de alarma pulsando el botón de hora y minutos de la hora de activación de la alarma ( por simplificar el número de pulsadores este ajusta los minutos y también las horas de modo que presionando este se van incrementando los minutos de la hora de activación de modo que si se llega hasta los 60 minutos automáticamente se incrementa el valor de las horas hasta llegar a las 24 h, momento en el que se vuelve a repetir el proceso.
Finalmente elegiremos el modo de activación, presionando sucesivamente el botón de modo , el cual definirá la periodicidad semanal de activación, mostrando los siguientes mensajes en el lcd:
- ‘Off’: desactiva el circuito de temporización.
- ‘Tod’= lo activa para todos los días de la semana.
- ‘Lab’= solo lo activa para los días laborales ( de Lunes a Viernes).
- ‘NoL’ =lo activa para todos los días excepto los Lunes.
- ‘Mañ’ =lo activa puntualmente para el día siguiente.
Para finalizar para desactivar tanto la luz de cortesía como el buzzer pulsaremos simplemente el botón “stop”.
Como detalle de cortesía, como puede verse en el código, pulsando cualquier pulsador se encenderá la luz del display aproximadamente un minuto.
Por ultimo animo desde estas líneas a que el lector experimente con el código en PBP que a continuación se adjunta adoptándolo y personalizando a las necesidades y exigencias particulares que se crean oportunos a nuevos proyectos, pues como habrá podido observar realmente programar un PIC no es tan complicado ¿verdad?
Listado del programa en PBP
‘****************************************************************
‘***********************************************
‘*** PROGRAMADOR SEMANAL CON SALIDA a rele
‘*** Por Carlos Rodríguez Navarro
‘*** [email protected]
‘**** procesador PIC16F84
‘**** 28/octubre/2008
‘
‘ DISPLAY LCD HD 44480
‘RA0,RA1,RA2,RA3=DATOS(PINES 11-14)
‘RB3=ENABLE (PIN 6)
‘RA4=RS (PIN 4)
‘vcc (pin 2)
‘gnd (pin 1)
‘vee(pin 3) a vcc
‘SALIDAS
‘alarma1 portb.0 ‘salida
‘ luz portb.1 ‘salida
‘PULSADORES
‘alarma_boton portb.2 ‘ent
‘solo_hora_boton portb.7 ‘ent
‘hora_boton portb.4 ‘ent
‘prog_boton portb.5 ‘ent
‘periodo_boton portb.6 ‘ent
‘***********************************************
symbol alarma1=portb.0 ‘salida
symbol luz=portb.1 ‘salida
SYMBOL alarma_boton=portb.2 ‘ent
SYMBOL solo_hora_boton=portb.7 ‘ ent
symbol hora_boton=portb.4 ‘ent
symbol prog_boton=portb.5 ‘ent
symbol periodo_boton=portb.6 ‘ent
ticks var byte
hora var byte
horaal VAR BYTE
minuto var byte
minutoal VAR BYTE
segundo var byte
semana VAR BYTE
delay var byte
DESC VAR BYTE
desc1 var byte
lunes var bit
martes var bit
miercoles var bit
jueves var bit
viernes var bit
sabado var bit
domingo VAR Bit
PATTERN VAR BYTE
i var byte
minutoluz var byte
TRISA=0 ‘PORTA COMO SALIDAS ( 0=output,1=input)
TRISB= $f4 ‘116 ‘RB0,RB1,rb3 COMO SALIDAS resto entradas 1110100= 116
‘PONER A CERO HORA,MIN,SEG Y TICLS
HORA=0
horaal=0
MINUTO=0
minutoal=0
SEGUNDO=2
semana= 1
TICKS=0
DESC=0
DESC1=0
Lcdout $fe, 1 ‘ Clear LCD screen
lcdout $FE,2
lcdout «CRN» ‘mensaje de cortesia
pause 10
‘INICIALIZAR VECTOR INTERRUPCOPN
OPTION_REG=$05 ‘timer prescaler es cargado a 64 a traves de option_reg 00000101
ON INTERRUPT GOTO ISR
INTCON=$A0 ‘habilita INTERRUPCIONES POR TMR0
‘BORRAR DISPLAY
LOOP: ‘bucle principal de ejecucion
‘bloque de ajuste minutos,hora, segundos y dia de la semana
IF solo_hora_boton=0 THEN ‘si se pulsa el boton de ajuste
GOSUB RETARDO
IF solo_hora_boton=0 THEN ‘si se pulsa el boton de ajuste
MINUTO=MINUTO+1 ‘se incrementan minutos
gosub minuto60
endif
endif
‘bloque de ajuste minutos,hora, segundos y dia de la semana
IF HORA_boton=0 THEN ‘si se pulsa el boton de ajuste
GOSUB RETARDO
IF HORA_boton=0 THEN ‘si se pulsa el boton de ajuste
minuto=60
‘ hora=hora+1
GOSUB minuto60 ‘HORA24
endif
endif
‘bloque de ajuste hora de alarma
IF PROG_boton=0 THEN ‘si se pulsa el boton de ajuste hora alarmas
GOSUB RETARDO
IF PROG_boton=0 THEN ‘si se pulsa el boton de ajuste hora alarmas
MINUTOAL=MINUTOAL+1 ‘se incrementan minutos
IF MINUTOAL>59 THEN ‘horas
MINUTOAL=0
horaAL=horaAL+1
endif
if horaal>23 then horaal=0
endif
endif
‘bloque ajuste periodicidad de alarma ( 6 modos)
IF periodo_boton=0 THEN ‘si se pulsa el boton de ajuste de semanas
GOSUB RETARDO
IF periodo_boton=0 THEN
DESC=DESC +1
DESC1=DESC
IF DESC=6 THEN
desc=0
DESC1=0
ENDIF
endif
endif
‘bloque apagado de alarma y de la luz
IF alarma_boton=0 THEN ‘si se pulsa el boton de ajuste de semanas
pause 150
IF alarma_boton=0 THEN
desc=desc1 ‘restara modalidad alarmqa
low alarma1 ‘resetea alarma
low luz
endif
endif
‘condicion de alarma
if hora=horaal and minuto=minutoal and segundo=1 and ( semana= lunes*1 or semana=martes*2 or semana=miercoles*3 or semana=jueves*4 or semana=viernes*5 or semana=sabado*6 or semana=domingo *7) then
GOSUB LUZON ‘ enciende luz de fondo
HIGH ALARMA1 ‘activa alarma
desc=5 ‘PINTA EN PANTALLA
ENDIF
‘apaga la luz de fondo al minuto
if minutoluz=minuto then
gosub luz_fondo_off
endif
gosub display
goto loop ‘bucle principal de ejecucion
‘RUTINA DE SERVICIO
DISABLE
ISR:
TICKS=TICKS +1
if ticks<61 THEN SINACTUALIZAR
TICKS=0
SEGUNDO=SEGUNDO+1
IF SEGUNDO=60 THEN
SEGUNDO=0
MINUTO=MINUTO+1
gosub minuto60
ENDIF
SINACTUALIZAR:
INTCON.2=0 ‘ REACTIVA TMR0
RESUME
ENABLE
END
display:
lcdout $FE,2
lcdout dEC2 hora,»:»,DEC2 minuto ,»:»,DEC2 SEGUNDO,» »
LOOKUP semana,[«0″,»L»,»M»,»M»,»J»,»V»,»S»,»D»,»M»] ,pattern
LCDOUT PATTERN
LOOKUP semana,[«F»,»U»,»A»,»I»,»U»,»I»,»A»,»O»,»A»] ,pattern
lcdout pattern
lcdout $FE,2
LcdOut $FE, $C0 ‘Principio segunda linea
lcdout dEC2 horaAL,»:»,DEC2 minutoAL ,» »
select case desc
case 0: LCDOUT «OFF»
gosub borra
case 1: ‘todos los dias
gosub llena
LCDOUT «Tod «‘»LMXJVSD»
case 2: ‘laborales
gosub llena
sabado=0
domingo=0
LCDOUT «Lab»‘ LMXJV »
case 3 : ‘libra lunes
gosub llena
lunes=0
LCDOUT «NoL»
case 4: lcdout «Mañ»
GOSUB BORRA
IF SEMANA=1 then martes=1
if semana=2 then miercoles=1
if semana=3 then jueves=1
if semana=4 then viernes=1
if semana=5 then sabado=1
if semana=6 then domingo=1
if semana=7 then lunes=1
case 5:
lcdout «ON »
end select
return
llena: ‘inicializa a 1 los indicadores semanales
lunes=1
martes=1
miercoles=1
jueves=1
viernes=1
sabado=1
domingo=1
return
borra: ‘inicializa a 0 los indicadores semanales
lunes=0
martes=0
miercoles=0
jueves=0
viernes=0
sabado=0
domingo=0
return
LUZON:
HIGH LUZ ‘activa la luz de fondo guardando el minuto
minutoluz = minuto+1
if minutoluz>60 then minutoluz=1
RETURN
RETARDO: ‘antirebotes de 150ms pulsadores activando tambien la luz de fondo
PAUSE 250
GOSUB LUZON ‘ enciende luz de fondo
RETURN
HORA24: ‘si se incrementan las horas mas de 24h
IF HORA=24 THEN
HORA=0
semana=semana+1
if semana>7 then semana=1
endif
RETURN
minuto60: ‘ si se incrementan los minutos mas de 60
IF MINUTO=60 THEN
MINUTO=0
HORA=HORA+1
GOSUB HORA24
ENDIF
return
luz_fondo_off: ‘apaga luz de fondo
low luz
minutoluz=61
return
PULSA AQUI PARA ACCEDER AL FICHERO HEX—
PROGRAMADOR_SEMANAL_CON_LCD -hex
ATENCION:COPIAR Y PEGAR EL CODIGO AL BLOC DE NOTAS Y LUEGO RENOMBRAR A .HEX
Debe estar conectado para enviar un comentario.