11. Prólogo
Emprender el estudio de microcontroladores para el desarrollo de proyectos
electrónicos que sean la base para nuevas ideas es el objetivo primordial de
esta primera edición, en la cual nos hemos concentrado en dar al lector
algunas herramientas fundamentales con las cuales esperamos abrir un
campo de conocimiento en la electrónica de control, a través de un sin
numero de posibilidades de diseño a partir de una serie de ejemplos prácticos
desarrollados en lenguaje Basic para Microcontroladores PIC.
De toda la gama de posibilidades entre las familias de microcontroladores PIC
que ofrece Microchip Inc., hemos elegido para empezar el microcontrolador
más popular de toda la serie, el PIC16F84, que será utilizado en este libro
para estudiar algunas de sus características a través del desarrollo de
actividades que en principio no requieren un nivel de conocimiento elevado y
a través del cual daremos los pasos necesarios para adentrarnos en las
gamas mas altas, de las que se ha seleccionado el microcontrolador
PIC16F877 para la realización de proyectos electrónicos de nivel medio y
avanzado, y en los que podremos manejar dispositivos periféricos que le dan
un gran valor agregado a cada uno de nuestros proyectos y abren
posibilidades de desarrollo muy interesantes al lector.
Además, hemos considerado proporcionar la información adecuada referente
a las herramientas de desarrollo más importantes en la actualidad, para
programación en lenguaje Basic para microcontroladores PIC. En esta
ocasión iniciamos con el estudio del compilador PicBasic Pro, de la empresa
microEngineering Labs, Inc., la cual ofrece una de las herramientas mas
populares en el área, debido a que cuenta con una gran variedad de
instrucciones que hacen de la programación de microcontroladores una tarea
fácil y muy productiva a la hora de desarrollar proyectos que involucren
periféricos como pantallas LCD, teclados matriciales, sensores de
temperatura, presión, gas, humedad, memorias de datos entre otros, y donde
una de las características más relevantes es el considerable ahorro de
tiempo, lo que se traduce en efectividad y menos líneas de programa, de tal
12. manera que el diseñador puede prestar mayor atención a los detalles,
logrando así perfeccionar su desempeño en cualquiera de las funciones que
desee programar.
Otra de las herramientas que hemos decidido incorporar a la obra, es el
programador de microcontroladores PIC P16Pro/PicAll, de la página oficial de
PicallW, de Boban Dobaj, Diseñador. Este programador soporta una gran
cantidad de modelos de las series 12, 16 y 18 de Microchip. Su construcción
es sumamente sencilla y de muy bajo costo, además de una serie de ventajas
entre las cuales podemos mencionar la alta velocidad de transferencia de
datos hacia el dispositivo al momento de ser grabado.
Cada capítulo contiene teoría sobre la cual se pretende estudiar el
funcionamiento de los microcontroladores y periféricos conectados a él. Para
ello hemos desarrollado una serie de prácticas en las que el lector deberá
hacer montajes de circuitos en base a los diagramas esquemáticos siguiendo
las instrucciones y leyendo detenidamente los comentarios de cada línea de
programa.
Esperamos con esto proporcionar al lector una base sólida de conocimientos
para el desarrollo de proyectos electrónicos, proyectos de robótica y todo
aquello que represente una innovación científica en este campo.
Finalmente, el agradecimiento para todos nuestros colaboradores en la
edición de esta publicación, quienes se han encargado de revisar cada
detalle, proyectos e ideas plasmadas en cada capitulo.
Ingeniero en Información, Maria del Carmen Lara T.
Ingeniero en Electrónica, Jesús Frank Phorlakis.
Técnico Superior en Electricidad, Raúl Mastropasqua.
2
13. Herramientas de Diseño Capitulo I
En la elaboración de proyectos electrónicos con microcontroladores PIC,
resulta muy importante considerar una serie de herramientas, las cuales
vamos a describir a continuación:
Software: para la programación en Lenguaje Basic, contamos con una gran
variedad de posibilidades en el mercado, y entre las cuales hemos elegido
para esta primera edición, el Ambiente Integrado de Desarrollo Microcode
Studio (IDE) de microEngineering Labs, Inc., además del compilador Basic,
PICBasic Compiler, o PICBasic Pro Compiler. Con estas dos herramientas
estaremos realizando la programación en cada uno de los proyectos
propuestos a partir del capítulo V.
Figura 1.1.
(Fuente: http://www.microengineeringlabs.com)
3
14. • Programador de Microcontroladores PIC: es una herramienta
indispensable con la cual podemos grabar el código generado por el
compilador PicBasic para poner en funcionamiento cada uno de los
proyectos propuestos en cada capítulo. Existen en internet una gran
cantidad de modelos de programadores para microcontroladores PIC,
de muy bajo costo y fácil construcción. Consideramos una buena
experiencia realizar el montaje de cualquiera de estos diseños, aunque
en esta oportunidad nuestra recomendación es el programador
P16Pro/Picallw. Los detalles para la construcción de este programador
están contenidos en el apéndice A.
Figura 1.2.
4
15. • Placa de prototipos: proporciona al diseñador conexiones sin
soldaduras, con lo cual se hace más práctico el desarrollo de los
proyectos electrónicos propuestos a lo largo de cada capítulo.
Figura 1.3.
• Multímetro digital: este instrumento de medición será muy útil durante
la elaboración de los circuitos propuetos en cada capítulo.
Figura 1.4.
5
16. • Fuente de poder regulada con salida de voltaje variable. En el capítulo
III se propone la construcción de una fuente de poder regulada a 5 Vdc
y 3.3 Vdc.
Figura 1.5.
• Herramientas de corte, extractor de circuitos integrados, cable rígido
para conexiones en la placa de prototipos.
Figura 1.6.
6
17. • Osciloscopio: este instrumento se requiere para el desarrollo de
algunas prácticas en las cuales se hace necesario medir las señales
generadas desde el microcontrolador.
Figura 1.7.
• Componentes electrónicos: microcontroladores PIC en los modelos
definidos en cada ejemplo práctico, resistencias, diodos, servomotores,
condensadores, cristales y otros componentes de fácil adquisición.
Cada proyecto cuenta con una tabla en la cual se decriben los
componentes electrónicos que deberán ser utilizados en el cada
montaje.
Figura 1.7.
7
18. Microcode Studio Capitulo II
Microcode Studio (IDE), es un Ambiente Integrado de Desarrollo de
MECANIQUE, diseñado especialmente para microEngineering Labs, Inc.,
de libre adquisición a través de la página Web
http://www.microengineeringlabs.com
Figura 2.1.
(Fuente: http://www.microengineeringlabs.com)
Descargar este programa es muy sencillo y esto lo podemos hacer
ingresando a la siguiente dirección:
http://www.microengineeringlabs.com/resources/win_ide.htm
En esta página se puede encontrar una sección destinada para la descarga
del archivo instalador, como se observa en la figura 2.2:
8
19. Figura 2.2.
(Fuente: http://www.microengineeringlabs.com)
Además de esta herramienta, es necesario adquirir el compilador PicBasic,
(Figura 2.3). Se puede acceder directamente a la página de productos de
microEngineering Labs a través de la dirección:
http://www.melabs.com/products/index.htm
Figura 2.3.
(Fuente: http://www.microengineeringlabs.com)
Es posible descargar una versión DEMO del compilador PIC Basic, con la
cual se pueden compilar programas con un máximo de 31 líneas de código, a
través de la dirección: http://www.melabs.com/pbpdemo.htm
9
20. Haga clic en el Link aquí
señalado, para descargar la
versión Demo de PicBasic.
Pro
Figura 2.4.
(Fuente: http://www.melabs.com)
Para empezar la descarga del archivo de instalación del compilador, solo hay
que hacer clic en el link señalado en la figura 2.4, e indicar la ruta en la cual
se desea que el archivo de instalación sea almacenado.
Nota Importante: Es necesario adquirir una de las versiones completas del
compilador Basic, para no tener límites en la cantidad de líneas del programa
a compilar.
En la figura 2.5 se puede observar el archivo descargado para la versión
disponible del software Microcode Studio, y en la figura 2.6 se puede observar
el archivo del compilador PicBasic Pro en su versión de prueba.
Figura 2.5. Figura 2.6.
10
21. El proceso de instalación es muy sencillo. El primer paso será ejecutar el
archivo mcsinstall.exe, el cual es el responsable de iniciar el proceso de
instalación de Microcode Studio:
Figura 2.7.
Seguidamente Microcode Studio le da la bienvenida en la ventana que se
muestra a continuación:
Figura 2.8.
11
22. Haga clic en el botón “Next” y podrá ver en la siguiente ventana el acuerdo de
licencia para Microcode Studio:
Figura 2.9.
La ruta por defecto para la instalación de Microcode Studio es C:Archivos de
programaMecaniqueMCS. Esta ruta puede ser cambiada haciendo clic en el
botón “Browse”, a través del cual se podrá ubicar la nueva carpeta en la cual
deberá ser instalado el software:
Nombre de la carpeta en la cual se
encontrará el archivo ejecutable de
Microcode Studio.
Figura 2.10.
12
23. Pulse “Next” para iniciar la copia de archivos (figura 2.11), y finalmente espere
que se complete la instalación (figura 2.12).
Figura 2.11.
Figura 2.12.
13
24. Una vez instalado Microcode Studio, es importante tomar en cuenta que antes
de iniciar este software, es necesario instalar el compilador Basic, el cual es
indispensable para la generación del código que será cargado en el
microcontrolador PIC.
Instalación del compilador PicBasic Pro:
Para dar inicio a la instalación del compilador Pic Basic, será necesario
ejecutar el archivo denominado “pbpdemo.exe” para el caso de la versión de
demostración. La figura 2.13 muestra la ventana de inicio del proceso de
instalación, en la cual se da la bienvenida al usuario y le invita a cerrar
cualquier otra aplicación que se encuentre en uso en ese momento.
Figura 2.13.
En la siguiente ventana se debe especificar la unidad de disco duro en la cual
se instalará el compilador y el nombre de la carpeta que va a contener los
archivos a ser instalados. El software de instalación del compilador establece
por defecto la ruta indicada en la figura 2.14.
14
25. Figura 2.14.
Seguidamente se debe especificar el nombre de la carpeta que va a contener
los accesos directos a los archivos que ofrecen información adicional acerca
del compilador PicBasic. Este paso puede ser omitido seleccionando la opción
“Don’t create a Start Menu Folder”:
Figura 2.15.
15
26. Una vez seleccionadas las rutas de instalación del compilador, se debe hacer
clic en el botón “Install” (figura 2.16), para dar inicio a la copia de archivos.
Figura 2.16.
Figura 2.17.
16
27. Figura 2.18.
Finalmente se puede ver en la ventana de la figura 2.18, un mensaje en el
cual se confirma que el compilador PICBasic Pro ha sido instalado
satisfactoriamente. Deshabilite la opción “Install Microcode Studio IDE” y
seguidamente haga clic en el botón “Finish”.
Nota: Puede descargar la documentación completa del compilador PicBasic a
través de la dirección: http://www.melabs.com/support/index.htm
17
28. Integración de Microcode Studio y Pic Basic Pro:
Es importante integrar Microcode Studio con el compilador PicBasic Pro,
indicando la ruta en la cual se encuentra instalado. Para esto debemos iniciar
el software y seguir las siguientes instrucciones:
1. Desde el menú de Inicio de Windows ejecute “Microcode Studio”.
Figura 2.19.
2. Haga clic en el menú “View” y seleccione la opción “Compile and
Program Options”.
Figura 2.20.
18
29. 3. En la pestaña “Compiler” haga clic en el botón “Find Automatically”
para una ubicación automática del compilador, o si lo prefiere haga clic
en “Find Manually” para ubicar el compilador manualmente.
Figura 2.21.
4. En la pestaña “Programmer” se pide la ubicación del software del
programador que estaremos utilizando para grabar los
microcontroladores.
Figura 2.22.
19
30. Se debe ubicar en la lista el programador “PICALL Programmer”, haciendo
clic en el botón denominado “Add New Programmer” (Figura 2.22), y
seguidamente se debe seleccionar de la lista de opciones, como se puede
observar en la figura 2.23:
Figura 2.23.
Por último, al hacer clic en el botón “Next”, el software realizará la búsqueda
automática de la carpeta que contiene el archivo ejecutable del programador
Picall, el cual ha debido ser instalado según el procedimiento descrito en el
Apéndice A.
20
31. Microcontroladores PIC Capitulo III
3.1. Que es un PIC?
Los PIC son una familia de microcontroladores desarrollados y fabricados por
la empresa Microchip Technologies Inc., los cuales cuentan con una
tecnología tipo RISC (Reduced Instruction Set Computer) y poseen en su
arquitectura interna características especiales que varían según el modelo de
PIC que deseamos utilizar.
Podríamos decir que estos dispositivos se asemejan a una computadora pero
de tamaño muy reducido, ya que cuentan con casi los mismos recursos que
éstas, es decir, poseen memoria de programa, memoria RAM, memoria de
datos, puertos de entrada o salida, temporizadores y en algunos casos
cuentan con recursos adicionales como convertidores A/D, comparadores,
USART (Universal Synchronous/Asynchronous Receiver/Transmitter),
comunicación serie I2C, entre otros.
Con todas estas características es lógico pensar que este dispositivo pasa a
ser el corazón del circuito a ser controlado. Esto significa que el
microcontrolador es el encargado de dirigir todos los procesos de un circuito
electrónico, en base a las instrucciones de programa o rutinas que definen
funciones específicas de control, donde las mismas serán realizadas en
lenguaje Basic para microcontroladores PIC. Es por esta razón que
consideramos muy importante estudiar la arquitectura interna del
microcontrolador que se desea programar y aunque esta tarea pueda parecer
difícil, el Lenguaje Basic para microcontroladores PIC la hace sumamente
sencilla.
El diseño de programas para microcontroladores PIC va acompañado
normalmente con un previo estudio del diseño del hardware que hará que
nuestros proyectos se pongan en marcha. Es decir, resulta absolutamente
necesario saber cual será la función específica de cada pin; por ejemplo, en el
caso de los puertos I/O (IN/OUT) a ser utilizados en el microcontrolador, es
importante definir sus funciones antes de empezar a programar, ya que éstos
pueden ser configurados a conveniencia como entrada o como salida de
datos de forma independiente. También podemos destinar un puerto completo
21
32. del microcontrolador para el control de dispositivos periféricos como pantallas
LCD, teclados, motores paso a paso, leds, servomotores entre otros. De ahí la
importancia de establecer cual será la función de cada puerto del
microcontrolador PIC elegido para nuestros proyectos.
Otra decisión importante será elegir convenientemente el modelo de
microcontrolador a ser utilizado, ya que hay una gran gama de modelos que
pueden ser adaptados a necesidades específicas de diseño.
Figura 3.1.
Los microcontroladores PIC comúnmente más utilizados son los siguientes:
• PIC12C508 y PIC12C509, tienen memoria de programa EPROM,
oscilador interno, y son muy utilizados en diseños de pequeños
circuitos.
• PIC16F84A, tiene memoria de programa tipo FLASH, oscilador
externo, 13 pines I/O entre otras características que estaremos
estudiando a lo largo del contenido de esta obra. Este PIC ha
resultado ser uno de los más populares de toda la serie.
• PIC16F87X, incluyen un gran número de mejoras en comparación
con el PIC16F84, debido principalmente a que cuentan con un
numero de pines I/O superior a éste, además de otras
características relevantes. Por ejemplo, con esta serie de
microcontroladores contamos con una mayor capacidad en cuanto
a memoria de programa y memoria de datos.
22
33. • PIC18F4XX, estos microcontroladores resultan muy útiles cuando
deseamos diseñar proyectos más avanzados.
Cada uno de estos microcontroladores cuenta con una completa hoja de
datos que puede ser descargada de la página oficial de Microchip:
http://www.microchip.com
Estas características influyen directamente al momento de decidir que modelo
de microcontrolador PIC deseamos utilizar en nuestros proyectos, según sea
el objetivo de diseño del circuito que deseamos realizar.
El microcontrolador PIC16F84 es uno de los microcontroladores más
populares y en algunos casos, el preferido por estudiantes para dar inicio al
estudio de la programación de microcontroladores, seguido del PIC16F877 el
cual posee más recursos importantes que estaremos estudiando a
continuación.
Antes de empezar a revisar todo lo referente a la programación de
microcontroladores PIC, consideramos importante recordar algunas de las
características de éstos dispositivos, para tener una base de conocimientos
básicos para poder realizar un programa de control de un diseño
completamente personalizado.
Para empezar, veamos algunas características del microcontrolador
PIC16F84:
• Microcontrolador de 8 Bits.
• Memoria de programa tipo Flash de 1024 palabras de 14 bits.
• Memoria RAM de 68 bytes.
• Memoria EEPROM de datos de 64 bytes.
• Velocidad de operación de hasta 20 Mhz.
• Cuatro fuentes de interrupción.
• Posee 13 pines I/O (pines de entrada o salida).
23
34. Diagrama de pines del PIC16F84:
Figura 3.2.
PIN Identificación Descripción del Pin
1 RA2 Pin de Entrada/Salida (I/O) del puerto A
2 RA3 Pin de Entrada/Salida (I/O) del puerto A
3 RA4/TOCKI Pin de Entrada/Salida (I/O) del puerto A
4 MCLR Reset y entrada de voltaje de programación.
5 Vss Pin de Alimentación a Tierra (GND)
6 RB0/INT Pin de Entrada/Salida (I/O) del puerto B
7 RB1 Pin de Entrada/Salida (I/O) del puerto B
8 RB2 Pin de Entrada/Salida (I/O) del puerto B
9 RB3 Pin de Entrada/Salida (I/O) del puerto B
10 RB4 Pin de Entrada/Salida (I/O) del puerto B
11 RB5 Pin de Entrada/Salida (I/O) del puerto B
12 RB6 Pin de Entrada/Salida (I/O) del puerto B
13 RB7 Pin de Entrada/Salida (I/O) del puerto B
14 Vdd Pin de Alimentación de 5Vdc
15 OCS2/CLKOUT Salida del oscilador a cristal.
16 OSC1/CLKIN Entrada del oscilador a cristal o fuente externa de reloj.
17 RA0 Pin de Entrada/Salida (I/O) del puerto A
18 RA1 Pin de Entrada/Salida (I/O) del puerto A
Tabla 3.1
24
35. El microcontrolador PIC16F84 cuenta con dos puertos I/O, el puerto A, el cual
consta de cinco pines I/O y el puerto B, el cual consta de ocho pines I/O como
se puede observar en la figura 3.3:
Figura 3.3.
En total se cuenta con trece pines I/O, los cuales pueden ser programados
como entrada o salida según convenga al momento de diseñar un circuito de
control.
Los pines correspondientes al oscilador (OSC1 y OSC2) y al reset (MCLR)
deben ser siempre tomados en cuenta en el diseño de nuestros proyectos. Es
por este motivo que damos inicio al estudio de algunos circuitos
indispensables para el correcto funcionamiento del microcontrolador PIC.
3.2. El Oscilador Externo.
Es un circuito indispensable para el funcionamiento del microcontrolador y el
cual además, define la velocidad a la cual va a trabajar. Para hacer funcionar
nuestro diseño podemos elegir entre las siguientes cuatro opciones:
• Oscilador LP: Oscilador de bajo consumo (Low Power).
• Oscilador XT: Cristal / Resonador.
25
36. • Oscilador HS: Oscilador de alta velocidad (High Speed).
• Oscilador RC: Resistencia / Condensador.
En los modos de oscilador LP, XT y HS el cristal debe ser conectado a los
pines 15 y 16, Osc2/CLKout y Osc1/CLKin respectivamente, como se muestra
en la figura 3.4.
Figura 3.4.
Los valores de los condensadores cerámicos vienen dados según la tabla que
se muestra a continuación:
Modo Frecuencia Osc1/CLKin Osc2/CLKout
32 kHz 68 - 100 pF 68 - 100 pF
LP
200 kHz 15 - 33 pF 15 - 33 pF
2 MHz 15 - 33 pF 15 - 33 pF
XT
4 MHz 15 - 33 pF 15 - 33 pF
4 MHz 15 - 33 pF 15 - 33 pF
HS
10 MHz 15 - 33 pF 15 - 33 pF
Tabla 3.2
26
37. Por ejemplo, para un oscilador tipo XT, podemos utilizar un cristal de cuarzo
como el de la figura 3.5.
Figura 3.5.
Al conectar el microcontrolador a la fuente de alimentación de 5 Vdc y medir
la señal de salida del oscilador XT con un osciloscopio, en el pin 15
(Osc2/CLKout) del microcontrolador, podremos ver la onda generada bajo los
siguientes parámetros de medición seleccionados en el equipo:
• Voltios/Div: 200mV
• Time/Div: 100ns
Figura 3.6.
27
38. La lectura de la frecuencia y período en este caso sería la siguiente:
• Frecuencia: 3,972 Mhz
• Período: 251,71 ns
Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines, de los
cuales solo tres están implementados de la siguiente manera:
Figura 3.7.
Pin 1: NC (Este pin no se encuentra conectado internamente)
Pin 7: GND
Pin 8: Salida TTL
Pin 14: +5Vdc
En su salida se obtiene un tren de pulsos como se puede observar en la figura
3.8, bajo los siguientes parámetros de medición seleccionados en un
osciloscopio:
• Voltios/Div: 2V
• Time/Div: 100ns
28
39. Figura 3.8.
La lectura de la frecuencia y período en este caso sería la siguiente:
• Frecuencia: 3,999 Mhz
• Período: 250,013 ns
El oscilador externo en modo RC resulta ser el más sencillo de todos y por
ende el más económico. Su configuración lo hace menos preciso debido a
que existe una tolerancia de error en sus componentes, sin olvidar también
que la temperatura puede afectar la operación de este tipo de oscilador.
Los valores recomendados para este oscilador son los siguientes:
• 5 Kohm ≤ R1 ≤ 100 Kohm
• C1 > 20 pF
29
40. Figura 3.9.
3.3. Circuito de Reset: El Pin denominado MCLR (Master Clear), siempre
debe ser tomado en cuenta cuando se diseña un circuito con
microcontroladores PIC. A través de este Pin se podrá reiniciar el dispositivo,
si a éste se le aplica un nivel lógico bajo (0V), por lo tanto resulta importante
destacar que para que un programa cargado en un microcontrolador se
mantenga en ejecución, el Pin MCLR debe estar siempre en un nivel lógico
alto (5V).
Si deseamos tener control externo del reset de un microcontrolador PIC,
debemos considerar el circuito de la figura 3.10:
30
41. Figura 3.10.
Este circuito permite reiniciar el microcontrolador cada vez que el pulsador P1
es presionado.
3.4. Consideraciones técnicas de diseño:
A continuación veremos algunos circuitos básicos que deben ser tomados en
cuenta para el desarrollo de prácticas con microcontroladores PIC. Estos
circuitos son muy útiles cuando deseamos visualizar el resultado de una
acción programada en el microcontrolador.
3.4.1. Estado Lógico de un pin I/O:
Una manera muy sencilla de ver el estado lógico de un pin configurado como
salida en cualquiera de los puertos de microcontrolador es a través del uso de
LEDs, como se observa en los circuitos de la figura 3.11.
31
42. En el primer circuito, el LED se iluminará solo cuando el estado lógico del pin
de salida del puerto sea igual a “1”, es decir, 5 voltios.
En el segundo circuito, el LED se iluminará solo cuando el estado lógico de la
salida del puerto sea igual a “0”, es decir, 0 voltios.
Figura 3.11.
Esto significa que si deseamos realizar un programa en Lenguaje Basic
encargado de cambiar el estado lógico de un pin específico, en cualquiera de
los puertos de un microcontrolador, una forma “básica” de visualizar este
cambio es a través del uso de LEDs.
32
43. 3.4.2. Lectura de un estado lógico en un pin I/O:
El microcontrolador también nos permite capturar datos o señales externas
para luego ser procesadas y convertidas en respuestas que pueden definir
una acción específica en nuestros circuitos de prueba. Un ejemplo común
podría ser el uso de un pulsador para hacer destellar un led cada vez que
éste sea presionado.
Si deseamos introducir un nivel lógico bajo (0V), o alto (5V), a una de las
entradas de un microcontrolador a través de un pulsador, podríamos
considerar los circuitos de la figura 3.12, los cuales nos proporcionan dos
formas diferentes de hacerlo:
Figura 3.12.
33
44. El primer circuito en la figura 3.12 mantiene un nivel lógico alto (5V) mientras
el pulsador permanece abierto. Al presionar el pulsador, el nivel lógico en el
pin I/O del puerto pasa a ser bajo (0V).
El segundo circuito de la figura 3.12 mantiene un nivel lógico bajo (0V)
mientras el pulsador permanece abierto. Al presionar el pulsador, el nivel
lógico en el pin I/O del puerto pasa a ser alto (5V).
3.4.3. El Opto-acoplador:
El opto-acoplador es un componente muy útil cuando se requiere acoplar
circuitos electrónicos digitales con etapas de manejo de potencia o con otros
circuitos.
Este componente en una de sus versiones, se compone básicamente de un
diodo LED el cual se encarga de iluminar un fototransistor, para que éste
conduzca corriente a través del colector.
Figura 3.13.
34
45. En la configuración de la figura 3.13, cuando en el pin I/O aplicamos un 1
lógico (5V), el LED del opto-acoplador enciende y el fototransistor conduce la
corriente a tierra; por lo tanto, en la salida tendremos un 0 lógico (0V).
Si apagamos el LED, el transistor no conduce, de tal manera que en la salida
tendremos un 1 lógico (5V).
En la configuración de la figura 3.14, cuando en el pin I/O aplicamos un 1
lógico (5V), el LED del opto-acoplador enciende y el fototransistor conduce
para poner en la salida un 1 lógico (5V). Mientras haya un 0 lógico en la
entrada, el fototransistor permanecerá abierto entre el emisor y colector,
dando como resultado un 0 lógico (0V) en la salida.
Figura 3.14.
Una configuración muy común para el control de dispositivos de potencia
como motores eléctricos, luces incandescentes, solenoides, etc., se puede ver
en la figura 3.15, la cual se basa en cualquiera de los dos circuitos antes
mencionados (figura 3.13 y figura 3.14), en la cual se ha incluido un relé a
35
46. través del cual circulará la corriente necesaria entre sus contactos, para hacer
funcionar cualquiera de estos dispositivos de potencia.
Figura 3.15.
36
47. 3.4.4. Fuente de poder, 5Vdc / 3.3Vdc:
En caso de no disponer de una fuente de poder regulada, proponemos la
construccion de un diseño sencillo que podemos implementar en todos los
proyectos propuestos. En la figura 3.16 se puede observar el diseño de una
fuente regulada con salidas de voltaje de +5 Vdc y +3.3 Vdc:
Figura 3.16.
37
48. Estructura de un programa.
Componentes y operadores en PicBasic. Capitulo IV
4.1.- Estructura de un programa: Para que nuestros programas tengan una
apariencia ordenada y se facilite la comprensión del mismo ante otros
programadores que deseen realizar mejoras a éste, es necesario establecer
una estructura que nos permita identificar fácilmente cada una de las partes
que lo componen.
A
B C D
Figura 4.1.
En la figura 4.1 se puede observar la estructura básica de un programa hecho
en Microcode Studio, y en la cual hemos identificado las cuatro secciones que
consideramos más importantes para lograr un programa bien estructurado.
38
49. Sección A: Corresponde al encabezado del programa, en el cual se debe
considerar información básica del mismo, como el nombre, la identificación
de autor, Copyright, fecha de elaboración o fecha de los últimos cambios
realizados, versión del programa que se está realizando, e incluso una breve
descripción acerca del objetivo del programa y su aplicación en un
determinado circuito electrónico.
Es importante resaltar que cada línea del encabezado debe empezar con una
comilla simple, en forma de comentario (ver “Sección D”).
Sección B: Esta sección empieza en la columna cero del editor de texto de
Microcode Studio, y en ella se pueden declarar las definiciones (concepto que
estudiaremos mas adelante) y las etiquetas de cada una de las subrutinas
que serán programadas.
Las etiquetas identifican puntos específicos o subrutinas dentro de un
programa. Son definidas por el programador y deben tener al final de cada
una de ellas el símbolo de “dos puntos”, que definen el final de la misma.
Sección C: Estará destinada para las instrucciones de programa y la misma
está separada de la columna cero del editor de texto por una tabulación, es
decir, cuando el cursor se encuentra en la columna cero, presionamos una
vez la tecla “TAB”, y de esta manera establecemos un espacio mínimo,
siempre igual o superior entre la sección B y C.
Sección D: Esta destinada para realizar comentarios acerca de la función que
estará cumpliendo una instrucción específica en nuestro programa. Cada
comentario debe empezar siempre con una comilla simple como se muestra a
continuación:
' Define el Oscilador para un Cristal
' de 4 Mhz.
Cuando un comentario es demasiado extenso, podemos continuar el mismo
en la siguiente línea, siempre que la frase comience con su respectiva comilla.
39
50. Los comentarios ayudan al diseñador a identificar cada línea de programa o
cada una de las funciones de cada subrutina, garantizando así una buena
documentación en cada uno de los programas que realizamos.
4.2.- Subrutinas: Una subrutina se presenta como un algoritmo separado del
algoritmo principal, y estará destinado a resolver una tarea específica. Las
subrutinas pueden ser referidas cada vez que sea necesario, llamando a la
etiqueta que corresponde a ésta, la cual debe ir siempre al inicio de la misma.
Led1:
For Z = 0 To 9
LED = Encendido
Etiqueta Pause 1000
LED = Apagado
Subrutina
Pause 1000
Next Z
GoTo Inicio
End
40
51. 4.3.- Componentes y operadores en PicBasic.
PIC Basic cuenta con una serie de herramientas de programación entre las
cuales podemos mencionar las etiquetas, variables, identificadores,
constantes, comentarios, símbolos entre otras.
Algunas de estas herramientas son de uso obligatorio a la hora de realizar un
programa, y otras que no son de uso obligatorio, nos facilitarán el trabajo
considerablemente.
4.3.1.- Define: La directiva “Define” resulta muy importante en la
programación de microcontroladores con PicBasic, ya que establece una
serie de parámetros que de no ser tomados en cuenta, causará que nuestros
programas sencillamente no funcionen en la mayoría de los casos.
Esta serie de parámetros están directamente relacionados con dispositivos
externos al microcontrolador. Por ejemplo, si deseamos utilizar un oscilador
de diferente frecuencia al valor establecido por defecto (4 Mhz), será
conveniente entonces definir la velocidad del mismo utilizando la directiva:
Define Osc {frecuencia}
De igual forma deben ser considerados estos parámetros para el uso de
dispositivos como pantallas LCD, donde se deberán definir los puertos de
conexión para el bus de datos y bus de control. Así mismo ocurre para el caso
de las comunicaciones seriales o I2C, donde los parámetros también deben
ser definidos. Veamos a continuación la tabla de parámetros para el uso de la
instrucción Define.
41
52. Parámetro Descripción
OSC {frecuencia} Frecuencia del Oscilador en Mhz
LCD_DREG {puerto} Puerto de datos LCD
LCD_DBIT {bit} Bit inicial del puerto de datos
LCD_RSREG {puerto} Puerto para RS (Register Select)
LCD_RSBIT {bit} Pin del Puerto para RS
LCD_EREG {puerto} Puerto para E (Enable)
LCD_EBIT {bit} Pin del Puerto para E
LCD_RWREG {puerto} Puerto para RW (Read/Write)
LCD_RWBIT {pin} Pin del puerto para RW
LCD_LINES {líneas} Número de líneas de la LCD (1,2 o 4)
I2C_SCLOUT 1 Interface de Reloj I2C Bipolar
Cuando en la transferencia es utilizado un
I2C_SLOW 1
oscilador mas lento que 8 Mhz.
Tabla 4.1.
4.3.2.- Variables: En las variables podemos almacenar datos temporalmente,
los cuales podrán ser consultados o modificados cada vez que sea necesario.
Regularmente la definición de variables se hace al inicio del programa y para
ello se utiliza la palabra VAR seguida por el tipo de variable según la tabla
que mostramos a continuación:
Nombre de Tipo de
VAR Descripción
la Variable Variable
A1 Var Bit Toma los valores 0 y 1 unicamente
Temp Var Byte Toma valores entre 0 y 255 (8 bits)
dig1 Var Word Toma valores entre 0 y 65535 (16 bits)
Tabla 4.2.
El nombre de la variable es elegido por el programador y el tipo de variable se
define según el tipo de dato que se desea almacenar temporalmente.
42
53. 4.3.3.- Arrays: Las variables Arrays tienen un determinado número de
“elementos”, definido según el tamaño de la variable. Las variables Arrays tipo
Bit, pueden almacenar 256 elementos; las variables Arrays tipo Byte pueden
almacenar hasta 96 elementos y las variables Arrays tipo Word hasta 48
elementos, los cuales a su vez pueden ser accesados en cualquiera de los
tres casos a través de un índice. Este índice se específica entre corchetes
como se muestra en los siguientes ejemplos:
Para declarar una variable Array utilizamos el siguiente formato:
Dato Var Byte[7]
El primer elemento de esta variable es Dato[0] y el último elemento es
Dato[7], lo cual significa que hemos declarado una variable array de 8
elementos. En este caso podemos almacenar un byte en cada elemento,
siempre especificando el índice.
Ejemplo: Almacenar en cada elemento de la variable “Dato” los valores 200,
15, 56, 75, 80, 20, 33, 45.
Dato[0] = 200
Dato[1] = 15
Dato[2] = 56
Dato[3] = 75
Dato[4] = 80
Dato[5] = 20
Dato[6] = 33
Dato[7] = 45
En algunos casos se debe verificar la hoja de datos del microcontrolador, ya
que la cantidad de elementos que se pueden almacenar en variables arrays
tipo Byte o Word puede variar según el modelo del mismo.
43
54. 4.3.4.- Constantes: Ayudan a identificar un valor constante en nuestro
programa, facilitando aún más la comprensión del mismo a la hora de verificar
su funcionamiento. En la tabla 4.3 se puede observar la forma de declarar una
constante.
Nombre de la Valor de la
CON
Constante Constante
Temp_Max CON 150
Temp_Min CON 55
Tabla 4.3.
4.3.5.- Símbolos o Alias: Proveen un nombre único y específico a elementos
o variables dentro de nuestro programa. Para definir un símbolo, utilizamos la
palabra “Symbol”, seguida del alias del elemento, el símbolo de igualdad “=”, y
por último el elemento en cuestión:
Symbol {alias} = {elemento}
Por ejemplo, si deseamos controlar un motor DC a través de uno de los pines
del puerto A de un microcontrolador, resultaría mucho mas sencillo referirse a
este pin como “Motor”, en vez de referirse a él como “PortA.0”.
Entonces,
Symbol Motor = PORTA.0
Veamos otros ejemplos:
Symbol Relay = PORTB.0
Symbol Sensor = PORTA.0
Symbol LED = PORTA.1
Symbol RC0 = PORTC.0
44
55. 4.3.6.- Operadores Aritméticos: Entre los operadores aritméticos más
utilizados tenemos los que se muestran en la siguiente tabla:
Operador Descripción Operador Descripción
+ Suma ABS Valor Absoluto
- Resta SIN Seno del Angulo
* Multiplicación COS Coseno del Angulo
/ División MIN Minimo de un número
// Residuo MAX Máximo de un número
<< Desplaza a la Izquierda REV Invertir un Bit
Valor de un digito para un
>> Desplaza a la Derecha DIG
número decimal
= Asignación de Valores
Tabla 4.4.
4.3.7.- Operadores Binarios: En la siguiente tabla veremos los operadores
binarios proporcionados para el Lenguaje PicBasic:
Operrador Descripción
& AND Lógico
| OR Lógico
^ XOR Lógico
˜ NOT Lógico
&/ NAND Lógico
|/ NOR Lógico
^/ NXOR Lógico
Tabla 4.5.
Con estos operadores resulta muy sencillo realizar operaciones binarias,
como lo demuestra el siguiente ejemplo:
Si aplicamos una AND lógica, donde deseamos filtrar los siete bits más
significativos del valor almacenado en la siguiente variable:
Var1 = %00101001
Entonces,
Var1 = Var1 & %00000001
45
56. El resultado de esta operación es Var1 = %00000001
4.3.8.- Operadores de Comparación: Los operadores de comparación
normalmente son utilizados con la instrucción If…Them… para realizar
comparaciones entre variables o datos extraídos de alguna operación
aritmética.
Operador Descripción
= Igual
<> Diferente
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
Tabla 4.6.
4.3.9.- Operadores Lógicos: Los operadores lógicos son utilizados para
establecer condiciones entre variables y son utilizados de la misma manera
que los operadores de comparación.
Operador Descripción
AND AND Lógico
OR OR Lógico
XOR XOR Lógico
NOT NOT Lógico
NOT AND NAND Lógico
NOT OR NOR Lógico
NOT XOR NXOR Lógico
Tabla 4.7.
Ejemplo:
If Var1 = 1 and Var2 = 3 And Var3 = 5 Then Goto inicio
La condición saltará a la etiqueta “inicio” solo si se cumplen las tres
condiciones.
46
57. Primeros Programas con el PIC16F84 Capitulo V
Para aprender a programar un microcontrolador resulta importante dar inicio
al tema con ejemplos prácticos y sencillos, que nos ayuden a comprender el
funcionamiento de la arquitectura del PIC y las instrucciones de programa que
se están empleando.
El primer paso entonces será realizar el montaje del circuito con base en los
conocimientos adquiridos en las páginas anteriores. Se debe tomar en cuenta
que aunque en los diagramas de los circuitos que se muestran a continuación,
no están presentes los pines de alimentación “Vcc” y “Gnd”, éstos deben ser
conectados debidamente a la fuente de alimentación de 5 Voltios.
A medida que se van proponiendo ejemplos de aplicación práctica, estaremos
estudiando la sintaxis de las instrucciones empleadas en cada proyecto para
facilitar la comprensión general de éste, referente a la programación y diseño
electrónico.
5.1.- Proyecto #1: A continuación realice el montaje de la figura 5.1, en base
al cual realizaremos la programación necesaria para encender dos Leds
conectados a los puertos del microcontrolador:
Figura 5.1.
47
58. Proyecto # 1
Componentes Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 2
Resistencia de 220 Ohm 2
Fuente regulada de 5 Vdc 1
Tabla 5.1.
• El Led 1 se encuentra conectado en el pin RA0 del puerto A, el cual
deberá ser configurado como “Salida”.
• El Led 2 se encuentra conectado en el pin RB0 del puerto B, el cual
deberá ser configurado igualmente como “Salida”.
Note que el ánodo del diodo LED se encuentra conectado al pin de salida del
puerto, por lo tanto para que encienda el LED debemos hacer salir un 1 lógico
por el pin correspondiente.
Como los pines de los puertos pueden ser configurados como “entradas” o
como “salidas”, es importante tomar en cuenta los registros de configuración
de puertos, los cuales para el caso específico del PIC16F84 son dos:
TrisA (registro de configuración I/O del puerto A), es un registro de 8 bits, de
los cuales los tres más significativos no se encuentran implementados en este
modelo de microcontrolador, ya que como se puede observar en el diagrama
de pines del dispositivo (figura 3.2), el puerto A solo cuenta con 5 pines (RA0,
RA1, RA2, RA3 y RA4).
48
59. Un ejemplo de configuración de los pines I/O del puerto A es el siguiente:
Registro TrisA
Bit menos
1 1 1 1 0
RA4 RA3 RA2 RA1 RA0
significativo
Figura 5.2.
1 = Entrada (Al configurar un bit del registro TrisA en “1”, éste se comporta como entrada).
0 = Salida (Al configurar un bit del registro TrisA en “0”, éste se comporta como salida).
Al ver la figura 5.2, se puede observar que el pin RA0 ha sido configurado
como salida y el resto de los pines como entrada.
En PicBasic, este paso se realiza de la siguiente manera:
TrisA = %11110 (“%” para expresar la configuración en Binario), ó:
TrisA = $1E (“$” para expresar la configuración en Hexadecimal)
“Recordemos entonces que como el Led 1 se encuentra conectado en el pin RA0,
el bit correspondiente a este pin en el registro TrisA ha sido configurado como
salida”.
TrisB, es un registro de 8 bits en el cual se configuran los pines del puerto B,
ya sea como entrada o como salida, por ejemplo:
Registro TrisB
1 1 1 1 1 1 1 0
Bit menos
RB7 RB6 RB5 RA4 RA3 RA2 RA1 RA0 significativo
Figura 5.3.
1 = Entrada (Al configurar un bit del registro TrisB en “1”, éste se comporta como entrada).
0 = Salida (Al configurar un bit del registro TrisB en “0”, éste se comporta como salida).
49
60. Para el caso particular del puerto B, se puede observar que el pin RB0 ha sido
configurado como salida y el resto de los pines como entrada.
“Consideramos importante configurar los pines que no estarán en uso como
entrada, ya que de esta forma podemos evitar daños en el hardware interno
del microcontrolador al experimentar con éste en un tablero de pruebas.”
La configuración en PicBasic para el registro TrisB, ajustada al ejemplo de la
figura 5.3 sería entonces la siguiente:
TrisB = %11111110 (si se desea hacer la notación en binario), ó:
TrisB = $FE (si se desea hacer la notación en hexadecimal)
Antes de verificar el programa propuesto para este ejemplo, veremos la
sintaxis de las instrucciones utilizadas en él, para tener una idea clara de la
función que cumple cada instrucción. Esta información puede ser
complementada en el capítulo XV, en el cual encontrará la descripción de
cada una de las instrucciones utilizadas en cada proyecto planteado en esta
edición.
Sintaxis de las Instrucciones empleadas en el programa:
HIGH
Sintaxis: HIGH pin
La instrucción “High” pone en uno lógico un pin I/O específico.
50
61. LOW
Sintaxis: LOW pin
La instrucción “LOW” coloca en cero lógico un pin I/O específico.
GOTO
Sintaxis: GOTO etiqueta
La instrucción “Goto” continúa la ejecución de un programa a partir de la
etiqueta especificada (Esta instrucción no tiene retorno).
PAUSE
Sintaxis: PAUSE periodo
La instrucción “Pause” realiza una pausa en el programa por un periodo
definido en milisegundos.
Veamos el programa en PicBasic:
'****************************************
'* Nombre : Proyecto1.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
51
62. TRISA = %11110 ' Configuración el Puerto A
TRISB = %11111110 ' Configuración el Puerto B
PORTA = 0 ' Inicializa el puerto "A", es decir,
' se ponen todos los pines en cero.
PORTB = 0 ' Inicializa el puerto "B".
Inicio: ' Etiqueta de Inicio del programa
High PORTA.0 ' Enciente el Led conectado en el pin RA0
Pause 1000 ' Hace una pausa de 1000 milisegundos = 1
' Seg.
Low PORTA.0 ' Apaga el Led conectado en el pin RA0
Pause 1000 ' Hace una pausa de 1000 milisegundos = 1
' Seg.
High PORTB.0 ' Enciente el Led conectado en el pin RB0
Pause 1000 ' Hace una pausa de 1000 milisegundos = 1
' Seg.
Low PORTB.0 ' Apaga el Led conectado en el pin RB0
Pause 1000 ' Hace una pausa de 1000 milisegundos = 1
' Seg.
GoTo Inicio ' Salta a la etiqueta "Inicio" y se repite el
' proceso.
End
La instrucción “High” se encarga de poner un nivel lógico alto en el pin
especificado seguidamente. En este caso, primero se escribe el puerto y
seguido de un punto, se especifica el número del pin en el puerto que
deseamos utilizar.
La instrucción “Low” es responsable en este caso de poner el pin
especificado en un nivel lógico bajo. Al igual que en la instrucción “High”, se
debe especificar el puerto y el pin del puerto a ser utilizado.
La instrucción “GoTo” realiza un salto hacia una etiqueta específica; en este
caso el programa salta a la etiqueta “Inicio” para empezar de nuevo todo el
proceso.
52
63. Al escribir el programa en el editor de texto de Microcode Studio, se debe
grabar el mismo con el nombre de su preferencia para que éste pueda ser
compilado y al mismo tiempo pueda ser enviado al microcontrolador.
Observe que para este programa, hemos designado el nombre
“Proyecto1.pbp” (figura 5.4).
Figura 5.4.
Antes de compilar el programa, se debe asegurar de seleccionar el modelo
apropiado de microcontrolador PIC, como se observa en la figura 5.5. Luego
se compila el programa y se verifica que éste no tenga errores.
53
64. Modelo
Compilar
Compilar y del uC.
Grabar en
el PIC
Figura 5.5.
Seguidamente, se debe proceder a cargar el programa compilado en el
microcontrolador con la ayuda del programador de microcontroladores Pic.
Al hacer clic en el icono “Compilar y Grabar en el PIC” (ver figura 5.5), el
compilador habrá generado un archivo de nombre “Ejemplo1.hex” y
seguidamente se abrirá el software “Picall/P16Pro”, como se observa en la
figura 5.6:
Figura 5.6.
En este momento el microcontrolador deberá estar montado en la base del
programador en la posición indicada por la figura 5.6.
54
65. Antes de programar el microcontrolador, también resulta conveniente verificar
los fusibles de programación, accediendo al botón “Config”, el cual puede ser
visualizado en la figura 5.6.
En esta sección se debe configurar el tipo de oscilador utilizado en nuestro
circuito, así como otras opciones disponibles que comentaremos a
continuación (ver figura 5.7).
Figura 5.7.
En la figura 5.7 se pueden observar tres secciones llamadas “Oscillator”,
“Hardware” y “Protection”:
• En la sección “Oscillator”, debemos seleccionar el tipo de oscilador
utilizado en nuestro circuito electrónico, el cual en este caso es del tipo
XT, debido a que el cristal que hemos elegido es de 4 Mhz.
• En la sección “Hardware” es posible activar el temporizador “Perro
Guardián”, el cual se encarga de reiniciar el microcontrolador en caso
de fallas o bloqueos en el programa. Para utilizar el “Watchdog” es
necesario diseñar el programa bajo ciertos parámetros, de forma que
podamos reiniciar el temporizador “Watchdog” antes de que éste se
desborde y provoque un “Reset” en el sistema. Si nuestro programa
llegara a fallar, el temporizador Watchdog completaría su conteo y se
desbordaría, provocando un “Reset” del sistema.
55
66. • En la sección “Hardware” también disponemos de la opción “Power Up
Timer”, la cual una vez activada en el microcontrolador, hará que éste
no pueda iniciar el programa hasta tanto el voltaje aplicado al circuito
sea estable y seguro (ver figura 5.8).
6
5
Voltios 4
3
2
1
0
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61
Tiempo
Figura 5.8.
• En la sección “Protection”, tenemos la posibilidad de proteger el código
de programa almacenado en la memoria del microcontrolador.
Finalmente hacemos clic en el botón “Program” (ver figura 5.6), para
descargar el programa “Proyecto1.hex” en el microcontrolador;
inmediatamente se podrá ver el proceso de grabación y verificación de datos,
para luego culminar con el montaje del microcontrolador en el circuito de
prueba.
Estos pasos se deben aplicar en cada uno de los proyectos aquí planteados,
o cada vez que se desee realizar una modificación a un programa para
obtener siempre mejores resultados sobre el objetivo propuesto en cada
actividad.
56
67. 5.2.- Proyecto #2: En este ejemplo conectaremos un Led en cada pin del
puerto B, el cual a su vez deberá ser configurado como salida para garantizar
el correcto funcionamiento del mismo. En la figura 5.9 podemos observar en
detalle la conexión del circuito eléctrico que deberá ser montado.
Figura 5.9.
Proyecto # 2
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor de 33 pF 2
LED 8
Resistencia de 220 Ohm 8
Fuente regulada de 5 Vdc 1
Tabla 5.2.
57
68. En el proyecto #1 se pudo observar como es posible encender un led
conectado a un pin del puerto A o B en un PIC16F84A, utilizando las
instrucciones High y Low. También existen otras formas de poner un “1” o un
“0” lógico en un pin configurado como salida; esto se puede lograr de varias
maneras:
PORTA.0 = 1 ' RA0 = 1 -> (es igual a High PortA.0)
PORTA.0 = 0 ' RA0 = 0 -> (es igual a Low PortA.0)
Cuando deseamos poner varios pines de un mismo puerto en “1”, podemos
utilizar las siguientes opciones:
PORTB = %10101010 ' RB7 = 1, RB5 = 1, RB3 = 1, RB1 = 1
' RB6 = 0, RB4 = 0, RB2 = 0, RB0 = 0
Este mismo ejemplo de configuración en hexadecimal:
PORTB = $AA ' RB7 = 1, RB5 = 1, RB3 = 1, RB1 = 1
' RB6 = 0, RB4 = 0, RB2 = 0, RB0 = 0
Recordemos que el símbolo “%” expresa la notación en binario, por lo cual se
deben expresar los ocho bits a ser cargados en el registro “PortB”. Otra forma
de expresar este ejemplo sería colocando la notación en hexadecimal con el
símbolo “$”, seguido del valor calculado.
Basados en esta información podemos lograr encender y apagar varios leds
simultáneamente conectados a uno de los puertos del microcontrolador como
lo muestra el montaje de la figura 5.9.
Veamos el siguiente programa:
'****************************************
'* Nombre : Proyecto2.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
58
69. Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISB = %00000000 ' Configura el Puerto B como Salida
PORTB = %00000000 ' Inicializa el puerto "B".
Inicio: ' Etiqueta de Inicio del programa
PORTB = %01010101 ' Enciente las salidas RB0, RB2, RB4 y RB6, al
' mismo tiempo apaga RB1, RB3, RB5 y RB7.
Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 Seg.
PORTB = %10101010 ' Enciente las salidas RB1, RB3, RB5 y RB7, al
' mismo tiempo apaga RB0, RB2, RB4 y RB6.
Pause 1000 ' Hace una pausa de 1000 milisegundos = 1 Seg.
GoTo Inicio ' Salta a la etiqueta "Inicio" y se repite el
' proceso.
End
Este programa enciende primero las salidas pares del puerto B y apaga las
salidas impares, genera una pausa de 1 segundo (1000 ms) y seguidamente
hace el proceso inverso en las salidas, es decir, enciende las salidas impares
y apaga las salidas pares para generar nuevamente otra pausa de 1 segundo
y así repetir el proceso completo al generar un salto a la etiqueta “Inicio”.
59
70. 5.3.- Proyecto #3: Los pines en los puertos de un microcontrolador pueden
ser configurados también como entradas, como se detalla en el contenido del
proyecto #1, donde se explica claramente que al poner un “1” en un bit de un
registro de configuración de puerto, ya sea TRISA o TRISB, para el caso del
PIC16F84A, éste se comportará como entrada. Realice el montaje de la figura
5.10 y analice el programa que se muestra a continuación.
Figura 5.10.
Proyecto # 3
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 1
Resistencia de 220 Ohm 1
Resistencia de 10K Ohm 1
Pulsador Normalmente Abierto 1
Fuente regulada de 5 Vdc 1
Tabla 5.3.
60
71. IF – THEM – ELSE
Sintaxis: If expresión 1 {AND / OR expresión 2} Then etiqueta
Con la instrucción If – Them podemos tomar decisiones a lo largo de un
programa, basadas en condiciones específicas definidas por el programador.
El siguiente programa hace destellar un LED conectado en RB0, solo cuado el
pulsador es activado:
'****************************************
'* Nombre : Proyecto3.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = %11111 ' configura el Puerto A como Entrada
TRISB = %00000000 ' Configura el Puerto B como Salida
PORTB = $00 ' Inicializa el puerto B
Inicio:
If PORTA.0 = 1 Then PORTB.0 = 1 ' Pregunta si RA0 = 1, si se cumple
' la condición entonces enciende el Led.
Pause 1000 ' Hace una pausa de 1 segundo (1000 ms)
Low PORTB.0 ' Apaga el Led
Pause 1000 ' Hace una pausa de 1 segundo (1000 ms)
GoTo inicio ' Salta a la etiqueta "Inicio"
End
Para verificar si el pulsador está activado, se pregunta si RA0 = 1. Esto es
posible gracias a la instrucción “IF” la cual genera un resultado siempre que la
condición planteada se cumpla, y para lo cual debemos utilizar
necesariamente su complemento “Then” seguido de la acción a ser tomada.
61
72. En este caso si el pulsador ha sido activado, entonces RA0 = 1, es decir, se
cumple la condición y por lo tanto RB0 = 1, es decir, el LED enciende.
5.4.- Proyecto #4: En este ejemplo empleamos un microcontrolador
PIC16F877A, con el cual nos hemos planteado la lectura de ocho pulsadores
conectados al puerto B, de tal manera que al activar uno de ellos podemos
mostrar un dígito decimal en un Display de siete segmentos.
Figura 5.11.
62
73. Proyecto # 4
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Resistencia de 220 Ohm 8
Resistencia de 10K Ohm 8
Pulsador Normalmente Abierto 8
Display de 7 Segmentos - Cátodo común 1
Fuente regulada de 5 Vdc 1
Tabla 5.4.
En el diagrama esquemático de la figura 5.11 se pueden observar ocho
pulsadores normalmente abiertos, los cuales una vez activados generan un
estado lógico alto en el puerto seleccionado (puerto “B”), el cual ha sido
configurado como entrada.
El display de 7 segmentos de cátodo común, se encuentra conectado al
puerto “D”, donde el bit menos significativo RB0 corresponde al segmento “a”
del display, RB1 corresponde al segmento “b”, RB2 corresponde al segmento
“c”, RB3 corresponde al segmento “d”, RB4 corresponde al segmento “e”, RB5
corresponde al segmento “f” y RB6 corresponde al segmento “g”.
El siguiente programa es una forma básica de tomar una lectura de cada
pulsador conectado al puerto “B” y generar un resultado en el puerto de salida
al cual hemos conectado un display de 7 segmentos:
'****************************************
'* Nombre : Proyecto4.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
63
74. Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISB = $FF ' Configura el Puerto B como Entrada
TrisD = $00 ' Configura el Puerto D como Salida
Inicio:
' A continuación se verifica cada pin del puerto B,
' si hay un 1 lógico en alguna de las entradas el
' puerto D se actualiza con el dato correspondiente
' para generar en el Display un dígito decimal.
' gfedcba
' |||||||
If PORTB.0 = 1 Then PortD = %00111111 ' Enciende los segmentos correspondientes
' al dígito “cero” en el display.
If PORTB.1 = 1 Then PortD = %00000110 ' Enciende los segmentos correspondientes
' al dígito “uno” en el display.
If PORTB.2 = 1 Then PortD = %01011011 ' Enciende los segmentos correspondientes
' al dígito “dos” en el display.
If PORTB.3 = 1 Then PortD = %01001111 ' Enciende los segmentos correspondientes
' al dígito “tres” en el display.
If PORTB.4 = 1 Then PortD = %01100110 ' Enciende los segmentos correspondientes
' al dígito “cuatro” en el display.
If PORTB.5 = 1 Then PortD = %01101101 ' Enciende los segmentos correspondientes
' al dígito “cinco” en el display.
If PORTB.6 = 1 Then PortD = %01111101 ' Enciende los segmentos correspondientes
' al dígito “seis” en el display.
If PORTB.7 = 1 Then PortD = %00000111 ' Enciende los segmentos correspondientes
' al dígito “siete” en el display.
GoTo Inicio ' Salta a la etiqueta "Inicio"
End
64
75. 5.5.- Proyecto #5: En el ejemplo a continuación se realiza un conteo
ascendente desde cero hasta nueve en un display de 7 segmentos conectado
al puerto “D” de un PIC16F877A.
Figura 5.12.
Proyecto # 5
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Resistencia de 220 Ohm 8
Display de 7 Segmentos - Cátodo común 1
Fuente regulada de 5 Vdc 1
Tabla 5.5.
65
76. FOR… NEXT
Sintaxis: For variable = inicio to final {step {-} incremento}
*
*
Instrucciones…
*
*
Next { variable}
La instrucción For…Next se encarga de hacer repeticiones de instrucciones
que permanecen dentro del lazo For… Next.
El parámetro Step afecta el incremento según el valor asignado después de
esta palabra. Si este parámetro es omitido, el incremento es en una unidad.
Analice el siguiente programa:
'****************************************
'* Nombre : Proyecto5.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
I Var Byte ' Declaración de la Variable "I" tipo Byte
' Constantes para definir cada dígito decimal en el Display:
' gfedcba
' |||||||
Cero CON %00111111
Uno CON %00000110
Dos CON %01011011
Tres CON %01001111
Cuatro CON %01100110
Cinco CON %01101101
Seis CON %01111101
Siete CON %00000111
66
77. Ocho CON %01111111
Nueve CON %01100111
' Configuración del Puerto de Salida:
TrisD = $00 ' Configura el Puerto D como Salida
Inicio:
For I = 0 To 9 ' Repetición de Instrucciones dentro del Lazo
' For - Next
Call Digito ' Salto con Retorno hacia la etiqueta "Digito"
Pause 1000 ' Pausa de 1 segundo (1000 ms)
Next I
GoTo Inicio ' Salta a la etiqueta "Inicio"
Digito:
' Verificación del dígito a ser mostrado en el Display el cual
' se corresponde con el valor almacenado en la variable "I".
If I = 0 Then PortD = cero
If I = 1 Then PortD = Uno
If I = 2 Then PortD = dos
If I = 3 Then PortD = tres
If I = 4 Then PortD = cuatro
If I = 5 Then PortD = cinco
If I = 6 Then PortD = seis
If I = 7 Then PortD = siete
If I = 8 Then PortD = ocho
If I = 9 Then PortD = nueve
Return ' Retorna una línea después del salto con retorno (Call)
End
Al iniciar el conteo en el display de 7 segmentos, se puede observar un
conteo ascendente que da inicio en cero y se va incrementando en una
unidad cada segundo hasta llegar a nueve.
Si deseamos realizar el incremento en más de una unidad por vez, tan solo
debemos incluir la directiva “Step”, seguido del incremento, es decir, si
queremos realizar un incremento de dos unidades por vez, entonces el lazo
For – Next se compone de la siguiente manera:
67
78. For I = 0 To 9 Step 2 ' Repetición de Instrucciones dentro del Lazo
' For – Next con incremento en dos unidades.
Call Digito ' Salto con Retorno hacia la etiqueta "Digito"
Pause 1000 ' Pausa de 1 segundo (1000 ms)
Next I
Esto significa que el conteo arranca en cero y cada segundo transcurrido se
podrán ver los dígitos: “2”, “4”, “6” y “8”.
Para realizar un conteo regresivo, el lazo For – Next se compone de la
siguiente forma:
For I = 9 To 0 Step -1 ' Repetición de Instrucciones dentro del Lazo
' For – Next.
Call Digito ' Salto con Retorno hacia la etiqueta "Digito"
Pause 1000 ' Pausa de 1 segundo (1000 ms)
Next I
En este caso en conteo inicia en nueve y decrece en una unidad hasta llegar
a cero.
5.6.- Proyecto #6: PicBasic cuenta con una instrucción capaz de generar
tonos DTMF (Dual Tone Multifrecuency - Multifrecuencia de doble tono), tonos
que se utilizan en telefonía para marcar una serie de números y así poder
establecer la comunicación entre dos o más personas. Una aplicación
interesante para esta instrucción podría ser el discado de números telefónicos
en sistemas de alarma cuando ha sido activado un dispositivo de supervisión,
para luego generar un mensaje de voz que nos alerte de dicho evento.
Realice el montaje de la figura 5.13 y analice el programa que se muestra a
continuación, el cual genera tonos DTMF consecutivos de una serie de dígitos
predefinidos. Es muy importante considerar que para generar los tonos
adecuadamente el oscilador externo debe ser de 10 Mhz o superior.
68
79. Figura 5.13.
Proyecto # 6
Componente Cantidad
PIC16F84A 1
Cristal de 10 Mhz 1
Capacitor cerámico de 33 pF 2
Capcitor Electrolítico de 10 uF 2
Parlante de 8 Ohm 1
Fuente regulada de 5 Vdc 1
Tabla 5.6.
En la tabla 5.7 se puede observar la frecuencia baja y la frecuencia alta de
cada digito entre cero y quince, los cuales se corresponden a su vez con cada
uno de los dígitos de un teclado telefónico, como se puede observar en la
segunda columna de la misma tabla.
Esto quiere decir que si generamos las frecuencias correspondientes al dígito
“1” utilizando la instrucción “DTMFout”, obtendremos las mismas frecuencias
baja y alta que se generan al pulsar el dígito “1” de cualquier teléfono de tonos
DTMF. Si deseáramos generar desde el microcontrolador el tono DTMF
69
80. correspondiente al dígito “0” de un teclado telefónico, entonces, según la tabla
5.7, el dígito a introducir en la instrucción “DTMFout” deberá ser el “10”.
Dígito en la Dígito en un
Frecuencias Frecuencias
Instrucción Teclado
Bajas Altas
DTMFout Telefónico
1 1 697 HZ 1209 HZ
2 2 697 HZ 1336 HZ
3 3 697 HZ 1477 HZ
4 4 770 HZ 1209 HZ
5 5 770 HZ 1336 HZ
6 6 770 HZ 1477 HZ
7 7 852 HZ 1209 HZ
8 8 852 HZ 1336 HZ
9 9 852 HZ 1477 HZ
10 0 941 HZ 1209 HZ
11 * 941 HZ 1336 HZ
12 # 941 HZ 1477 HZ
13 A 697 HZ 1633 HZ
14 B 770 HZ 1633 HZ
15 C 852 HZ 1633 HZ
0 D 941 HZ 1633 HZ
Tabla 5.7.
Figura 5.14.
70
81. Antes de empezar a programar, vamos a verificar la sintaxis de la instrucción
DTMFout:
DTMFout
Sintaxis: DTMFout pin, {On-ms, Off-ms}, [tono, tono,...tono]
La instrucción DTMFout genera tonos DTMF en secuencia y a través de un
puerto cualquiera del microcontrolador.
Pin: especifica el pin del puerto en el cual se emitirán los tonos DTMF.
On-ms: es una variable o constante que especifica la duración de cada tono
en milisegundos. En caso de no utilizar este parámetro, el tiempo por defecto
de cada tono es de 200 ms.
Off-ms: es una variable o constante que especifica el tiempo en milisegundos
del silencio que hay entre cada tono. En caso de no utilizar este parámetro, el
tiempo en silencio entre cada tono por defecto será de 50 ms.
Tono: puede ser una variable o constante entre 0 y 15, que especifica el tono
que debe ser generado.
71
82. Programa en Pic Basic:
'****************************************
'* Nombre : Proyecto6.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
Define Osc 10 ' Define el Oscilador en 10 Mhz.
TRISA = $FE ' Configura el pin RA0 como Salida
' y el resto de los pines como entrada.
Inicio:
DTMFOut PORTA.0, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
Pause 2000 ' Genera una pausa de 2 segundos.
DTMFOut PORTA.0, 400, 150, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
Pause 2000 ' Genera una pausa de 2 segundos.
GoTo Inicio ' Salta a la etiqueta "Inicio".
End
72
83. Observe que en la primera instrucción “DTMFout”, después de la etiqueta
“Inicio”, no se especifica la duración de cada tono y el tiempo en silencio entre
cada tono. Esto significa que el microcontrolador genera cada tono con una
duración de 200 milisegundos por defecto, y un tiempo en silencio entre cada
tono de 50 milisegundos como se muestra en las figuras 5.15 y 5.16
respectivamente:
Figura 5.15.
73
84. Figura 5.16.
La segunda instrucción “DTMFout”, después de la etiqueta “Inicio”, tiene
definido un tiempo de duración para cada tono de 400 milisegundos (figura
5.17), y un tiempo de espera entre cada tono de 150 milisegundos (figura
5.18). Estos tiempos pueden ser ajustados a conveniencia cada vez que sea
necesario.
74
86. 5.7.- Proyecto #7: En este proyecto estudiaremos la instrucción “Button”, la
cual es utilizada para la eliminación de rebotes en pulsadores o para efectuar
repeticiones en un botón, como sucede en el caso de los teclados de las
computadoras, en las cuales si dejamos presionado un botón o tecla, la
misma se repite indefinidamente a una frecuencia específica, la cual puede
ser variada fácilmente como lo demostraremos a continuación.
Antes de empezar, veamos la sintaxis de la instrucción Button:
Button
Sintaxis: Button pin, estado, retardo, rango, variable, acción, etiqueta
La instrucción “Button” elimina los rebotes de un “pulsador” o “switch”, y
genera auto-repetición.
Pin: especifica el pin del puerto en el cual será conectado el pulsador.
Estado: indica cual es estado lógico que debe ocurrir cuando el pulsador es
presionado (0 o 1). Si es 0, el pulsador deberá ser activo-bajo y si es 1, el
pulsador deberá ser activo-alto (Ver figura 5.19).
76