Vous êtes sur la page 1sur 331

Prlogo

Emprender el estudio de microcontroladores para el desarrollo de proyectos


electrnicos que sean la base para nuevas ideas es el objetivo primordial de
esta primera edicin, en la cual nos hemos concentrado en dar al lector
algunas herramientas fundamentales con las cuales esperamos abrir un
campo de conocimiento en la electrnica de control, a travs de un sin
numero de posibilidades de diseo a partir de una serie de ejemplos prcticos
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
ms popular de toda la serie, el PIC16F84, que ser utilizado en este libro
para estudiar algunas de sus caractersticas a travs del desarrollo de
actividades que en principio no requieren un nivel de conocimiento elevado y
a travs del cual daremos los pasos necesarios para adentrarnos en las
gamas mas altas, de las que se ha seleccionado el microcontrolador
PIC16F877 para la realizacin de proyectos electrnicos de nivel medio y
avanzado, y en los que podremos manejar dispositivos perifricos que le dan
un gran valor agregado a cada uno de nuestros proyectos y abren
posibilidades de desarrollo muy interesantes al lector.
Adems, hemos considerado proporcionar la informacin adecuada referente
a las herramientas de desarrollo ms importantes en la actualidad, para
programacin en lenguaje Basic para microcontroladores PIC. En esta
ocasin 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 programacin de microcontroladores una tarea
fcil y muy productiva a la hora de desarrollar proyectos que involucren
perifricos como
pantallas LCD, teclados matriciales, sensores de
temperatura, presin, gas, humedad, memorias de datos entre otros, y donde
una de las caractersticas ms relevantes es el considerable ahorro de
tiempo, lo que se traduce en efectividad y menos lneas de programa, de tal

manera que el diseador puede prestar mayor atencin a los detalles,


logrando as perfeccionar su desempeo 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 pgina oficial de
PicallW, de Boban Dobaj, Diseador. Este programador soporta una gran
cantidad de modelos de las series 12, 16 y 18 de Microchip. Su construccin
es sumamente sencilla y de muy bajo costo, adems 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 captulo contiene teora sobre la cual se pretende estudiar el
funcionamiento de los microcontroladores y perifricos conectados a l. Para
ello hemos desarrollado una serie de prcticas en las que el lector deber
hacer montajes de circuitos en base a los diagramas esquemticos siguiendo
las instrucciones y leyendo detenidamente los comentarios de cada lnea de
programa.
Esperamos con esto proporcionar al lector una base slida de conocimientos
para el desarrollo de proyectos electrnicos, proyectos de robtica y todo
aquello que represente una innovacin cientfica en este campo.
Finalmente, el agradecimiento para todos nuestros colaboradores en la
edicin de esta publicacin, quienes se han encargado de revisar cada
detalle, proyectos e ideas plasmadas en cada capitulo.
Ingeniero en Informacin, Maria del Carmen Lara T.
Ingeniero en Electrnica, Jess Frank Phorlakis.
Tcnico Superior en Electricidad, Ral Mastropasqua.

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
tecnologa tipo RISC (Reduced Instruction Set Computer) y poseen en su
arquitectura interna caractersticas especiales que varan segn el modelo de
PIC que deseamos utilizar.
Podramos decir que estos dispositivos se asemejan a una computadora pero
de tamao 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),
comunicacin serie I2C, entre otros.
Con todas estas caractersticas es lgico pensar que este dispositivo pasa a
ser el corazn del circuito a ser controlado. Esto significa que el
microcontrolador es el encargado de dirigir todos los procesos de un circuito
electrnico, en base a las instrucciones de programa o rutinas que definen
funciones especficas de control, donde las mismas sern realizadas en
lenguaje Basic para microcontroladores PIC. Es por esta razn que
consideramos muy importante estudiar la arquitectura interna del
microcontrolador que se desea programar y aunque esta tarea pueda parecer
difcil, el Lenguaje Basic para microcontroladores PIC la hace sumamente
sencilla.
El diseo de programas para microcontroladores PIC va acompaado
normalmente con un previo estudio del diseo del hardware que har que
nuestros proyectos se pongan en marcha. Es decir, resulta absolutamente
necesario saber cual ser la funcin especfica 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. Tambin podemos destinar un puerto completo
21

del microcontrolador para el control de dispositivos perifricos como pantallas


LCD, teclados, motores paso a paso, leds, servomotores entre otros. De ah la
importancia de establecer cual ser la funcin de cada puerto del
microcontrolador PIC elegido para nuestros proyectos.
Otra decisin 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 especficas de diseo.

Figura 3.1.

Los microcontroladores PIC comnmente ms utilizados son los siguientes:

PIC12C508 y PIC12C509, tienen memoria de programa EPROM,


oscilador interno, y son muy utilizados en diseos de pequeos
circuitos.

PIC16F84A, tiene memoria de programa tipo FLASH, oscilador


externo, 13 pines I/O entre otras caractersticas que estaremos
estudiando a lo largo del contenido de esta obra. Este PIC ha
resultado ser uno de los ms populares de toda la serie.

PIC16F87X, incluyen un gran nmero de mejoras en comparacin


con el PIC16F84, debido principalmente a que cuentan con un
numero de pines I/O superior a ste, adems de otras
caractersticas relevantes. Por ejemplo, con esta serie de
microcontroladores contamos con una mayor capacidad en cuanto
a memoria de programa y memoria de datos.

22

PIC18F4XX, estos microcontroladores resultan muy tiles cuando


deseamos disear proyectos ms avanzados.

Cada uno de estos microcontroladores cuenta con una completa hoja de


datos que puede ser descargada de la pgina oficial de Microchip:
http://www.microchip.com
Estas caractersticas influyen directamente al momento de decidir que modelo
de microcontrolador PIC deseamos utilizar en nuestros proyectos, segn sea
el objetivo de diseo del circuito que deseamos realizar.
El microcontrolador PIC16F84 es uno de los microcontroladores ms
populares y en algunos casos, el preferido por estudiantes para dar inicio al
estudio de la programacin de microcontroladores, seguido del PIC16F877 el
cual posee ms recursos importantes que estaremos estudiando a
continuacin.
Antes de empezar a revisar todo lo referente a la programacin de
microcontroladores PIC, consideramos importante recordar algunas de las
caractersticas de stos dispositivos, para tener una base de conocimientos
bsicos para poder realizar un programa de control de un diseo
completamente personalizado.
Para empezar,
PIC16F84:

veamos

algunas

caractersticas

del

microcontrolador

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 operacin de hasta 20 Mhz.
Cuatro fuentes de interrupcin.
Posee 13 pines I/O (pines de entrada o salida).

23

Diagrama de pines del PIC16F84:

Figura 3.2.

PIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Identificacin
RA2
RA3
RA4/TOCKI
MCLR
Vss
RB0/INT
RB1
RB2
RB3
RB4
RB5
RB6
RB7
Vdd
OCS2/CLKOUT
OSC1/CLKIN
RA0
RA1

Descripcin del Pin


Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Reset y entrada de voltaje de programacin.
Pin de Alimentacin a Tierra (GND)
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Alimentacin de 5Vdc
Salida del oscilador a cristal.
Entrada del oscilador a cristal o fuente externa de reloj.
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Tabla 3.1

24

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 segn convenga al momento de disear un circuito de
control.
Los pines correspondientes al oscilador (OSC1 y OSC2) y al reset (MCLR)
deben ser siempre tomados en cuenta en el diseo 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 adems, define la velocidad a la cual va a trabajar. Para hacer funcionar
nuestro diseo podemos elegir entre las siguientes cuatro opciones:

Oscilador LP: Oscilador de bajo consumo (Low Power).


Oscilador XT: Cristal / Resonador.
25

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 cermicos vienen dados segn la tabla que
se muestra a continuacin:

Modo
LP
XT
HS

Frecuencia
32 kHz
200 kHz
2 MHz
4 MHz
4 MHz
10 MHz

Osc1/CLKin
68 - 100 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF

Tabla 3.2

26

Osc2/CLKout
68 - 100 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF

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 alimentacin de 5 Vdc y medir


la seal de salida del oscilador XT con un osciloscopio, en el pin 15
(Osc2/CLKout) del microcontrolador, podremos ver la onda generada bajo los
siguientes parmetros de medicin seleccionados en el equipo:

Voltios/Div: 200mV
Time/Div: 100ns

Figura 3.6.

27

La lectura de la frecuencia y perodo en este caso sera la siguiente:

Frecuencia: 3,972 Mhz


Perodo: 251,71 ns

Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines, de los
cuales solo tres estn 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 parmetros de medicin seleccionados en un
osciloscopio:

Voltios/Div: 2V
Time/Div: 100ns

28

Figura 3.8.

La lectura de la frecuencia y perodo en este caso sera la siguiente:

Frecuencia: 3,999 Mhz


Perodo: 250,013 ns

El oscilador externo en modo RC resulta ser el ms sencillo de todos y por


ende el ms econmico. Su configuracin lo hace menos preciso debido a
que existe una tolerancia de error en sus componentes, sin olvidar tambin
que la temperatura puede afectar la operacin de este tipo de oscilador.
Los valores recomendados para este oscilador son los siguientes:

5 Kohm R1 100 Kohm


C1 > 20 pF

29

Figura 3.9.

3.3. Circuito de Reset: El Pin denominado MCLR (Master Clear), siempre


debe ser tomado en cuenta cuando se disea un circuito con
microcontroladores PIC. A travs de este Pin se podr reiniciar el dispositivo,
si a ste se le aplica un nivel lgico bajo (0V), por lo tanto resulta importante
destacar que para que un programa cargado en un microcontrolador se
mantenga en ejecucin, el Pin MCLR debe estar siempre en un nivel lgico
alto (5V).
Si deseamos tener control externo del reset de un microcontrolador PIC,
debemos considerar el circuito de la figura 3.10:

30

Figura 3.10.

Este circuito permite reiniciar el microcontrolador cada vez que el pulsador P1


es presionado.

3.4. Consideraciones tcnicas de diseo:


A continuacin veremos algunos circuitos bsicos que deben ser tomados en
cuenta para el desarrollo de prcticas con microcontroladores PIC. Estos
circuitos son muy tiles cuando deseamos visualizar el resultado de una
accin programada en el microcontrolador.
3.4.1. Estado Lgico de un pin I/O:
Una manera muy sencilla de ver el estado lgico de un pin configurado como
salida en cualquiera de los puertos de microcontrolador es a travs del uso de
LEDs, como se observa en los circuitos de la figura 3.11.
31

En el primer circuito, el LED se iluminar solo cuando el estado lgico 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 lgico 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 lgico de un pin especfico, en cualquiera de
los puertos de un microcontrolador, una forma bsica de visualizar este
cambio es a travs del uso de LEDs.

32

3.4.2. Lectura de un estado lgico en un pin I/O:


El microcontrolador tambin nos permite capturar datos o seales externas
para luego ser procesadas y convertidas en respuestas que pueden definir
una accin especfica en nuestros circuitos de prueba. Un ejemplo comn
podra ser el uso de un pulsador para hacer destellar un led cada vez que
ste sea presionado.
Si deseamos introducir un nivel lgico bajo (0V), o alto (5V), a una de las
entradas de un microcontrolador a travs de un pulsador, podramos
considerar los circuitos de la figura 3.12, los cuales nos proporcionan dos
formas diferentes de hacerlo:

Figura 3.12.

33

El primer circuito en la figura 3.12 mantiene un nivel lgico alto (5V) mientras
el pulsador permanece abierto. Al presionar el pulsador, el nivel lgico en el
pin I/O del puerto pasa a ser bajo (0V).
El segundo circuito de la figura 3.12 mantiene un nivel lgico bajo (0V)
mientras el pulsador permanece abierto. Al presionar el pulsador, el nivel
lgico 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 electrnicos digitales con etapas de manejo de potencia o con otros
circuitos.
Este componente en una de sus versiones, se compone bsicamente de un
diodo LED el cual se encarga de iluminar un fototransistor, para que ste
conduzca corriente a travs del colector.

Figura 3.13.

34

En la configuracin de la figura 3.13, cuando en el pin I/O aplicamos un 1


lgico (5V), el LED del opto-acoplador enciende y el fototransistor conduce la
corriente a tierra; por lo tanto, en la salida tendremos un 0 lgico (0V).
Si apagamos el LED, el transistor no conduce, de tal manera que en la salida
tendremos un 1 lgico (5V).
En la configuracin de la figura 3.14, cuando en el pin I/O aplicamos un 1
lgico (5V), el LED del opto-acoplador enciende y el fototransistor conduce
para poner en la salida un 1 lgico (5V). Mientras haya un 0 lgico en la
entrada, el fototransistor permanecer abierto entre el emisor y colector,
dando como resultado un 0 lgico (0V) en la salida.

Figura 3.14.

Una configuracin muy comn para el control de dispositivos de potencia


como motores elctricos, 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

travs del cual circular la corriente necesaria entre sus contactos, para hacer
funcionar cualquiera de estos dispositivos de potencia.

Figura 3.15.

36

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 diseo sencillo que podemos implementar en todos los
proyectos propuestos. En la figura 3.16 se puede observar el diseo de una
fuente regulada con salidas de voltaje de +5 Vdc y +3.3 Vdc:

Figura 3.16.

37

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 comprensin del mismo ante otros
programadores que deseen realizar mejoras a ste, es necesario establecer
una estructura que nos permita identificar fcilmente cada una de las partes
que lo componen.

D
Figura 4.1.

En la figura 4.1 se puede observar la estructura bsica de un programa hecho


en Microcode Studio, y en la cual hemos identificado las cuatro secciones que
consideramos ms importantes para lograr un programa bien estructurado.

38

Seccin A: Corresponde al encabezado del programa, en el cual se debe


considerar informacin bsica del mismo, como el nombre, la identificacin
de autor, Copyright, fecha de elaboracin o fecha de los ltimos cambios
realizados, versin del programa que se est realizando, e incluso una breve
descripcin acerca del objetivo del programa y su aplicacin en un
determinado circuito electrnico.
Es importante resaltar que cada lnea del encabezado debe empezar con una
comilla simple, en forma de comentario (ver Seccin D).
Seccin B: Esta seccin 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 sern programadas.
Las etiquetas identifican puntos especficos o subrutinas dentro de un
programa. Son definidas por el programador y deben tener al final de cada
una de ellas el smbolo de dos puntos, que definen el final de la misma.
Seccin C: Estar destinada para las instrucciones de programa y la misma
est separada de la columna cero del editor de texto por una tabulacin, es
decir, cuando el cursor se encuentra en la columna cero, presionamos una
vez la tecla TAB, y de esta manera establecemos un espacio mnimo,
siempre igual o superior entre la seccin B y C.
Seccin D: Esta destinada para realizar comentarios acerca de la funcin que
estar cumpliendo una instruccin especfica en nuestro programa. Cada
comentario debe empezar siempre con una comilla simple como se muestra a
continuacin:
' Define el Oscilador para un Cristal
' de 4 Mhz.

Cuando un comentario es demasiado extenso, podemos continuar el mismo


en la siguiente lnea, siempre que la frase comience con su respectiva comilla.

39

Los comentarios ayudan al diseador a identificar cada lnea de programa o


cada una de las funciones de cada subrutina, garantizando as una buena
documentacin 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 especfica. 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:

Etiqueta

For Z = 0 To 9
LED = Encendido
Pause 1000
LED = Apagado
Pause 1000
Next Z
GoTo Inicio
End

Subrutina

40

4.3.- Componentes y operadores en PicBasic.


PIC Basic cuenta con una serie de herramientas de programacin entre las
cuales podemos mencionar las etiquetas, variables, identificadores,
constantes, comentarios, smbolos 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 facilitarn el trabajo
considerablemente.

4.3.1.- Define: La directiva Define resulta muy importante en la


programacin de microcontroladores con PicBasic, ya que establece una
serie de parmetros que de no ser tomados en cuenta, causar que nuestros
programas sencillamente no funcionen en la mayora de los casos.
Esta serie de parmetros estn 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 parmetros para el uso de
dispositivos como pantallas LCD, donde se debern definir los puertos de
conexin para el bus de datos y bus de control. As mismo ocurre para el caso
de las comunicaciones seriales o I2C, donde los parmetros tambin deben
ser definidos. Veamos a continuacin la tabla de parmetros para el uso de la
instruccin Define.

41

Parmetro

Descripcin

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 {lneas}

Nmero de lneas de la LCD (1,2 o 4)

I2C_SCLOUT 1

Interface de Reloj I2C Bipolar


Cuando en la transferencia es utilizado un
oscilador mas lento que 8 Mhz.

I2C_SLOW 1

Tabla 4.1.

4.3.2.- Variables: En las variables podemos almacenar datos temporalmente,


los cuales podrn ser consultados o modificados cada vez que sea necesario.
Regularmente la definicin de variables se hace al inicio del programa y para
ello se utiliza la palabra VAR seguida por el tipo de variable segn la tabla
que mostramos a continuacin:

Nombre de
la Variable
A1
Temp
dig1

VAR
Var
Var
Var

Tipo de
Variable
Bit
Byte
Word

Descripcin
Toma los valores 0 y 1 unicamente
Toma valores entre 0 y 255 (8 bits)
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 segn el tipo de dato que se desea almacenar temporalmente.

42

4.3.3.- Arrays: Las variables Arrays tienen un determinado nmero de


elementos, definido segn el tamao 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 travs de un ndice. Este ndice se especfica 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 segn el modelo del mismo.

43

4.3.4.- Constantes: Ayudan a identificar un valor constante en nuestro


programa, facilitando an ms la comprensin 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
Constante
Temp_Max
Temp_Min

CON
CON
CON

Valor de la
Constante
150
55

Tabla 4.3.

4.3.5.- Smbolos o Alias: Proveen un nombre nico y especfico a elementos


o variables dentro de nuestro programa. Para definir un smbolo, utilizamos la
palabra Symbol, seguida del alias del elemento, el smbolo de igualdad =, y
por ltimo el elemento en cuestin:
Symbol

{alias}

{elemento}

Por ejemplo, si deseamos controlar un motor DC a travs de uno de los pines


del puerto A de un microcontrolador, resultara 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

4.3.6.- Operadores Aritmticos: Entre los operadores aritmticos ms


utilizados tenemos los que se muestran en la siguiente tabla:
Operador
+
*
/
//
<<

Descripcin
Suma
Resta
Multiplicacin
Divisin
Residuo
Desplaza a la Izquierda

Operador
ABS
SIN
COS
MIN
MAX
REV

>>

Desplaza a la Derecha

DIG

Asignacin de Valores

Descripcin
Valor Absoluto
Seno del Angulo
Coseno del Angulo
Minimo de un nmero
Mximo de un nmero
Invertir un Bit
Valor de un digito para un
nmero decimal

Tabla 4.4.

4.3.7.- Operadores Binarios: En la siguiente tabla veremos los operadores


binarios proporcionados para el Lenguaje PicBasic:
Operrador
&
|
^

Descripcin
AND Lgico
OR Lgico
XOR Lgico

NOT Lgico
NAND Lgico
NOR Lgico
NXOR Lgico

&/
|/
^/

Tabla 4.5.

Con estos operadores resulta muy sencillo realizar operaciones binarias,


como lo demuestra el siguiente ejemplo:
Si aplicamos una AND lgica, donde deseamos filtrar los siete bits ms
significativos del valor almacenado en la siguiente variable:
Var1 = %00101001
Entonces,
Var1 = Var1 & %00000001

45

El resultado de esta operacin es Var1 = %00000001


4.3.8.- Operadores de Comparacin: Los operadores de comparacin
normalmente son utilizados con la instruccin IfThem para realizar
comparaciones entre variables o datos extrados de alguna operacin
aritmtica.
Operador
=
<>
<
>
<=
>=

Descripcin
Igual
Diferente
Menor que
Mayor que
Menor o igual que
Mayor o igual que
Tabla 4.6.

4.3.9.- Operadores Lgicos: Los operadores lgicos son utilizados para


establecer condiciones entre variables y son utilizados de la misma manera
que los operadores de comparacin.
Operador
AND
OR
XOR
NOT
NOT AND
NOT OR
NOT XOR

Descripcin
AND Lgico
OR Lgico
XOR Lgico
NOT Lgico
NAND Lgico
NOR Lgico
NXOR Lgico
Tabla 4.7.

Ejemplo:
If Var1 = 1 and Var2 = 3 And Var3 = 5 Then Goto inicio
La condicin saltar a la etiqueta inicio solo si se cumplen las tres
condiciones.

46

Primeros Programas con el PIC16F84

Capitulo V

Para aprender a programar un microcontrolador resulta importante dar inicio


al tema con ejemplos prcticos y sencillos, que nos ayuden a comprender el
funcionamiento de la arquitectura del PIC y las instrucciones de programa que
se estn empleando.
El primer paso entonces ser realizar el montaje del circuito con base en los
conocimientos adquiridos en las pginas anteriores. Se debe tomar en cuenta
que aunque en los diagramas de los circuitos que se muestran a continuacin,
no estn presentes los pines de alimentacin Vcc y Gnd, stos deben ser
conectados debidamente a la fuente de alimentacin de 5 Voltios.
A medida que se van proponiendo ejemplos de aplicacin prctica, estaremos
estudiando la sintaxis de las instrucciones empleadas en cada proyecto para
facilitar la comprensin general de ste, referente a la programacin y diseo
electrnico.
5.1.- Proyecto #1: A continuacin realice el montaje de la figura 5.1, en base
al cual realizaremos la programacin necesaria para encender dos Leds
conectados a los puertos del microcontrolador:

Figura 5.1.

47

Proyecto # 1
Componentes
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc

Cantidad
1
1
2
2
2
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 lgico
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 configuracin
de puertos, los cuales para el caso especfico del PIC16F84 son dos:
TrisA (registro de configuracin I/O del puerto A), es un registro de 8 bits, de
los cuales los tres ms 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

Un ejemplo de configuracin de los pines I/O del puerto A es el siguiente:

Registro TrisA
1
1
1

RA4 RA3 RA2 RA1 RA0

Bit menos
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 configuracin en Binario), :

TrisA = $1E ($ para expresar la configuracin 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

RB7 RB6 RB5 RA4 RA3 RA2 RA1 RA0

Bit menos
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

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 estarn en uso como
entrada, ya que de esta forma podemos evitar daos en el hardware interno
del microcontrolador al experimentar con ste en un tablero de pruebas.
La configuracin en PicBasic para el registro TrisB, ajustada al ejemplo de la
figura 5.3 sera entonces la siguiente:
TrisB = %11111110 (si se desea hacer la notacin en binario), :
TrisB = $FE (si se desea hacer la notacin 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
funcin que cumple cada instruccin. Esta informacin puede ser
complementada en el captulo XV, en el cual encontrar la descripcin de
cada una de las instrucciones utilizadas en cada proyecto planteado en esta
edicin.

Sintaxis de las Instrucciones empleadas en el programa:

HIGH
Sintaxis:

HIGH pin

La instruccin High pone en uno lgico un pin I/O especfico.

50

LOW
Sintaxis:

LOW pin

La instruccin LOW coloca en cero lgico un pin I/O especfico.

GOTO
Sintaxis:

GOTO etiqueta

La instruccin Goto contina la ejecucin de un programa a partir de la


etiqueta especificada (Esta instruccin no tiene retorno).

PAUSE
Sintaxis:

PAUSE periodo

La instruccin 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 (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

51

TRISA = %11110
' Configuracin el Puerto A
TRISB = %11111110 ' Configuracin el Puerto B
PORTA = 0
PORTB = 0
Inicio:

' Inicializa el puerto "A", es decir,


' se ponen todos los pines en cero.
' Inicializa el puerto "B".
' Etiqueta de Inicio del programa

High PORTA.0
Pause 1000

' Enciente el Led conectado en el pin RA0


' Hace una pausa de 1000 milisegundos = 1
' Seg.

Low PORTA.0
Pause 1000

' Apaga el Led conectado en el pin RA0


' Hace una pausa de 1000 milisegundos = 1
' Seg.

High PORTB.0
Pause 1000

' Enciente el Led conectado en el pin RB0


' Hace una pausa de 1000 milisegundos = 1
' Seg.

Low PORTB.0
Pause 1000

' Apaga el Led conectado en el pin RB0


' Hace una pausa de 1000 milisegundos = 1
' Seg.

GoTo Inicio

' Salta a la etiqueta "Inicio" y se repite el


' proceso.

End

La instruccin High se encarga de poner un nivel lgico alto en el pin


especificado seguidamente. En este caso, primero se escribe el puerto y
seguido de un punto, se especifica el nmero del pin en el puerto que
deseamos utilizar.
La instruccin Low es responsable en este caso de poner el pin
especificado en un nivel lgico bajo. Al igual que en la instruccin High, se
debe especificar el puerto y el pin del puerto a ser utilizado.
La instruccin GoTo realiza un salto hacia una etiqueta especfica; en este
caso el programa salta a la etiqueta Inicio para empezar de nuevo todo el
proceso.

52

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
Proyecto1.pbp (figura 5.4).

programa,

hemos

designado

el

nombre

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

Compilar

Compilar y
Grabar en
el PIC

Modelo
del uC.

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 posicin indicada por la figura 5.6.

54

Antes de programar el microcontrolador, tambin resulta conveniente verificar


los fusibles de programacin, accediendo al botn Config, el cual puede ser
visualizado en la figura 5.6.
En esta seccin se debe configurar el tipo de oscilador utilizado en nuestro
circuito, as como otras opciones disponibles que comentaremos a
continuacin (ver figura 5.7).

Figura 5.7.

En la figura 5.7 se pueden observar tres secciones llamadas Oscillator,


Hardware y Protection:

En la seccin Oscillator, debemos seleccionar el tipo de oscilador


utilizado en nuestro circuito electrnico, el cual en este caso es del tipo
XT, debido a que el cristal que hemos elegido es de 4 Mhz.

En la seccin Hardware es posible activar el temporizador Perro


Guardin, el cual se encarga de reiniciar el microcontrolador en caso
de fallas o bloqueos en el programa. Para utilizar el Watchdog es
necesario disear el programa bajo ciertos parmetros, 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 completara su conteo y se
desbordara, provocando un Reset del sistema.

55

En la seccin Hardware tambin disponemos de la opcin 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 seccin Protection, tenemos la posibilidad de proteger el cdigo


de programa almacenado en la memoria del microcontrolador.

Finalmente hacemos clic en el botn Program (ver figura 5.6), para


descargar el programa Proyecto1.hex en el microcontrolador;
inmediatamente se podr ver el proceso de grabacin y verificacin 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 modificacin a un programa para
obtener siempre mejores resultados sobre el objetivo propuesto en cada
actividad.

56

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 conexin del circuito elctrico que deber ser montado.

Figura 5.9.

Proyecto # 2
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc

Cantidad
1
1
2
8
8
1

Tabla 5.2.

57

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. Tambin existen otras formas de poner un 1 o un
0 lgico 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 configuracin en hexadecimal:


PORTB = $AA

' RB7 = 1, RB5 = 1, RB3 = 1, RB1 = 1


' RB6 = 0, RB4 = 0, RB2 = 0, RB0 = 0

Recordemos que el smbolo % expresa la notacin en binario, por lo cual se


deben expresar los ocho bits a ser cargados en el registro PortB. Otra forma
de expresar este ejemplo sera colocando la notacin en hexadecimal con el
smbolo $, seguido del valor calculado.
Basados en esta informacin podemos lograr encender y apagar varios leds
simultneamente 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 (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************

58

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

5.3.- Proyecto #3: Los pines en los puertos de un microcontrolador pueden


ser configurados tambin 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 configuracin 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 continuacin.

Figura 5.10.

Proyecto # 3
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Tabla 5.3.

60

Cantidad
1
1
2
1
1
1
1
1

IF THEM ELSE
Sintaxis:

If expresin 1 {AND / OR expresin 2} Then etiqueta

Con la instruccin If Them podemos tomar decisiones a lo largo de un


programa, basadas en condiciones especficas 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 (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 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 condicin 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 instruccin IF la cual genera un resultado siempre que la
condicin planteada se cumpla, y para lo cual debemos utilizar
necesariamente su complemento Then seguido de la accin a ser tomada.

61

En este caso si el pulsador ha sido activado, entonces RA0 = 1, es decir, se


cumple la condicin 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 dgito decimal en un Display de siete segmentos.

Figura 5.11.

62

Proyecto # 4
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Display de 7 Segmentos - Ctodo comn
Fuente regulada de 5 Vdc

Cantidad
1
1
2
8
8
8
1
1

Tabla 5.4.

En el diagrama esquemtico de la figura 5.11 se pueden observar ocho


pulsadores normalmente abiertos, los cuales una vez activados generan un
estado lgico alto en el puerto seleccionado (puerto B), el cual ha sido
configurado como entrada.
El display de 7 segmentos de ctodo comn, 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 bsica 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 (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************

63

Define Osc 4

TRISB = $FF
TrisD = $00

' Define el Oscilador para un Cristal


' de 4 Mhz.

' Configura el Puerto B como Entrada


' Configura el Puerto D como Salida

Inicio:
'
'
'
'

A continuacin se verifica cada pin del puerto B,


si hay un 1 lgico en alguna de las entradas el
puerto D se actualiza con el dato correspondiente
para generar en el Display un dgito decimal.

' gfedcba
' |||||||
If PORTB.0 = 1 Then PortD = %00111111

' Enciende los segmentos correspondientes


' al dgito cero en el display.

If PORTB.1 = 1 Then PortD = %00000110

' Enciende los segmentos correspondientes


' al dgito uno en el display.

If PORTB.2 = 1 Then PortD = %01011011

' Enciende los segmentos correspondientes


' al dgito dos en el display.

If PORTB.3 = 1 Then PortD = %01001111

' Enciende los segmentos correspondientes


' al dgito tres en el display.

If PORTB.4 = 1 Then PortD = %01100110

' Enciende los segmentos correspondientes


' al dgito cuatro en el display.

If PORTB.5 = 1 Then PortD = %01101101

' Enciende los segmentos correspondientes


' al dgito cinco en el display.

If PORTB.6 = 1 Then PortD = %01111101

' Enciende los segmentos correspondientes


' al dgito seis en el display.

If PORTB.7 = 1 Then PortD = %00000111

' Enciende los segmentos correspondientes


' al dgito siete en el display.

GoTo Inicio

' Salta a la etiqueta "Inicio"

End

64

5.5.- Proyecto #5: En el ejemplo a continuacin 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
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Resistencia de 220 Ohm
Display de 7 Segmentos - Ctodo comn
Fuente regulada de 5 Vdc

Tabla 5.5.

65

Cantidad
1
1
2
8
1
1

FOR NEXT
Sintaxis:
For variable = inicio to final
*
*
Instrucciones
*
*
Next { variable}

{step {-} incremento}

La instruccin ForNext se encarga de hacer repeticiones de instrucciones


que permanecen dentro del lazo For Next.
El parmetro Step afecta el incremento segn el valor asignado despus de
esta palabra. Si este parmetro es omitido, el incremento es en una unidad.
Analice el siguiente programa:
'****************************************
'* Nombre
: Proyecto5.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
Define Osc 4

I Var Byte

' Define el Oscilador para un Cristal


' de 4 Mhz.
' Declaracin de la Variable "I" tipo Byte

' Constantes para definir cada dgito decimal en el Display:

Cero
Uno
Dos
Tres
Cuatro
Cinco
Seis
Siete

CON
CON
CON
CON
CON
CON
CON
CON

' gfedcba
' |||||||
%00111111
%00000110
%01011011
%01001111
%01100110
%01101101
%01111101
%00000111

66

Ocho
Nueve

CON %01111111
CON %01100111

' Configuracin del Puerto de Salida:


TrisD = $00

' Configura el Puerto D como Salida

Inicio:
For I = 0 To 9

' Repeticin 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:
' Verificacin del dgito a ser mostrado en el Display el cual
' se corresponde con el valor almacenado en la variable "I".
If
If
If
If
If
If
If
If
If
If

I
I
I
I
I
I
I
I
I
I

=
=
=
=
=
=
=
=
=
=

Return
End

0
1
2
3
4
5
6
7
8
9

Then
Then
Then
Then
Then
Then
Then
Then
Then
Then

PortD
PortD
PortD
PortD
PortD
PortD
PortD
PortD
PortD
PortD

=
=
=
=
=
=
=
=
=
=

cero
Uno
dos
tres
cuatro
cinco
seis
siete
ocho
nueve

' Retorna una lnea despus del salto con retorno (Call)

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 ms 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

For I = 0 To 9 Step 2

' Repeticin 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


podrn ver los dgitos: 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

' Repeticin 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 instruccin capaz de generar
tonos DTMF (Dual Tone Multifrecuency - Multifrecuencia de doble tono), tonos
que se utilizan en telefona para marcar una serie de nmeros y as poder
establecer la comunicacin entre dos o ms personas. Una aplicacin
interesante para esta instruccin podra ser el discado de nmeros telefnicos
en sistemas de alarma cuando ha sido activado un dispositivo de supervisin,
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
continuacin, el cual genera tonos DTMF consecutivos de una serie de dgitos
predefinidos. Es muy importante considerar que para generar los tonos
adecuadamente el oscilador externo debe ser de 10 Mhz o superior.

68

Figura 5.13.

Proyecto # 6
Componente
PIC16F84A
Cristal de 10 Mhz
Capacitor cermico de 33 pF
Capcitor Electroltico de 10 uF
Parlante de 8 Ohm
Fuente regulada de 5 Vdc

Cantidad
1
1
2
2
1
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 dgitos de un teclado telefnico, como se puede observar en la
segunda columna de la misma tabla.
Esto quiere decir que si generamos las frecuencias correspondientes al dgito
1 utilizando la instruccin DTMFout, obtendremos las mismas frecuencias
baja y alta que se generan al pulsar el dgito 1 de cualquier telfono de tonos
DTMF. Si deseramos generar desde el microcontrolador el tono DTMF

69

correspondiente al dgito 0 de un teclado telefnico, entonces, segn la tabla


5.7, el dgito a introducir en la instruccin DTMFout deber ser el 10.
Dgito en la
Instruccin
DTMFout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0

Dgito en un
Teclado
Telefnico
1
2
3
4
5
6
7
8
9
0
*
#
A
B
C
D

Frecuencias
Bajas

Frecuencias
Altas

697 HZ
697 HZ
697 HZ
770 HZ
770 HZ
770 HZ
852 HZ
852 HZ
852 HZ
941 HZ
941 HZ
941 HZ
697 HZ
770 HZ
852 HZ
941 HZ

1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1633 HZ
1633 HZ
1633 HZ
1633 HZ

Tabla 5.7.

Figura 5.14.

70

Antes de empezar a programar, vamos a verificar la sintaxis de la instruccin


DTMFout:

DTMFout
Sintaxis:

DTMFout pin, {On-ms, Off-ms}, [tono, tono,...tono]

La instruccin DTMFout genera tonos DTMF en secuencia y a travs de un


puerto cualquiera del microcontrolador.

Pin: especifica el pin del puerto en el cual se emitirn los tonos DTMF.
On-ms: es una variable o constante que especifica la duracin de cada tono
en milisegundos. En caso de no utilizar este parmetro, 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 parmetro, 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

Programa en Pic Basic:


'****************************************
'* Nombre
: Proyecto6.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 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
DTMFOut

' Genera una pausa de 2 segundos.

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

Observe que en la primera instruccin DTMFout, despus de la etiqueta


Inicio, no se especifica la duracin de cada tono y el tiempo en silencio entre
cada tono. Esto significa que el microcontrolador genera cada tono con una
duracin 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

Figura 5.16.

La segunda instruccin DTMFout, despus de la etiqueta Inicio, tiene


definido un tiempo de duracin 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

Figura 5.17.

Figura 5.18.

75

5.7.- Proyecto #7: En este proyecto estudiaremos la instruccin Button, la


cual es utilizada para la eliminacin de rebotes en pulsadores o para efectuar
repeticiones en un botn, como sucede en el caso de los teclados de las
computadoras, en las cuales si dejamos presionado un botn o tecla, la
misma se repite indefinidamente a una frecuencia especfica, la cual puede
ser variada fcilmente como lo demostraremos a continuacin.

Antes de empezar, veamos la sintaxis de la instruccin Button:

Button
Sintaxis:

Button pin, estado, retardo, rango, variable, accin, etiqueta

La instruccin Button
genera auto-repeticin.

elimina los rebotes de un pulsador o switch, y

Pin: especifica el pin del puerto en el cual ser conectado el pulsador.


Estado: indica cual es estado lgico 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

Figura 5.19.

Retardo: es una variable o constante (0 255) que especifica cuantos ciclos


deben pasar antes de efectuar la auto-repeticin. Este campo tiene dos
funciones especiales: si el campo retardo es igual 0, no permite anti-rebote y
no permite auto-repeticin. Si el campo retardo es igual a 255, permite el antirebote pero no permite la auto-repeticin.
Rango: es una variable o constante (0 255) que especifica el nmero de
ciclos entre auto-repeticiones.
Variable: es una variable auxiliar tipo Byte, definida tambin al inicio del
programa para uso exclusivo de la instruccin Button, por lo cual no deber
ser utilizada con otro fin en el programa. Siempre debe ser inicializada antes
del comando Button.
Accin: indica el estado del botn cuando ste no es presionado.

77

Etiqueta: la instruccin realiza un salto a la etiqueta definida en este campo


cuando el pulsador no ha sido presionado.

Adicionalmente utilizaremos la instruccin Pulsout en el ejemplo, para


generar pulsos de tiempo definido.

PULSout
Sintaxis:

PULSout pin, nivel, variable

La instruccin PULSout, genera pulsos con una duracin definida en


decenas de microsegundos. (Tiene una resolucin de 10 microsegundos
para un oscilador de 4 Mhz, y una resolucin de 2 microsegundos para un
oscilador de 20 Mhz).

78

Para este proyecto hemos preparado tres ejemplos los cuales estn basados
en el circuito de la figura 5.20.

Figura 5.20.

Proyecto # 7 - 7.1 - 7.2 - 7.3


Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Tabla 5.8.

79

Cantidad
1
1
2
1
1
1

Se puede observar en el diagrama esquemtico, que mientras el pulsador


permanece abierto, hay un cero lgico en el pin RB0, el cual debemos
configurar como entrada en el programa. Cuando el pulsador sea presionado,
el estado lgico en el pin RB0 ser un uno lgico.
La salida a travs de la cual se van a generar los pulsos ser el pin RB1, en el
cual hemos conectado un osciloscopio para poder ver el resultado de las
seales generadas a partir de las especificaciones dadas en cada ejemplo a
continuacin.

5.7.1.- Proyecto #7.1: Para el primer ejemplo, se pide generar un pulso de


1.5 milisegundos una vez presionado el botn. Luego, pasados 20
milisegundos con el botn presionado, debe empezar una auto-repeticin de
este pulso cada 10 milisegundos.

Veamos el siguiente programa:


Define Osc 4
TRISB = %11111101

' Configuracin del puerto B

A Var Byte

' declaracin de la variable A para la instruccin Button.

A = 0
PORTB.1 = 0

' inicializa la variable A


' Inicializa la Salida RB0

Inicio:
Button PORTB.0,1,2,1,A,0,Tiempo
PulsOut PORTB.1,150 ' Genera un pulso de 1.5ms o 150 decenas de
' microsegundos.
Tiempo:
Pause 10
GoTo Inicio

' Pausa de 10 milisegundos


' Salta a inicio

End

80

Ahora analicemos la secuencia del programa:

Mientras el pulsador permanece abierto, la instruccin Button salta a la


etiqueta especificada, la cual en este caso hemos denominado
Tiempo. Seguidamente el programa completa el ciclo ejecutando las
instrucciones que siguen, y finalmente retorna a la etiqueta inicio.

Si es presionado el pulsador, se genera el primer pulso a travs de la


instruccin Pulsout PortB.1, 150 (figura 5.21), y el programa contina
su curso hasta completar el primer ciclo. En este punto la autorepeticin an no comienza, ya que hemos especificado en la
instruccin Button, que sta debe comenzar al terminar el segundo
ciclo:
Button PORTB.0,1,2,1,A,0,Tiempo

Figura 5.21.

81

Al terminar el primer ciclo de programa, han transcurrido los primeros 10


milisegundos. Con el segundo ciclo de programa ocurre nuevamente el salto a
la etiqueta Tiempo, producindose una nueva pausa de 10 milisegundos,
para un tiempo de espera antes de ejecutar la auto-repeticin de 20
milisegundos.

Figura 5.22.

Cumplidos los dos ciclos especificados en el campo retardo de la


instruccin Button, la instruccin empieza la auto-repeticin cada un
ciclo, ya que as lo hemos especificado en el campo rango de la
instruccin:

Button PORTB.0,1,2,1,A,0,Tiempo

82

En la figura 5.22 se puede apreciar la lectura de la seal producida por el


programa al activar el pulsador. Observe que el tiempo entre el primer pulso y
la auto-repeticin es de 20 milisegundos, y que el tiempo entre cada autorepeticin es de 10 milisegundos (figura 5.23).

Figura 5.23.

83

En la figura 5.24 se puede observar la seal generada al activar el pulsador,


en la cual se ve la auto-repeticin del pulso de 1.5 milisegundos, la cual
permanecer hasta que el pulsador sea liberado.

Figura 5.24.

84

5.7.2.- Proyecto #7.2: Para el siguiente ejemplo se pretende generar el


mismo pulso de 1.5 milisegundos indefinidamente cada 20 milisegundos,
siempre y cuando el pulsador permanezca activado.
Analice el siguiente programa:
Define Osc 4
TRISB = %11111101

' Configuracin del puerto B

A Var Byte

' declaracin de la variable A

A = 0
PORTB.1 = 0

' inicializa la variable A


' Inicializa la Salida RB0

Inicio:
Button PORTB.0,1,2,2,A,0,Tiempo
PulsOut PORTB.1,150

' Genera un pulso de 1.5ms o 150 decenas de


' microsegundos.

Tiempo:
Pause 10
GoTo Inicio

' Pausa de 10 milisegundos


' Salta a inicio

End

Observe en el programa que el nico cambio para lograr el objetivo, ha sido


aumentar en una unidad el campo rango de la instruccin Button, lo cual
significa que se deben esperar dos ciclos de programa entre cada autorepeticin para producir el pulso de 1.5 milisegundos.

Button PORTB.0,1,2,2,A,0,Tiempo
La secuencia para este programa es la siguiente:

Mientras el pulsador permanece abierto, al igual que en el ejemplo


anterior, la instruccin Button hace un salto a la etiqueta Tiempo por
cada ciclo de programa.

Cuando activamos el pulsador, se genera el primer pulso de 1.5


milisegundos gracias a la instruccin Pulsout; luego se genera una

85

pausa de 10 milisegundos y finaliza el primer ciclo con un salto a la


etiqueta Inicio. En el segundo ciclo, la instruccin Button verifica el
conteo de los ciclos, el cual es controlado por la variable A,
determinando que an no se puede empezar la auto-repeticin hasta
tanto no haya culminado el segundo ciclo, de tal manera que ocurre
nuevamente el salto a la etiqueta Tiempo, y se produce una nueva
pausa de 10 milisegundos.

Culminados los dos ciclos definidos en el campo retardo de la


instruccin Button para el anti-rebote, se produce el primer pulso de
1.5 milisegundos de la auto-repeticin.

Ahora podemos ver en el osciloscopio (figura 5.25), la seal generada


al activar el pulsador, y en la cual se produce un pulso de 1.5
milisegundos, cada 20 milisegundos.

Figura 5.25.

86

5.7.3.- Proyecto #7.3: En este ejemplo se debe generar un pulso de 2.5


milisegundos, con un tiempo para anti-rebotes en el pulsador de 30
milisegundos, y un tiempo entre cada auto-repeticin de 10 milisegundos.
Analice el siguiente programa:
Define Osc 4
TRISB = %11111101

' Configuracin del puerto B

A Var Byte

' declaracin de la variable A

A = 0
PORTB.1 = 0

' inicializa la variable A


' Inicializa la Salida RB0

Inicio:
Button PORTB.0,1,3,1,A,0,Tiempo
PulsOut PORTB.1,250

' Genera un pulso de 2.5ms o 250 decenas de


' microsegundos.

Tiempo:
Pause 10
GoTo Inicio

' Pausa de 10 milisegundos


' Salta a inicio

End

En este caso se puede observar que los parmetros en la instruccin Button


han sido configurados para que el tiempo en anti-rebote dure tres ciclos de
programa, y para la auto-repeticin un ciclo de programa.
Entonces, la secuencia de programa es la siguiente:

Al activar el botn, se genera un pulso de 2.5 milisegundos.

Debido a que el campo retardo en la instruccin Button es igual a


tres, la instruccin ejecutar la auto-repeticin despus de cumplir con
los tres ciclos de programa, pasando por la subrutina Tiempo en cada
ciclo, lo cual da como resultado un retardo de 30 milisegundos.

Al culminar el tercer ciclo de programa, empieza la auto-repeticin,


generando un pulso de 2.5 milisegundos por cada ciclo de programa,

87

es decir, aproximadamente cada 10 milisegundos. La auto-repeticin


se mantiene siempre y cuando el pulsador permanezca activo.

En la figura 5.26 se puede observar la seal generada al activar el pulsador,


al igual que la medicin del tiempo en el pulso generado por la instruccin
Pulsout, igual a 2.5 milisegundos.

Figura 5.26.

88

En la figura 5.27, se puede apreciar el tiempo de espera generado por la


instruccin Button, igual a 30 milisegundos, para evitar los rebotes en el
pulsador. Tambin se puede observar claramente, que una vez culminado
este tiempo, se genera una auto-repeticin del pulso, la cual se mantiene
siempre que el pulsador se encuentre presionado.

Figura 5.27.

89

Observe en la figura 5.28 la medicin del tiempo entre cada auto-repeticin.

Figura 5.28.

90

5.8.- Proyecto #8: En este proyecto estudiaremos la instruccin Branch, con


un ejemplo sencillo basado en el circuito de la figura 5.29, en el cual se debe
iluminar cada Led en forma consecutiva por cada segundo transcurrido.

Figura 5.29.

Proyecto # 8
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc

Tabla 5.9.

91

Cantidad
1
1
2
3
3
1

Branch
Sintaxis:

Branch Variable,[Etiqueta1, Etiqueta2,EtiquetaN]

La instruccin Branch hace un salto a una etiqueta dependiendo del valor de


la variable, es decir, si la variable es igual a 0, el salto se hace a la etiqueta 1;
si la variable es igual a 1, el salto se hace a la etiqueta 2; si la variable es
igual a 2, el salto se hace a la etiqueta 3, y as sucesivamente.

Analice el siguiente programa:


'****************************************
'* Nombre
: Proyecto8.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
I var Byte

' Declaracin de la variable I

TRISB = $00
PORTB = $00

' Configura el puerto B como salida


' Inicializa el puerto B

I = 0

' Inicializa la variable I

Inicio:
Branch I,[Led1,Led2,Led3]

Led1:
PORTB = %00000001
Pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio

'
'
'
'
'

enciende el led en RB0


pause de 1 segundo
apaga el led
suma 1 a la variable I
salta a inicio

PORTB = %00000010
Pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio

'
'
'
'
'

enciende el led en RB1


pause de 1 segundo
apaga el Led
suma 1 a la variable I
salta a inicio

Led2:

92

Led3:
PORTB = %00000100
Pause 1000
PORTB = %00000000
I = 0

'
'
'
'

enciende el led en RB2


pause de 1 segundo
apaga el Led
Inicializa la variable I

GoTo Inicio
End

' salta a inicio

Observe en el programa que a partir de la etiqueta Inicio, la instruccin


Branch hace un salto a la etiqueta especificada segn el valor cargado en la
variable I, que se corresponde con la posicin de la etiqueta que hemos
designado entre los corchetes.
Entonces, si I = 0, la instruccin hace un salto a la etiqueta Led1; si I = 1, la
instruccin hace un salto a la etiqueta Led2; si I = 2, entonces la instruccin
hace un salto a la etiqueta Led3.

93

5.9.- Proyecto #9: La instruccin PWM, puede ser usada para generar
voltajes analgicos implementando el circuito conectado al pin RB0 de la
figura 5.30. A continuacin realizaremos un ejemplo de aplicacin de la
instruccin PWM para generar un voltaje determinado, aplicando una serie de
clculos sencillos.

Figura 5.30.

Proyecto # 9
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Resistencia de 10K Ohm
Capcitor Electroltico de 10 uF
Fuente regulada de 5 Vdc

Tabla 5.10.

94

Cantidad
1
1
2
1
1
1

PWM
Sintaxis:

PWM pin, nivel, ciclo

La instruccin PWM enva pulsos PWM (Pulse Width Modulation) a un pin


especfico.

Pin: especifica el pin del puerto en el cual se genera PWM.


Nivel: es una variable o constante que determina la duracin del pulso en su
nivel alto, es decir, partiendo de nivel = 1, si se incrementa este valor, el
ancho de pulso positivo se incrementa, hasta nivel = 254, donde el ciclo de
trabajo es aproximadamente 100%. Cuando nivel = 0, la salida se mantiene
en cero lgico; cuando nivel = 255, la salida se mantiene en uno lgico.
Ciclo: es una variable o constante en el cual se define el nmero de ciclos en
un pin especfico.
PWM es una abreviacin de Pulse Width Modulation, o modulacin por ancho
de pulso, y es un mtodo utilizado normalmente para el control de velocidad
de motores elctricos, o para regular voltajes en fuentes conmutadas entre
otras aplicaciones. Este control se lleva a cabo modificando el ancho de pulso
o ciclo de trabajo de la seal generada.
En nuestro ejemplo, para generar un voltaje especfico en una de las salidas
de un microcontrolador a travs de la instruccin PWM, podemos aplicar la
siguiente frmula:
Vout =

Vfuente nivel
255

donde,
Vout: voltaje de salida.
Vfuente: voltaje de la fuente de alimentacin del circuito.
Nivel: constante entre 0 y 255.

95

Por ejemplo, si deseamos obtener Vout = 3.5V, entonces,


nivel =

Vout 255 3.5V 255


=
= 178,5 179
Vfuente
5V

El valor a ser cargado en el campo nivel de la instruccin es 179. Al medir el


voltaje en la salida del circuito de la figura 5.30, podemos comprobar que ste
se aproxima al valor deseado de 3.5 voltios.

El programa a ser cargado en el microcontrolador es el siguiente:


DEFINE OSC 4

' Define el oscilador en 4 Mhz

Inicio:
PWM PORTB.0,179,100
GoTo Inicio
End

' Seal PWM


' Salto a inicio

96

Mdulos LCD

Capitulo VI

6.1.- Pantallas LCD: Las pantallas LCD alfanumricas, son las ms utilizadas
hoy en da en el desarrollo de proyectos o equipos electrnicos en los cuales
se hace necesario visualizar mensajes de texto cortos, que proporcionen la
informacin adecuada sobre un evento determinado. Las pantallas ms
comunes suelen ser de 1x16, de 2x16 y de 4x16 (Filas x Columnas). Todas
estas configuraciones tambin se encuentran para 20 columnas y hasta para
40 columnas. Aunque en esta edicin solo estudiaremos el uso de pantallas
alfanumricas, tambin resulta interesante mencionar que existen en el
mercado pantallas grficas (GLCD), como la que se observa en la figura 6.3, y
donde se debe aplicar un mtodo de control diferente al de las pantallas
alfanumricas.

Figura 6.1. Pantalla LCD 2x16.

Figura 6.2.

Pantalla LCD 4x16.

Figura 6.3. Pantalla GLCD (Graphic Liquid Crystal


Display) de 128x64 pixel.

97

6.2.- Identificacin de los pines de una pantalla LCD: Veamos a


continuacin la descripcin de cada uno de los pines de una pantalla LCD:

Figura 6.4. Pinout de un mdulo


LCD con conexin a Vcc, Gnd y
Control de contraste.

Pin 1, 2 y 3: como se puede observar en la figura 6.4, en la mayora de las


pantallas LCD, el Pin No. 1 y 2 corresponden a la alimentacin de la pantalla,
GND y Vcc, donde el voltaje mximo comnmente soportado es de 5 Vdc. El
Pin No.3 corresponde al control de contraste de la pantalla.
Pin 4: "RS" (trabaja paralelamente al Bus de datos del modulo LCD, Pines 7 al
14, es decir, cuando RS es cero, el dato presente en el bus corresponde a un
registro de control o instruccin, pero cuando RS es uno, el dato presente en
el bus corresponde a un registro de datos o caracter alfanumrico.
Pin 5: "R/W" (Read/Write), este pin es utilizado para leer un dato desde la
pantalla LCD o para escribir un dato en la pantalla LCD. Si R/W = 0, esta
condicin indica que podemos escribir un dato en la pantalla. Si R/W = 1, esta
condicin nos permite leer un dato desde la pantalla LCD.
Pin 6: "E" (Enable), este es el pin de habilitacin, es decir, si E = 0 el mdulo
LCD se encuentra inhabilitado para recibir datos, pero si E = 1, el mdulo LCD
se encuentra habilitado para trabajar, de tal manera que podemos escribir o
leer desde el modulo LCD.

98

Pin 7 al14: "Bus de Datos, el Pin 7 hasta el Pin 14 representan 8 lneas que
se utilizan para colocar el dato que representa una instruccin para el modulo
LCD o un carcter alfanumrico.
Pin 15-16: "BackLight", en muchos modelos de LCD, los pines 15 y 16 son
respectivamente el nodo y el Ctodo, aunque se pueden encontrar en el
mercado modelos de pantallas LCD donde esta condicin es configurable
desde la parte posterior del circuito impreso a travs de Jumpers, o
conexiones donde podemos invertir los Pines, de manera tal que el Pin 15 sea
el Ctodo y el Pin 16 el nodo, como se muestra en la figura 6.5.

Figura 6.5.

6.3.- Conexin de una pantalla LCD en Pic Basic: Una pantalla LCD puede
ser conectada a un microcontrolador utilizando los ocho bits del bus de datos
(D0 a D7) o solamente los cuatro bits mas significativos del bus de datos (D4
a D7). Al emplear los ocho bits, estos debern estar conectados en un solo
puerto y nunca en puertos diferentes. Si deseamos trabajar solo con los
cuatro bits ms significativos del bus, estos debern ser conectados en los
cuatro bits menos significativos de un puerto o en los cuatro bits ms
significativos del puerto seleccionado.
Los pines E (Pin 6) y RS (Pin 4) pueden estar conectados en cualquier puerto
del microcontrolador. Por ltimo, el Pin R/W deber estar conectado a tierra
(GND) para indicar a la pantalla LCD que estaremos escribiendo, esto debido
a que estaremos trabajando inicialmente solo con la instruccin Lcdout.

99

Un dato interesante resulta ser el hecho de que las pantallas LCD pueden ser
controladas utilizando dos configuraciones distintas para el bus de datos:

La primera configuracin es a 8 bits de datos, lo cual requiere


que conectemos todos los pines del bus (D0 hasta D7 en la
pantalla LCD), en uno de los puertos disponibles de un
microcontrolador PIC.

La segunda configuracin posible es a 4 bits de datos, lo cual


reduce a la mitad la cantidad de pines a ser utilizados en un
puerto de un microcontrolador PIC, pero sta deber ser definida
al inicio del programa para garantizar que la pantalla funcione
correctamente.

Nota Importante: PIC Basic asume por defecto que el conexionado entre un
mdulo LCD alfanumrico y un microcontrolador, se ha realizado como se muestra
en el diagrama esquemtico de la figura 6.6. En este caso no ser necesario definir
estas conexiones en el programa; sin embargo, es conveniente saber que el
funcionamiento de un programa para el manejo de una pantalla LCD, no se ver
afectado si decidimos definir cada una de las conexiones como se muestran a
continuacin:
DEFINE LCD_DREG

PORTA

' Indica que el Bus de datos estar conectado


' en el Puerto A.

DEFINE LCD_BITS

' El bus de datos de la LCD ser de cuatro bits.

DEFINE LCD_DBIT

' Seleccin del Bit de inicio del puerto en el uC para el


' bus de datos de la LCD

DEFINE LCD_RSREG PORTA

' Indica al uC que el pin RS estar en el Puerto A

DEFINE LCD_RSBIT 4

' RS estar conectado en RA4

DEFINE LCD_EREG

PORTB

' Indica al uC que el pin E estar en el Puerto B

DEFINE LCD_EBIT

' E estar conectado en RB3

Compare estas definiciones con el diagrama esquemtico de la figura 6.6, y


podr notar que las conexiones entre la pantalla LCD y el microcontrolador
PIC coinciden exactamente con cada lnea de programa de la nota anterior.

100

Figura 6.6.

Proyecto # 10
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x4
Resistencia de 1K Ohm
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc

Tabla 6.1.

101

Cantidad
1
1
2
1
1
1
1

Aunque esta configuracin es la que PicBasic asume por defecto, la misma


puede ser cambiada segn convenga, pero siempre tomando en cuenta las
definiciones anteriormente mencionadas; en ellas se especifica la disposicin
de los pines de la pantalla LCD con respecto a su conexin en los puertos del
microcontrolador.

LCDout
Sintaxis:

LCDout comando, dato

La instruccin Lcdout enva datos especficos a una pantalla LCD


Alfanumrica para que puedan ser mostrados en la misma.

La instruccin Lcdout va acompaada de un comando de control el cual


opera segn la tabla 6.2:
Comando
$FE, 1
$FE, 2
$FE, $0C
$FE, $0E
$FE, $0F
$FE, $10
$FE, $14
$FE, $C0
$FE, $90
$FE, $D0

Accin
Limpia la pantalla
Retorna al inicio de la primera lnea
Apaga el Cursor
Cursor bajo (Underline "_") activo
Cursor intermitente activo
Mueve el cursor un espacio a la izquierda
Mueve el cursor un espacio a la derecha
Mueve el cursor al inicio de la segunda lnea
Mueve el cursor al inicio de la tercera lnea
Mueve el cursor al inicio de la cuarta lnea
Tabla 6.2.

Estos comandos son indispensables para especificar en la pantalla LCD la


accin que deseamos tomar. Para el caso especfico de la primera lnea en
una pantalla LCD, bastar solo con escribir la instruccin Lcdout, seguida
del mensaje o variable que se desea mostrar.

102

En la figura 6.7 se muestran las direcciones de cada caracter en las lneas 2,


3 y 4:
Pantalla LCD 16x4
Lnea 1 Lnea 2 $C0 $C1 $C2 $C3 $C4 $C5 $C6 $C7 $C8 $C9 $CA $CB $CC $CD $CE $CF
Lnea 3 $90 $91 $92 $93 $94 $95 $96 $97 $98 $99 $9A $9B $9C $9D $9E $9F
Lnea 4 $D0 $D1 $D2 $D3 $D4 $D5 $D6 $D7 $D8 $D9 $DA $DB $DC $DD $DE $DF
Figura 6.7.

Entonces, para escribir un mensaje en cada lnea de una pantalla LCD,


tenemos que:
Lcdout
"Mensaje Linea
Lcdout $fe,$C0, "Mensaje Linea
Lcdout $fe,$90, "Mensaje Linea
Lcdout $fe,$D0, "Mensaje Linea

1"
2"
3"
4"

Tambin es posible iniciar un mensaje en otra posicin en las lneas 2, 3 y 4,


cambiando la direccin en el comando de control de la instruccin.

6.4.- Proyecto #10. En el siguiente programa se puede ver que no ha sido


utilizado ningn tipo de definicin de parmetros de conexin para los pines
de control entre la pantalla y el microcontrolador, por lo cual se asume que el
conexionado entre ambos dispositivos deber ser igual al planteado en el
diagrama de la figura 6.6.
Realice el montaje y haga modificaciones al programa mostrado a
continuacin, con el fin de comprobar la tabla 6.2.
' Programa en PIC Basic Pro
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

Pause 500
LCDOut $fe, 1
LCDOut $fe, 2
LCDOut

' Limpia la pantalla


' Posiciona el cursor en el inicio
"* Pantalla LCD *"

103

LCDOut $fe,$C0, "* Alfanumerica *"


LCDOut $fe,$90, "* 1234567890 *"
LCDOut $fe,$D0, "* AaBbCcDdEeFf *"
Inicio:
GoTo Inicio
End

' Salta a la etiqueta inicio

Al conectar el circuito de la figura 6.6 y el programa cargado en el


microcontrolador, podremos ver como se despliega en la pantalla LCD de
cuatro lneas, cada frase preestablecida en el programa, como se muestra en
las figuras 6.8 y 6.9.

Figura 6.8.

Figura 6.9.

104

6.5.- Proyecto #11. En el diagrama de la figura 6.10 se puede observar que la


conexin entre el modulo LCD y el microcontrolador ha cambiado con
respecto al proyecto #10, con el fin de utilizar en el programa la definicin de
conexiones anteriormente mencionada.
Para este ejemplo se ha realizado un programa que muestra el valor cargado
en una variable a la cual hemos denominado Dato, y la cual podr ser
incrementada al accionar el pulsador P1 conectado en RB0; el valor de esta
variable tambin podr decrecer al accionar el pulsador P2 conectado en
RB1.
Los puertos han sido configurados de la siguiente manera:

Puerto B: se configura como entrada ya que en los pines RB0 y RB1


estarn conectados los pulsadores P1 y P2.

Puerto D: se configura como salida ya que ste ser utilizado para el


control de la pantalla LCD.

La variable Dato ha sido inicializada con un valor cargado igual a 25. Para
aumentar o disminuir este valor, simplemente se pregunta si en RB0 o en RB1
hay un cambio de estado lgico. Adicionalmente se establecen dos
condiciones que se deben cumplir para que la variable pueda aumentar su
valor o disminuir:

La primera condicin al pulsar P1 para el incremento es: solo podr ser


incrementado el valor cargado en la variable Dato, si sta es menor
(<) a cincuenta (50).

La segunda condicin al pulsar P2 para disminuir el valor cargado en la


variable es: solo se podr disminuir el valor cargado en la variable
Dato si sta es mayor (>) a cero (0).

105

Para mostrar el valor decimal cargado en la variable Dato a travs de la


pantalla LCD, se debe utilizar la directiva Dec o el smbolo # antes de la
variable, como se muestra a continuacin:
Lcdout $fe,$C0,"Dato: ",Dec Dato

' Escribe el mensaje en la lnea 2


' seguido del valor cargado en la
' variable "Dato" en Decimal.

,
Lcdout $fe,$C0,"Dato: ",#Dato

Figura 6.10.

106

Proyecto # 11 - 12
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Cantidad
1
1
2
1
2
1
2
1

Tabla 6.3.
' Programa en Pic Basic Pro:
'****************************************
'* Nombre
: Proyecto11.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

Define Osc 8

' Define el Oscilador para un Cristal


' de 8 Mhz.

TRISB = $FF
TRISD = $00

' Configura el puerto B como entrada.


' Configura el puerto D como salida.

Dato Var Byte

' Declaracin de la Variable "Dato" tipo Byte.

Dato = 25

' Inicializa la Variable Dato = 25.

Lcdout $fe, 1

' Limpia la pantalla

Inicio:

107

Lcdout $fe,2

' Inicio de la primera lnea.

Lcdout "P1 Suma P2 Resta"

' Escribe mensaje en la primera lnea.

Lcdout $fe,$C0,"Dato: ",Dec Dato,"

"

' Escribe el mensaje en la 2da lnea


' seguido del valor cargado en la
' variable "Dato" en Decimal.

' La siguiente instruccin pregunta si hay un "1" en RB0 y si la variable


' "Dato" es menor a 50. Si se cumplen estas dos condiciones, hace un salto
' con retorno a la subrutina "Suma".
If PORTB.0 = 1 And Dato < 50 Then Call Suma
' La siguiente instruccin pregunta si hay un "1" en RB1 y si la variable
' "Dato" es mayor a 0. Si se cumplen estas dos condiciones, hace un salto
' con retorno a la subrutina "Resta".
If PORTB.1 = 1 And Dato > 0 Then Call Resta
GoTo Inicio

' Salta a la etiqueta "Inicio".

Suma:
Dato = Dato + 1
Pause 350

Return

'
'
'
'
'

Incrementa en una unidad la variable "Dato".


Realiza una pausa de 350 milisegundos para evitar
que el incremento de la variable sea muy acelerado
mientras el pulsador "P1" est presionado.
Retorna una lnea despus del llamado "Call Suma".

'
'
'
'
'

Decrementa en una unidad la variable "Dato".


Realiza una pausa de 350 milisegundos para evitar
que el decremento de la variable sea muy acelerado
mientras el pulsador "P2" est presionado.
Retorna una lnea despus del llamado "Call Resta".

Resta:
Dato = Dato - 1
Pause 350

Return
End

Note que en la lnea de programa encargada de imprimir el mensaje Dato: ,


adems del valor cargado en la variable, hay un espacio en blanco entre
comillas ( ) para imprimir en la pantalla:
Lcdout $fe,$C0,"Dato: ",Dec Dato,"

"

Analice la razn por la cual ha sido considerado este espacio en blanco.

108

6.6.- Proyecto #12. En este proyecto nos hemos basado en el diagrama de la


figura 6.10 para efectuar la programacin del microcontrolador.
La idea principal en este ejemplo, ser mostrar un men inicial en la pantalla
LCD, como se muestra a continuacin:
"P1: Ver Mensaje1"
"P2: Ver Mensaje2"
Figura 6.11.

Al accionar el pulsador P1, se deber mostrar el siguiente sub-men


(figura 6.12), el cual deber permanecer visible durante 5 segundos
para luego retornar al men inicial:
"
Menu #1
"
"Mensaje #1 aqui!"
Figura 6.12.

Al accionar el pulsador P2, se deber mostrar el siguiente sub-men


(figura 6.13), el cual tambin deber permanecer visible durante 5
segundos para luego retornar al men inicial:
"
Menu #2
"
"Mensaje #2 aqui!"
Figura 6.13.

Lea detenidamente los comentarios de cada lnea del programa. Observe que
en esta oportunidad hemos utilizado un alias para cada una de las entradas
utilizadas en el puerto B (RB0 se llamar P1, y RB1 se llamar P2).
' Programa en Pic Basic Pro:
'****************************************
'* Nombre
: Proyecto12.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************

109

DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

Symbol P1 = PORTB.0
Symbol P2 = PORTB.1
Define Osc 8

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

' Alias para RB0


' Alias para RB1

' Define el Oscilador para un Cristal


' de 8 Mhz.

TRISB = $FF
TrisD = $00

' Configura el puerto B como entrada.


' Configura el puerto D como salida.

LCDOut $fe, 1

' Limpia la pantalla

Inicio:
LCDOut $fe, 2
' Posiciona el cursor en el inicio
LCDOut
"P1: Ver Mensaje1"
LCDOut $fe,$C0, "P2: Ver Mensaje2"
If P1 = 1 Then Call Mensaje1
If P2 = 1 Then Call Mensaje2

' Pregunta si RB0 = 1


' Pregunta si RB1 = 1

GoTo Inicio
Mensaje1:
LCDOut $fe, 2
LCDOut
LCDOut $fe,$C0,
Pause 5000
Return

' Posiciona el cursor en el inicio


"
Menu #1
"
"Mensaje #1 aqui!"
' Pausa de 5 segundos.
' Retorna una lnea despus del llamado "Call"

Mensaje2:
LCDOut $fe, 2
LCDOut
LCDOut $fe,$C0,
Pause 5000
Return

' Posiciona el cursor en el inicio


"
Menu #2
"
"Mensaje #2 aqui!"
' Pausa de 5 segundos.
' Retorna una lnea despus del llamado "Call"

End

110

6.7.- Proyecto #13. En el siguiente ejemplo explicamos la forma de visualizar


en la pantalla LCD un valor decimal y sus equivalentes en hexadecimal,
binario y el cdigo ASCII correspondiente, de un dato almacenado en una
variable tipo Byte.
Para lograr este objetivo, hemos declarado en el programa la variable Dato,
en la cual cargaremos un valor igual a 64, como ejemplo inicial.
Ya es conocido por un ejemplo anterior a ste, que si deseamos mostrar el
contenido de la variable en decimal, debemos anteponer la directiva Dec o el
smbolo # a sta, como se puede ver a continuacin:
LCDOut

"Decimal: ", Dec Dato

LCDOut

"Decimal: ", #Dato

El equivalente en Hexadecimal para este valor (64) es 40, y el equivalente


en binario para este mismo valor es 1000000. Entonces, para mostrar estos
valores en la pantalla LCD en su formato correspondiente, debemos utilizar
las siguientes directivas:
Hexadecimal:

LCDOut

"Hexadecimal: ",Hex Dato

Binario:

LCDOut

"Binario: ",Bin Dato

El cdigo ASCII equivalente a este valor (64), corresponde al smbolo @, y


se muestra de la siguiente forma:
LCDOut

"Cdigo ASCII: ", Dato

Realice el montaje de la figura 6.14, y analice el programa que se muestra a


continuacin:

111

Figura 6.14.

Proyecto # 13 - 14
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc

Tabla 6.4.

112

Cantidad
1
1
2
1
1
1

' Programa en Pic Basic Pro:


'****************************************
'* Nombre
: Proyecto13.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************

DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

Define Osc 8

' Define el Oscilador para un Cristal


' de 8 Mhz.

TrisD = $00

' Configura el puerto D como salida.

Dato Var Byte


Dato = 64

' Carga la variable "Dato" con el Valor 64.

LCDOut $fe, 1

' Limpia la pantalla.

LCDOuT $fe, 2

' Posiciona el cursor en el inicio.

LCDOut

"Decimal: ",Dec Dato,"

Inicio:

LCDOut $fe,$C0, "Hexadecimal: ",HEX Dato,"

"
"

Pause 4000

' Hace una pausa de 4 segundos.

LCDOuT $fe, 2

' Posiciona el cursor en el inicio.

LCDOut

"Binario:",BIN Dato

LCDOut $fe,$C0, "Codigo ASCII: ", Dato,"


Pause 4000

' Hace una pausa de 4 segundos.

GoTo Inicio

' Salta a la etiqueta "Inicio".

End

113

"

6.8.- Proyecto #14: Analice el programa propuesto a continuacin, el cual


est basado en el diagrama esquemtico de la figura 6.14. En este caso se
desea mostrar en la pantalla LCD los valores entre 33 y 125 en decimal,
adems de sus equivalentes en hexadecimal y cdigo ASCII correspondiente.
' Programa en Pic Basic Pro:
'****************************************
'* Nombre
: Proyecto14.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

Define Osc 8

' Define el Oscilador para un Cristal


' de 8 Mhz.

TrisD = $00

' Configura el puerto D como salida.

' Declaracin de la variable "I" topo Byte.

Var Byte
LCDOut $fe, 1

' Limpia la pantalla.

Inicio:
'
'
'
'

A continuacin se carga la variable "I" con un valor inicial igual a


33, el cual se ir incrementando hasta llegar a 125. Por cada incremento
se muestran los valores equivalentes en hexadecimal y su respectivo
cdigo ASCII en la pantalla LCD.

For I = 33 To 125
Lcdout $fe,2
Lcdout "Dec:",#I," Hex:",HEX I,"
Lcdout $fe,$C0,"ASCII: ", I,"
Pause 1000

"
"

' Realiza una pausa de 1 segundo.

Next I
Fin:
GoTo Fin
End

' Bucle infinito.

114

6.9.- Proyecto #15: Con la ayuda de la instruccin Count, estaremos


realizando un contador de pulsos, el cual se compone bsicamente de un
PIC16F877A y una pantalla LCD 2x16. El tren de pulsos cuadrados de
frecuencia variable, ser generado desde un microcontrolador PIC16F84A
utilizando la instruccin Pulsout, y el cual deber ser programado para que
sea posible aumentar o disminuir la frecuencia a travs de dos pulsadores
conectados a l, P1 para aumentar la frecuencia y P2 para disminuir la
frecuencia, como se muestra en el diagrama de la figura 6.15.

Figura 6.15.

115

Proyecto # 15 - 16
Componente
PIC16F877A
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x4
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Cantidad
1
1
1
2
1
2
1
2
1

Tabla 6.5.

En el circuito de la figura 6.15 se puede observar un microcontrolador


PIC16F877A, en el cual cargaremos el programa encargado de realizar el
conteo de pulsos enviados desde un microcontrolador PIC16F84A, el cual
tambin dispone de su propia programacin para poder generar un tren de
pulsos variables.
El tren de pulsos de frecuencia variable desde los pulsadores P1 y P2, sale
desde el pin RB1 del PIC16F84A hacia el pin RB1 del PIC16F877A, el cual a
su vez realiza constantemente el conteo de pulsos, durante un tiempo
definido, que en este caso ha sido de 1000 milisegundos. Seguidamente el
resultado del conteo de pulsos en este perodo de tiempo es almacenado en
una variable la cual hemos denominado Pulsos, para luego ser mostrado en
la pantalla LCD.
Veamos a continuacin la sintaxis de la nueva instruccin y seguidamente los
programas propuestos para este ejemplo.

116

Count
Sintaxis:

Count pin, duracin, variable

Con esta instruccin se puede medir la frecuencia de una seal simple,


contando el nmero de pulsos durante un tiempo determinado, definido en el
campo duracin de la instruccin. Se pueden medir frecuencias de hasta 25
khz con un oscilador de 4 MHz. Para un oscilador de 20 MHz la frecuencia
mxima a ser medida ser de 125 khz.

Pin: especifica el pin del puerto en el cual se introducirn los pulsos. Este pin
es designado como entrada automticamente por la instruccin Count.
Duracin: es el tiempo en milisegundos, durante el cual se realizar el conteo
de pulsos sobre el pin especificado.
Variable: es una variable definida por el programador en la cual se grabar el
resultado del conteo.
Programa para el contador de pulsos (PIC16F877A):
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

Define Osc 4

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

' Define el Oscilador para un Cristal


' de 4 Mhz.

Pulsos Var Word

' declaracin de la variable "Pulsos" tipo Word

Lcdout $fe, 1

' Limpia la pantalla

Inicio:
Count

PORTB.1, 1000, Pulsos

' Cuenta los pulsos introducidos a travs


' del pin RB1, durante 1000 milisegundos y el
' resultado del conteo es almacenado en la

117

' variable "Pulsos".


Lcdout $fe,2

' Inicio de la primera lnea.

Lcdout "Frecuencia

"

' Escribe mensaje en la primera lnea.

LcdOut $FE,$C0,"Medida = ",#Pulsos," Hz


GoTo Inicio

"

' Escribe dato en pantalla.

' Salta a la etiqueta "Inicio"

End

Anlisis del programa:

Para empezar, se han definido los pines de control y bus de datos de la


pantalla LCD, al igual que la frecuencia del oscilador externo.

Seguidamente se define la variable Pulsos, en la cual se cargar el


resultado del conteo de los pulsos introducidos a travs del pin RB1.

Se limpia la pantalla LCD.

La instruccin Count, cuenta los pulsos introducidos por el pin RB1, y


el resultado es almacenado en la variable Pulsos.

Por ltimo se muestra el valor cargado en la variable Pulsos, en la


pantalla LCD y se retorna a la etiqueta Inicio.

Programa para el generador de pulsos (PIC16F84A):


Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

TRISB = %11111101

' Configuracin del puerto B

Base Var Word


Espera VAR Word

' Declaracin de la variable "Base" tipo Word

PORTB.1 = 0

' Inicializa la Salida RB0

Base = 100
Espera = 1

' Inicializa la variable Base = 100

Inicio:
If PORTB.0 = 1 Then Call Suma

' Si RB0 = 1 llama a la subrutina "Suma"

118

If PORTB.2 = 1 Then Call Resta

' Si RB2 = 1 llama a la subrutina "Resta"

PulsOut PORTB.1,Base ' Genera un pulso de duracin definida por la variable


' "Base".
pause Espera
GoTo Inicio

' Pausa de "Base/100" milisegundos


' Salta a inicio

Suma:
Pause 300
' Pausa de 300 milisegundos
Base = Base + 100
' Incrementa la variable "Base"
If Base = 10100 Then Base = 10000 ' Establece un lmite mximo al valor cargado
' en la variable "Base".
Espera = Base / 100
' Divide el valor cargado en la variable
' "Base" entre 100 y lo carga en la variable
' "Espera", para que la pausa que se genera
' despus de cada pulso sea igual al tiempo
' del pulso.
Return

' Retorna una lnea despus del llamado "Call"

Resta:
Pause 300
Base = Base - 100
If Base = 0 Then Base = 100
Espera = Base / 100

'
'
'
'
'
'
'
'
'

Pausa de 300 milisegundos


decrementa la variable "Base"
Establece un lmite mximo al valor cargado
en la variable "Base".
Divide el valor cargado en la variable
"Base" entre 100 y lo carga en la variable
"Espera", para que la pausa que se genera
despus de cada pulso sea igual al tiempo
del pulso.

Return

' Retorna una lnea despus del llamado "Call"

End

Anlisis del programa:

En el programa se puede observar que se han dado los pasos


necesarios en lo que respecta a la definicin del tipo de oscilador y la
configuracin del puerto que estamos utilizando en el diseo
propuesto.

Seguidamente, ha sido declarada la variable Base y la variable


Espera, las cuales sern necesarias para almacenar la base de
tiempo de los pulsos generados por la instruccin Pulsout, adems de
la pausa generada entre cada pulso.

119

Inicializamos la variable Base con un valor igual a 100 y la variable


Espera con un valor igual a 1.

A partir de la etiqueta Inicio, el primer paso de la subrutina ha sido


preguntar si los pulsadores P1 y P2 han sido activados. Si el pulsador
P1 es activado, el programa hace un salto con retorno a la subrutina
Suma, incrementando el valor de la variable Base en 100 unidades.
Si el pulsador P2 es activado, el programa hace un salto con retorno a
la subrutina Resta, haciendo decrecer en 100 unidades el valor
cargado en la variable Base. En estas dos subrutinas (Suma y Resta),
se establecen lmites para la variable Base, de manera tal que si la
suma llega a ser igual a 10100, la variable Base mantiene su valor
igual a 10000. En el caso especfico de la resta, si el valor de la
variable Base llega a ser igual a 0, entonces la variable mantiene
siempre su valor igual a 100. Seguidamente se carga la variable
Espera, tanto en la subrutina Suma como en la subrutina Resta,
valor que ser utilizado para realizar la pausa entre pulsos.

La instruccin Pulsout, genera un pulso en el pin RB1, con una


duracin definida por el valor cargado en la variable Base. Por
ejemplo, si Base = 100, entonces el pulso generado ser de 100
decenas de microsegundos, es decir, 1 milisegundo. Recuerde que la
instruccin Pulsout tiene una resolucin de 10 microsegundos para un
oscilador de 4 Mhz.

Seguidamente el programa realiza una pausa la cual depende tambin


del valor cargado en la variable Espera. Entonces, observe que si la
variable Base = 100, la pausa generada es de 1 milisegundo, debido a
que se est dividiendo el valor cargado en la variable Base entre 100
y el resultado es cargado en la variable Espera.

Por ltimo, el programa hace un salto a la etiqueta Inicio para


empezar el proceso.

120

El tren de pulsos generado por el microcontrolador PIC16F84A en el pin RB1,


se puede observar en la siguiente figura:

Figura 6.16.

Observe que la frecuencia de la seal generada cuando alimentamos el


circuito es de 480 Hz, debido a que el valor cargado en la variable Base es
igual a 100, y el valor cargado en la variable Espera es igual a 1.
Compare el valor de la frecuencia medido en el osciloscopio, con el valor
obtenido por la instruccin Count, en el programa cargado en el
microcontrolador PIC16F877A. En este caso, el valor mostrado en la pantalla
LCD, debe ser igual a 480 pulsos por segundo.
Realice las pruebas necesarias con la ayuda de un osciloscopio, para
visualizar la seal generada cada vez que aumenta o disminuye el valor de la
variable Base, a travs de los pulsadores P1 y P2 respectivamente.
Compare el valor de la frecuencia medido en el osciloscopio, con el valor
obtenido en el conteo de pulsos por cada segundo transcurrido a travs de la
instruccin Count.
121

6.10.- Proyecto #16: El siguiente proyecto est basado en el montaje de la


figura 6.15. En esta oportunidad estudiaremos el funcionamiento de la
instruccin Pulsin, con la cual mediremos la duracin de los pulsos
generados por el microcontrolador PIC16F84A, programado en el proyecto
#15.

PULSIN
Sintaxis:

PULSIN pin, nivel, variable

La instruccin PULSIN mide la duracin de un pulso alto o bajo con una


resolucin de 10 microsegundos para un oscilador de 4 Mhz, o una resolucin
de 2 microsegundos para un oscilador de 20 Mhz, y el valor obtenido es
almacenado en una variable definida de 8 bits (byte) o 16 bits (Word).

Pin: especifica el pin del puerto en el cual se introducir el pulso a ser medido.
Nivel: define si la medicin se hace en nivel alto o bajo. (1 = alto, 0 = bajo).
Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tipo
word) definida por el programador en la cual se grabar el resultado de la
lectura.
Analice el siguiente programa:
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

Define OSC 4

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3
' Define el oscilador en 4 Mhz

LECTURA VAR Word

' Definicin de variable de 16 bits

Pause 200

' Pausa de 200 milisegundos

LCDOut $fe, 1

' Limpia la pantalla

122

Inicio:
LECTURA = 0

' Inicializa la variable "Lectura".

PulsIn PORTB.1,1,LECTURA

' Mide la duracin de un pulso.

LCDOut $fe, 2

' Posiciona el cursor en el inicio.

LCDOut "Lectura: ",#LECTURA,"

"

' Muestra mensaje y dato por pantalla.

Lcdout $fe,$C0,"decenas de uS.

"

' Muestra el mensaje de la segunda lnea.

Pause 1000

' Pausa de 1 segundo

GoTo Inicio

' Salta a inicio

End

Al compilar y grabar el programa en el microcontrolador PIC16F877A del


diagrama de la figura 6.15, podremos observar en la pantalla LCD el resultado
de la lectura generada por la instruccin Pulsin, la cual mide el tiempo de
cada pulso que ingresa a travs del pin RB1, en decenas de microsegundos.
Entonces, su generamos un pulso cuya duracin es igual a 1 milisegundo, el
valor cargado en la variable Lectura ser igual o aproximado a 100.

123

6.11.- Proyecto #17: Realice el montaje para el circuito la figura 6.17, con el
cual estudiaremos la instruccin POT a travs de un ejemplo de
programacin, con el cual se pretende tomar lectura de un elemento resistivo,
el cual en este caso ser un potencimetro de 10Kohm.

Figura 6.17.

124

Proyecto # 17
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Potencimetro de 5K Ohm
Potencimetro de 10K Ohm
Capacitor cermico de 0,1 uF
Fuente regulada de 5 Vdc

Cantidad
1
1
2
1
1
1
1
1

Tabla 6.6.

POT
Sintaxis:

POT pin, escala, variable

La instruccin POT lee un potencimetro, foto celda, termistor, o cualquier


otro dispositivo capaz de variar su valor resistivo. Bsicamente esta
instruccin calcula el tiempo de descarga del condensador C1 el cual vara
segn el valor resistivo presente en la resistencia variable.

Pin: especifica el pin del puerto en el cual se va a conectar el potencimetro.


Escala: Es una variable o constante que aumenta o disminuye el rango de
lectura en un porcentaje determinado. Esta escala es utilizada para ajustar el
rango de salida en la lectura del dispositivo, y es afectada directamente por
las constantes RC. El valor de la escala ser correcto cuando el valor cargado
en la variable se aproxime a cero, cuando la resistencia medida sea mnima; y
tambin cuando el valor de la variable se aproxime a 255, cuando la
resistencia medida sea mxima.

125

Variable: es una variable en la cual se almacena el resultado obtenido de la


lectura del potencimetro o componente resistivo.
Analice el siguiente programa, y experimente sobre el valor de C1, y el valor
de la escala en la instruccin POT, hasta lograr el rango ms aceptable para
una resistencia variable (P1) de 10K.
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

Define OSC 4

' Define el oscilador en 4 Mhz

ESCALA VAR Byte


DATO Var Byte
Pause 200

' Pausa de 200 milisegundos

ESCALA = 127

' Asigna valor a la escala

LCDOut $fe, 1

' Limpia la pantalla

Inicio:
Pot PORTB.0,ESCALA,DATO
LCDOut $fe, 2
LCDOut "Lectura: ",#DATO,"
GoTo inicio
End

' Toma lectura del Potencimetro

"

' Posiciona el cursor en el inicio


' Muestra dato por pantalla
' Salto a inicio

126

6.12.- Memoria CGRAM en la Pantalla LCD.


La pantalla LCD posee una memoria llamada CGRAM (Character Generator
RAM), destinada para que el usuario pueda almacenar hasta un mximo de 8
caracteres o figuras personalizadas como lo demostraremos a continuacin.
Cada carcter es representado como un bloque constituido normalmente por
5 columnas y 8 filas, cada una de 8 bits (1 byte)*, es decir, cada carcter se
compone de ocho bytes.

C5 C4 C3 C2 C1

C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 C5 C4 C3 C2 C1

Fila 1
Fila 2
Fila 3
Fila 4
Fila 5
Fila 6
Fila 7
Fila 8

C5 C4 C3 C2 C1

.............

Figura 6.18.

* Nota: Los 3 bits ms significativos de cada byte (3 bits ms significativos de


cada fila), son tomados como ceros.
En cada posicin de la CGRAM se almacenan los 8 bytes que forman un
caracter. Las direcciones correspondientes a cada posicin son:
Posicin en
la CGRAM
Posicin 0
Posicin 1
Posicin 2
Posicin 3
Posicin 4
Posicin 5
Posicin 6
Posicin 7

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7


$40
$41
$42
$43
$44
$45
$46
$47
$48
$49
$4A
$4B
$4C
$4D
$4E
$4F
$50
$51
$52
$53
$54
$55
$56
$57
$58
$59
$5A
$5B
$5C
$5D
$5E
$5F
$60
$61
$62
$63
$64
$65
$66
$67
$68
$69
$6A
$6B
$6C
$6D
$6E
$6F
$70
$71
$72
$73
$74
$75
$76
$77
$78
$79
$7A
$7B
$7C
$7D
$7E
$7F
Tabla 6.7.

127

Veamos el siguiente ejemplo en el cual almacenaremos el smbolo de un


parlante en la posicin 0 de la CGRAM.
Dato
HEX

Smbolo

$02
$06
$1A
$1A
$1A
$06
$02
$00

Dato
Binario

Bytes en la
CGRAM

00000010
00000110
00011010
00011010
00011010
00000110
00000010
00000000

$40
$41
$42
$43
$44
$45
$46
$47

Tabla 6.8.

Note que cada cuadro representa un bit el cual corresponde a un 1 o un 0


segn sea el caso o la figura que deseamos realizar, donde 1 es encendido
y 0 es apagado.
La instruccin para desplegar este smbolo en la pantalla sera la siguiente:
LCDOUT $fe,$40,$02,$06,$1A,$1A,$1A,$06,$02,$00

Observe que hemos especificado la direccin inicial de la posicin cero


despus de la sentencia de comando $fe, seguido de los datos
correspondientes al caracter.
Una vez almacenado los datos correspondientes a la figura en la posicin
cero de la memoria CGRAM, podemos desplegar el smbolo en la pantalla
LCD.
Esto se hace especificando la posicin de la CGRAM que se desea mostrar
despus del comando de control, como se muestra a continuacin:
LCDOUT $FE,1, 0

' Limpia la pantalla y luego muestra el smbolo


' almacenado en la posicin 0 de la CGRAM

128

En este caso la figura aparece en la primera lnea de la pantalla LCD.


Para mostrar esta misma figura en una posicin diferente de la pantalla,
simplemente nos basamos en la tabla de comandos de la instruccin Lcdout
(Tabla 6.2) y en la figura 6.7, en la cual podremos encontrar la direccin de la
posicin de visualizacin deseada en la pantalla LCD.
Por ejemplo;

Para visualizar la figura cargada en la posicin cero de la CGRAM en la


lnea 2, posicin $C0 de la pantalla LCD, la sintaxis sera la siguiente:
LcdOut $fe,$C0, 0

Para visualizar una figura cargada en la posicin cuatro de la CGRAM


en la lnea 2, posicin $C7 de la pantalla LCD, la sintaxis sera la
siguiente:
LcdOut $fe,$C7, 4

El programa para visualizar entonces la figura ya creada anteriormente en la


lnea 1 de la pantalla LCD sera el siguiente:
' Programa en PIC Basic Pro
Pause 500

' Pausa de 500 milisegundos

LCDOut $fe, 1
LCDOut $fe, 2

' Limpia la pantalla


' Posiciona el cursor en el inicio

' Cargamos el caracter en la posicin cero:


LCDOut $fe,$40,$02,$06,$1A,$1A,$1A,$06,$02,$00
' Muestra el caracter en la pantalla:
LCDOut $fe,1, 0
Inicio:
GoTo Inicio ' Salta a la etiqueta Inicio (Lazo infinito).
End

129

6.13.- Proyecto #18. A continuacin realizaremos la simulacin de un control


digital de volumen, basados en el diagrama de la figura 6.19. El pulsador P1
ser el encargado de aumentar el nivel de volumen, mientras que el pulsador
P2 ser el encargado de disminuir el nivel.

Figura 6.19.

Proyecto # 18
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Tabla 6.9.

130

Cantidad
1
1
2
1
2
1
2
1

Las pantallas que veremos representadas en este ejemplo son las mostradas
en las figuras 6.20, 6.21, 6.22 y 6.23. Se puede observar en ellas la
representacin de un pequeo parlante y cuatro rectngulos, encargados de
indicar el nivel de volumen.

Figura 6.20.

Figura 6.21.

Figura 6.22.

Figura 6.23.

131

El primer paso en la elaboracin de este ejercicio, es crear las figuras que


deseamos mostrar en la pantalla LCD basados en la explicacin dada
anteriormente:
Figura 1:
Dato
HEX

Smbolo

$02
$06
$1A
$1A
$1A
$06
$02
$00

Dato
Binario

Bytes en la
CGRAM

00000010
00000110
00011010
00011010
00011010
00000110
00000010
00000000

$40
$41
$42
$43
$44
$45
$46
$47

Palabra 0: $02, $06, $1A, $1A, $1A, $06, $02, $00

Figura 2:
Dato
HEX
$00
$00
$00
$00
$00
$00
$1F
$1F

Smbolo

Dato
Binario

Bytes en la
CGRAM

00000000
00000000
00000000
00000000
00000000
00000000
00011111
00011111

$48
$49
$4A
$4B
$4C
$4D
$4E
$4F

Palabra 1: $00, $00, $00, $00, $00, $00, $1F, $1F


132

Figura 3:
Dato
HEX

Smbolo

$00
$00
$00
$00
$1F
$1F
$1F
$1F

Dato
Binario

Bytes en la
CGRAM

00000000
00000000
00000000
00000000
00011111
00011111
00011111
00011111

$50
$51
$52
$53
$54
$55
$56
$57

Palabra 2: $00, $00, $00, $00, $1F, $1F, $1F, $1F

Figura 4:
Dato
HEX
$00
$00
$1F
$1F
$1F
$1F
$1F
$1F

Smbolo

Dato
Binario

Bytes en la
CGRAM

00000000
00000000
00011111
00011111
00011111
00011111
00011111
00011111

$58
$59
$5A
$5B
$5C
$5D
$5E
$5F

Palabra 3: $00, $00, $1F, $1F, $1F, $1F, $1F, $1F

133

Figura 5:
Dato
HEX

Smbolo

$1F
$1F
$1F
$1F
$1F
$1F
$1F
$1F

Dato
Binario

Bytes en la
CGRAM

00011111
00011111
00011111
00011111
00011111
00011111
00011111
00011111

$60
$61
$62
$63
$64
$65
$66
$67

Palabra 4: $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F

A continuacin analice el siguiente programa, leyendo detenidamente los


comentarios:
' Programa en PIC Basic Pro
'****************************************
'* Nombre
: Proyecto18.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************

DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

Define Osc 8

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

' Define el Oscilador para un Cristal


' de 8 Mhz.

134

Symbol P1 = PORTB.0
Symbol P2 = PORTB.1

' Alias para RB0.


' Alias para RB1.

Volumen Var Byte

' Declaracin de la variable "Volumen" tipo Byte.

Volumen = 1

' Inicializa la variable Volumen con el valor "1".

' A continuacin se cargan las cinco figuras creadas a partir de la


' posicin cero de la memoria CGRAM:
LCDOut
LCDOut
LCDOut
LCDOut
LCDOut

$fe,
$fe,
$fe,
$fe,
$fe,

$40,
$48,
$50,
$58,
$60,

$02,
$00,
$00,
$00,
$1F,

LCDOut $fe, 1
LCDOut "
Volumen:

$06,
$00,
$00,
$00,
$1F,

"

$1A,
$00,
$00,
$1F,
$1F,

$1A,
$00,
$00,
$1F,
$1F,

$1A,
$00,
$1F,
$1F,
$1F,

$06,
$00,
$1F,
$1F,
$1F,

$02,
$1F,
$1F,
$1F,
$1F,

$00
$1F
$1F
$1F
$1F

'Figura
'Figura
'Figura
'Figura
'Figura

1.
2.
3.
4.
5.

' Limpia la pantalla


' Escribe "Volumen:" en la lnea 1 de la pantalla.

Inicio:

'
'
'
'
'

LCDOut $fe, 2

' Posiciona el cursor en el inicio

LCDOut $fe,$C5, 0

' Muestra la Figura almacenada en la Posicin 0


' de la CGRAM.

LCDOut $fe,$C6, 1

' Muestra la Figura almacenada en la Posicin 1


' de la CGRAM.

A continuacin se verifica si alguno de los pulsadores ha sido activado.


Si P1 es activado y la variable "Volumen" es menor a cinco, llama a la
subrutina "SubeVol".
Si P2 es activado y la variable "Volumen" es mayor a cero, llama a la
subrutina "BajaVol".
If P1 = 1 And Volumen < 5 Then Call SubeVol
If P2 = 1 And Volumen > 0 Then Call BajaVol
GoTo Inicio

' Salta a la etiqueta "Inicio".

SubeVol:
Volumen = Volumen + 1 ' Suma 1 al contenido de la variable "Volumen".
If Volumen = 2 Then Call Nivel1
If Volumen = 3 Then Call Nivel2
If Volumen = 4 Then Call Nivel3
Return
Nivel1:
LCDOut $fe,$C7, 2
Pause 350
Return

' Muestra la Figura almacenada en la Posicin dos (2)


' de la CGRAM.
' Pausa de 350 milisegundos, mientras se suelta P1.

135

Nivel2:
LCDOut $fe,$C8, 3
Pause 350
Return

' Muestra la Figura almacenada en la Posicin tres (3)


' de la CGRAM.
' Pausa de 350 milisegundos, mientras se suelta P1.

Nivel3:
LCDOut $fe,$C9, 4
Pause 350
Return

' Muestra la Figura almacenada en la Posicin cuatro (4)


' de la CGRAM.
' Pausa de 350 milisegundos, mientras se suelta P1.

BajaVol:
Volumen = Volumen - 1 ' Resta 1 al contenido de la variable "Volumen".
If Volumen = 3 Then Call Borra1
If Volumen = 2 Then Call Borra2
If Volumen = 1 Then Call Borra3
Return
Borra1:
LCDOut $fe,$C9," "
Pause 350
Return

' Borra la figura colocando un espacio en blanco en la


' posicin $C9 de la pantalla LCD.
' Pausa de 350 milisegundos, mientras se suelta P2.

Borra2:
LCDOut $fe,$C8," "
Pause 350
Return

' Borra la figura colocando un espacio en blanco en la


' posicin $C8 de la pantalla LCD.
' Pausa de 350 milisegundos, mientras se suelta P2.

Borra3:
LCDOut $fe,$C7," "
Pause 350
Return

' Borra la figura colocando un espacio en blanco en la


' posicin $C7 de la pantalla LCD.
' Pausa de 350 milisegundos, mientras se suelta P2.

End

136

6.14.- Proyecto #19. Realice el siguiente ejercicio en el cual se podr


visualizar un pequeo caballo que corre a lo largo de la pantalla LCD, como
se muestra en las figuras 6.25 y 6.26. El programa ha sido diseado en base
al diagrama esquemtico de la figura 6.24:

Figura 6.24.

Proyecto # 19
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x4
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc

Tabla 6.10.

137

Cantidad
1
1
2
1
1
1

A continuacin podr ver una secuencia numerada de cada una de las


pantallas que debe generar el programa propuesto:

Figura 6.25.

138

Figura 6.26.

139

Un paso fundamental es hacer el diseo de cada figura en una matriz


cuadriculada de 8 filas por 5 columnas, como se muestra en la figura 6.27.

Figura 6.27.

Rellenando los cuadros adecuados podemos llegar a realizar una gran


cantidad de figuras, las cuales podrn ser almacenadas en la CGRAM de una
pantalla LCD o incluso en la memoria de datos del microcontrolador, para
luego ser consultadas y almacenadas en la CGRAM.
Una vez hecho el diseo de la figura, procedemos a sacar los datos
correspondientes a cada posicin en la CGRAM.

140

Los datos a ser almacenados en las ocho posiciones de la CGRAM son los
siguientes:
Figura 1:
Dato
HEX

Figura A

$00
$00
$10
$0F
$0F
$0D
$18
$10

Dato
Binario
00000000
00000000
00010000
00001111
00001111
00001101
00011000
00010000

Bytes en la
CGRAM
$40
$41
$42
$43
$44
$45
$46
$47

Palabra 0: $00,$00,$10,$0F,$0F,$0D,$18,$10

Figura 2:
Dato
HEX
$04
$0E
$1F
$1C
$1C
$1C
$06
$05

Figura B

Dato
Binario
00000100
00001110
00011111
00011100
00011100
00011100
00000110
00000101

Palabra 1: $04,$0E,$1F,$1C,$1C,$1C,$06,$05

141

Bytes en la
CGRAM
$48
$49
$4A
$4B
$4C
$4D
$4E
$4F

Figura 3:
Dato
HEX

Figura C

$00
$00
$10
$0F
$0F
$0D
$04
$06

Dato
Binario
00000000
00000000
00010000
00001111
00001111
00001101
00000100
00000110

Bytes en la
CGRAM
$50
$51
$52
$53
$54
$55
$56
$57

Palabra 2: $00,$00,$10,$0F,$0F,$0D,$04,$06

Figura 4:
Dato
HEX
$04
$0E
$1F
$1C
$1C
$1C
$08
$18

Figura D

Dato
Binario
00000100
00001110
00011111
00011100
00011100
00011100
00001000
00011000

Palabra 3: $04,$0E,$1F,$1C,$1C,$1C,$08,$18

142

Bytes en la
CGRAM
$58
$59
$5A
$5B
$5C
$5D
$5E
$5F

Figura 5:
Dato
HEX

Figura E

$04
$0E
$1F
$07
$07
$07
$02
$03

Dato
Binario
00000100
00001110
00011111
00000111
00000111
00000111
00000010
00000011

Bytes en la
CGRAM
$60
$61
$62
$63
$64
$65
$66
$67

Palabra 4: $04,$0E,$1F,$07,$07,$07,$02,$03

Figura 6:
Dato
HEX
$00
$00
$01
$1E
$1E
$16
$04
$0C

Figura F

Dato
Binario
00000000
00000000
00000001
00011110
00011110
00010110
00000100
00001100

Palabra 5: $00,$00,$01,$1E,$1E,$16,$04,$0C

143

Bytes en la
CGRAM
$68
$69
$6A
$6B
$6C
$6D
$6E
$6F

Figura 7:
Dato
HEX

Figura G

$04
$0E
$1F
$07
$07
$07
$0C
$14

Dato
Binario
00000100
00001110
00011111
00000111
00000111
00000111
00001100
00010100

Bytes en la
CGRAM
$70
$71
$72
$73
$74
$75
$76
$77

Palabra 6: $04,$0E,$1F,$07,$07,$07,$0C,$14

Figura 8:
Dato
HEX
$00
$00
$01
$1E
$1E
$16
$03
$01

Figura H

Dato
Binario
00000000
00000000
00000001
00011110
00011110
00010110
00000011
00000001

Palabra 7: $00,$00,$01,$1E,$1E,$16,$03,$01

144

Bytes en la
CGRAM
$78
$79
$7A
$7B
$7C
$7D
$7E
$7F

En esta oportunidad pondremos a correr nuestro caballo en la segunda lnea


de la pantalla, y lo ubicaremos de la siguiente manera:
La primera mitad de nuestro caballo estar en la direccin $C0 y la otra mitad
estar en la direccin $C1, nos referimos respectivamente a las figuras A y
B de nuestro diseo.
Para ver el efecto que deseamos, hacemos una pausa de 300 milisegundos,
borramos la pantalla y mostramos las figuras C y D en las posiciones $C2
y $C3 respectivamente de la pantalla LCD; luego hacemos otra pausa de 300
milisegundos y comenzamos el proceso, solo que esta vez ser partiendo
desde la direccin $C4.
Cuando la figura D llegue a la direccin $CF, estaremos listos para repetir
todo el proceso de forma inversa con las figuras E, F, G y H.

Pantalla LCD 16x4


Lnea 1
Lnea 2
Lnea 3
Lnea 4

$80
$C0
$90
$D0

$81
$C1
$91
$D1

$82
$C2
$92
$D2

$83
$C3
$93
$D3

$84
$C4
$94
$D4

$85
$C5
$95
$D5

$86
$C6
$96
$D6

$87
$C7
$97
$D7

$88
$C8
$98
$D8

$89
$C9
$99
$D9

$8A
$CA
$9A
$DA

$8B
$CB
$9B
$DB

$8C
$CC
$9C
$DC

$8D
$CD
$9D
$DD

$8E
$CE
$9E
$DE

$8F
$CF
$9F
$DF

Figura 6.28.

En la figura 6.28 se pueden observar las direcciones en una pantalla LCD de


16 columnas y 4 filas. Esta tabla de direcciones resulta muy til al momento
de establecer la ubicacin de cada figura en cualquiera de las lneas de la
pantalla LCD.

145

Veamos el programa que hace posible esta representacin:


' Programa en PIC Basic Pro
'****************************************
'* Nombre
: Proyecto19.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto en el uC para el
bus de datos de la LCD
Indica al uC que el pin "RS" estar en el Puerto D
"RS" estar conectado en RD2
Indica al uC que el pin "E" estar en el Puerto D
"E" estar conectado en RD3

' Programa en PIC Basic Pro


Define Osc 8

' Define el Oscilador para un Cristal


' de 8 Mhz.

' Declaracin de Variables


POS1
POS2
POS3
POS4

var
var
var
var

Byte
Byte
Byte
Byte

' Inicializamos las Variables correspondientes a la posicin de la figura


' en la pantalla LCD
POS1
POS2
POS3
POS4

=
=
=
=

$C0
$C1
$C2
$C3

Pause 500

' Ver figura 6.13


'
'
'
' Tiempo de inicializacin de la Pantalla LCD

' Cargamos las 8 figuras en la CGRAM:


LCDOUT
LCDOUT
LCDOUT
LCDOUT

$FE,$40,$00,$00,$10,$0F,$0F,$0D,$18,$10
$FE,$48,$04,$0E,$1F,$1C,$1C,$1C,$06,$05
$FE,$50,$00,$00,$10,$0F,$0F,$0D,$04,$06
$FE,$58,$04,$0E,$1F,$1C,$1C,$1C,$08,$18

'
'
'
'

Palabra
Palabra
Palabra
Palabra

0
1
2
3

de
de
de
de

la
la
la
la

CGRAM
CGRAM
CGRAM
CGRAM

LCDOUT
LCDOUT
LCDOUT
LCDOUT

$FE,$60,$04,$0E,$1F,$07,$07,$07,$02,$03
$FE,$68,$00,$00,$01,$1E,$1E,$16,$04,$0C
$FE,$70,$04,$0E,$1F,$07,$07,$07,$0C,$14
$FE,$78,$00,$00,$01,$1E,$1E,$16,$03,$01

'
'
'
'

Palabra
Palabra
Palabra
Palabra

4
5
6
7

de
de
de
de

la
la
la
la

CGRAM
CGRAM
CGRAM
CGRAM

inicio:

146

LCDOUT $fe, 1
LCDOUT $FE,POS1,
LCDOUT $FE,POS2,
Pause 300
LCDOUT $fe, 1
LCDOUT $FE,POS3,
LCDOUT $FE,POS4,
Pause 300

0
1

' Limpia la pantalla LCD


' Muestra Palabra 0 en la LCD
' Muestra Palabra 1 en la LCD

2
3

' Limpia la pantalla LCD


' Muestra Palabra 2 en la LCD
' Muestra Palabra 3 en la LCD

' Aumentamos la posicin de cada smbolo en la pantalla para dar el efecto


' de movimiento:
POS1
POS2
POS3
POS4

=
=
=
=

POS1
POS2
POS3
POS4

+
+
+
+

3
3
3
3

If POS4 > $CF Then RETRO ' Pregunta si llega al tope derecho de la LCD
' si POS4 = $CF salta a la etiqueta "RETRO"
GoTo inicio
' Salta a la etiqueta "inicio"
' Antes de retroceder nos aseguramos de que las figuras E,F,G y H tengan una
' posicin inicial en la pantalla LCD:
RETRO:
POS1
POS2
POS3
POS4

=
=
=
=

$CF
$CE
$CD
$CC

RETROCEDE:
LCDOUT $fe, 1
LCDOUT $FE,POS1, 7
LCDOUT $FE,POS2, 6
Pause 300

' Limpia la pantalla LCD


' Muestra Palabra 7 en la LCD
' Muestra Palabra 6 en la LCD

LCDOUT $fe, 1
LCDOUT $FE,POS3, 5
LCDOUT $FE,POS4, 4
Pause 300

' Limpia la pantalla LCD


' Muestra Palabra 5 en la LCD
' Muestra Palabra 4 en la LCD

' Disminuimos la posicin de cada smbolo en la pantalla para dar el efecto


' de movimiento en sentido contrario:
POS1
POS2
POS3
POS4

=
=
=
=

POS1
POS2
POS3
POS4

3
3
3
3

If POS4 < $C0 Then REINICIA ' Pregunta si llega al tope Izquierdo de la LCD
GoTo RETROCEDE
' Nos aseguramos de que las figuras A,B,C y D tengan una posicin inicial en la
' pantalla LCD:

147

REINICIA:
POS1
POS2
POS3
POS4

=
=
=
=

$C0
$C1
$C2
$C3

GoTo inicio ' Se repite el proceso saltando a la etiqueta "inicio"


End

148

Teclado Matricial

Capitulo VII

7.1.- Teclado Matricial: Para introducir datos de forma manual en un


microcontrolador, nada mejor que un teclado matricial para este fin. Los
teclados matriciales ms comunes son de 3 columnas por 4 filas, y de 4
columnas por 4 filas, como los mostrados en la figura 7.1:

Figura 7.1.

Figura 7.2.

149

El principio de funcionamiento de un teclado matricial es muy sencillo.


Bsicamente cuando pulsamos un botn en el teclado, estamos uniendo una
fila con una columna.
Por ejemplo, al presionar la tecla 1, estaremos conectando la columna 1 con
la fila 1; si pulsamos la tecla 4, estaremos conectando nuevamente la
columna 1, esta ves con la fila 2; si pulsamos la tecla 9, entonces estaremos
conectando la columna 3 con la fila 3.
Existen diversas formas de conectar e interpretar el funcionamiento de un
teclado matricial. En el diagrama de la figura 7.3 se puede apreciar un teclado
matricial 3x4 conectado a los pines del puerto B, los cuales se han distribuido
y configurado de la siguiente manera:

Puerto B
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

TrisB
0 (Salida)
0 (Salida)
0 (Salida)
1 (Entrada)
1 (Entrada)
1 (Entrada)
1 (Entrada)
1 (Entrada)

Teclado 3x4
Columna 1
Columna 2
Columna 3
Fila 1
Fila 2
Fila 3
Fila 4
Sin Conexin

Tabla 7.1.

Observe en el diagrama esquemtico que los pines RB3, RB4, RB5 y RB6
tienen una resistencia Pull-up, lo cual significa que si leemos cualquiera de
estas entradas, asumiendo que ninguna tecla ha sido presionada, entonces
siempre habr un uno lgico presente en cada una de ellas.

150

Figura 7.3.

Entonces para saber si una tecla ha sido presionada, podemos aplicar el


siguiente anlisis:
1. Enviamos un cero 0 por la columna 1, y enviamos un 1 por las
columnas 2 y 3.
PORTB.0 = 0
PORTB.1 = 1
PORTB.2 = 1

' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1

2. Leemos las filas 1, 2, 3 y 4 para verificar si alguna de ellas cambi su


estado a cero 0. Si esto sucede, quiere decir que una de las teclas en
la columna 1 ha sido presionada, entonces:
Si PORTB.3 = 0  La tecla "1" fue presionada.
Si PORTB.4 = 0  La tecla "4" fue presionada.
Si PORTB.5 = 0  La tecla "7" fue presionada.
Si PORTB.6 = 0  La tecla "*" fue presionada.

151

3. Enviamos un cero 0 por la columna 2, y enviamos un 1 por las


columnas 1 y 3.
PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 1

' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1

4. Leemos las filas 1, 2, 3 y 4 para verificar si alguna de ellas cambi su


estado a cero 0. Si esto sucede, en este caso quiere decir que una de
las teclas en la columna 2 ha sido presionada, entonces:
Si PORTB.3 = 0  La tecla "2" fue presionada.
Si PORTB.4 = 0  La tecla "5" fue presionada.
Si PORTB.5 = 0  La tecla "8" fue presionada.
Si PORTB.6 = 0  La tecla "0" fue presionada.

5. Enviamos un cero 0 por la columna 3, y enviamos un 1 por las


columnas 1 y 2.
PORTB.0 = 1
PORTB.1 = 1
PORTB.2 = 0

' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0

6. Leemos nuevamente las filas 1, 2, 3 y 4 para verificar si alguna de ellas


cambi su estado a cero 0. Si esto sucede, entonces quiere decir que
una de las teclas en la columna 3 ha sido presionada.
Si PORTB.3 = 0  La tecla "3" fue presionada.
Si PORTB.4 = 0  La tecla "6" fue presionada.
Si PORTB.5 = 0  La tecla "9" fue presionada.
Si PORTB.6 = 0  La tecla "#" fue presionada.

A continuacin veremos el algoritmo capaz de leer el teclado matricial


conectado al puerto B, y el cual a su vez genera el digito correspondiente a la
tecla presionada en un display de 7 segmentos conectado al puerto D.

152

Observe que el display de 7 segmentos es de nodo comn, lo cual significa


que para encender un segmento ser necesario enviar un cero 0 a travs
del pin que corresponda a ste, en el puerto D.
' Programa en PIC Basic Pro
Define Osc 8

' Define el Oscilador para un Cristal


' de 8 Mhz.

TRISB = %01111000
TRISD = %00000000

' Configura los pines del puerto B.


' Configura los pines del puerto D.

Inicio:
Call Teclado
Pause 300
GoTo Inicio

' Llama a la rutina barrido del teclado matricial.


' Hace una pausa de 300 ms.
' Salta a la etiqueta Inicio.

Teclado:
PORTB.0 = 0
PORTB.1 = 1
PORTB.2 = 1
If
If
If
If

PORTB.3
PORTB.4
PORTB.5
PORTB.6

=
=
=
=

' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
0
0
0
0

PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 1
If
If
If
If

PORTB.3
PORTB.4
PORTB.5
PORTB.6

=
=
=
=

PORTB.3
PORTB.4
PORTB.5
PORTB.6

=
=
=
=

PORTD
PORTD
PORTD
PORTD

=
=
=
=

%11111001
%10011001
%11111000
%10011100

'
'
'
'

tecla
tecla
tecla
tecla

"1"
"4"
"7"
"*"

'
'
'
'

tecla
tecla
tecla
tecla

"2"
"5"
"8"
"0"

'
'
'
'

tecla
tecla
tecla
tecla

"3"
"6"
"9"
"#"

' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
0
0
0
0

PORTB.0 = 1
PORTB.1 = 1
PORTB.2 = 0
If
If
If
If

Then
Then
Then
Then

Then
Then
Then
Then

PORTD
PORTD
PORTD
PORTD

=
=
=
=

%10100100
%10010010
%10000000
%11000000

' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
0
0
0
0

Then
Then
Then
Then

PORTD
PORTD
PORTD
PORTD

=
=
=
=

%10110000
%10000010
%10011000
%10100011

Return
End

153

7.2.- Proyecto #20. En el siguiente proyecto utilizaremos una pantalla LCD


16x2, y un teclado matricial 3x4, conectados segn el diagrama esquemtico
de la figura 7.4. El objetivo de este proyecto ser visualizar el valor o smbolo
correspondiente a cada una de las teclas.

Figura 7.4.

Proyecto # 20 - 21 - 22 - 23
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 1K Ohm
Potencimetro de 5K Ohm
Teclado Matricial 3x4
Fuente regulada de 5 Vdc

Tabla 7.2.

154

Cantidad
1
1
2
1
4
1
1
1

Utilizaremos la tcnica de lectura de teclado mostrada anteriormente para la


programacin de este proyecto.
Realice un anlisis detallado del siguiente programa, y compare el algoritmo
de lectura del teclado matricial con el algoritmo comentado anteriormente.

' Programa en Pic Basic Pro


Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

TRISA = %00000000
TRISB = %00000000
TRISD = %01111000

' Configuracin del puerto A


' Configuracin del puerto B
' Configuracin del puerto D

VAR1 VAR Byte

' Declaramos la Variable VAR1

var1 = 0

' Inicializamos la variable VAR1

Pause 200

' Pausa de 200 milisegundos

Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
PAUSE 3000

' Limpia la pantalla


' Posiciona el cursor en el inicio
"* Pantalla LCD *"
"* Teclado Mat. *"

' Pausa de 3 segundos

Inicio:
Call Teclado
Lcdout $fe, 2
' Posiciona el cursor en el inicio
Lcdout
"Tecla Pulsada: "
Lcdout $fe,$C0, "--> ",#var1,"
"
GoTo Inicio
Teclado:
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

=
=
=
=

PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1

' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
0
0
0
0

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

1
4
7
10

'
'
'
'

' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1

155

tecla
tecla
tecla
tecla

"1"
"4"
"7"
"*"

If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

=
=
=
=

0
0
0
0

PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

Return
End

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

2
5
8
11

'
'
'
'

tecla
tecla
tecla
tecla

"2"
"5"
"8"
"0"

'
'
'
'

tecla
tecla
tecla
tecla

"3"
"6"
"9"
"#"

' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0

=
=
=
=

0
0
0
0

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

3
6
9
12

' Retorna una lnea despus del llamado "Call"

156

Memoria de Datos

Capitulo VIII

8.1.- La Memoria de Datos: La memoria EEPROM de datos resulta muy


importante cuando necesitamos almacenar informacin que no queremos que
se pierda al desconectar la energa de nuestros proyectos. La capacidad de
esta memoria vara segn el modelo de microcontrolador que escojamos, y no
todos cuentan con esta caracterstica.
Por ejemplo, el PIC16F84 cuenta con una memoria de datos de 64 bytes y el
PIC16F877 cuenta con una memoria de datos de 256 bytes. Esta informacin
puede ser verificada directamente en la hoja de caractersticas tcnicas de
cada microcontrolador. Sin embargo, haremos un mapa de memoria de datos
para estos dos microcontroladores PIC:

0000:
0008:
0010:
0018:
0020:
0028:
0030:
0038:

Memoria de Datos PIC16F84


00 01 02 03 04 05 06 07
08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27
28 29 2A 2B 2C 2D 2E 2F
30 21 32 33 34 35 36 37
38 39 3A 3B 3C 3D 3E 3F
Tabla 8.1.

Podemos ver claramente en la tabla de memoria de datos, que tenemos 64


bytes que podemos utilizar para almacenar informacin, a partir de la posicin
00 hasta la posicin 3F.

157

En un microcontrolador PIC16F877 la capacidad de almacenamiento aumenta


considerablemente y lo podemos ver en el siguiente mapa:

0000:
0008:
0010:
0018:
0020:
0028:
0030:
0038:
0040:
0048:
0050:
0058:
0060:
0068:
0070:
0078:
0080:
0088:
0090:
0098:
00A0:
00A8:
00B0:
00B8:
00C0:
00C8:
00D0:
00D8:
00E0:
00E8:
00F0:
00F8:

Memoria de Datos PIC16F877


00 01 02 03 04 05 06 07
08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27
28 29 2A 2B 2C 2D 2E 2F
30 21 32 33 34 35 36 37
38 39 3A 3B 3C 3D 3E 3F
40 41 42 43 44 45 46 47
48 49 4A 4B 4C 4D 4E 4F
50 51 52 53 54 55 56 57
58 59 5A 5B 5C 5D 5E 5F
60 61 62 63 64 65 66 67
68 69 6A 6B 6C 6D 6E 6F
70 71 72 73 74 75 76 77
78 79 7A 7B 7C 7D 7E 7F
80 81 82 83 84 85 86 87
88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97
98 99 9A 9B 9C 9D 9E 9F
A0 A1 A2 A3 A4 A5 A6 A7
A8 A9 AA AB AC AD AE AF
B0 B1 B2 B3 B4 B5 B6 B7
B8 B9 BA BB BC BD BE BF
C0 C1 C2 C3 C4 C5 C6 C7
C8 C9 CA CB CC CD CE CF
D0 D1 D2 D3 D4 D5 D6 D7
D8 D9 DA DB DC DD DE DF
E0 E1 E2 E3 E4 E5 E6 E7
E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7
F8 F9 FA FB FC FD FE FF
Tabla 8.2.

Guardar y leer datos resulta muy sencillo al trabajar en PicBasic. Este


compilador tiene instrucciones muy especficas las cuales estudiaremos a
continuacin.
Si deseamos grabar algunos datos, ser necesario saber la posicin en la
cual estarn almacenados para luego poder ser consultados. La instruccin

158

en PicBasic para grabar datos en la memoria de datos EEPROM es Write y


la estructura de la sentencia es la siguiente:
WRITE direccin, dato

WRITE
Sintaxis:

WRITE direccin, variable

La instruccin WRITE almacena datos en la memoria EEPROM de un


microcontrolador en una direccin especfica.

Ejemplo:
Write $00,1

' graba el dato o valor 1 en la direccin $00

Write $21,155

' graba el dato o valor 155 en la direccin $21

Write $A0,VAR1

' graba el dato almacenado en la variable VAR1,


' en la direccin $A0

Si deseamos leer alguno de los datos almacenados, la instruccin en PicBasic


para este fin es Read, y la estructura de la sentencia es la siguiente:
Read direccin, variable

READ
Sintaxis:

READ direccin, variable

La instruccin READ permite leer datos desde la memoria EEPROM de datos


de un microcontrolador almacenndolos en una variable previamente definida.

159

Ejemplo:
Read $00, VAR1

' lee el dato de la direccin especificada y lo guarda


' en la variable VAR1

Read $21, VAR2

' lee el dato de la direccin especificada y lo guarda


' en la variable VAR2

Read $A0, VAR3

' lee el dato de la direccin especificada y lo guarda


' en la variable VAR3

A continuacin realizaremos una serie de ejercicios, en los cuales debern ser


aplicados los todos conocimientos adquiridos en los captulos anteriores.
La idea principal en cada proyecto ser familiarizarse con el uso de la
memoria de datos, almacenando en ella informacin que deber poder ser
consultada aunque el circuito sea reiniciado o apagado.
Como se puede observar en la figura 8.1, se requiere el uso de un teclado
matricial 3x4 para el ingreso de datos y una pantalla LCD, con la cual se
podr visualizar toda la informacin a ser consultada.

Figura 8.1.

160

8.2.- Proyecto #21. En este proyecto vamos a almacenar datos en la


memoria EEPROM, para luego ser consultados y mostrados uno por uno en
la pantalla LCD.
Basados en el diagrama esquemtico de la figura 8.1, empezamos el
programa asegurando que los puertos A, B y D estn configurados de
acuerdo a los dispositivos conectados a l:
' Programa en Pic Basic Pro
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

' Configuracin de Puertos:


TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
VAR1 VAR Byte

' Declaramos la variable VAR1

Seguidamente generamos una pausa de 200 milisegundos y damos un


mensaje de entrada el cual deber permanecer durante 3 segundos:
Pause 200

' Pausa de 200 milisegundos

Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
Pause 3000

' Limpia la pantalla


' Posiciona el cursor en el inicio
"Memoria de Datos"
"****************"

' Pausa de 3 segundos

Para almacenar un dato es necesario especificar una direccin en la memoria


de datos. En este ejemplo, veamos a almacenar el valor 1 en la posicin de
memoria $00; 2 en la posicin de memoria $01 y 3 en la posicin de
memoria $02:
Write $00,1
Write $01,2
Write $02,3

' Escribe el valor 1 en la posicin $00


' Escribe el valor 2 en la posicin $01
' Escribe el valor 3 en la posicin $02

161

La siguiente subrutina lee el valor almacenado en la direccin $00 y lo


muestra en la pantalla LCD, espera tres segundos y lee el segundo valor
almacenado en la posicin $01, lo muestra en la pantalla LCD y nuevamente
hace una pausa de tres segundos. Por ltimo se lee el valor almacenado en la
posicin $02 y lo muestra en la pantalla LCD durante tres segundos, para
luego volver a empezar el proceso de lectura.
Inicio:
Read $00,VAR1
Lcdout $fe, 2
' Posiciona el cursor en el inicio
Lcdout
"Direccin 00:
"
Lcdout $fe,$C0, "Dato: ",#VAR1,"
"
Pause 3000
Read $01,VAR1
Lcdout $fe, 2
' Posiciona el cursor en el inicio
Lcdout
"Direccin 01:
"
Lcdout $fe,$C0, "Dato: ",#VAR1,"
"
Pause 3000
Read $02,VAR1
' Posiciona el cursor en el inicio
Lcdout $fe, 2
Lcdout
"Direccin 02:
"
Lcdout $fe,$C0, "Dato: ",#VAR1,"
"
Pause 3000
GoTo inicio
End

Para comprobar que estos datos estn en la memoria de datos EEPROM del
microcontrolador, tambin es posible utilizar el programador P16Pro para este
fin, desde el cual podemos extraer el contenido completo de la memoria de
datos sin problemas, debido a que el software del programador cuenta con
una pequea ventana llamada Data Memory, en la cual se pueden ver los
datos almacenados como se muestra en la figura 8.2:

162

Figura 8.2.

8.3.- Proyecto #22. En el ejemplo presentado a continuacin se desea


almacenar una serie de datos a partir de una direccin especfica en la
memoria de programa. Se puede experimentar cambiando las direcciones y
datos a ser almacenados. Veamos el siguiente programa, el cual est basado
en el diagrama de la figura 8.1:

' Programa en Pic Basic Pro


Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

' Configuracin de Puertos:


TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
I VAR Byte
VAR1 var Byte
DIRECCION var Byte
DATO var Byte
Pause 200

DIRECCION = $00
DATO = 1

Declaramos
Declaramos
Declaramos
Declaramos

la
la
la
la

Variable
Variable
Variable
Variable

I
VAR1
DIRECCION
DATO

' Pausa de 200 milisegundos

Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
Pause 3000

'
'
'
'

' Limpia la pantalla


' Posiciona el cursor en el inicio
"Memoria de Datos"
"****************"

' Pausa de 3 segundos

' Asignamos una direccin inicial


' Primer dato que ser almacenado

163

' Almacenaremos a continuacin 20 datos en 20 direcciones


' consecutivas; los datos a almacenar sern: 1,3,5,7,9,11,13
' 15,17,19,21,23,25,27,29,31,33,35,37 y 39.
For I = 1 To 20
' ejecuta la subrutina 20 veces
Write DIRECCION,DATO
' escribe el dato en la direccin especificada
DIRECCION = DIRECCION + 1 ' aumenta en una unidad la posicin de la Mem.
DATO = DATO + 2 ' aumenta en dos unidades el valor del dato a almacenar.
Next I
Inicio:
DIRECCION = $00
For I = 1 To 20
' ejecuta la subrutina 20 veces
Read DIRECCION,VAR1 ' lee el dato y lo almacena en VAR1
Lcdout $fe, 2
' Posiciona el cursor en el inicio
Lcdout
"Direccin ",#DIRECCION,":
" ' muestra la direccin
Lcdout $fe,$C0, "Dato: ",#var1,"
"
' muestra el dato
DIRECCION = DIRECCION + 1
' aumenta en uno la posicin de la memoria
Pause 2000
' Pausa de 2 segundos para poder visualizar la informacin
Next I
GoTo Inicio

' inicia el proceso de lectura de la memoria de datos

End

Si apagamos el circuito y leemos la memoria de datos, podremos observar los


valores almacenados en el siguiente mapa de la memoria:

Figura 8.3.

Se puede ver en la figura 8.3 que estn almacenados 20 valores (el


equivalente de cada valor o dato en hexadecimal).

164

8.4.- Proyecto #23. En el siguiente ejemplo vamos a utilizar la rutina para el


control de un teclado matricial, ya que con ella podremos insertar valores que
sern almacenados en la memoria de datos. Analice el siguiente programa, el
cual ha sido desarrollado en base al diagrama de la figura 8.1.
' Programa en Pic Basic Pro
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

' Configuracin de Puertos:


TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
I VAR Byte
'
VAR1 VAR Byte
'
DIRECCION VAR Byte '
DATO VAR Byte
'
Pause 200

Declaramos
Declaramos
Declaramos
Declaramos

la
la
la
la

Variable
Variable
Variable
Variable

I
VAR1
DIRECCION
DATO

' Pausa de 200 milisegundos

Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
Pause 3000

' Limpia la pantalla


' Posiciona el cursor en el inicio
"Memoria de Datos"
"****************"

' Pausa de 3 segundos

DIRECCION = $00

' Asignamos una direccin inicial

Inicio:
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,

' Limpia la pantalla


' Posiciona el cursor en el inicio
"Direccion: ",#DIRECCION,"
"
"Dato?: "

espera1:
Call Teclado
If
If
If
If

VAR1
VAR1
VAR1
VAR1

=
=
=
=

0 Then espera1
10 Then espera1
11 Then VAR1 = 0
12 Then espera1

' Si ninguna tecla fue pulsada salta a espera1


' Si pulsamos la tecla asterisco salta a espera1
' Si pulsamos la tecla 0, entonces VAR1 = 0
' Si pulsamos la tecla numeral salta a espera1

Lcdout $fe,$C0, "Dato?: ",#VAR1,"

"

Write DIRECCION,VAR1
' Escribe el valor en la memoria de datos
DIRECCION = DIRECCION + 1
' Aumentamos la posicin en una unidad
Pause 1000
' Espera 1 segundo para simular un tiempo de grabacin

165

Lcdout $fe,$C0, "Dato Almacenado"


Pause 1000

' Espera 1 segundo para visualizar el mensaje

If DIRECCION = $0F Then Aviso ' Revisa si llegamos al lmite asignado por
' el programador en la memoria de datos
GoTo inicio
Aviso:
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,

' Limpia la pantalla


' Posiciona el cursor en el inicio
" Memoria llena! "
"****************"

Parada:
GoTo Parada
Teclado:
VAR1 = 0
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1

=
=
=
=

0
0
0
0

PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

PORTD.3
PORTD.4
PORTD.5
PORTD.6

Return

VAR1
VAR1
VAR1
VAR1

=
=
=
=

1
4
7
10

'
'
'
'

tecla
tecla
tecla
tecla

"1"
"4"
"7"
"*"

'
'
'
'

tecla
tecla
tecla
tecla

"2"
"5"
"8"
"0"

'
'
'
'

tecla
tecla
tecla
tecla

"3"
"6"
"9"
"#"

' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1

=
=
=
=

0
0
0
0

PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If
If
If
If

Then
Then
Then
Then

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

2
5
8
11

' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0

=
=
=
=

0
0
0
0

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

3
6
9
12

' Retorna una lnea despus del llamado "Call"

End

166

Una vez compilado y puesto a prueba el programa, los valores podrn ser
introducidos a la memoria de datos a travs del teclado matricial, y el lmite de
datos a ser grabados ser de 16 registros, ya que hemos fijado como lmite la
direccin $0F en la memoria de datos, para luego mostrar un mensaje en la
pantalla LCD que nos indicar que hemos llenado cada uno de los 16
registros disponibles.
Recuerde que un microcontrolador PIC16F877 tiene una capacidad de
memoria de datos de 256 bytes, por lo tanto el lmite que hemos fijado en el
programa anterior puede ser llevado a su capacidad mxima de ser
necesario.

167

8.5.- Proyecto #24: En el siguiente ejemplo hemos desarrollado un sistema


de control de acceso, en el cual el usuario deber introducir una contrasea
previamente almacenada en la memoria de datos. Si la contrasea es
correcta, se genera un mensaje de confirmacin y sonido (Beep). Si la
contrasea es incorrecta, se genera un mensaje de error y un sonido
intermitente (Beep, Beep, Beep).
El dispositivo encargado de generar el sonido (Buzzer), se encuentra
conectado al pin RC0.

Figura 8.4.

168

Proyecto # 24
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 1K Ohm
Potencimetro de 5K Ohm
Teclado Matricial 3x4
Transistor 2N3904
Buzzer 5 Vdc
Fuente regulada de 5 Vdc

Cantidad
1
1
2
1
4
1
1
1
1
1

Tabla 8.3.

Antes de empezar a programar, es importante tomar en cuenta cuales sern


las posiciones en la memoria de datos para guardar la contrasea.
Para un sistema de acceso donde la contrasea ser de seis dgitos, y donde
cada dgito deber ser almacenado en una posicin especfica,
convenientemente podemos tomar las posiciones en el mapa de la memoria
de datos a partir de la direccin $10 por ejemplo, hasta la direccin $15,
como se puede apreciar en la siguiente tabla:

169

0000:
0008:
0010:
0018:
0020:
0028:
0030:
0038:
0040:
0048:
0050:
0058:
0060:
0068:
0070:
0078:
0080:
0088:
0090:
0098:
00A0:
00A8:
00B0:
00B8:
00C0:
00C8:
00D0:
00D8:
00E0:
00E8:
00F0:
00F8:

Memoria de Datos PIC16F877


00 01 02 03 04 05 06 07
08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27
28 29 2A 2B 2C 2D 2E 2F
30 21 32 33 34 35 36 37
38 39 3A 3B 3C 3D 3E 3F
40 41 42 43 44 45 46 47
48 49 4A 4B 4C 4D 4E 4F
50 51 52 53 54 55 56 57
58 59 5A 5B 5C 5D 5E 5F
60 61 62 63 64 65 66 67
68 69 6A 6B 6C 6D 6E 6F
70 71 72 73 74 75 76 77
78 79 7A 7B 7C 7D 7E 7F
80 81 82 83 84 85 86 87
88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97
98 99 9A 9B 9C 9D 9E 9F
A0 A1 A2 A3 A4 A5 A6 A7
A8 A9 AA AB AC AD AE AF
B0 B1 B2 B3 B4 B5 B6 B7
B8 B9 BA BB BC BD BE BF
C0 C1 C2 C3 C4 C5 C6 C7
C8 C9 CA CB CC CD CE CF
D0 D1 D2 D3 D4 D5 D6 D7
D8 D9 DA DB DC DD DE DF
E0 E1 E2 E3 E4 E5 E6 E7
E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7
F8 F9 FA FB FC FD FE FF
Tabla 8.4.

Ahora analice detenidamente el siguiente programa tomando en cuenta cada


comentario. Notar que la clave que hemos establecido en el programa es
una serie de dgitos consecutivos 123456.
Tambin podr notar que seguimos utilizando la misma rutina para el control
del teclado matricial.

170

' Programa en Pic Basic Pro


Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

' Configuracin de Puertos:


TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
' Declaramos las variables:

X VAR Byte
VAR1 VAR Byte
DIGITO VAR Byte[7]
CLV VAR Byte[7]
' Guardamos cada digito de la clave en las posiciones elegidas previamente:
Write
Write
Write
Write
Write
Write

10,
11,
12,
13,
14,
15,

1
2
3
4
5
6

'
'
'
'
'
'

Primer dgito de la clave


Segundo dgito de la clave
Tercer dgito de la clave
Cuarto dgito de la clave
Quinto dgito de la clave
Sexto dgito de la clave

' Iniciamos el sistema con una bienvenida:


Inicio:
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut
"Cont. de Acceso"
LCDOut $fe,$C0, "** Bienvenido **"
Pause 2000
Call Beep

' Hacemos una pausa de 2 segundos


' Generamos un sonido

Clave:
X = 0
Read 10,
Read 11,
Read 12,
Read 13,
Read 14,
Read 15,

CLV[1]
CLV[2]
CLV[3]
CLV[4]
CLV[5]
CLV[6]

LCDOut $fe, 1 '


LCDOut $fe, 2 '
LCDOut
LCDOut $fe,$C0,
Call Beep

'
'
'
'
'
'
'

inicializamos la variable X = 0
leemos el primer dgito y lo guardamos en CLV[1]
leemos el segundo dgito y lo guardamos en CLV[2]
leemos el tercer dgito y lo guardamos en CLV[3]
leemos el cuarto dgito y lo guardamos en CLV[4]
leemos el quinto dgito y lo guardamos en CLV[5]
leemos el sexto dgito y lo guardamos en CLV[6]

Limpia la LCD
Posiciona el cursor en el inicio
"Introduzca su
"
"Clave de Acceso:"

' Generamos un sonido

171

Consulta:
Call Teclado

' Consultamos el teclado

If VAR1 = 0 Then consulta ' Si no hay una tecla pulsada vuelve a consultar
' Si VAR1 es diferente de cero, significa que pulsamos una tecla, por lo
' tanto generamos un sonido y continuamos
Call Beep
'
'
'
'
'
'

' Generamos un sonido

Seguidamente lo que hacemos es almacenar


en seis variables definidas
por el programador los dgitos introducidos
desde el teclado matricial
para luego ser comparados con los valores
almacenados en la memoria de datos.

X = X + 1
DIGITO[X] = VAR1

' El valor de la tecla pulsada lo


' guardamos en la variable correspondiente

If X = 6 Then comprobar ' Si X = 6 estamos guardando en DIGITO[6]


' el ltimo valor introducido desde el
' teclado matricial
GoTo consulta

'
'
'
'
'
'

' Si X es diferente de 6 continuamos


' esperando el siguiente valor a ser
' ingresado desde el teclado

A partir de la siguiente etiqueta empezamos la comprobacin,


y el formato es:
Si DIGITO[X] es igual a CLV[X] el digito es correcto,
y salta a la etiqueta paseX,
si es diferente salta a la subrutina error; veamos

Comprobar:
If DIGITO[1] = CLV[1] Then pase1:GoTo error
pase1:
If DIGITO[2] = CLV[2] Then pase2:GoTo error
pase2:
If DIGITO[3] = CLV[3] Then pase3:GoTo error
pase3:
If DIGITO[4] = CLV[4] Then pase4:GoTo error
pase4:
If DIGITO[5] = CLV[5] Then pase5:GoTo error
pase5:
If DIGITO[6] = CLV[6] Then correcto:GoTo error
' Si los seis dgitos han sido correctos
' se ejecuta la subrutina correspondiente.

172

Correcto:
Pause 500
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut
" * * * * * *
"

LCDOut $fe,$C0, "Clave

Correcta!"

Call beep

' Generamos un sonido

Pause 3000

' Pausa para visualizar el mensaje

GoTo inicio
Error:
Pause 500
LCDOut $fe, 1 '
LCDOut $fe, 2 '
LCDOut
LCDOut $fe,$C0,

Limpia la LCD
Posiciona el cursor en el inicio
" * * * * * *
"
"
ERROR!
"

Call beep
Call beep
Call beep

' Generamos un sonido


' Generamos un sonido
' Generamos un sonido

Pause 1500

' Pausa para visualizar el mensaje

GoTo clave

' Salta a clave para nueva oportunidad

' La siguiente subrutina genera un Beep en el Buzzer


' conectado en RC0.
Beep:
High portc.0
' Estado Lgico Alto para RC0
Pause 100
' Pausa de 100 milisegundos
Low portc.0
' Estado Lgico Bajo para RC0
Pause 100
' Pausa de 100 milisegundos
Return
' Retorna una lnea despus del llamado "Call"
Teclado:
VAR1 = 0
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

=
=
=
=

' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
0
0
0
0

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

1
4
7
10

'
'
'
'

173

tecla
tecla
tecla
tecla

"1"
"4"
"7"
"*"

PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1

=
=
=
=

0
0
0
0

PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

Return

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

2
5
8
11

'
'
'
'

tecla
tecla
tecla
tecla

"2"
"5"
"8"
"0"

'
'
'
'

tecla
tecla
tecla
tecla

"3"
"6"
"9"
"#"

' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0

=
=
=
=

0
0
0
0

Then
Then
Then
Then

VAR1
VAR1
VAR1
VAR1

=
=
=
=

3
6
9
12

' Retorna una lnea despus del llamado "Call"

End

174

Interrupciones

Capitulo IX

9.1.- Qu son las Interrupciones?


Las interrupciones son cambios de trayectorias del flujo de un programa
causadas por agentes externos de mayor prioridad. Cuando esto ocurre, el
microcontrolador detiene el programa en curso, almacena la direccin en la
cual se ha detenido y salta a un vector de interrupcin previamente definido
en el programa.
9.2.- Fuentes de Interrupciones:
A continuacin mencionaremos cuatro posibles fuentes de interrupcin en un
microcontrolador PIC16F84:
1. Activacin de interrupcin por el pin RB0/INT.
2. Desbordamiento del temporizador TMR0.
3. Cambio de estado de uno de los pines ms significativos del puerto B
(RB4-RB7).
4. Finalizacin de la escritura en la EEPROM de datos.
Estas posibles fuentes de interrupcin
microcontroladores mas avanzados.

pueden

aumentar

en

9.3.- Registro INTCON:


Para aprender a controlar una de estas fuentes de interrupcin, debemos
estudiar el registro de control de interrupciones INTCON, con el cual
podremos habilitar el inspector de interrupciones, seleccionar el tipo de
interrupcin y consultar las banderas de interrupciones.
Bit 7
GIE

Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0


EEIE TOIE INTE RBIE TOIF INTF RBIF
Figura 9.1.

175

GIE:
1 = habilita todas las interrupciones.
0 = deshabilita las interrupciones.
EEIE:
1 = habilita la interrupcin por escritura de la EEPROM.
0 = deshabilita la interrupcin por escritura de la EEPROM.
TOIE:
1 = habilita la interrupcin por temporizador TMR0.
0 = deshabilita la interrupcin por temporizador TMR0.
INTE:
1 = habilita la interrupcin por RB0/INT.
0 = deshabilita la interrupcin por RB0/INT.
RBIE:
1 = habilita la interrupcin por puerto B (RB4-RB7).
0 = deshabilita la interrupcin por puerto B.
TOIF: (Bandera de interrupcin por desborde del TMR0)
1 = cuando TMR0 pasa de FFh a 00h.
Este bit debe ponerse a cero por software.
INTF: (Bandera de interrupcin por RB0/INT)
1 = cuando ocurre una interrupcin en RB0/INT.
Este bit debe ponerse a cero por software.
RBIF: (Bandera de interrupcin por puerto B)
1 = cuando las entradas RB7 a RB4 cambian de estado.
Este bit debe ponerse a cero por software.

176

9.4.- Activacin de interrupcin a travs del pin RB0/INT:


Para activar esta interrupcin, lo primero que debemos tomar en cuenta es la
configuracin del bit 4 (INTE) del registro INTCON, el cual deber estar en 1.
Otro paso importante antes de empezar a ejecutar la rutina principal de un
programa, ser definir el vector de interrupcin y habilitar el inspector de
interrupciones.
Estos pasos se pueden ver claramente en el programa propuesto para el
proyecto que presentamos a continuacin.

9.5.- Proyecto #25. En el siguiente circuito hemos conectado un diodo LED


en el pin RA0, el cual deber destellar a una frecuencia de 1 Hz. La
interrupcin ocurre cuando activamos P1, lo cual produce un salto hacia el
vector de interrupcin, en el cual habr una rutina encargada de hacer
destellar un LED conectado en el pin RA1.

Figura 9.2.

177

Proyecto # 25
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Cantidad
1
1
2
2
2
1
1
1

Tabla 9.1.

Figura 9.3.

Lea detenidamente los comentarios en cada lnea y analice el funcionamiento


del programa y del registro INTCON:
' Programa en Pic Basic Pro
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

178

TRISA = %00000000
TRISB = %00000000

' Configura el Puerto A como salida


' Configura el Puerto B como salida

I VAR Byte
Symbol LED1 = PORTA.0
Symbol LED2 = PORTA.1
Symbol INTEDG = OPTION_REG.6 ' Bit 6 del registro Option
' El bit 6 (INTEDG) del registro Option define si la interrupcin ser
' activada por flanco positivo o negativo.
On Interrupt GoTo Interrup

' Define el vector de interrupcin.

INTCON = %10010000

' Activa el inspector de interrupciones y


' habilita la interrupcin RB0/INT.

PORTA = $00

' Inicializa el puerto A.

LED1 = 0
LED2 = 0

' Apaga el Led1


' Apaga el Led2

INTEDG = 0

' Cero (0) para activacin de RB0/INT en flanco descendente


' Uno (1) para activacin de RB0/INT en flanco ascendente

Inicio:
LED1 = 1
Pause 1000
LED1 = 0
Pause 1000
GoTo Inicio

'
'
'
'
'

Enciende el Led1
Pausa de 1000 ms (1 segundo)
Apaga el Led1
Pausa de 1000 ms (1 segundo)
Salta a la etiqueta inicio

' Rutina de interrupcin:


Interrup:
Disable
For I = 1 To 6
LED2 = 1
Pause 200
LED2 = 0
Pause 200
Next I
INTCON = %10010000

Enable
Resume

' Detiene al inspector de interrupciones mientras


' ejecuta las siguientes lneas:
'
'
'
'

Enciende
Pausa de
Apaga el
Pausa de

el Led2
200 ms
Led1
200 ms

' Habilita las interrupciones (GIE=1)


' Habilita la interrupcin RB0/INT (INTE=1)
' Inicializa la interrupcin (INTF=0)
' Habilita el inspector de interrupciones.
' GIE = 1 y retorna al punto donde haba quedado
' antes de la interrupcin.

End

179

9.6.- Interrupcin TMR0:


El registro TMR0 es un contador ascendente de ocho bits, el cual tambin
puede ser configurado como temporizador. Este registro produce una
interrupcin cuando su conteo pasa de 255 ($FF) a 0 ($00). Cuando esto
ocurre, la bandera de interrupcin TOIF en el registro INTCON se activa, es
decir, TOIF = 1.
La Figura 9.4 representa el funcionamiento del registro TMR0:

Figura 9.4.

180

El Bit TOSE del registro OPTION, elige el tipo de flanco activo cuando el
contador TMR0 es incrementado a travs del pin RA4/TOCKI, es decir,
determina si el incremento se har con el flanco de bajada o con el flanco de
subida de la seal aplicada.
TOCKI es una seal generada por un circuito externo aplicada al pin
RA4/TOCKI. A travs de esta entrada es posible contar el nmero de pulsos
que lleguen a ella, y producir una interrupcin por desborde cuando el
contador pasa de 255 ($FF) a 0 ($00). Se utiliza cuando deseamos que el
registro TMR0 se comporte como contador, y esto es posible configurando el
Bit TOCS del registro OPTION (TOCS = 1).
FOSC/4 es una seal de reloj interna que genera pulsos que tienen una
frecuencia conocida y la cual depende del oscilador principal. FOSC/4 se
utiliza cuando queremos que el registro TMR0 se comporte como
temporizador, y esto se logra configurando el Bit TOCS del registro OPTION
(TOCS = 0).
PRESCALER el un divisor programable de frecuencia el cual se configura
seleccionando los bits PS2, PS1 y PS0 (bits menos significativos del Registro
OPTION). Para programar el PRESCALER, contamos con una tabla que
define los valores del Divisor (ver tabla 9.2).
PSA asigna el divisor de frecuencias y tambin puede ser programado a
travs del bit 3 del registro OPTION.

9.7.- Registro OPTION:


Bit 7
RBPO#

Bit 6
INTEDG

Bit 5
TOCS

Bit 4
TOSE

Bit 3
PSA

Figura 9.5.

RBP0#:
1 = resistencias Pull-Up del puerto B activadas.
0 = resistencias Pull-Up del puerto B desactivadas.
181

Bit 2
PS2

Bit 1
PS1

Bit 0
PS0

INTEDG: (Flanco activo de interrupcin externa)


1 = activacin de la interrupcin con flanco ascendente
0 = activacin de la interrupcin con flanco descendente
TOCS:
1 = seal de reloj introducida a travs de RA4/TOCKI
0 = seal de reloj interno FOSC/4
TOSE:
1 = incrementa TMR0 con flanco descendente de RA4/TOCKI
0 = incrementa TMR0 con flanco ascendente de RA4/TOCKI
PSA:
1 = asigna el divisor de frecuencia a WDT
0 = asigna el divisor de frecuencia a TMR0
PS2,PS1,PS0:
PS2 PS1 PS0
0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1

Divisor de
TMR0
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256
Tabla 9.2.

182

Divisor de
WDT
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128

9.8.- Proyecto #26. Para dar un ejemplo de aplicacin del Registro TMR0
como temporizador, crearemos un programa que haga destellar un Led con
una frecuencia de 1 Hz. Este proceso se debe cumplir de la siguiente manera:
1.
2.
3.
4.
5.

Encender el Led.
Esperar un segundo (1000 milisegundos).
Apagar el Led.
Esperar un segundo (1000 milisegundos).
Repetir todo el proceso.

En este punto resulta importante saber cuanto es la temporizacin mxima


que se puede lograr con TMR0. Para esto, ser necesario aplicar una frmula
sencilla:
Temporizacin TMR0 = 4 / Fosc x (256 - Valor a cargar en TMR0) x Prescaler

Fosc: Depende del Oscilador que usemos, y en este ejemplo utilizamos un


cristal de 4 Mhz, por lo tanto Fosc = 4000000.
Valor a cargar en TMR0: es el valor desde el cual se inicia el conteo para
generar el desborde. En este caso cargaremos cero, para garantizar que
cuente los 256 ciclos completos.
Prescaler: segn la tabla 9.2, el valor mximo para el divisor del TMR0 es
256.
Entonces;
Temporizacin TMR0 = (4 / 4000000) x (256 - 0) x (256)
Temporizacin TMR0 = 0,065536 Segundos  65,536 milisegundos
Obviamente este tiempo no es suficiente para generar el retardo deseado de
1000 milisegundos, por lo cual proponemos entonces calcular el valor a
cargar en el registro TMR0, para un tiempo de desborde de 50 milisegundos,
el cual repetiremos 20 veces, dando como resultado un retardo de 1000
milisegundos, es decir, 1 segundo.

183

Entonces, aplicando la formula tenemos:


Temporizacin TMR0 = (4 / Fosc) x (256 Valor a cargar en TMR0) x Prescaler
50 ms= (4 / 4000000) x (256 Valor a cargar en TMR0) x 256

Despejando la incgnita tenemos que:


Valor a cargar en TMR0 = 256 (50ms / (256 x 0,000001))
Valor a cargar en TMR0 = 256 195
Valor a cargar en TMR0 = 61

El valor a cargar en el registro TMR0 para que se produzca un desborde cada


50 milisegundos es 61.
Realice el montaje correspondiente al diagrama esquemtico de la figura 9.6 y
analice detenidamente el programa que se muestra a continuacin:

Figura 9.6.

184

Proyecto # 26
Componente

Cantidad

PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc

1
1
2
1
1
1

Tabla 9.3.
' Programa en Pic Basic Pro
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

I var Byte

' Declaracin de la variable I tipo Byte.

On Interrupt GoTo retardo

' Define el vector de Interrupcin

Symbol TOIF = INTCON.2


Symbol GIE = INTCON.7
Symbol LED = PORTA.0

' Alias para el bit 2 del registro INTCON.


' Alias para el bit 7 del registro INTCON.
' Alias para el pin RA0

OPTION_REG = %0000111
INTCON = %10100000

' Configuracin del Registro OPTION


' Configuracin del Registro INTCON

Disable
Inicio:
High LED
Call Retardo
Low LED
Call Retardo
GoTo Inicio

'
'
'
'
'

Enciende el Led
Llama a la rutina de retardo
Apaga el Led
Llama a la rutina de retardo
Salta a la etiqueta inicio.

Retardo:
For I = 1 To 20 ' Repetimos la interrupcin 20 veces para
' obtener un retardo de 1 segundo.
Call Retardo1
Next I
Return
Retardo1: '
'
'
'
'

Retardo de 50 ms
TMR0 se desborda cada 50 ms. Para calcular este valor
Utilizamos la formula:
Tiempo = 4 x Periodo x Valor a cargar en TMR0 x Valor del Divisor
El clculo del dato a cargar en TMR0 es:

185

' TMR0 = 256 - (0.050/0.000256) = 60,68 = 61

TMR0 = 61

' Cargamos el dato en TMR0

Espera:
If TOIF = 1 Then Reseteo
GoTo Espera

' pregunta si TOIF es igual a 1, es decir,


' pregunta si TMR0 se desbordo.
' Salta a la etiqueta Espera.

Reseteo:
TOIF = 0
Return
Resume

' Inicializa la bandera TOIF

End

9.9.- Interrupcin por cambio de estado de uno de los pines ms


significativos del puerto B (RB4-RB7):
Activar la interrupcin por cambio de estado en los pines RB4, RB5, RB6 y
RB7 es muy sencillo, y lo podemos hacer a travs del registro INTCON,
donde contamos con un bit llamado RBIE, que activa o desactiva este tipo de
interrupcin, es decir, podemos configurar este registro de la siguiente
manera:

Bit 7
GIE

Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0


EEIE TOIE INTE RBIE TOIF INTF RBIF
Figura 9.7.

INTCON = %10001000

GIE = 1, con este bit en estado lgico 1, habilitamos las interrupciones.


RBIE = 1, con este bit en estado lgico 1, habilitamos las interrupciones por
cambio de estado en el puerto B.

186

Es importante tomar en cuenta el registro de configuracin del puerto B


(TrisB), en el cual debemos configurar los bits ms significativos como
entrada.
TRISB = %1111XXXX, donde las X representan cualquier estado I/O debido a
que estos pines no sern utilizados.

9.10.- Proyecto #27. Para verificar el funcionamiento de estas interrupciones,


realice el circuito de la figura 9.8. En esta oportunidad el LED conectado en el
pin RA0 destella a una frecuencia de 1 Hz. Cuando se produce una
interrupcin en cualquiera de los pines RB4, RB5 RB6 y RB7, el LED
conectado en el pin RA1 destella seis veces a una frecuencia de 1 Hz.

Figura 9.8.

187

Proyecto # 27
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Cantidad
1
1
2
2
2
4
4
1

Tabla 9.4.

En este circuito las entradas RB4, RB5, RB6 y RB7 estn normalmente en 0;
para producir una interrupcin bastar con activar cualquiera de los
pulsadores, para poner un 1 en la entrada correspondiente.

' Programa en Pic Basic Pro


Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

TRISA = %00000000
TRISB = %11110000

' Configura el puerto A como salida.


' Configura los 4 bits ms significativos como
' entrada.

I VAR Byte

' Declaracin de la variable "I" tipo Byte

Symbol LED1 = PORTA.0


Symbol LED2 = PORTA.1

' Alias para el pin RA0


' Alias para el pin RA1

On Interrupt GoTo Interrup ' Define el vector de interrupcin


INTCON = %10001000 ' habilita la interrupcin RB4-RB7
Inicio:
LED1 = 1
Pause 1000
LED1 = 0
Pause 1000
GoTo Inicio

'
'
'
'
'

Enciende el Led 1
Pausa de 1 segundo
Apaga el Led 1
Pausa de 1 segundo
Salta a la etiqueta "Inicio"

188

Interrup:
Disable
For I = 1 To 6
LED2 = 1
Pause 1000
LED2 = 0
Pause 1000
Next I

'
'
'
'

Enciende
Pausa de
Apaga el
Pausa de

el Led 2
1 segundo
Led 2
1 segundo

INTCON = %10001000 ' habilita las interrupciones (GIE=1)


' habilita la interrupcin RB4-RB7 (RBIE=1)
' Inicializa la interrupcin (RBIF=0)
Resume
Enable
End

189

Memoria Serial I2C

Capitulo X

10.1.- Qu es el bus I2C?


Se puede definir al Bus I2C como un puente de comunicaciones a dos hilos
entre los circuitos integrados de un sistema, desarrollado por la empresa
Philips y el cual se ha convertido en un estndar mundial para el control de
dispositivos como memorias EEPROM, sensores de temperatura,
convertidores A/D y D/A, entre otros dispositivos.
La tasa de transferencia de datos llega a niveles que van desde los 100 Khz
para un oscilador de 4 Mhz, hasta 400 khz para un oscilador de 20 Mhz. Si
deseamos utilizar una taza de transferencia inferior a 100 Khz la siguiente
directiva deber ser definida al inicio del programa:
DEFINE I2C_SLOW 1

Tambin es importante mencionar que el bus I2C tiene una capacidad de


conexin mxima de carga de 400 pF, que se traduce en aproximadamente
25 dispositivos entre memorias, sensores, convertidores A/D, etc. En el bus
I2C es necesario que al menos exista un chip maestro, que en nuestro caso
ser un microcontrolador. A l podrn conectarse varios dispositivos I2C
esclavos a travs del bus, donde cada uno de ellos se puede comunicar con
el dispositivo maestro, transmitiendo informacin de un lado a otro. En el bus
I2C tambin puede haber ms de un chip maestro, todos con las mismas
prioridades.
Cada dispositivo I2C cuenta con una nica direccin de 7 bits, de tal manera
que el microcontrolador podr saber exactamente a cual de ellos transferir
informacin y a cual de ellos solicitar informacin en cualquier momento. Los
cuatro bits ms significativos de esta direccin regularmente siempre estarn
fijos y su estado depende del tipo de dispositivo a ser conectado. Por ejemplo,
para una memoria EEPROM serial, los cuatro bits mas significativos en la
direccin siempre ser 1010.

190

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0


1
0
1
0
A2 A1 A0 R/W
Figura 10.1.

Los Bits 1, 2 y 3 son programables a travs de los pines A0, A1 y A2 (ver


figura 10.2), con ellos seleccionamos la direccin de cada memoria EEPROM
conectada al Bus:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0


1
0
1
0
A2 A1 A0 R/W
Figura 10.2.

Figura 10.3.

El bit 0 es una bandera que indica el estado actual de la memoria, lectura o


escritura.
El Pin WP (Write Protection) debemos conectarlo a tierra (Gnd) si deseamos
escribir datos en la memoria.
El Pin SDA (Serial Data) es bi-direccional y es utilizado para transferir
direcciones y datos a un dispositivo I2C.
El Pin SCL (Serial Clock) se utiliza para sincronizar la transferencia de datos y
los dispositivos conectados al bus I2C.
Las instrucciones de programa en PicBasic para el control del bus I2C son
I2Cread e I2CWrite, con las cuales realizaremos los siguientes proyectos, y
191

en los cuales podremos almacenar datos y extraer datos de una memoria


serial 24LC256.

10.2.- Proyecto #28. En el siguiente ejemplo hemos empleado como


dispositivo maestro un microcontrolador PIC16F877, el cual tiene conectado
una memoria EEPROM 24LC256, adems de una pantalla LCD para
visualizar los datos al momento de realizar la lectura de la memoria (figura
10.4).

Figura 10.4.

192

Proyecto # 28 - 29
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 4,7K Ohm
Potencimetro de 5K Ohm
Memoria EEPROM 24LC256
Fuente regulada de 5 Vdc

Cantidad
1
1
2
1
2
1
1
1

Tabla 10.1.

I2CWRITE
Sintaxis:
I2CWrite SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2CWrite enviar el dato de control y la direccin en la cual se
almacenar el dato cargado en la variable previamente cargada.

La primera actividad consiste en escribir un dato en una direccin especfica


de la memoria de datos EEPROM conectada al bus I2C.
Analice el siguiente programa:
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

Symbol SDA = PORTB.0

' Alias para RB0

Symbol SCL = PORTB.1

' Alias para RB1

193

Direc VAR Word


Control VAR Byte
Dato VAR Byte

' Declaracin de variable "Direc"


' Declaracin de variable "Control"
' Declaracin de variable "Dato"

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

Control = $A0
Direc = $10
Dato = $23

'
'
'
'

Inicio:
Dato de Control
Direccin en la memoria externa
Dato a ser cargado en la direccin
especificada ($23 = 35 Decimal)

I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria


Pause 10

' Pausa de 10 milisegundos

LCDOUT $fe, 2, "Dato Grabado"


Loop:

' Muestra mensaje por la LCD

GoTo Loop
End

A partir de la etiqueta Inicio, asignamos valores a las variables declaradas.


El dato de control, el cual contiene la direccin de la memoria 24LC256 es
$A0; la direccin en la cual vamos a almacenar un dato en este ejemplo ser
$10; y por ltimo el dato a ser almacenado ser $23.
Si se pregunta porqu el dato de control es $A0, podr obtener la respuesta
verificando la conexin de la memoria en el circuito de la figura 10.4. Observe
que los pines A2, A1 y A0, los hemos conectado a tierra.
Recuerde que estos tres pines definen la direccin del dispositivo; entonces,
debemos tomar en cuenta que para una memoria serial, los cuatro bits ms
significativos estn configurados como 1010xxxx; los tres bits A2, A1 y A0
estn conectados a tierra en este proyecto; y el bit R/W debe estar en 0 para
poder escribir un dato en la memoria (ver figura 10.5).
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 (A2) Bit 2 (A1) Bit 1 (A0)
1
0
1
0
0
0
0
A
0
Figura 10.5.

194

Bit 0 (R/W)
0

Para enviar el dato a la memoria en la direccin especificada, utilizamos la


instruccin I2CWrite de la siguiente manera:
I2Cwrite PORTB.0, PORTB.1, $A0, $10, [$23]

Note que en el programa utilizamos los alias y las variables:


I2Cwrite SDA, SCL, Control, Direc, [dato]

Seguidamente se requiere de una pausa de 10 milisegundos, para asegurar el


tiempo necesario para la grabacin del dato en la memoria. Una vez finalizada
la pausa, procedemos a mostrar un mensaje en la pantalla LCD, indicando
que el dato ya ha sido grabado.

I2CREAD
Sintaxis:
I2Cread SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2Cread enviar el dato de control y la direccin especfica a un
dispositivo conectado a un bus I2C y almacenar el dato obtenido en una
variable definida. Al utilizar la etiqueta opcional, el programa saltar si no se
recibe ninguna respuesta del dispositivo consultado.

Para verificar que este dato en realidad est grabado en la memoria, y en la


direccin correcta, veamos el siguiente programa:
Define Osc 4

' Define el Oscilador para un Cristal de 4 Mhz.

Symbol SDA = PORTB.0


Symbol SCL = PORTB.1

' Alias para RB0


' Alias para RB1

A1 Var Byte
Direc var Word
Control Var Byte

' Declaracin de variable "A1"


' Declaracin de variable "Direc"
' Declaracin de variable "Control"

Pause 200

' Pause de 200 milisegundos

195

LCDOut $fe, 1

' Limpia la LCD

Inicio:
Direc = $10
Control = $A0

' Direccin en la memoria externa


' Dato de Control

I2CREAD SDA, SCL, Control, Direc, [A1]


LCDOUT $fe, 2,"Dato: ",#A1
Ciclo:

' Lectura de Memoria

' Muestra el dato leido

GoTo Ciclo
End

10.3.- Proyecto #29: El siguiente programa almacena datos a partir de la


direccin cero ($00) de la memoria EEPROM conectada al bus I2C. Se
almacenan nmeros que se incrementan de dos en dos, donde el dato inicial
es igual a 1. Este proyecto est basado en el diagrama de la figura 10.4.
Analice el siguiente programa:
' Programa en Pic Basic Pro
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

Symbol SDA = PORTB.0


Symbol SCL = PORTB.1

' Alias para RB0


' Alias para RB1

I VAR Byte
A1 VAR Byte
Direc VAR Word
Control VAR Byte
Dato VAR Byte

'
'
'
'
'

Declaracin
Declaracin
Declaracin
Declaracin
Declaracin

de
de
de
de
de

variable
variable
variable
variable
variable

"I"
"A1"
"Direc"
"Control"
"Dato"

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

Direc = $00
Control = $A0
Dato = 1

' Direccin en la memoria externa


' Dato de Control
' Dato inicial a ser grabado

Escribir:
For I = 0 To 50

' Repeticin

I2Cwrite SDA, SCL, Control, Direc, [dato]


Pause 10
If I = 50 Then leer
Direc = Direc + 1
Dato = Dato + 2
Next I

'
'
'
'

' Escribe la memoria

Pausa de 10 milisegundos
Condicional
Suma 1 a la variable "Direc"
Suma 2 a la variable "Dato"

196

Leer:
LCDOUT $fe, 2,"Datos Grabados"
Pause 2000
LCDOut $fe, 2,"Inicia Lectura"
Pause 2000
Direc = $00
For I = 0 To 50

' Muestra mensaje por la LCD


' Pausa de 2 segundos
' Muestra mensaje por la LCD
' Pausa de 2 segundos

' Inicializa la direccin en la memoria externa


' Repeticin

I2CREAD SDA, SCL, Control, Direc, [A1]

' Lectura de memoria

LCDOUT $fe, 2,"Dato ",#I,": ",#A1,"


" ' Muestra el dato leido
Pause 1000
' Pausa de 1 segundo
If I = 50 Then final
' Condicional
Direc = Direc + 1
' Suma 1 a la variable "Direc"
Next I
Final:
GoTo Final

' Salta a la etiqueta "final"

End

En caso de requerir mayor capacidad de memoria de datos para nuestros


proyectos, podemos utilizar memorias como la 24LC512 o varias de menor o
igual capacidad conectadas al bus I2C como se observa en la figura 10.6.
Por supuesto, es importante resaltar que cuando se tiene mas de una
memoria conectada al bus, se debe considerar el conexionado de los Pines 1,
2 y 3 (A0, A1 y A2 respectivamente). En el programa tambin debemos tomar
en cuenta que para leer cada una de estas memorias, tenemos que
especificar la direccin del dispositivo.

197

10.4.- Proyecto #30: Veamos el siguiente programa en el cual se almacenan


datos en dos memorias conectadas al bus I2C, para luego ser extrados y
verificados.

Figura 10.6.

Proyecto # 30
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 4,7K Ohm
Potencimetro de 5K Ohm
Memoria EEPROM 24LC256
Fuente regulada de 5 Vdc

Tabla 10.2.

198

Cantidad
1
1
2
1
2
1
2
1

Analice el siguente programa, prestando atencin a los comentarios de cada


lnea:
Define Osc 4

' Define el Oscilador para un Cristal


' de 4 Mhz.

Symbol SDA = PORTB.0


Symbol SCL = PORTB.1

' Alias para RB0


' Alias para RB1

I VAR Byte
A1 VAR Byte
Direc VAR Word
Control VAR Byte
Dato VAR Byte

'
'
'
'
'

Pause 200
LCDOut $fe, 1

Declaracin
Declaracin
Declaracin
Declaracin
Declaracin

de
de
de
de
de

variable
variable
variable
variable
variable

"I"
"A1"
"Direc"
"Control"
"Dato"

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

memoria1:
' Escribimos en la memoria 1 (Pin A0 = 0; Pin A1 = 0; Pin A2 = 0)
' xxxxAAAx
' xxxx210x
Control = %10100000
Direc = $00
Dato = 1
For I = 0 To 20

' Dato de Control


' Direccin en la memoria externa
' Dato inicial a ser grabado

' Repeticin

I2Cwrite SDA, SCL, Control, Direc, [dato]


Pause 10
If I = 20 Then confirma1
Direc = Direc + 1
Dato = Dato + 2
Next I

' Escribe la memoria

' Pausa de 10 milisegundos


' Condicional
' Suma 1 a la variable "Direc"
' Suma 2 a la variable "Dato"

confirma1:
' Muestra mensaje por la LCD
LCDOUT $fe, 2,"Datos Grabados"
LCDOut $fe,$C0,"Memoria 1
"
Pause 2000
' Pausa de 2 segundos
' Escribimos en la memoria 2 (Pin A0 = 1; Pin A1 = 0; Pin A2 = 0)
memoria2:
' xxxxAAAx
' xxxx210x
Control = %10100010

' Dato de Control

199

Direc = $00
Dato = 150
For I = 0 To 20

' Direccin en la memoria externa


' Dato inicial a ser grabado
' Repeticin

I2Cwrite SDA, SCL, Control, Direc, [dato]


Pause 10
If I = 20 Then confirma2
Direc = Direc + 1
Dato = Dato + 5
Next I

'
'
'
'

' Escribe la memoria

Pausa de 10 milisegundos
Condicional
Suma 1 a la variable "Direc"
Suma 2 a la variable "Dato"

confirma2:
LCDOUT $fe, 2,"Datos Grabados"
LCDOut $fe,$C0,"Memoria 2
"
Pause 2000

' Muestra mensaje por la LCD

' Iniciamos la lectura en la memoria 1:


lectura1:
LCDOut $fe, 2,"Inicia Lectura"
LCDOut $fe,$C0,"Memoria 1
"
Pause 2000
' xxxxAAAx
' xxxx210x
Control = %10100000
Direc = $00
For I = 0 To 20

' Muestra mensaje por la LCD


' Pausa de 2 segundos

' Dato de Control


' Direccin en la memoria externa

' Repeticin

I2CREAD SDA, SCL, Control, Direc, [A1]

' Lectura de memoria

LCDOUT $fe, 2,"Dato ",#I,": ",#A1,"


" ' Muestra el dato leido
Pause 1000
' Pausa de 1 segundo
If I = 20 Then lectura2
' Condicional
Direc = Direc + 1
' Suma 1 a la variable "Direc"
Next I
lectura2:
LCDOut $fe, 2,"Inicia Lectura"
LCDOut $fe,$C0,"Memoria 2
"
Pause 2000
' xxxxAAAx
' xxxx210x
Control = %10100010
Direc = $00
For I = 0 To 20

' Muestra mensaje por la LCD


' Pausa de 2 segundos

' Dato de Control


' Direccin en la memoria externa

' Repeticin

I2CREAD SDA, SCL, Control, Direc, [A1]

200

' Lectura de memoria

LCDOUT $fe, 2,"Dato ",#I,": ",#A1,"


" ' Muestra el dato leido
Pause 1000
' Pausa de 1 segundo
If I = 20 Then final
' Condicional
Direc = Direc + 1
' Suma 1 a la variable "Direc"
Next I
final:
GoTo final
End

' Salta a la etiqueta "final"

201

Conversor A/D en el PIC16F877

Capitulo XI

11.1.- Conversor A/D.


Los microcontroladores de las familias PIC16F87x y PIC18Fxxx de los cuales
estaremos hablando a continuacin, poseen un convertidor Analgico-Digital
que convierte una seal analgica en un nmero de 8 o 10 bits, segn sea la
configuracin elegida por el diseador.
En los microcontroladores PIC de 28 pines como el PIC16F870,
encontraremos que solo poseen 5 entradas para la conversin A/D, y en el
caso particular de los microcontroladores de 40 pines como el PIC16F877 o el
PIC18F442 por ejemplo, se puede observar que poseen 8 canales para
conversin A/D, identificadas por las siglas AN(n), las cuales se encuentran
distribuidas entre el puerto A y el puerto E, como se muestra en el diagrama
de pines de la figura 11.1:

Figura 11.1.

202

En el microcontrolador PIC16F877, cada canal de conversin A/D est


conectado a un pin ubicado en el puerto A y en el puerto E. Por ejemplo, el
canal AN0 corresponde al pin # 2 del microcontrolador, o expresado de otra
manera, al pin RA0 del puerto A. El canal AN1 corresponde al pin # 3; el canal
AN2 corresponde al pin # 4 y as sucesivamente; entonces se puede ver
claramente que el puerto A cuenta con cinco de los ocho canales del
conversor A/D, y los otros tres canales estn ubicados en los pines
correspondientes al puerto E del microcontrolador.
Un punto importante a considerar al momento de utilizar el convertidor A/D,
ser decidir si la conversin se har configurando el conversor a 8 o 10 bits,
con lo cual a su vez estaremos definiendo la resolucin en el proceso de
conversin.
Esto significa que si elegimos la conversin de una seal analgica a solo 8
bits (28 = 256), los valores digitales resultantes de la conversin estarn
comprendidos entre 0 y 255 (en binario es de 00000000 hasta 11111111),
como se puede observar en la tabla 11.1:

REGISTRO BAJO (ADRESL)


BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
0

250
251
252
253
254
255

1
1
1
1
1
1

1
1
1
1
1
1

1
1
1
1
1
1

1
1
1
1
1
1

0
1
2
3
4

Decimal

Tabla 11.1.

203

0
0
0
0
0

0
0
0
0
1

0
0
1
1
0

0
1
0
1
0

1
1
1
1
1
1

0
0
1
1
1
1

1
1
0
0
1
1

0
1
0
1
0
1

Cuando la conversin se hace a 10 bits, la resolucin aumenta


considerablemente en relacin a la de 8 bits, ya que tenemos 210 = 1024
datos de conversin, como se puede observar en la tabla 11.2:
REGISTRO ALTO (ADRESH)

1018
1019
1020
1021
1022
1023

BIT 7

BIT 6

BIT 5

BIT 4

BIT 3

BIT 2

BIT 1

BIT 0

BIT 7

BIT 6

BIT 5

BIT 4

BIT 3

BIT 2

BIT 1

BIT 0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
0

0
0
0
0
1

0
0
1
1
0

0
1
0
1
0

1
1
1
1
1
1

1
1
1
1
1
1

1
1
1
1
1
1

1
1
1
1
1
1

1
1
1
1
1
1

1
1
1
1
1
1

1
1
1
1
1
1

0
0
1
1
1
1

1
1
0
0
1
1

0
1
0
1
0
1

0
1
2
3
4

Decimal

REGISTRO BAJO (ADRESL)

Tabla 11.2.

Para comprender an mejor este punto, veamos el siguiente ejemplo:


Si configuramos el conversor A/D a 8 bits e introducimos una seal cuya
amplitud vara entre 0 y 5 voltios, y donde el voltaje de referencia del
conversor es 5 voltios, entonces la resolucin que obtendremos en la
conversin sera la siguiente:

Resolucin =

Vimax
2n

Resolucin =

5V
28

204

Resolucin =

5V
256

Resolucin = 0.0196 0.02 V


Esto significa que la resolucin a 8 bits para el ejemplo planteado es de 20
mV por cada paso que da el conversor A/D entre 0 y 255.
Si configuramos el conversor A/D a 10 bits, entonces tenemos que 210 = 1024,
y por lo tanto obtenemos una resolucin mayor, lo cual podemos demostrar
realizando los clculos correspondientes:
Resolucin =

Vimax
2n

Resolucin =

5V
210

Resolucin =

5V
1024

Resolucin = 0.00488 0.0049 V

Entonces la resolucin a 10 Bits es de 4.9 mV por cada paso que da el


conversor A/D entre 0 y 1023.

205

Veamos el diagrama de bloques del conversor A/D (figura 11.2):

Figura 11.2.

Resulta interesante saber que se puede obtener ms resolucin en trminos


de voltios por paso, si utilizamos un voltaje de referencia menor al de la
alimentacin del microcontrolador a travs de los pines Ref+ o Ref- segn
sea el caso.
Por ejemplo, si aplicamos un voltaje de referencia positivo igual a 2.5 voltios
en el pin RA3/AN3/Ref+ del puerto A, el cual ha sido previamente configurado
para esto, entonces:
Resolucin =

Vimax
2n

206

Resolucin =

Resolucin =

2.5V
210
2.5V
1024

Resolucin = 0.00244 0.0025 V

La resolucin del conversor A/D sera de 2.5 mV por cada paso entre 0 y
1023. Hay una serie de pasos que debemos tomar en cuenta para llevar a
cabo una conversin A/D, basados en el diagrama de bloques de la figura
11.2:
Lo primero, ser configurar los canales de entrada que utilizaremos para
introducir la seal analgica al conversor A/D y los canales para voltajes de
referencia, en el caso de ser necesario. Esto se hace seleccionando la
combinacin correspondiente en los bits PCFG3, PCFG2 PCFG1 y PCFG0
del registro de control ADCON1 (figura 11.3).

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

ADFM

------

------

------

PCFG3

PCFG2

PCFG1

PCFG0

Figura 11.3.

En este punto es muy conveniente detenerse a analizar la tabla 11.3, que


define cuales pines del puerto A y E sern entradas al conversor A/D, segn
la combinacin elegida.

207

PCFG3 PCFG2 PCFG1 PCFG0 AN7

0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

0
0
0
0
1
1
1
0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
0
0
1
1
0
0
1
1

0
1
0
1
0
1
x
0
1
0
1
0
1
0
1

A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

AN6

AN5

AN4

A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

A
A
D
D
D
D
D
A
A
A
A
D
D
D
D

A
A
A
A
D
D
D
A
A
A
A
A
D
D
D

AN3

AN2

A
A
Vref+ A
A
A
Vref+ A
A
D
Vref+ D
D
D
Vref+ VrefA
A
Vref+ A
Vref+ VrefVref+ VrefVref+ VrefD
D
Vref+ Vref-

AN1

AN0

A
A
A
A
A
A
D
A
A
A
A
A
A
D
D

A
A
A
A
A
A
D
A
A
A
A
A
A
A
A

Vref+ Vref-

Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
RA3
RA3
RA3
Vdd
RA3

Vss
Vss
Vss
Vss
Vss
Vss
Vss
RA2
Vss
Vss
RA2
RA2
RA2
Vss
RA2

Tabla 11.3.

El segundo paso ser activar el canal en el cual se encuentra presente la


seal analgica para que pase a la etapa de muestreo. La seleccin de las
entradas analgicas se realiza configurando los bits CHS2 (bit 5), CHS1 (bit 4)
y CHS0 (bit 3) del registro ADCON0 (figura 11.4):

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

ADCS1

ADCS0

CHS2

CHS1

CHS0

GO/DONE

------

ADON

Figura 11.4.

CHS2 CHS1 CHS0


0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1

Canal/Pin
Canal 0 (AN0)/RA0
Canal 1 (AN1)/RA1
Canal 2 (AN2)/RA2
Canal 3 (AN3)/RA3
Canal 4 (AN4)/RA5
Canal 5 (AN5)/RE0
Canal 6 (AN6)/RE1
Canal 7 (AN7)/RE2

=
=
=
=
=
=
=
=

Tabla 11.4.

208

Tambin es posible seleccionar el canal que deseamos utilizar, con la


instruccin de programa ADCin, en la cual slo se especifica cual ser el
canal de entrada de la seal a ser convertida y la variable en la cual se
almacenar el resultado de la conversin.
Por ejemplo:

ADCin 0, temperatura

Significa que el resultado de la conversin de una seal presente en la


entrada AN0 ser almacenado en la variable temperatura, la cual ha sido
previamente definida en el programa.
Aunque la instruccin ADCin se encarga de controlar el registro ADCON0
ahorrando algunas lneas de programa, consideramos conveniente hacer una
revisin de los registros de control del conversor A/D.

11.2.- El registro ADCON0:

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

ADCS1

ADCS0

CHS2

CHS1

CHS0

GO/DONE

------

ADON

Figura 11.5.

Bit 7 y Bit 6: Seleccin del reloj del conversor A/D.

ADCS1 ADCS0
Conversin del Reloj
0
0
=
Fosc/2
0
1
=
Fosc/8
1
0
=
Fosc/32
1
1
=
FRC
Tabla 11.5.

209

Bit 5, Bit 4 y Bit 3: Seleccin del canal de entrada.


CHS2 CHS1 CHS0
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1

Canal/Pin
Canal 0 (AN0)/RA0
Canal 1 (AN1)/RA1
Canal 2 (AN2)/RA2
Canal 3 (AN3)/RA3
Canal 4 (AN4)/RA5
Canal 5 (AN5)/RE0
Canal 6 (AN6)/RE1
Canal 7 (AN7)/RE2

=
=
=
=
=
=
=
=

Tabla 11.6.

Bit 2: Estado de la conversin.


GO/DONE: Solo funciona si ADON = 1
1 = Conversin A/D en progreso.
0 = Conversin A/D detenida.
Bit 1: Este bit no est implementado.
Bit 0: Enciende el conversor A/D.
1 = conversor A/D encendido.
0 = conversor A/D apagado.

11.3.- El registro ADCON1:

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

ADFM

------

------

------

PCFG3

PCFG2

PCFG1

PCFG0

Figura 11.6.

Bit 7: Justificacin del resultado de la conversin a 10 bits a la derecha o


izquierda.

210

1 = Justifica a la derecha.
0 = Justifica a la Izquierda.

Bit 6 al Bit 4: No estn implementados.

Bit3, Bit 2, Bit 1 y Bit 0: Configuracin

PCFG3 PCFG2 PCFG1 PCFG0 AN7

0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

0
0
0
0
1
1
1
0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
0
0
1
1
0
0
1
1

0
1
0
1
0
1
x
0
1
0
1
0
1
0
1

A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

AN6

AN5

AN4

AN3

AN2

AN1

AN0

A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

A
A
D
D
D
D
D
A
A
A
A
D
D
D
D

A
A
A
A
D
D
D
A
A
A
A
A
D
D
D

A
Vref+
A
Vref+
A
Vref+
D
Vref+
A
Vref+
Vref+
Vref+
Vref+
D
Vref+

A
A
A
A
D
D
D
VrefA
A
VrefVrefVrefD
Vref-

A
A
A
A
A
A
D
A
A
A
A
A
A
D
D

A
A
A
A
A
A
D
A
A
A
A
A
A
A
A

Vref+ Vref-

Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
RA3
RA3
RA3
Vdd
RA3

Vss
Vss
Vss
Vss
Vss
Vss
Vss
RA2
Vss
Vss
RA2
RA2
RA2
Vss
RA2

Tabla 11.7.

A = Entrada Analgica
D = I/O Digital

Para definir en un programa si la conversin A/D se har a 8 bits o a 10 bits,


se deben utilizar las siguientes directivas:
Conversin a 8 Bits:

Define ADC_BITS 8

211

Esta directiva define que el resultado de la conversin A/D de una seal,


aplicada a cualquiera de los canales, ser de 8 bits. Este resultado ser
almacenado en un registro definido por el fabricante denominado ADRESL.

REGISTRO BAJO (ADRESL)


BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

Figura 11.7.

Conversin a 10 Bits:

Define ADC_BITS 10
Cuando realizamos la conversin A/D a 10 bits, el resultado de la conversin
se almacena en dos registros, ADRESH y ADRESL, los cuales unidos forman
un solo registro de 16 bits, solo que en la parte alta de ste, los 6 bits mas
significativos (Bit 2 al Bit 7 de ADRESH, figura 11.8) no son tomados en
cuent, es decir, son considerados como 0. Esto da como resultado que el
valor mximo a ser almacenado en l ser: 0000001111111111, es decir,
1023.

REGISTRO ALTO (ADRESH)

REGISTRO BAJO (ADRESL)

BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

0
Figura 11.8.

En la conversin a 10 bits tambin es muy importante considerar el bit 7


(ADFM) del registro de control ADCON1, ya que este bit mantiene el resultado
de la conversin de 10 bits justificado, ya sea a la derecha si ADFM = 1, como
lo demuestra la figura 11.9, o a la izquierda si ADFM = 0 como lo demuestra la
figura 11.10:

212

REGISTRO ALTO (ADRESH)

REGISTRO BAJO (ADRESL)

BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

0
Figura 11.9.

REGISTRO ALTO (ADRESH)

REGISTRO BAJO (ADRESL)

BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

Figura 11.10.

Cuando justificamos el resultado de la conversin A/D a la izquierda, el bit


menos significativo de ste es el bit 6 del registro ADRESL, y el bit ms
significativo es el bit 7 del registro ADRESH.

Nota: En el proceso de conversin A/D, resulta importante considerar un


tiempo mnimo requerido en la etapa de muestreo, necesario para cargar el
condensador de mantenimiento C-Hold (ver figura 11.2). El tiempo de
muestreo se define a travs de la siguiente directiva:
Define ADC_SAMPLEUS {tiempo}

Ejemplo:
Define ADC_SAMPLEUS 50

213

11.4.- Proyecto #31: A continuacin presentamos un ejemplo de conversin


A/D a 8 bits, el cual consta bsicamente de un microcontrolador PIC16F877,
un oscilador externo de 10 Mhz, una pantalla LCD para visualizar los
resultados, y un potencimetro de 5Kohm para introducir un voltaje variable
en un canal de entrada al conversor A/D.

Figura 11.11.

214

Proyecto # 31
Componente
PIC16F877A
Cristal de 10 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 220 Ohm
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc

Cantidad
1
1
2
1
2
2
1

Tabla 11.8.

ADCin
Sintaxis:

ADCin canal, Variable

Esta instruccin solo es vlida para microcontroladores que tienen convertidor


A/D, por ejemplo, el PIC16F877, el PIC18F442, el PIC18F452, el PIC18F458
entre otros.

Realice el montaje del circuito propuesto en la figura 11.11, y analice cada


lnea de programa leyendo detenidamente los comentarios.
DEFINE OSC 10

' Define el Oscilador a 10 Mhz

DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE
DEFINE

PORTB
1
PORTB
0
2

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
LCD_LINES

'
'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto (0 o 4) en caso
de utilizar los cuatro Bits mas significativos de la LCD
Indica al uC que el pin "RS" estar en el Puerto B
"RS" estar conectado en RB1
Indica al uC que el pin "E" estar en el Puerto B
"E" estar conectado en RB0
Define el nmero de lneas de la pantalla

215

DEFINE ADC_BITS 8
DEFINE ADC_SAMPLEUS 50

' Define la conversin A/D a 8 Bits


' Tiempo de muestreo en el conversor A/D es 50 uS

VAR Byte

' Declaracin de una variable tipo Byte (8 bits)

ADCON1 = %00000000

' Configura el registro ADCON1

LCDOut $fe, 1

' Limpia la LCD

ADCIN 0, A

' Inicia la conversin, almacena el resultado en "A"

Inicio:

LCDOut $fe, 2
LCDOUT "C-AD a 8 Bit:
"
LCDOUT $fe,$C0,"
",Dec A,"
PAUSE 100

"

'
'
'
'

GoTo Inicio

Posiciona el cursor en el inicio


Muestra mensaje en la lnea 1
Muestra dato en la lnea 2
Pausa de 100 milisegundos
' Salta a inicio

End

En este ejemplo, podemos observar como vara el resultado cargado en la


variable A al modificar el valor del potencimetro conectado al canal AN0 del
conversor A/D (figura 11.11). Recordemos que la variable A, definida al
inicio del programa, es del tipo Byte (8 Bits), suficiente para una conversin
A/D de 8 Bits.
Adems es importante observar que hemos seleccionado una configuracin
en el registro ADCON1, para que todos los canales estn activos y
disponibles para una posible solicitud de conversin, y tambin para que el
voltaje de referencia sea el mismo de la fuente de alimentacin del circuito.
Otro detalle importante es que el resultado de la conversin A/D se muestra
en la pantalla LCD en decimal, debido a que se antepone a la variable A la
directiva Dec.
El resultado de la conversin tambin lo podemos ver en binario anteponiendo
la directiva Bin, o en hexadecimal, anteponiendo la directiva Hex.
Si deseamos obtener una mayor resolucin en la conversin A/D, podemos
hacer unos cambios en la configuracin del conversor, sin necesidad de
modificar el circuito de la figura 11.11.

216

Esto significa que podemos configurar el conversor A/D a 10 Bits, lo cual nos
lleva a considerar los siguientes cambios:
1. Debemos definir ADC_BITS = 10.
2. La variable en la cual ser almacenado el resultado, debe ser del tipo
Word (16 Bits), ya que una vez que se desborde el registro ADRESL,
se requerir disponer de ms bits, debido a que el resultado para una
conversin de 10 bits vara entre 0 y 1023.
3. Debemos recordar justificar el resultado de la conversin A/D a la
derecha, configurando el bit 7 del registro ADCON1, es decir, ADFM =
1.
4. El mensaje mostrado en la primera lnea de la pantalla LCD deber ser:
C-AD a 10 Bit:.
Analice el siguiente programa en el cual se pueden observar los cambios
antes mencionados:
DEFINE OSC 10

' Define Oscilador a 10 Mhz

DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE
DEFINE

PORTB
1
PORTB
0
2

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
LCD_LINES

'
'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto (0 o 4) en caso
de utilizar los cuatro Bits mas significativos de la LCD
Indica al uC que el pin "RS" estar en el Puerto B
"RS" estar conectado en RB1
Indica al uC que el pin "E" estar en el Puerto B
"E" estar conectado en RB0
Define el nmero de lneas de la pantalla

Define ADC_BITS 10
DEFINE ADC_SAMPLEUS 50

' Define la conversin A/D a 10 Bits


' Tiempo de muestreo en el conversor A/D es 50 uS

VAR Word

' Declaracin de una variable tipo word (16 bits)

ADCON1 = %10000000

' Configura el registro ADCON1

LCDOut $fe, 1

' Limpia la LCD

ADCIN 0, A

' Inicia la conversin, almacena el resultado en "A"

Inicio:

217

LCDOut $fe, 2
LCDOUT "C-AD a 10 Bit:
"
LCDOUT $fe,$C0,"
",Dec A,"
PAUSE 100
GoTo Inicio

"

'
'
'
'

Posiciona el cursor en el inicio


Muestra mensaje en la lnea 1
Muestra dato en la lnea 2
Pausa de 100 milisegundos

' Salta a inicio

End

Al modificar el valor del potencimetro conectado al canal AN0, podemos


observar cmo vara el resultado de la conversin en la pantalla LCD entre 0 y
1023.
Mueva el potencimetro hasta obtener un resultado cercano a 512 en la
pantalla LCD, y mida con un multmetro el voltaje aplicado en el canal AN0, el
cual deber ser aproximadamente 2,5 voltios, ya que el voltaje de referencia
segn la configuracin elegida en el registro de control ADCON1 es el mismo
voltaje que alimenta al circuito, es decir, 5 voltios.

218

Comunicacin Serial
Transmisin y Recepcin de Datos

Capitulo XII

12.1.- Comunicacin Serial.

En este captulo nos dedicaremos a estudiar la comunicacin serial asncrona,


la cual resulta muy til cuando necesitamos transmitir o recibir datos entre
circuitos gobernados por microcontroladores PIC, o inclusive cuando
deseamos establecer una comunicacin entre nuestros circuitos y nuestro PC.
Las instrucciones en PicBasic para la comunicacin serial, se rigen bajo el
protocolo de comunicacin RS-232, el cual es una norma o estndar mundial
que define los parmetros en la comunicacin serial. Este protocolo define
adems estndares como la velocidad de transmisin en baudios (300, 1200,
2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200 y 128000
bps), niveles de voltaje, distancia entre dispositivos, entre otros.
Cuando se trata de comunicacin serial entre un microcontrolador y un PC, es
importante tomar en cuenta que los niveles de voltaje entre ambos
dispositivos deben ser acoplados, ya que en un puerto serial de un PC, los
niveles de voltaje estn comprendidos entre +12V y -12V, y en un
microcontrolador los niveles de voltaje estn comprendidos entre 0V y 5V.
Estas y otras caractersticas han sido detalladas a lo largo del captulo a
travs de algunas recomendaciones y ejemplos.
A continuacin estudiaremos las instrucciones SerIn y SerOut con las cuales
haremos posible la comunicacin serial asncrona entre diversos dispositivos.
Estas dos instrucciones son capaces de emular una comunicacin RS-232 en
cualquier microcontrolador que no posea en su hardware USART (Universal
Synchronous / Asynchronous Receiver / Transmitter).
12.2.- Instruccin SerIn: La instruccin SerIn se encarga de recibir uno o
mas valores a travs de un pin especfico, usando el formato asncrono
estndar 8N1 que significa 8 bits de datos, sin revisin de paridad y 1 bit de
parada (stop). SerIn trabaja por defecto con un oscilador de 4 Mhz, y para
219

tener una transferencia de datos segura con otros osciladores de mayor valor,
ser necesario utilizar la directiva Define Osc al inicio del programa.
Ejemplo:

Define Osc 20

(para un oscilador de 20 Mhz).

Sintaxis:

SERIN pin, modo,{tiempo, etiqueta}, variable

Pin: en este campo definiremos cual ser el pin de entrada entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.1
Modo: define la velocidad de transmisin en baudios.
Valor Numrico
0
1
2
3
4
5
6
7

Modo
T2400
T1200
T9600
T300
N2400
N1200
N9600
N300

Tasa de Bps
2400
1200
9600
300
2400
1200
9600
300

Tabla 12.1.

Ejemplo:
Serin PortC.1, 0, variable  Velocidad de transmisin: 2400 bps
Serin PortA.1, 1, variable  Velocidad de transmisin: 1200 bps
Serin PortE.0, 2, variable  Velocidad de transmisin: 9600 bps
Serin PortC.4, 3, variable  Velocidad de transmisin: 300 bps
El campo Modo tambin puede ser definido como se muestra en la columna
2 de la tabla 12.1, incluyendo la librera MODEDEFS.BAS en el inicio del
programa
(Include "modedefs.bas"), o utilizando directamente la
instruccin SYMBOL como se muestra a continuacin:

220

Symbol
Symbol
Symbol
Symbol
Symbol
Symbol
Symbol
Symbol

T2400
T1200
T9600
T300
N2400
N1200
N9600
N300

=
=
=
=
=
=
=
=

0
1
2
3
4
5
6
7

'
'
'
'
'
'
'
'

Dato
Dato
Dato
Dato
Dato
Dato
Dato
Dato

verdadero
verdadero
verdadero
verdadero
invertido
invertido
invertido
invertido

(Driven
(Driven
(Driven
(Driven
(Driven
(Driven
(Driven
(Driven

True)
True)
True)
True)
inverted)
inverted)
inverted)
inverted)

Tiempo: este campo es opcional al igual que el campo etiqueta, y su objetivo


es establecer un tiempo en milisegundos definido por el programador, el cual
una vez vencido, har que se realice un salto a la etiqueta, tambin definida
por el programador. Ejemplo:
Serin PortA.3, 2, 10, inicio, variable
Este ejemplo se interpreta de la siguiente forma: el microcontrolador recibe los
datos por el pin RA3 a 9600 bps en formato de dato verdadero; si no se
reciben datos durante 10 milisegundos, salta a la etiqueta inicio; si recibe
datos lo almacena en la variable y contina con el programa.
Variable: En este campo se especifica la variable en la cual se desea sean
almacenados los datos recibidos. Ejemplo:
Serin PortC.7, 4, dato

12.3.- Proyecto #32: En este proyecto vamos a transmitir datos desde un PC


hacia un microcontrolador PIC16F877, utilizando un circuito integrado
MAX232 entre ambos dispositivos y donde los datos enviados desde el PC
sern visualizados en una pantalla LCD.
Para enviar datos desde el PC hacia el microcontrolador, explicaremos como
realizar un pequeo proyecto en Visual Basic, en el cual haremos un teclado
matricial 3x4, que enviar un dato por cada tecla presionada a travs del
puerto serial COM1.
Para ello ser necesario construir el circuito de la figura 12.1. Es importante
tomar en cuenta en la construccin de este circuito, la polaridad de los
221

condensadores de 1 uF, ya que una polaridad invertida afectar


negativamente el funcionamiento del MAX232 (Observe la polaridad de cada
condensador en la figura 12.2).
Entre los pines 15 (Gnd) y 16 (Vcc) del MAX232 se debe conectar un
condensador de 1 uF como se muestra en la figura 12.2, ya que la ausencia
de este componente tambin afectar el funcionamiento del circuito
produciendo errores en la recepcin de datos.

Figura 12.1.

222

Proyecto # 32
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 220 Ohm
Capacitor Electroltico de uF
Conector DB-9M
IC MAX232
Fuente regulada de 5 Vdc

Tabla 12.2.

Figura 12.2.

223

Cantidad
1
1
2
1
1
5
1
1
1

' Programa en Pic Basic Pro


Define Osc 4

Symbol T9600
dato var Byte

' Define el Oscilador para un Cristal


' de 4 Mhz.

= 2

' Dato verdadero (Driven True)


' Define la variable dato como Byte

pause 500

' Pausa de 500 milisegundos para la LCD

LCDOut $fe, 1

' Limpia la LCD

inicio:
' espera datos durante 1 ms

SerIn PORTC.7, T9600, dato


LCDOUT $fe, 2,"Dato: "
LCDOut $fe,$C0,#dato,"
GoTo inicio
End

"

' Salta a inicio

Como velocidad de transmisin, hemos elegido utilizar 9600 bps, por lo cual
debemos definir este valor en nuestro programa.
Las seales con las que acta el puerto del PC son digitales y la tensin con
la cual trabaja es +12V y -12V; adicionalmente resulta importante saber que la
lgica es invertida, es decir:
+12 V  Lgica = 0
-12 V  Lgica = 1

De ah la importancia de saber cual ser el formato que debemos utilizar a la


hora de definir los parmetros para la comunicacin (dato verdadero, o dato
invertido).
En este caso y como se puede observar en la segunda lnea de programa
(Symbol T9600 = 2), esteremos utilizando el formato driven true, debido a que
el MAX232 tiene en sus salidas un inversor para los datos provenientes del
puerto serial del PC hacia el microcontrolador y vice versa.

224

Programa en Visual Basic 6.0:


Para crear un nuevo proyecto en Visual Basic, hacemos clic en el men
Archivo  Nuevo Proyecto y seleccionamos la opcin EXE estndar (figura
12.3).

Figura 12.3.

Figura 12.4.

225

Figura 12.5.

Una vez creado un nuevo proyecto, ser importante activar el componente


para manejar la comunicacin serial Microsoft Comm Control 6.0. Esto se
realiza haciendo clic en el men Proyectos  Componentes  Controles.

Figura 12.6.

226

Al hacer clic en el botn Aceptar veremos que en la barra de herramientas


aparece un nuevo icono representado por un telfono.

Figura 12.7.

Inserte en el formulario el icono MsComm como se muestra en la figura


12.8, y configure los siguientes parmetros en la ventana de propiedades:
CommPort: 1 (ver figura 12.9)
Settings: 9600,n,8,1 (ver figura 12.10)

Figura 12.8.

227

Figura 12.9.

Figura 12.10.

Seguidamente haga doble clic sobre el formulario para visualizar la ventana


de cdigo en la cual introduciremos las siguientes lneas de programa, las
cuales se encargarn de abrir el puerto serial del PC (Figura 12.11).

Figura 12.11.

228

Utilice el icono CommandButton en la barra de herramientas para agregar


botones en el formulario:

Figura 12.12.

Para cambiar el nombre del botn, busque la celda Caption en la ventana de


propiedades del mismo (ver figura 12.13):

Figura 12.13.

229

Este procedimiento se repite hasta lograr obtener un formulario con 12


botones debidamente identificados como se observa en la figura 12.14:

Figura 12.14.

El siguiente paso es designar a cada botn la instruccin que se encargar de


enviar un dato especfico a travs del puerto serial del PC. Haga doble clic en
el primer botn del formulario y agregue la siguiente lnea de comando (ver
figura 12.15):
MSComm1.Output = Chr$(1)

Figura 12.15.

230

Se repite el paso anterior para el resto de los botones:


Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn

#2: MSComm1.Output = Chr$(2)


#3: MSComm1.Output = Chr$(3)
#4: MSComm1.Output = Chr$(4)
#5: MSComm1.Output = Chr$(5)
#6: MSComm1.Output = Chr$(6)
#7: MSComm1.Output = Chr$(7)
#8: MSComm1.Output = Chr$(8)
#9: MSComm1.Output = Chr$(9)
#10: MSComm1.Output = Chr$(10)
#11: MSComm1.Output = Chr$(11)
#12: MSComm1.Output = Chr$(12)

Por ltimo, haga clic en el botn Iniciar (ver figura 12.16), para hacer
funcionar el teclado 3x4 desde el cual se enviarn datos hacia el
microcontrolador.
Al hacer clic en cualquiera de los botones del teclado, estar enviando al
microcontrolador el dato correspondiente el cual podr ser observado en la
pantalla LCD de su circuito.

231

Figura 12.16.

Por ltimo, generamos el archivo ejecutable desde el men Archivo  Generar


Nombre del archivo.exe

232

12.4.- Instruccin SerOut: La instruccin SerOut en PicBasic se encarga de


enviar uno o mas valores a travs de un pin especfico, usando el formato
asncrono estndar 8N1, que significa 8 bits de datos, sin revisin de paridad
y 1 bit de parada (stop).
Sintaxis:

SEROUT pin, modo, [variable]

Pin: en este campo definiremos cual ser el pin de salida entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.5
Modo: define la velocidad de transmisin en baudios y emplea la misma tabla
de la instruccin Serin (Tabla 12.1).
Variable: En este campo se especifica la variable que contiene los datos que
sern enviados a travs de pin especificado. Ejemplo:
SerOut PORTC.6, T9600, [variable]

12.5.- Proyecto #33: Comenzaremos por realizar el circuito de la figura 12.17,


el cual ser conectado al PC a travs del puerto serial COM1, y a travs del
HyperTerminal de Windows veremos como son transmitidos los datos desde
el microcontrolador hasta el PC.
Veamos el siguiente programa en PBP:
Define Osc 4

Symbol T9600
I VAR Byte

' Define el Oscilador para un Cristal


' de 4 Mhz.

= 2

' Dato verdadero (Driven True)


' Define la variable I como Byte

inicio:
For I = 0 To 9

' Repeticin de 0 a 9

SerOut PORTC.6, T9600, [#I]


pause 1000

' Enva los datos a travs del pin RC6

' Pausa de 1 segundo

Next I

233

GoTo inicio
End

' Salta a inicio

Podemos ver en el programa anterior como es enviado el contenido de la


variable I, la cual incrementa su valor de cero a nueve, dato que sale en
formato serial asncrono a travs del Pin RC6 a 9600 bps.

Figura 12.17.

234

Proyecto # 33
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Capacitor Electroltico de uF
Conector DB-9M
IC MAX232
Fuente regulada de 5 Vdc

Cantidad
1
1
2
5
1
1
1

Tabla 12.3.

En caso de no disponer de un MAX232 para el acople entre el


microcontrolador y el puerto serial del PC, tambin se pueden utilizar dos
resistencias limitadoras de corriente, como se muestra en el diagrama de la
figura 12.18.

Figura 12.18.

235

Deber tomar en cuenta entonces, que los parmetros de comunicacin


cambian, debido a que los datos ya no pasarn a travs del inversor integrado
en el MAX232.
Esto significa que el programa a utilizar para el circuito de la figura 12.18 es el
siguiente:

Define Osc 4

Symbol N9600
dato var Byte
I var Byte

' Define el Oscilador para un Cristal


' de 4 Mhz.

= 6

' Dato invertido (Driven inverted)


' Define la variable dato como Byte
' Define la variable I como Byte

Inicio:
For I = 0 To 9

' Repeticin de 0 a 9

SerOut PORTC.6, N9600, [#I]


Pause 1000

' enva los datos a travs del pin RC6

' Pausa de 1 segundo

Next I
GoTo Inicio
End

' Salta a inicio

Para abrir el HyperTerminal de Windows, haga clic en el men Inicio  Todos


los Programas  Accesorios  Comunicaciones  HyperTerminal. Escriba un
nombre para la conexin y haga clic en Aceptar.

236

Figura 12.19.

Normalmente el puerto disponible para la comunicacin serial es el COM1.


Seleccione el puerto disponible en su PC para realizar la prueba de
transmisin y luego haga clic en el botn Configurar (figura 12.20).

237

Figura 12.20.

En la figura 12.21 se observan los campos en los cuales se pueden


establecer los parmetros para la comunicacin serial, los cuales deben
coincidir con los parmetros seleccionados para la instruccin SerOut.

Figura 12.21.

238

Tambin es conveniente tomar en cuenta en la configuracin de la conexin,


el tipo de emulacin (figura 12.22).

Figura 12.22.

Finalmente, al aceptar todos estos cambios en la ventana de configuracin del


HyperTerminal de Windows, podremos ver la siguiente ventana (figura
12.23), en la cual se recibirn los datos enviados desde el microcontrolador.
Una vez conectada la alimentacin del circuito, el microcontrolador empezar
a enviar los datos desde cero hasta nueve, con intervalos de tiempo de un
segundo.

239

Figura 12.23.

12.6.- Proyecto #34: En base a los conocimientos adquiridos hasta ahora,


realizaremos a continuacin un circuito capaz de medir un voltaje variable
aplicado a una de las entradas del conversor A/D de un PIC16F877A, el cual
a su vez deber enviar el resultado de la conversin en decimal a una pantalla
LCD, y enviar este mismo resultado a un PC, a travs del puerto serial donde
los datos sern recibidos y convertidos, en una hoja de clculo (Excel), para
posteriormente graficar el conjunto de datos de una muestra de diez lecturas
acumuladas.
Antes de iniciar con la programacin, ser importante considerar los
siguientes puntos:

La conversin A/D ser a 10 Bits, por lo cual debemos tener presente


realizar esta definicin, es decir, Define ADC_BITS 10.

240

La pantalla LCD estar conectada en el puerto D, por lo cual ser


necesario definir los pines de la misma al inicio del programa.

Figura 12.24.

241

Proyecto # 34
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 220 Ohm
Capacitor Electroltico de uF
Conector DB-9M
IC MAX232
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc

Cantidad
1
1
2
1
1
5
1
1
1
1

Tabla 12.4.

Programa en Pic Basic Pro:


'****************************************
'* Nombre
: Proyecto34.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************

DEFINE OSC 4

' Define Oscilador a 4 Mhz

DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT

PORTD
4
4

DEFINE
DEFINE
DEFINE
DEFINE
DEFINE

PORTD
2
PORTD
3
2

LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
LCD_LINES

Symbol T9600

= 2

'
'
'
'
'
'
'
'
'

Indica que el Bus estar conectado en el Puerto D


El bus ser de cuatro bits.
Seleccin del Bit de inicio del puerto (0 o 4) en caso
de utilizar los cuatro Bits mas significativos de la LCD
Indica al uC que el pin "RS" estar en el Puerto B
"RS" estar conectado en RB1
Indica al uC que el pin "E" estar en el Puerto B
"E" estar conectado en RB0
Define el nmero de lneas de la pantalla

' Dato verdadero (Driven True)

Define ADC_BITS 10
DEFINE ADC_SAMPLEUS 50

' Define la conversin A/D a 10 Bits


' Tiempo de muestreo en el conversor A/D es 50 uS

' Declaracin de una variable tipo word (16 bits)

VAR Word

242

ADCON1 = %10000000

' Configura el registro ADCON1

LCDOut $fe, 1

' Limpia la LCD

inicio:
ADCIN 0, A

' Inicia la conversin, almacena el resultado en "A"

LCDOut $fe, 2
LCDOUT "C-AD a 10 Bit:
"
LCDOUT $fe,$C0,"Dato: ",Dec A,"

"

' Posiciona el cursor en el inicio


' Muestra mensaje en la lnea 1
' Muestra dato en la lnea 2

SerOut PORTC.6, T9600, [#A]

' enva los datos al PC

pause 500

' Pausa de 500 milisegundos

GoTo inicio

' Salta a inicio

End

En el programa se puede observar cmo hemos definido el conexionado de la


pantalla LCD, as como tambin la configuracin bsica establecida para el
conversor A/D, el cual har la conversin a 10 bits con el fin de obtener una
mayor resolucin en el proceso de medicin del voltaje aplicado al pin RA0.
Una vez iniciada la conversin, se puede observar que el resultado de la
misma es almacenada en la variable A, la cual hemos declarado como una
variable de 16 bits (word), debido a que el resultado de la conversin requiere
mas de ocho bits de datos. Este resultado puede ser mostrado fcilmente en
la pantalla LCD en decimal anteponiendo la directiva Dec a la variable en la
cual hemos almacenado el dato resultado de la conversin.
El siguiente paso en el programa consiste en enviar el dato obtenido al PC a
travs del puerto serial, para luego hacer una pequea pausa de 500
milisegundos y empezar nuevamente el proceso para una nueva lectura.
Un paso importante en este punto, una vez obtenido el resultado de la
conversin A/D en la pantalla LCD, ser verificar la transferencia de datos
hacia el PC con la ayuda del HyperTerminal de Windows.

243

Para esto debemos conectar el cable serial entre el circuito y el PC, desde la
cual realizaremos una nueva conexin con el HyperTerminal, como se
muestra en figura 12.25:

Figura 12.25.

En este punto solo debemos dar un nombre a la conexin y configurar el


puerto con el cual estaremos trabajando como se muestra a continuacin:

244

Figura 12.26.

Figura 12.27.

Es importante recordar que la configuracin del puerto en el PC debe coincidir


con la configuracin elegida para el microcontrolador PIC. Una vez
configurado el HyperTerminal de Windows, se podrn observar los datos en la
ventana, los cuales estarn llegando cada 500 milisegundos, tiempo definido
245

anteriormente en el programa que hemos cargado en el microcontrolador PIC


(figura 12.28).

Figura 12.28.

Despus de verificar la correcta recepcin de datos desde el HyperTerminal,


se debe asegurar de cerrar esta ventana (Figura 12.28) para garantizar la
disponibilidad del puerto serial.
La idea principal de esta prctica, ser llevar estos datos a una hoja de Excel,
en la cual podamos realizar los clculos para expresar estos valores en sus
equivalentes en voltios para luego tomar una muestra significativa y
graficarlos como se observa en la figura 12.29.

246

Figura 12.29.

El primer paso para configurar la hoja de Excel, ser ubicar las herramientas
de Visual Basic y agregar a la hoja de clculo el control Microsoft
communications control, Version 6.0. Para esto debemos seguir los
siguientes pasos:

247

1.- Al abrir la hoja de clculo, podemos ver un men de opciones en la parte


superior de la ventana denominado Herramientas. Haga clic en el men
Herramientas y seleccione la opcin Personalizar.

Figura 12.30.

Al seleccionar esta opcin podr observar que en la ventana Personalizar


hay tres fichas de configuracin. Seleccione la ficha Barra de herramientas
como se muestra en la figura 12.31.

248

Figura 12.31.

En esta ficha encontrar una serie de opciones disponibles, de las cuales


deber seleccionar Visual Basic. Haga clic en al botn Cerrar y ver que
aparece en la hoja de clculo una caja de herramientas nueva llamada Visual
Basic (Figura 12.32), la cual podemos trasladar a la parte superior de la hoja
de clculo, la cual contiene el resto de las herramientas tpicas usadas en
Excel (Figura 12.33).

249

Figura 12.32.

250

Figura 12.33.

Haga clic en el botn Cuadro de controles (figura 12.33), y desplace la caja


de herramientas nuevamente a la parte superior de la hoja de clculo junto
con el resto de herramientas comunes de Excel (Figura 12.34).

251

Figura 12.34.

En esta serie de botones, podemos encontrar uno denominado Mas


controles (ver Figura 12.35), el cual despliega una lista de opciones. Ubique
el siguiente control: Microsoft communications control, Version 6.0.
Al hacer doble clic en este control la lista de opciones desaparece y es en
este momento en el cual debemos agregar el mismo sobre la hoja de clculo.
Para esto, debe mantener el botn izquierdo del mouse activado y arrastrar el

252

puntero hasta que aparezca un pequeo recuadro. Al soltar el botn izquierdo


el control aparece sobre la hoja. La figura de un Telfono sobre un MODEM
lo identifica claramente, como se muestra en la figura 12.35.

Figura 12.35.

El siguiente paso ser agregar un botn en el cual se configura el cdigo


necesario para la apertura del puerto serial en el PC (Figura 12.36).
253

Figura 12.36.

Al hacer doble clic sobre el nuevo botn, estamos entrando al editor de Visual
Basic, en el cual podemos agregar las siguientes lneas de programa, las
cuales permitirn abrir el puerto al hacer clic sobre el botn que hemos
agregado para tal fin:

Private Sub CommandButton1_Click()


'abre el puerto de comunicacin
If Hoja1.MSComm1.PortOpen = False Then
Hoja1.MSComm1.PortOpen = True
End If
End Sub

Observe la figura 12.37, en la cual se puede ver el campo Caption,


correspondiente a la etiqueta del botn de comando que estamos
configurando, la cual podemos personalizar con un nombre adecuado como
Abrir Puerto o Abrir Comm1.

254

Figura 12.37.

En figura 12.37 tambin podemos apreciar las lneas de programacin


agregadas al botn de comando, y el icono que nos permitir regresar a la
hoja de clculo para continuar con la programacin.
Al regresar a la hoja de clculo podremos notar el cambio en la etiqueta del
botn de comando, como se muestra en la figura 12.38:

255

Figura 12.38.

Ahora solo nos queda configurar el evento OnComm, relativo a la recepcin


de datos, haciendo doble clic sobre el control de comunicaciones (figura
12.39):

Figura 12.39.

256

Veremos a continuacin la ventana del editor de Visual Basic (Figura 12.40):

Figura 12.40.

Recordemos que para almacenar datos en una variable, es importante


considerar la declaracin de la misma antes de ejecutar cualquier otra lnea
de programa que as la requiera. Es por esto que para este ejemplo, el primer
257

paso en la configuracin del control de comunicaciones ha sido la declaracin


de dos variables, las cuales hemos denominado Apuntador y datainput.
La variable Apuntador ser declarada como Byte y la variable datainput
ser declarada como String.
Analice el uso de la variable Apuntador en el cdigo del evento OnComm, el
cual detallamos unas lneas ms adelante. Esta variable se usa bsicamente
como acumulador y determina la posicin en un rango predeterminado de las
filas en la hoja de clculo. Esto se debe a que estamos interesados en
mantener una muestra de los diez ltimos valores capturados en el puerto
para poder realizar una grfica de lneas suavizadas, la cual se estar
actualizando cada 500 milisegundos.
Para almacenar un dato presente en el puerto serial (Comm1), utilizamos el
comando MSComm1.Input, entonces, para almacenar un dato en la variable
datainput, debemos realizar el siguiente arreglo:
datainput = MSComm1.Input
Luego para llevar el dato almacenado en la variable a una celda en la hoja de
clculo, podemos utilizar el siguiente comando:
Hoja1.Cells(Fila, Columna)
Un punto importante a considerar es que la variable datainput por estar
declarada como String, almacenar una serie de datos consecutivos uno
tras otro. Podemos extraer un dato de la cadena de caracteres almacenada
en la variable datainput de la siguiente manera:
Hoja1.Cells(Fila, Columna) = Mid(Variable, Bit de inicio, longitud)

Ejemplo:
Si datainput = 643645650681701718745776
Para extraer los tres primeros caracteres y llevarlos por ejemplo a la celda
(40,2) debemos hacer el siguiente arreglo:
258

Hoja1.Cells(40, 2) = Mid(datainput, 1, 3)

Para mantener este dato y capturar uno mas actualizado, simplemente


debemos hacer un arreglo para desplazar el contenido de la celda (40,2) a la
celda (39,2). Cuando llegue el prximo dato actualizado, el contenido de esta
celda deber pasar a la celda (38,2) y as sucesivamente. Al repetir el
desplazamiento de celdas diez veces, podremos tomar estos valores y
graficarlos en la hoja de clculo.
Veamos a continuacin el cdigo para el evento OnComm:
Private Sub MSComm1_OnComm()
'Declara variable
Dim Apuntador As Byte
Dim datainput As String
datainput = MSComm1.Input
For Apuntador = 30 To 40
Hoja1.Cells(Apuntador, 2) = Hoja1.Cells(Apuntador + 1, 2)
Next
Hoja1.Cells(40, 2) = Mid(datainput, 1, 4)
End Sub

259

Figura 12.41.

Analice cuidadosamente el contenido del cdigo en el evento OnComm.


Verifique la rutina encargada de apilar los datos entre las celdas (40,1) y (30,
1). Por ltimo, analice la extraccin de datos de la cadena de caracteres
almacenada en la variable datainput.
Completados todos estos pasos, lo siguiente ser volver a la hoja de clculo y
salir del modo de diseo, haciendo clic en el icono sealado en la siguiente
figura:

260

Figura 12.42.

Cuando se sale del modo de diseo, el control de comunicaciones


desaparece de la hoja de clculo. Ahora, haciendo clic en el botn Abrir
Comm1 y activando el circuito, podremos ver que aparecen los datos de la
conversin A/D del microcontrolador en la pantalla LCD y en la hoja de
clculo, especficamente en las celdas B40, B39, B38, B37, B36, B35, B34,
B33, B32, B31 y B30.
En la figura 12.43 se pueden ver unos datos de prueba almacenados en las
celdas anteriormente mencionadas. Estos datos pueden ser identificados
poniendo un nombre o encabezado en la celda B29, por ejemplo, podemos
escribir la palabra Lecturas: .
En la columna C de la hoja de clculo, haremos la conversin de datos para
expresar los valores obtenidos en Voltios. Para esto aplicaremos la siguiente
formula en las celdas C40, C39, C38, C37, C36, C35, C34, C33, C32, C31 y
C30:

=(B40*5)/1024

para la celda C40

=(B39*5)/1024

para la celda C39

=(B38*5)/1024

para la celda C38

=(B37*5)/1024

para la celda C37

261

=(B36*5)/1024

para la celda C36

=(B35*5)/1024

para la celda C35

=(B34*5)/1024

para la celda C34

=(B33*5)/1024

para la celda C33

=(B32*5)/1024

para la celda C32

=(B31*5)/1024

para la celda C31

=(B30*5)/1024

para la celda C30

Figura 12.43.

262

Figura 12.44.

Observe en la figura 12.44, la formula para la celda C40. Observe tambin


que hemos ocultado una serie de filas de la hoja de clculo, las cuales hemos
reservado para agregar un grfico de lneas suavizadas.

Para graficar esta serie de datos, seleccionamos las diez celdas (desde la
celda C30 hasta la celda C40) y hacemos clic en el icono Asistente para
Grficos (Figura 12.45), donde aparecer una ventana en la cual podremos
elegir el tipo de grfico que deseamos utilizar. Seleccione la ficha Tipos
personalizados y haga clic en la opcin Lneas suavizadas de la lista
(Figura 12.46).

263

Figura 12.45.

Figura 12.46.

264

En la siguiente ventana podemos ver el rango de datos que ser graficado


(Figura 12.47):

Figura 12.47.

Si se desea personalizar an mas el grfico, se puede hacer en la ficha


Serie, en cual es posible editar el recuadro que contiene la leyenda. En la
siguiente ventana encontraremos una serie de fichas con una gran variedad
de opciones que nos permitirn aadir detalles como el ttulo del grfico,
identificar los ejes, agregar lneas de divisin, y algunos otros detalles tiles
para mejorar la apariencia del grfico. (figura 12.48).

265

Figura 12.48.

Seguidamente, podemos seleccionar si el grfico ser colocado en una hoja


nueva, o en la hoja de clculo en la cual hemos estado trabajando (figura
12.49):

Figura 12.49.

Finalmente podremos ver en la hoja de Excel los datos enviados desde el


microcontrolador, los cuales a su vez sern graficados constantemente, como
se puede observar en la figura 12.50.
266

Figura 12.50.

267

Servomotores

Capitulo XIII

13.1.- Qu es un Servomotor?
Un servomotor es un dispositivo electromecnico capaz de rotar su eje a una
posicin especfica a lo largo de su recorrido, inyectando un tren de pulsos
controlados, a un circuito de control que posee dentro de su caja o chasis.
Esta seal se introduce a travs de un cable de control que se distingue entre
los tres cables que posee y que segn la marca del servomotor puede ser de
color blanco o amarillo. Los cables de alimentacin se distinguen por sus
colores rojo (Positivo) y negro (Negativo).
Un servomotor estndar tiene dimensiones muy apropiadas para realizar
proyectos de robtica, y aunque se pueden encontrar en diferentes tamaos,
es importante resaltar que la fuerza de un servo en su eje no es directamente
proporcional al tamao del mismo. Esto significa que su fuerza depende en
gran sentido de su diseo interior, es decir, de la mecnica y material que
componen sus engranajes.
Veamos a continuacin algunas caractersticas tcnicas importantes en un
servomotor estndar:
Control: Control por ancho de pulso.
Pulso: 3-5 Voltios Pico a Pico.
Voltaje de operacin: 4.8 a 6.0 Voltios.

268

Torque (4.8V): 3.0 kg/cm (42 oz/in)


Torque (6.0V): 4.5 kg/cm (48.60 oz/in)
Rango de Temperatura Operacional: -20 a +60 C.
Velocidad (4.8V): 0.19sec/60 grados.
Velocidad (6.0V): 0.15sec/60 grados.
Corriente (4.8V): 7.4mA activo y 160mA al aplicar fuerza.
Corriente (6.0V): 7.7mA activo y 180mA al aplicar fuerza.

Figura 13.1.

Para controlar la posicin del eje de un servomotor, hace falta enviar un tren
de pulsos, donde el ancho de cada pulso determina el punto en el cual el eje
mantiene su posicin, siempre y cuando est presente el tren de pulsos. El
recorrido ser en la mayora de los modelos de 180 y los tiempos
correspondientes al pulso en la seal para las posiciones principales (0, 90 y
269

180) se especifican en la tabla 13.1. (Estos tiempos pueden variar de


acuerdo al modelo y marca del servomotor).

Tabla 13.1.

Entonces, si deseamos llevar el eje a 0, se deben introducir al servo pulsos


de 0.6 milisegundos (T1) aproximadamente, cada 20 milisegundos, como se
muestra en la figura 13.3. T2 corresponde por consiguiente al tiempo que
debemos esperar para enviar un nuevo pulso, el cual mantiene actualizada la
posicin de eje. El tiempo T2 puede estar dentro del rango 10 ms T2 40
ms.

Figura 13.3.

270

A medida que aumentamos gradualmente el tiempo T1, el eje del servomotor


se ir moviendo en sentido horario. Cuando T1 = 1.5 ms podremos ver que el
eje forma un ngulo de 90 con respecto al punto de inicio (0). En la figura
13.4 se puede observar la seal correspondiente a esta posicin (90), donde
T2 se mantiene en 20 milisegundos.

Figura 13.4.

La seal correspondiente a la posicin mxima (180) en un servomotor


estndar, tendra entonces valores para T1 = 2.6 ms y T2 = 20 ms. (figura
13.5).

Figura 13.5.

271

13.2.- Proyecto #35: Se puede crear un programa en PicBasic que cumpla


con estas caractersticas, en el cual variando solo una variable, podemos
modificar el ngulo de giro de un servomotor. Veamos el siguiente ejemplo:

Figura 13.6.

Proyecto # 35
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Servomotor
Fuente regulada de 5 Vdc

Tabla 13.2.

272

Cantidad
1
1
2
1
1

PAUSEUS
Sintaxis:

PAUSEUS periodo

La instruccin Pause realiza un pausa en el programa por un periodo definido


en microsegundos. Esta instruccin no pone al microcontrolador en modo de
bajo consumo de energa.

Programa en Pic Basic Pro:


DEFINE OSC 4

' Define el oscilador en 4 Mhz

PULSO VAR Word

' Define la variable "Pulso" (16 Bits)

PULSO = 1550

' Inicializamos la variable "Pulso"

Inicio:
High PORTB.0
PauseUs PULSO
Low PORTB.0
Pause 20

'
'
'
'

RB0 =
Pausa
RB0 =
Pausa

1
en microsegundos
0
de 20 milisegundos

GoTo Inicio

' Salto a inicio

End

Al compilar, grabar y ejecutar el programa anterior en el microcontrolador,


podremos ver en un osciloscopio el tren de pulsos presente en el pin RB0
como se muestra en la figura 13.7.

273

Figura 13.7.

Volt/Div: 2V
Time/Div: 5ms
Perodo: 21,55 ms
T1: 1,55 ms (Ancho de pulso positivo).
T2: 20 ms
Vpp: 5,44 Voltios.
Ciclo de trabajo: 8,16%
Tiempo de subida: 160,0 us
Tiempo de bajada: 160,0 us
Al aplicar el tren de pulsos al servomotor, su eje rotar hasta una posicin en
el punto medio de su recorrido total.
Si analizamos el programa, podremos observar que la instruccin PauseUs
realiza una parada durante un tiempo definido por la variable Pulso, cuyo
valor es de 1550, es decir, se est generando una pausa de 1550
microsegundos, o lo que es igual, 1,55 milisegundos.
Seguidamente hacemos una pausa de 20 milisegundos antes de enviar
nuevamente el pulso al Pin RB0.

274

Entonces, si deseramos modificar el ngulo de giro, podemos cambiar el


valor de la variable Pulso, siempre y cuando el valor est dentro del rango
de tiempo permitido (0,65 ms T1 2.6 ms), es decir, 650 PauseUs 2600.
Una forma an ms prctica para generar el tren de pulsos de la figura 13.7,
sera haciendo uso de la instruccin PulsOut, como se muestra a
continuacin:

DEFINE OSC 4

' Define el oscilador en 4 Mhz

Inicio:
PulsOut PORTB.0,65
Low PORTB.0
Pause 20
GoTo Inicio

'
'
'
'
'

Genera pulsos de 650 microsegundos de


duracin.
RB0 = 0
Pausa de 20 milisegundos.
Salto a inicio.

End

275

13.3.- Proyecto #36: Para hacer un poco ms interesante la prctica, en la


cual el objetivo ha sido controlar el ngulo de giro de un servomotor,
proponemos incorporar al circuito dos pulsadores para aumentar y disminuir el
ngulo y una pantalla LCD para visualizar el valor en microsegundos de cada
pulso enviado al servomotor (Figura 13.8).

Figura 13.8.

276

Proyecto # 36
Componente

Cantidad

PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Servomotor
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

1
1
2
1
3
1
1
2
1

Tabla 13.3.

Programa en PBP:
DEFINE OSC 4
TRISB = %11110110

' Define el oscilador en 4 Mhz


' Configuracin del puerto B

PULSO VAR Word

' Define la variable "Pulso" (16 Bits)

PULSO = 1550

' Inicializamos la variable "Pulso"

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

Inicio:
High PORTB.0
PauseUs PULSO
Low PORTB.0
Pause 15
'
'
'
'

' RB0 = 1
' Pausa en microsegundos
' RB0 = 0
' Pausa de 15 milisegundos

Considerando que las siguientes instrucciones consumen


1 ms cada una y la instruccin de salto consume 2 ms, la
pausa anterior ser de 15 ms para lograr un tiempo entre
cada pulso de 20 ms.

If PORTB.1 = 1 And PULSO < 2600 Then Call SUMA


' Si RB1 = 1 significa que se ha activado el pulsador
' conectado a l. La condicin se cumple slo si el pulsador
' est activado y la variable "Pulso" es menor a 2600.
If PORTB.2 = 1 And PULSO > 650 Then Call RESTA
' Si RB2 = 1 significa que se ha activado el pulsador

277

' conectado a l. La condicin se cumple slo si el pulsador


' est activado y la variable "Pulso" es mayor a 650.
LCDOUT $fe, 2,"PULSO: ",#PULSO," uS
"
' Muestra el dato cargado en la variable "Pulso"
GoTo Inicio

' Salto a inicio

SUMA:
PULSO = PULSO + 100
Pause 40
Return

' Suma 100 a la variable "Pulso"


' Pausa de 40 milisegundos
' Retorno

RESTA:
PULSO = PULSO - 100
Pause 40
Return

' Resta 100 a la variable "Pulso"


' Pausa de 40 milisegundos
' Retorno

' Si se aumenta o disminuye la pausa en las subrutinas


' suma y resta, se logra un efecto de aumento o disminucin
' de la velocidad variacin del ngulo.
End

Si empleamos la instruccin PulsOut:


DEFINE OSC 4

' Define el oscilador en 4 Mhz

TRISB = %11110110

' Configuracin del puerto B

PULSO VAR Word

' Define la variable "Pulso" (16 Bits)

PULSO = 155

' Inicializamos la variable "Pulso"

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

Inicio:
PulsOut PORTB.0, PULSO
Low PORTB.0
Pause 15
'
'
'
'

' Genera un pulso en RB0


' RB0 = 0
' Pausa de 15 milisegundos

Considerando que las siguientes instrucciones consumen


1 ms cada una y la instruccin de salto consume 2 ms, la
pausa anterior ser de 15 ms para lograr un tiempo entre
cada pulso de 20 ms.

If PORTB.1 = 1 And PULSO < 260 Then Call SUMA


' Si RB1 = 1 significa que se ha activado el pulsador
' conectado a l. La condicin se cumple slo si el pulsador

278

' est activado y la variable "Pulso" es menor a 260.


If PORTB.2 = 1 And PULSO > 65 Then Call RESTA
' Si RB2 = 1 significa que se ha activado el pulsador
' conectado a l. La condicin se cumple slo si el pulsador
' est activado y la variable "Pulso" es mayor a 65.
LCDOUT $fe, 2,"PULSO: ",#PULSO,"0 uS
"
' Muestra el dato cargado en la variable "Pulso"
GoTo Inicio

' Salto a inicio

SUMA:
PULSO = PULSO + 10
Pause 40
Return

' Suma 10 a la variable "Pulso"


' Pausa de 40 milisegundos
' Retorno

RESTA:
PULSO = PULSO - 10
Pause 40
Return

' Resta 10 a la variable "Pulso"


' Pausa de 40 milisegundos
' Retorno

' Si se aumenta o disminuye la pausa en las subrutinas


' suma y resta, se logra un efecto de aumento o disminucin
' de la velocidad variacin del ngulo.
End

279

13.4.- Proyecto #37: En la siguiente actividad se desea controlar un


servomotor y visualizar el tiempo de cada pulso en una pantalla LCD,
conectados a un microcontrolador principal. Desde un microcontrolador
secundario se enviar el dato correspondiente al ngulo del eje, estableciendo
una comunicacin serial con el microcontrolador principal, de tal manera que
cuando se requiera aumentar o disminuir el ngulo, sean utilizados dos
pulsadores conectados en cualquiera de los puertos disponibles del
microcontrolador secundario.
El circuito propuesto se muestra en la figura 13.9.

Figura 13.9.

280

Proyecto # 37
Componente

Cantidad

PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc

Tabla 13.4.

Programa para el microcontrolador principal U1:


DEFINE OSC 4
Symbol T9600

' Define el oscilador en 4 Mhz


= 2

' Dato verdadero (Driven True)

PULSO VAR Word

' Define la variable "Pulso" (16 Bits)

PULSO = 155

' Inicializa variable "Pulso"

pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

Inicio:
SerIn PORTB.7, T9600, 16, Sigue, PULSO

' Espera dato


' durante 16 ms

Sigue:
LCDOUT $fe, 2,"PULSO: ",#PULSO,"0 uS
" ' Muestra dato.
PulsOut PORTB.1, PULSO
' Genera pulso en RB1
GoTo Inicio
' Salto a inicio
End

281

2
2
4
1
3
1
2
1

Programa para el microcontrolador secundario U2:


DEFINE OSC 4
Symbol T9600

= 2

' Dato verdadero (Driven True)

PULSO VAR Word

' Define la variable "Pulso" (16 Bits)

PULSO = 155

' Inicializa variable "Pulso"

inicio:
If PORTA.0 = 1 And PULSO < 250 Then Call suma
' Si RA0 = 1 significa que se ha activado el pulsador
' conectado a l. La condicin se cumple slo si el pulsador
' est activado y la variable "Pulso" es menor a 250.
If PORTA.1 = 1 And PULSO > 60 Then Call resta
' Si RA1 = 1 significa que se ha activado el pulsador
' conectado a l. La condicin se cumple slo si el pulsador
' est activado y la variable "Pulso" es mayor a 60.
GoTo inicio

' Salto a inicio

suma:
PULSO = PULSO + 10

' Suma 10 a la variable "Pulso"

SerOut PORTA.2, T9600, [PULSO] ' Enva dato serial por RA2
PAUSE 40
' Pausa de 40 milisegundos
Return
' Retorno
resta:
PULSO = PULSO - 10
' Resta 10 a la variable "Pulso"
SerOut PORTA.2, T9600, [PULSO] ' Enva dato serial por RA2
PAUSE 40
' Pausa de 40 milisegundos
Return
' Retorno
End

282

13.5.- Proyecto #38: En la siguiente actividad se controlar un servomotor


desde el puerto serial de un PC, desde donde enviaremos el dato a ser
cargado en la instruccin PulsOut en el cdigo de programa del
microcontrolador, y el cual definir el ancho de pulso a ser introducido en el
servomotor cada 20 milisegundos. El circuito consta de un microcontrolador
PIC16F84A con oscilador de 4 Mhz y un servomotor, donde la lnea de control
estar conectada al Pin RB1. Para la comunicacin entre el PC y el circuito,
emplearemos un circuito integrado MAX-232 (Figura 13.10).

Figura 13.10.

283

Proyecto # 38
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
IC MAX232
Capacitor electroltico de 0,1 uF
Potencimetro de 5K Ohm
Conector DB-9M
Fuente regulada de 5 Vdc

Cantidad
1
1
2
1
5
1
1
1

Tabla 13.5.

Programa en Pic Basic Pro:


DEFINE OSC 4
Symbol T9600
PULSO VAR Word
PORTB.1 = 0

' Define el oscilador en 4 Mhz


= 2

' Dato verdadero (Driven True)


' Define la variable "Pulso" (16 Bits)
' Inicializa RB1

inicio:
SerIn PORTB.7, T9600, 18, sigue, PULSO

' Espera dato


' durante 18 ms

sigue:
PulsOut PORTB.1, PULSO
GoTo inicio

' Genera pulso en RB1


' Salto a inicio

End

284

Para la comunicacin serial, se ha definido el modo de dato verdadero a 9600


bps (T9600). A partir de la etiqueta inicio, el primer paso ser esperar un
dato serial durante 18 milisegundos antes de saltar a la etiqueta sigue, para
generar el pulso correspondiente y donde su duracin se calcula en decenas
de microsegundos. Seguidamente se genera un salto a la etiqueta inicio
para repetir el proceso.
La interfaz grfica para el control del servomotor la hemos realizado en Visual
Basic (Figura 13.11), desde la cual podremos seleccionar el tiempo de
duracin de los pulsos enviados al servomotor.
Adems hemos agregado tres botones con valores fijos para las tres
posiciones principales (0, 90 y 180). Veamos a continuacin el desarrollo de
la interfaz grfica paso a paso:

Figura 13.11.

285

Paso 1: creamos un nuevo proyecto EXE estndar (Figura 13.12):

Figura 13.12.

Paso 2: Identificamos el formulario en las propiedades del mismo, ingresando


un nombre que identifique nuestra aplicacin:

Figura 13.13.

286

Figura 13.14.

Paso 3: activamos el componente para manejar la comunicacin serial


Microsoft Comm Control 6.0. Esto se realiza haciendo clic en el men
Proyectos  Componentes  Controles. Seguidamente se inserta el icono
MsComm como se muestra en la figura 13.15, y se configuran los
parmetros de conexin en la ventana de propiedades (Figuras 13.16 y
13.17):

Figura 13.15.

287

Figura 13.16.

Figura 13.17.

Paso 4: cerramos la ventana de cdigo e incluimos los botones, el campo de


texto y la imagen en el formulario (Figura 13.18). Recuerde identificar cada
botn en la ventana de propiedades (Figura 13.19):

Figura 13.18.

Figura 13.19.

288

Figura 13.20.

Paso 5: se asigna un nombre a cada botn en la ventana de propiedades


(Figura 13.21):

289

Figura 13.21.

Paso 6: se hace doble clic sobre el formulario para agregar el siguiente


cdigo, con el cual habilitaremos el puerto serial del PC, y asignaremos una
funcin especfica a cada botn (Figura 13.20):
Dim Servo As Byte

' Declaracin de Variable "Servo"


' tipo byte
______________________________________________________________________________
Private Sub Form_Load()
' Rutina para abrir el puerto serial
MSComm1.PortOpen = True
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
Servo = 155
MSComm1.Output = Chr$(Servo)
Text1.Text = Servo * 10

' Inicializamos la variable "Servo"


' Enva dato al puerto Comm1
' Muestra dato * 10 en la caja de texto

End Sub
______________________________________________________________________________

290

Private Sub Boton1_Click()


' Boton 0
Servo = 70
' Carga el valor para 0
Text1.Text = Servo * 10
' Muestra dato * 10 en la caja de texto
MSComm1.Output = Chr$(Servo)
' Enva dato al puerto Comm1
End Sub
______________________________________________________________________________
Private Sub Boton2_Click()
' Boton 90
Servo = 155
' Carga el valor para 90
Text1.Text = Servo * 10
' Muestra dato * 10 en la caja de texto
MSComm1.Output = Chr$(Servo)
' Enva dato al puerto Comm1
End Sub
______________________________________________________________________________
Private Sub Boton3_Click()
' Boton 90
Servo = 250
' Carga el valor para 180
Text1.Text = Servo * 10
' Muestra dato * 10 en la caja de texto
MSComm1.Output = Chr$(Servo)
' Enva dato al puerto Comm1
End Sub
______________________________________________________________________________
Private Sub Boton4_Click()

' Boton <--

If Servo > 70 Then


' Restar solo si Servo es > 70
Servo = Servo - 5
' Resta 5 a la variable "Servo"
Text1.Text = Servo * 10
' Muestra dato * 10 en la caja de texto
End If
End Sub
______________________________________________________________________________
Private Sub Boton5_Click()
' Boton -->
If Servo < 250 Then
' Sumar solo si Servo es < 250
Servo = Servo + 5
' Suma 5 a la variable "Servo"
Text1.Text = Servo * 10
' Muestra dato * 10 en la caja de texto
End If
End Sub
______________________________________________________________________________
Private Sub Boton6_Click()
MSComm1.Output = Chr$(Servo)
End Sub

' Boton "Enviar Dato"


' Enva dato al puerto Comm1

291

Nota Importante:
Recuerde que el dato a ser cargado en la instruccin PulsOut del programa
de control del PIC16F84A, se mide en decenas de microsegundos para un
oscilador de 4 Mhz, por ejemplo:
PulsOut PORTB.1, 100

Esto significa que el tiempo del pulso generado ser de 100 decenas de
microsegundos:
10 microsegundos x 100 = 1000 microsegundos 1 milisegundo.
Por lo tanto, los datos que enviamos al microcontrolador a travs del puerto
serial desde la aplicacin que hemos creado en Visual Basic, deben ser
considerados como la cantidad de decenas de microsegundos que deseamos
que dure cada pulso enviado al servomotor.
Esta es la razn por la cual hemos multiplicado por diez el dato a ser
mostrado en la caja de texto, especificando adems la unidad de tiempo
correspondiente, que en este caso se expresa con la palabra
Microsegundos.
Paso 7: generamos el archivo ejecutable desde el men Archivo  Generar
Nombre del archivo.exe.

292

Mdulos RF para comunicaciones

Captulo XIV

14.1.- Proyectos con Mdulos RF.


A continuacin realizaremos algunos proyectos donde la base de stos sern
los mdulos inalmbricos RF de la empresa Linx Technologies Inc.
(http://www.linxtechnologies.com), los cuales ofrecen una gran variedad de
modelos en diferentes rangos de frecuencias y donde la caracterstica ms
resaltante radica en que no requieren componentes externos a excepcin de
la antena (figura 14.1). Su interfaz serial nos permite realizar una
comunicacin directa o sin modificaciones en el protocolo RS-232, haciendo
muy sencillo el trabajo de comunicar dos circuitos que se encuentran a
distancias considerablemente largas en sus versiones de mdulos LR (Long
Range), para distancias que pueden llegar a exceder los 900 metros en su
frecuencia estndar de 418 Mhz. Tambin se pueden adquirir para trabajar en
frecuencias de 315 Mhz o 433 Mhz.

Figura 14.1.

El voltaje de alimentacin no debe exceder los 3.3 Vdc, por lo cual se debe
considerar el uso de una regulador de voltaje para el transmisor y receptor,
considerando que el voltaje estndar en nuestros circuitos ha sido de 5 Vdc.

293

Transmisor: TXM-418-LR-S

Figura 14.2.

Receptor: RXM-418-LR-S

Figura 14.3.

El pin 4 (LADJ/VCC) en el transmisor puede ser utilizado para el ajuste en la


potencia del transmisor, variando el valor de una resistencia o potencimetro,
y la relacin resistencia versus potencia se puede ver en la figura 14.4:

294

Figura 14.4.

El pin PDN (Power Down) se encuentra disponible en el transmisor y receptor


y puede ser utilizado para poner el dispositivo en bajo consumo de energa
(menor a 5nA). Si se desea utilizar la opcin de bajo consumo de energa se
requiere de una resistencia Pull-up de 10Kohm a Vcc o de menor valor en el
pin PDN. Cuando PDN = 0, entonces el transmisor o receptor entran en
reposo.
Todas estas consideraciones pueden ser ampliadas en la hoja de datos de
cada dispositivo suministradas por el fabricante.
A continuacin realizaremos una serie de proyectos en los cuales
implementaremos la comunicacin serial inalmbrica, y los cuales resultan
muy interesantes como base para nuevos proyectos.

295

14.2.- Proyecto #39: En el siguiente proyecto se requiere la construccin de


dos circuitos, figura 14.5 y figura 14.6. En el transmisor hemos empleado un
microcontrolador PIC16F877 debido a que en los siguientes proyectos iremos
incorporando ms dispositivos externos a dems de la pantalla LCD. El
circuito receptor estar controlado por un PIC16F84 al cual le hemos
conectado una pantalla LCD para visualizar los datos recibidos.
Circuito Transmisor:

Figura 14.5.

296

Circuito Receptor:

Figura 14.6.

297

Proyecto # 39
Componente
PIC16F877A
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
TXM-418-LR-S con antena
RXM-418-LR-S con antena
Pantalla LCD 16x2
Potencimetro de 5K Ohm
Resistencia de 390 Ohm
Resistencia de 750 Ohm
Resistencia de 10K Ohm
Fuente regulada de 3.3 Vdc / 5 Vdc

Cantidad
1
1
2
4
1
1
2
2
2
1
1
2

Tabla 14.1.

La primera actividad consiste en enviar una secuencia de dgitos (0 al 9) hacia


el receptor, los cuales deben poder ser visualizados en la pantalla LCD del
mismo. Esto significa que cuando transmitimos el primer dgito al receptor,
ste ser mostrado en la pantalla LCD del circuito transmisor y receptor y
ambos debern ser iguales para confirmar que la transmisin de datos ha sido
exitosa.

Programa para el circuito transmisor:


Symbol T9600

= 2

' Dato verdadero (Driven True)

I VAR Byte

' Define la variable "I" como Byte

Pause 200

' Pausa de 200 milisegundos para la LCD

LCDOut $fe, 1

' Limpia la LCD

inicio:

298

For I = 0 To 9

' Repeticin de 0 a 9

SerOut PORTB.0, T9600, [I]

' Enva los datos por RB0

LCDOut $fe, 2,"Dato: ",#I

' Muestra dato por la LCD

Pause 1000

' Pausa de 1 segundo

Next I
GoTo inicio

' Salta a inicio y reinicia el conteo

End

Programa para el circuito receptor:


Symbol T9600

= 2

' Dato verdadero (Driven True)

dato var Byte

' Define la variable "dato" como Byte

pause 500

' Pausa de 500 milisegundos para la LCD

LCDOut $fe, 1

' Limpia la LCD

inicio:
SerIn PORTB.7, T9600, dato

' espera datos durante 1 ms

LCDOUT $fe, 2,"Dato: ",#dato,"


GoTo inicio

"

' Salta a inicio

End

Como podemos observar en los diagramas de los circuitos, los mdulos TXM418-LR-S y RXM-418-LR-S conforman el medio a travs del cual viajan los
datos, sustituyendo al cable, cuyas limitaciones son de apenas unos pocos
metros cuando se requiere de comunicacin serial RS-232.

299

14.3.- Proyecto #40: Incorporando un teclado matricial al proyecto anterior,


podemos enviar datos asignados a cada tecla.
Circuito transmisor:

Figura 14.7.

300

Circuito Receptor:

Figura 14.8.

301

Proyecto # 40
Componente
PIC16F877A
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
TXM-418-LR-S con antena
RXM-418-LR-S con antena
Resistencia de 1K Ohm
Resistencia de 390 Ohm
Resistencia de 750 Ohm
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Teclado Matricial 3x4
Fuente regulada de 3.3 Vdc / 5 Vdc

Cantidad
1
1
2
4
2
1
1
4
2
1
1
2
1
2

Tabla 14.2.

Programa para el circuito transmisor con teclado matricial:


Symbol T9600

= 2

' Dato verdadero (Driven True)

TRISD = %01111000

' Configuracin de Puerto D

TECLA VAR Byte

' Declaracin de variable "Tecla"

pause 500

' Pausa de 500 milisegundos para la LCD

LCDOut $fe, 1
inicio:
Call teclado
PAUSE 100

' Limpia la LCD

' Llama a rutina de barrido de teclas


' Pausa de 1050 milisegundos

SerOut PORTB.0, T9600, [TECLA]

' Enva dato por RB0

LCDOUT $fe, 2,"Dato: ",#TECLA

' Muestra dato por la LCD

302

GoTo inicio

' Salto a inicio

teclado:
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1

PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

=
=
=
=

0
0
0
0

PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

TECLA
TECLA
TECLA
TECLA

=
=
=
=

1
4
7
10

'
'
'
'

tecla
tecla
tecla
tecla

"1"
"4"
"7"
"*"

'
'
'
'

tecla
tecla
tecla
tecla

"2"
"5"
"8"
"0"

'
'
'
'

tecla
tecla
tecla
tecla

"3"
"6"
"9"
"#"

' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
=
=
=
=

0
0
0
0

PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If PORTD.3
If PORTD.4
If PORTD.5
If PORTD.6
Return
End

Then
Then
Then
Then

Then
Then
Then
Then

TECLA
TECLA
TECLA
TECLA

=
=
=
=

2
5
8
11

' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
=
=
=
=

0
0
0
0

Then
Then
Then
Then

TECLA
TECLA
TECLA
TECLA

=
=
=
=

3
6
9
12

Se puede apreciar en la rutina de barrido del teclado que hemos asignado un


valor especfico en cada condicin, es decir, si presionamos la tecla #1, el
valor asignado a la variable TECLA ser igual a uno. Si presionamos la tecla
#2, entonces la variable TECLA ser igual a dos, y as sucesivamente hasta
la ltima tecla.

303

Cada vez que presionamos una tecla, el dato correspondiente a la misma es


cargado y enviado al receptor el cual a su vez almacena este dato en una
variable, e inmediatamente lo muestra en la pantalla LCD. Esta accin se
puede apreciar en el cdigo de programa que se muestra a continuacin.
Programa para el circuito receptor:
Symbol T9600

= 2

' Dato verdadero (Driven True)

dato VAR Byte

' Define la variable "dato" como Byte

Pause 200

' Pausa de 200 milisegundos para la LCD

LCDOut $fe, 1

' Limpia la LCD

inicio:
SerIn PORTB.7, T9600, dato

' Espera de datos

LCDOUT $fe, 2,"Dato: ",#dato,"


GoTo inicio

"

' Salta a inicio

End

A partir de la etiqueta inicio se espera la llegada de los datos enviados


desde el circuito transmisor. En este punto la instruccin SerIn mantiene al
microcontrolador en espera, de tal manera que cuando llega un dato, ste se
almacena en la variable correspondiente dato y seguidamente salta a la
siguiente lnea, que en este caso corresponde a la instruccin LCDout la cual
se encargar de mostrar el dato en la pantalla.
Es importante resaltar que cuando el circuito transmisor es apagado, el
mdulo receptor (RXM-418-LR-S) pierde sincrona y puede entregar datos
errados o aleatorios al microcontrolador. Esto es un problema que puede ser
corregido con unas pocas lneas de programacin como lo demostraremos en
el siguiente proyecto.

304

14.4.- Proyecto #41: En este proyecto se plantea realizar un sistema de


control a distancia que maneje ocho salidas de potencia en el circuito
receptor, de tal manera que pueda ser encendida o apagada cualquiera de
ellas al presionar el botn correspondiente en el teclado del circuito
transmisor. Esto significa que al pulsar la tecla 1, el estado de la salida
correspondiente a esta tecla en el circuito receptor debe cambiar. Si la salida
se encuentra en estado lgico cero, la misma debe cambiar a estado lgico
uno y viceversa. Lo mismo debe aplicar para el resto de las salidas de
potencia del circuito receptor.
Para el circuito transmisor podemos emplear el mismo diagrama de la
actividad anterior.
Circuito transmisor:

Figura 14.9.

305

Diagrama del circuito receptor:

Figura 14.10.

306

Programa para el circuito transmisor con teclado matricial:


Symbol T9600

= 2

TRISD = %01111000

' Dato verdadero (Driven True)


' Configuracin de Puerto D

TECLA VAR Byte

' Declaracin de variable "Tecla"

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

inicio:
Call teclado

' Llama a rutina de barrido de teclas.

If tecla = 0 Then inicio ' Si TECLA = 0 ninguna tecla fue


' presionada y salta de nuevo a
' la etiqueta inicio.
SerOut PORTB.0, T9600, [%10011001] ' Enva cdigo de confirmacin.
PAUSE 200
SerOut PORTB.0, T9600, [TECLA]
' Enva dato por RB0
PAUSE 300
' Pausa de 300 milisegundos
LCDOUT $fe, 2,"Dato: ",#TECLA,"
GoTo inicio
' Salto a inicio

" ' Muestra dato por la LCD

teclado:
tecla = 0
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1

' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
=
=
=
=

0
0
0
0

Then
Then
Then
Then

TECLA
TECLA
TECLA
TECLA

=
=
=
=

1
4
7
10

'
'
'
'

tecla
tecla
tecla
tecla

"1"
"4"
"7"
"*"

' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1

If PORTD.3 = 0 Then TECLA = 2


If PORTD.4 = 0 Then TECLA = 5

' tecla "2"


' tecla "5"

If PORTD.5 = 0 Then TECLA = 8

' tecla "8"

307

If PORTD.6 = 0 Then TECLA = 11


PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If
If
If
If

PORTD.3
PORTD.4
PORTD.5
PORTD.6

' tecla "0"

' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
=
=
=
=

0
0
0
0

Then
Then
Then
Then

TECLA
TECLA
TECLA
TECLA

=
=
=
=

3
6
9
12

'
'
'
'

tecla
tecla
tecla
tecla

"3"
"6"
"9"
"#"

Return
End

En el programa del circuito transmisor se pueden observar algunas mejoras. A


partir de la etiqueta inicio se puede observar que no se envan datos al
receptor a menos que se presione una tecla.
Si una tecla es presionada, entonces enviamos un cdigo elegido al azar al
receptor (Ej. 10011001), para indicar que el siguiente dato corresponde al de
la tecla presionada. De esta manera evitaremos observar datos errados en la
pantalla LCD del circuito receptor, ya que su programa ha sido diseado para
que solo cambie el estado lgico de las salidas de potencia, solo si recibe el
cdigo correcto enviado desde el circuito transmisor.

Programa para el circuito receptor:


TRISD = %00000000
Symbol T9600

= 2

dato VAR Byte


salida VAR Byte

' Dato verdadero (Driven True)


' Define la variable "dato" como Byte

Pause 500
LCDOut $fe, 1

' Pausa de 500 milisegundos para la LCD


' Limpia la LCD

PORTD = 0

' Inicializamos el puerto D

inicio:
SerIn PORTB.7, T9600, dato
If DATO = %10011001 Then sigue

' Espera datos.


' Salta a la etiqueta "sigue"

308

' si se recibe el cdigo correcto


' que hemos elegido (10011001)
GoTo inicio

' Salto a inicio.

sigue:
SerIn PORTB.7, T9600, dato
If
If
If
If
If
If
If
If

dato
dato
dato
dato
dato
dato
dato
dato

=
=
=
=
=
=
=
=

1
2
3
4
5
6
7
8

Then
Then
Then
Then
Then
Then
Then
Then

Toggle
Toggle
Toggle
Toggle
Toggle
Toggle
Toggle
Toggle

' espera datos durante 1 ms

PORTD.0
PORTD.1
PORTD.2
PORTD.3
PORTD.4
PORTD.5
PORTD.6
PORTD.7

'
'
'
'
'
'
'
'

Invierte
Invierte
Invierte
Invierte
Invierte
Invierte
Invierte
Invierte

el
el
el
el
el
el
el
el

Bit
Bit
Bit
Bit
Bit
Bit
Bit
Bit

en
en
en
en
en
en
en
en

RD0
RD1
RD2
RD3
RD4
RD5
RD6
RD7

LCDOUT $fe, 2,"Salida #: ",#dato,"


" ' Muestra dato en LCD
GoTo inicio
' Salta a inicio
End

309

Instrucciones de programa de PicBasic

Captulo XV

@
Sintaxis:
@ instruccin en lenguaje ensamblador

Esta instruccin es utilizada para insertar dentro del cdigo PicBasic, lneas
de programa en lenguaje ensamblador. En este caso, cada lnea en lenguaje
ensamblador debe llevar el smbolo @ al inicio.
Ejemplo:
Led Var Byte

' Declaracin de Variable Led

TRISB = $00
Led = $00

' Configura el puerto B como salida


' Inicializamos la variable Led

@bsf _Led,0
Pause 1000
PORTB = Led
Pause 1000
@bcf _Led,0
PORTB = Led
GoTo Inicio

'
'
'
'
'
'
'

Inicio:
pone en 1 el bit 0 de la variable Led
Pausa de 1 segundo
Saca dato por el puerto B
Pausa de 1 segundo
pone en 0 el bit 0 de la variable Led
Saca dato por el puerto B
Salto a inicio

End

Nota Importante: para acceder a una variable declarada en PicBasic, desde


el lenguaje ensamblador se debe anteponer el smbolo _ (Guin bajo), ya
que de lo contrario no ser posible el acceso a sta. En el ejemplo, se puede
ver que para acceder a la variable Led desde el lenguaje ensamblador, se
antepuso el guin bajo a la variable, quedando _Led.

310

ADCin
Sintaxis:
ADCin canal, Variable
Lee una entrada del conversor A/D y el resultado es almacenado en una
variable.
Esta instruccin solo es vlida para microcontroladores que tienen convertidor
A/D, por ejemplo, el PIC16F877, el PIC18F442, el PIC18F452, el PIC18F458
entre otros.

Asm EndAsm
Sintaxis:
Asm
*
*
Instrucciones en lenguaje ensamblador
*
*
EndAsm

Esta instruccin permite insertar un conjunto de instrucciones en lenguaje


ensamblador y al igual que en la instruccin @, tambin aplica el uso del
smbolo _ (Guin Bajo), el cual debe anteceder a las variables que se
deseen utilizar.

311

Branch
Sintaxis:
Branch Variable,[Etiqueta1, Etiqueta2,EtiquetaN]
La instruccin Branch hace un salto a una etiqueta dependiendo del valor de
la variable, es decir, si la variable es igual a 0, el salto se hace a la etiqueta 1;
si la variable es igual a 1, el salto se hace a la etiqueta 2; si la variable es
igual a 2, el salto se hace a la etiqueta 3, y as sucesivamente.
Ejemplo:
I var Byte

' Declaracin de Variable I

TRISB = $00
PORTB = $00

' Configura el puerto B como salida


' Inicializa el puerto B

I = 0

' Inicializa la variable I

inicio:
Branch I,[Led1,Led2,Led3]
Led1:
PORTB = %00000001
pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio

'
'
'
'
'

enciende el led en RB0


pause de 1 segundo
apaga el led
suma 1 a la variable I
salta a inicio

PORTB = %00000010
pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio

'
'
'
'
'

enciende el led en RB1


pause de 1 segundo
apaga el Led
suma 1 a la variable I
salta a inicio

PORTB = %00000100
pause 1000
PORTB = %00000000
I = 0
GoTo inicio

'
'
'
'
'

enciende el led en RB2


pause de 1 segundo
apaga el Led
Inicializa la variable I
salta a inicio

Led2:

Led3:

End

312

Button
Sintaxis:

Button pin, estado, retardo, rango, variable, accin, etiqueta

La instruccin Button
genera auto-repeticin.

elimina los rebotes de un pulsador o switch, y

Pin: especifica el pin del puerto en el cual ser conectado el pulsador.


Estado: indica cual es estado lgico 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 15.1).
+5V

+5V

R1
10 Kohm

S1
Pulsador

Al Pin
Al Pin
S1
Pulsador

R1
10 Kohm

Activo-Bajo

Activo-Alto

Figura 15.1.

Retardo: es una variable o constante (0 255) que especifica cuantos ciclos


deben pasar antes de efectuar la auto-repeticin. Este campo tiene dos
funciones especiales: si el campo retardo es igual 0, no permite anti-rebote y
no permite auto-repeticin. Si el campo retardo es igual a 255, permite el antirebote pero no permite la auto-repeticin.
Rango: es una variable o constante (0 255) que especifica el nmero de
ciclos entre auto-repeticiones.

313

Variable: es una variable auxiliar tipo Byte, definida tambin al inicio del
programa para uso exclusivo de la instruccin Button, por lo cual no deber
ser utilizada con otro fin en el programa. Siempre debe ser inicializada antes
del comando Button.
Accin: indica el estado del botn cuando ste no es presionado.
Etiqueta: la instruccin realiza un salto a la etiqueta definida en este campo
cuando el pulsador no ha sido presionado.
Ejemplo:
TRISB = %11111101

' Configuracin del puerto B

A0 Var Byte

' declaracin de la variable A0

Lcdout $fe,1
A0 = 0

' inicializa la variable A0

inicio:
Button PORTB.0,1,2,2,A0,0,NoPres
PulsOut PORTB.1,150
NoPres:
Pause 10
GoTo inicio

' Salta a inicio

End

314

Call
Sintaxis:
Call etiqueta
La instruccin Call, llama a una subrutina la cual est identificada con una
etiqueta, y una vez culminada la subrutina la cual contiene al final la
instruccin Return, vuelve a la siguiente lnea despus del llamado.
Ejemplo:
inicio:
Call Teclado
If A0 = 1 Then led1
.
.
.
Teclado:
.
.
.
.
Return
End

Clear
Sintaxis:
Clear
La instruccin Clear inicializa todos los registros de la RAM a cero, es decir,
todas las variables simultneamente pasarn a ser cero.

315

ClearWDT
Sintaxis:
ClearWDT
La instruccin ClearWDT inicializa el Perro Guardin (Watchdog Timer).

Count
Sintaxis:
Count pin, duracin, variable
La instruccin Count puede medir la frecuencia de una seal simple
determinando el nmero de pulsos por segundo. Se pueden medir frecuencias
de hasta 25 khz con un oscilador de 4 MHz. Para un oscilador de 20 MHz la
frecuencia mxima a ser medida ser de 125 khz.
Pin: especifica el pin del puerto en el cual se introducirn los impulsos. Este
pin es designado como entrada automticamente por la instruccin Count.
Duracin: es el tiempo durante el cual se realizar el conteo de impulsos
sobre el pin especificado.
Variable: es una variable definida por el programador en la cual se grabar el
resultado del conteo.

316

Data
Sintaxis:
Data {@Direccin inicial}, constante1, constante2,constanteN

La instruccin Data
solo puede ser utilizada para las familias de
microcontroladores que incorporan memoria EEPROM en su arquitectura.
Para los microcontroladores que no cuentan con esta memoria, existe la
posibilidad de agregar una memoria EEPROM externa a travs del protocolo
de comunicacin I2C.
Bsicamente esta instruccin guarda varias constantes a partir de una
direccin que especificamos en el campo correspondiente.
Ejemplo:
Data @10,1,3,5,7,9
En este ejemplo, la instruccin Data almacenar los valores 1, 3, 5, 7 y 9 en
las direcciones de memoria 10, 11, 12, 13 y 14 respectivamente.

DTMFout
Sintaxis:
DTMFout pin, {On-ms, Off-ms}, [tono, tono,...tono]
La instruccin DTMFout genera tonos DTMF en secuencia y a travs de un
puerto cualquiera del microcontrolador.
Pin: especifica el pin del puerto en el cual se emitirn los tonos DTMF.
On-ms: es una variable, constante o expresin que especifica la duracin de
cada tono en milisegundos. En caso de no utilizar este parmetro, el tiempo
por defecto de cada tono es de 200 ms.
317

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 parmetro, el
tiempo por defecto ser de 50 ms.
Tono: puede ser una variable o constante (entre 0 15), que especifica el
tono que debe ser generado.

Dgito en la
Instruccin
DTMFout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0

Dgito en un
Teclado
Telefnico
1
2
3
4
5
6
7
8
9
0
*
#
A
B
C
D

Frecuencias
Bajas

Frecuencias
Altas

697 HZ
697 HZ
697 HZ
770 HZ
770 HZ
770 HZ
852 HZ
852 HZ
852 HZ
941 HZ
941 HZ
941 HZ
697 HZ
770 HZ
852 HZ
941 HZ

1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1633 HZ
1633 HZ
1633 HZ
1633 HZ

Tabla 15.1.

318

Figura 15.2.

Ejemplo:
DTMFout

PortC.0, [0,1,2,3,4,5,6,7,8,9]

Conectando el pin de salida (RC0) adecuadamente a una lnea telefnica,


estaremos marcando sin problemas un nmero telefnico. En algunos casos
es recomendable utilizar los tiempos On-ms y Off-ms para realizar un
marcado ms exacto.

Ejemplo:
DTMFout

PortC.0,400,150, [6,4,3,8,7,1,0]

319

Los tonos tendrn una duracin de 400 milisegundos cada uno y un tiempo en
silencio entre ellos de 150 milisegundos.

En cuanto al oscilador se recomienda usar del tipo HS (desde 10 Mhz o


superior) para obtener mejores resultados en la generacin de tonos DTMF,
as como tambin se recomienda utilizar un circuito de acople entre el
microcontrolador y el dispositivo externo al cual enviaremos los tonos.

R1
1K

R2
1K

Al Pin

Al amplif icador de Audio

C1
0.1 uF
GND

C2
0.1 uF
GND

C1
Al Pin
10 uF
C2
10 uF
Parlante
GND

Figura 15.3.

320

EEPROM
Sintaxis:
EEPROM direccin,[constante1, constante2,.constanteN]
La instruccin EEPROM es capaz de almacenar datos en la memoria de
datos de un microcontrolador siempre y cuando ste cuente con esta
caracterstica y a partir de la direccin indicada, almacena constantes
especficas en las posiciones consecutivas a la inicial.
Es importante resaltar que los datos solo son almacenados al momento de
grabar el microcontrolador en nuestro programador para microcontroladores
PIC, por lo tanto, para realizar lecturas o grabaciones de nuevos datos
durante la ejecucin de un programa se debe recurrir a las instrucciones Read
y Write.

END
Sintaxis:
End
La instruccin END detiene la ejecucin de un programa y pone el
microcontrolador en bajo consumo de energa.

FREQOUT
Sintaxis:
FreqOut pin, On-ms, Frecuencia1, Frecuencia2
La instruccin FreqOut genera una o dos seales de frecuencia entre 0 y
32767 Hz previamente definidas, durante un perodo de tiempo tambin
definido.

321

Pin: especifica el pin del puerto en el cual se va a generar la seal.


On-ms: Es una variable o constante que determina el tiempo de duracin de
la seal.
Frecuencia1: puede ser una variable o constante (entre 0 32767) que
especifica la frecuencia del primer tono.
Frecuencia2: puede ser una variable o constante (entre 0 32767) que
especifica la frecuencia del segundo tono, el cual sale mezclado con la
frecuencia 1.
En cuanto al oscilador tambin se recomienda usar del tipo HS (20 Mhz) para
obtener mejores resultados en la generacin de tonos, as como tambin se
recomienda utilizar un circuito de acople entre el microcontrolador y el
dispositivo externo al cual enviaremos los tonos (ver figura 15.3).
Ejemplo:
FreqOut PortC.2, 1000, 2000
Genera un tono de 2000Hz durante 1 segundo.
FreqOut PortC.2, 1000, 1500, 3500
Genera dos tonos a la vez durante 1 segundo, uno de 1500Hz y otro de
3500Hz.

322

FOR NEXT
Sintaxis:

For variable = inicio to final


*
*
Instrucciones
*
*
Next {variable}

{step {-} incremento}

La instruccin ForNext se encarga de hacer repeticiones de instrucciones


que permanecen dentro del lazo For Next.
El parmetro Step afecta el incremento segn el valor asignado despus de
esta palabra. Si este parmetro es omitido, el incremento es en una unidad.
Ejemplo:
Z Var Byte

' Declaracin de la Variable Z

Inicio:
For Z = 0 To 10
PORTD.0 = 1
Pause 1000
PORTD.0 = 0
Pause 1000

'
'
'
'

Pone en 1 el pin RD0


Pausa de 1 segundo
Pone en 0 el pin RD0
Pausa de 1 segundo

Next Z
End

323

Gosub
Sintaxis:
Gosub etiqueta
La instruccin Gosub ejecuta subrutinas dentro de un programa principal
donde la ubicacin de las mismas estar definida por la etiqueta
correspondiente. Una vez ejecutada la subrutina y encontrada la instruccin
Return, la ejecucin del programa contina en la lnea siguiente a la
instruccin Gosub.

GOTO
Sintaxis:
GOTO etiqueta
La instruccin Goto contina la ejecucin de un programa a partir de la
etiqueta especificada. Esta instruccin no tiene retorno.

HIGH
Sintaxis:
HIGH pin
La instruccin High pone en uno lgico el pin especificado, el cual configura
automticamente como salida.

Ejemplo:
Inicio:
HIGH PORTA.0

' Pone en 1 el pin RA0

324

GoTo inicio
End

I2CREAD
Sintaxis:
I2Cread SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2Cread enviar el dato de control y la direccin especfica a
un dispositivo conectado a un bus I2C y almacenar el dato obtenido en una
variable definida. Al utilizar la etiqueta opcional, el programa saltar si no se
recibe ninguna respuesta del dispositivo consultado.
Ejemplo:
SDA VAR PORTB.0
SCL VAR PORTB.1
A1 VAR Byte
Direc VAR Word
Control VAR Byte
Pause 500

' Pause de 500 milisegundos

LCDOut $fe, 1

' Limpia la LCD

Direc = $10
Control = $A0

' Direccin en la memoria externa


' Dato de Control

inicio:

I2CREAD SDA, SCL, Control, Direc, [A1] ' Lectura de


' memoria
LCDOUT $fe, 2,"Dato: ",#A1
ciclo:

GoTo ciclo
End

325

' Muestra el dato ledo

I2CWRITE
Sintaxis:
I2CWrite SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2CWrite enviar el dato de control y la direccin en la cual se
almacenar el dato cargado en la variable previamente cargada.
Ejemplo:
SDA VAR PORTB.0
SCL VAR PORTB.1
Direc var Word
Control Var Byte
inicio:
Direc = $10
Control = $A0

' Direccin en la memoria externa


' Dato de Control

I2Cwrite SDA, SCL, Control, Direc, [$21]

pause 10
Loop:

' Escribe la
' memoria

' Pausa de 10 milisegundos

GoTo Loop
End

IF THEM ELSE
Sintaxis:
If expresin 1 {AND / OR expresin 2} Then etiqueta
Con la instruccin If Them podemos seleccionar uno, dos o mas posibles
comportamientos de programa, tomando decisiones en una estructura de
programacin sencilla y la cual ser considerada casi en la totalidad de los
programas.

326

Ejemplo 1: Si pulsamos un botn conectado al pin RA0 se cumple la condicin


y salta a la etiqueta Espera.
inicio:
Input PORTA.0

' Designa el PIN RA0 como entrada

If PORTA.0 = 1 Then Espera


GoTo inicio

' Si RA0 = 1 salta a la etiqueta

' Salta a "inicio" si RA0 = 0

Espera:
GoTo Espera
End

Ejemplo 2:
inicio:
Input PORTA.0

' Designa el PIN RA0 como entrada

If PORTA.0 = 1 Then

' Si RA0 = 1 ...

GoTo Espera

' salta a la etiqueta "Espera"

Else

' de lo contrario...

GoTo inicio

' salta a la etiqueta "inicio"

EndIf

' Fin de la instruccin IF-Them-Else

Espera:
GoTo Espera
End

Solo se utiliza EndIf cuando deseamos tener ms de una condicin o toma


de decisin.

327

Ejemplo 3:
A VAR Byte
inicio:
Input PORTA.0

' Designa el PIN RA0 como entrada

If PORTA.0 = 1 Then
A = A + 1
If A = 10 Then Espera

' Si A = 10 salta a la etiqueta Espera

EndIf
GoTo inicio

' Salta a "inicio"

Espera:
GoTo Espera
End

INPUT
Sintaxis:
INPUT PIN
Designa un pin especfico como entrada.
Ejemplo:
inicio:
Input PORTA.0

' Designa el PIN RA0 como entrada

Espera:
GoTo Espera
End

328

LCDIN
Sintaxis:
LCDin direccin, [variable1, variable2,]
La instruccin LCDin carga el dato almacenado en una direccin de la
memoria RAM de la LCD en una variable previamente definida.

Ejemplo:
A VAR Byte
inicio:
LCDIn $10,[A]

' Lee el dato en la direccin de memoria $10


' y lo carga en la variable "A".

Espera:
GoTo Espera
End

329

LCDout
Sintaxis:
LCDout comando, dato
La instruccin Lcdout enva datos especficos a una pantalla LCD
Alfanumrica para que puedan ser mostrados en la misma.
Comando
$FE, 1
$FE, 2
$FE, $0C
$FE, $0E
$FE, $0F
$FE, $10
$FE, $14
$FE, $C0
$FE, $90
$FE, $D0

Accin
Limpia la pantalla
Retorna al inicio de la primera lnea
Apaga el Cursor
Cursor bajo (Underline "_") activo
Cursor intermitente activo
Mueve el cursor un espacio a la izquierda
Mueve el cursor un espacio a la derecha
Mueve el cursor al inicio de la segunda lnea
Mueve el cursor al inicio de la tercera lnea
Mueve el cursor al inicio de la cuarta lnea
Tabla 15.2.

Ejemplo:
Pause 200
LCDOut
LCDOut
LCDOut
LCDOut
LCDOut
LCDOut

$fe, 1
$fe, 2

' Limpia la pantalla


' Posiciona el cursor en el inicio
"* Pantalla LCD *" ' escribe
$fe,$C0, "* Alfanumerica *"
$fe,$90, "* 1234567890 *"
$fe,$D0, "* AaBbCcDdEeFf *"

Inicio:
GoTo Inicio
End

330

LOW
Sintaxis:
LOW pin
La instruccin LOW coloca en cero lgico un pin especfico.

Ejemplo:
inicio:
Low PORTA.0

' configura RA0 = 0

espera:
GoTo espera
End

NAP
Sintaxis:
NAP periodo
La instruccin NAP pone el microcontrolador en modo de bajo consumo de
energa por periodos de tiempo definidos en la siguiente tabla:

331

Periodo
0
1
2
3
4
5
6
7

Retardo (ms)
18
36
72
144
288
576
1152
2304

Tabla 15.3.

Ejemplo:
inicio:
NAP 6

' Bajo consumo de energa durante 1152 milisegundos

espera:
GoTo espera
End

OUTPUT
Sintaxis:
OUTPUT pin
La instruccin OUTPUT configura un pin especfico como salida.
Ejemplo:
inicio:
OUTPUT PORTA.0

' configura RA0 como salida

espera:
GoTo espera
End

332

PAUSE
Sintaxis:
PAUSE periodo
La instruccin Pause realiza una pausa en el programa por un periodo
definido en milisegundos. Esta instruccin no pone al microcontrolador en
modo de bajo consumo de energa.
Ejemplo:
inicio:
High PORTA.0

' RA0 = 1

Pause 1000

' Pausa de 1 segundo

Low PORTA.0

' RA0 = 0

Pause 1500

' Pausa de 1.5 segundos

GoTo inicio

' Salta a la etiqueta "inicio"

End

PAUSEUS
Sintaxis:
PAUSEUS periodo
La instruccin PauseUs realiza una pausa en el programa por un periodo
definido en microsegundos. Esta instruccin no pone al microcontrolador en
modo de bajo consumo de energa.

Ejemplo:

333

inicio:
High PORTA.0

' RA0 = 1

PauseUs 200

' Pausa de 200 microsegundos

Low PORTA.0

' RA0 = 0

PauseUs 1500

' Pausa de 1.5 milisegundos

GoTo inicio

' Salta a la etiqueta "inicio"

End

POT
Sintaxis:
POT pin, escala, variable
La instruccin POT lee un potencimetro, foto celda, termistor, o cualquier
otro dispositivo capaz de variar su valor resistivo. Bsicamente esta
instruccin calcula el tiempo de descarga del condensador C1 el cual vara
segn el valor resistivo presente en la resistencia variable.
Pin: especifica el pin del puerto en el cual se va a conectar el potencimetro.
Escala: Es una variable o constante que aumenta o disminuye el rango de
lectura en un porcentaje determinado. Esta escala es utilizada para ajustar el
rango de salida en la lectura del dispositivo, y es afectada directamente por
las constantes RC. El valor de la escala ser correcto cuando el valor cargado
en la variable se aproxime a cero, cuando la resistencia medida sea mnima; y
tambin cuando el valor de la variable se aproxime a 255, cuando la
resistencia medida sea mxima.
Variable: es una variable en la cual se almacena el resultado obtenido de la
lectura del potencimetro o componente resistivo.

334

PULSIN
Sintaxis:
PULSIN pin, nivel, variable
La instruccin PULSIN mide la duracin de un pulso alto o bajo con una
resolucin de 10 microsegundos para un oscilador de 4 Mhz y el valor
obtenido es almacenado en una variable definida de 8 bits (variable tipo byte)
o 16 bits (variable tipo Word).
Pin: especifica el pin del puerto en el cual se introducirn los pulsos.
Nivel: define si la medicin se hace en nivel alto o bajo. (1 = alto, 0 = bajo).
Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tipo
word) definida por el programador en la cual se grabar el resultado de la
lectura.
Ejemplo:
Define OSC 4

' Define el oscilador en 4 Mhz

LECTURA VAR Word

' Definicin de variable de 16 bits

Pause 200

' Pausa de 200 milisegundos

LCDOut $fe, 1

' Limpia la pantalla

Inicio:
LECTURA = 0

' Inicializa la variable

PulsIn PORTB.0,1,LECTURA
LCDOut $fe, 2
' Posiciona el cursor en el inicio
LCDOut "Lect. en ms:",#LECTURA," "
' Muestra mensaje y
' dato por pantalla
Pause 1000
' Pausa de 1 segundo
GoTo Inicio
' Salta a inicio
End

335

PULSOUT
Sintaxis:
PULSOUT pin, nivel, variable
La instruccin PULSOUT genera pulsos con una duracin definida en
decenas de microsegundos. (Tiene una resolucin de 10 microsegundos
para un oscilador de 4 Mhz).
Ejemplo:
DEFINE OSC 4

' Define el oscilador en 4 Mhz

Inicio:
PulsOut PORTB.0,100
Pause 1
GoTo Inicio
End

'
'
'
'

Genera un pulso de 1 milisegundo de


duracin o 100 decenas de uS.
Pausa de 1 milisegundo.
Salto a inicio

PWM
Sintaxis:
PWM pin, nivel, ciclo
La instruccin PWM enva pulsos PWM (Pulse Width Modulation) a un pin
especfico.
Pin: especifica el pin del puerto en el cual se genera PWM.
Nivel: es una variable o constante que determina la duracin del pulso en su
nivel alto, es decir, partiendo de nivel = 1 si se incrementa este valor, el ancho
de pulso positivo se incrementa hasta nivel = 254 donde el ciclo de trabajo es

336

aproximadamente 100%. Cuando nivel = 0 la salida se mantiene en cero


lgico; cuando nivel = 255 la salida se mantiene en uno lgico.
Ciclo: es una variable o constante en el cual se define el nmero de ciclos en
un pin especfico.

Ejemplo:
DEFINE OSC 4

' Define el oscilador en 4 Mhz

Inicio:
PWM PORTB.0,127,100

' Seal PWM

GoTo Inicio

' Salto a inicio

End

RANDOM
Sintaxis:
RANDOM variable
La instruccin RANDOM almacena nmeros aleatorios en una variable de 16
Bits (Word).
Ejemplo:
A0 VAR Word

' Declaracin de variable "A0" Word (16 Bits)

Pause 200

' Pausa de 200 milisegundos

LCDOut $fe, 1

' Limpia la pantalla

Inicio:
Random A0

' Almacena un nmero aleatorio en A0

337

LCDOut $fe, 2
' Posiciona el cursor en el inicio
LCDOut "RANDOM: ",#A0,"
"
' Muestra mensaje y
' dato por pantalla
Pause 1500

' Pausa de 1.5 segundos

GoTo Inicio

' Salto a inicio

End

READ
Sintaxis:
READ direccin, variable
La instruccin READ permite leer datos desde la memoria EEPROM de
datos de un microcontrolador almacenndolos en una variable previamente
definida.
Ejemplo:
' Declaracin de Variables:
I VAR Byte
DIRECCION VAR Byte
DATO VAR Byte
WRITE
WRITE
WRITE
WRITE
WRITE

1,
2,
3,
4,
5,

3
5
7
9
11

'
'
'
'
'

Escribe
Escribe
Escribe
Escribe
Escribe

en
en
en
en
en

la
la
la
la
la

memoria
memoria
memoria
memoria
memoria

de
de
de
de
de

datos
datos
datos
datos
datos

DIRECCION = 1

' Direccin inicial de lectura

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos


' Limpia la pantalla

Inicio:
For I = 1 To 5

' Repite la lectura cinco veces

338

Read DIRECCION,DATO

' Lee la direccin especificada y la


' guarda en la variable "Dato".

LCDOut $fe, 2

' Posiciona el cursor en el inicio

LCDOut "Direccion: ",#DIRECCION,"


LCDOut $fe,$C0, "Dato: ",#DATO,"

"

" ' Muestra direccin


' Muestra el dato ledo

DIRECCION = DIRECCION + 1

' Suma uno (1) a la variable

Pause 1500
Next I
End

' Pausa de 1.5 segundos

RETURN
Sintaxis:
RETURN
Retorno de una subrutina desde donde se ha generado un salto del tipo Call o
Gosub.
Ejemplo:
inicio:
Call Teclado
If A0 = 1 Then led1
.
.
.
Teclado:
.
.
.
.
Return
End

339

REVERSE
Sintaxis:
REVERSE pin
La instruccin REVERSE cambia el estado de un pin I/O, es decir, si el pin
es entrada, ste pasa a ser salida. Si un pin es salida, ste pasa a ser
entrada.
Ejemplo:
TRISB = %00000000

' Configura los pines del puerto B como


' salida.

Inicio:
High PORTB.5
Pause 1000
Low PORTB.5
Reverse PORTB.5
End

'
'
'
'

RB5 = 1
Pausa de 1 segundo
RB5 = 0
RB5 ahora es entrada

SELECT CASE
Sintaxis:
SELECT CASE variable
La instruccin SELECT CASE es un condicional que permite seleccionar
entre un nmero determinado de subrutinas.
Ejemplo:
' Declaracin de Variables
I VAR Byte
Z VAR Byte
Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos


' Limpia la pantalla

340

Z = 0

' Inicializa la variable Z

Inicio:
Z = Z + 1
If Z = 4 Then Final

' Incrementa la variable Z


' Si Z = 4 salta a la etiqueta "Final"

Select Case Z

' Condicional Select Case para la


' variable Z.

Case 1
LCDOut $fe, 2
LCDOut "Select Case 1"
Pause 1500
GoTo Inicio

'
'
'
'

Posiciona el cursor en el inicio


Muestra mensaje por la LCD
Pausa de 1.5 segundos
Salto a inicio

'
'
'
'

Posiciona el cursor en el inicio


Muestra mensaje por la LCD
Pausa de 1.5 segundos
Salto a inicio

'
'
'
'

Posiciona el cursor en el inicio


Muestra mensaje por la LCD
Pausa de 1.5 segundos
Salto a inicio

Case 2
LCDOut $fe, 2
LCDOut "Select Case 2"
Pause 1500
GoTo Inicio
Case 3
LCDOut $fe, 2
LCDOut "Select Case 3"
Pause 1500
GoTo Inicio
End Select
Final:
GoTo Final
End

341

SERIN
Sintaxis:
SERIN pin, modo,{tiempo, etiqueta}, variable
La instruccin SerIn se encarga de recibir uno o mas valores a travs de un
pin especfico usando el formato asncrono estndar 8N1 que significa 8 bits
de datos, sin revisin de paridad y 1 bit de parada (stop). SerIn trabaja por
defecto con un oscilador de 4 Mhz y para tener una transferencia de datos
segura con otros osciladores de mayor valor, ser necesario utilizar la
directiva Define Osc al inicio del programa.
Pin: en este campo definiremos cual ser el pin de entrada entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.1
Modo: define la velocidad de transmisin en baudios.
Tiempo: este campo es opcional al igual que el campo etiqueta y su objetivo
es establecer un tiempo en milisegundos definido por el programador, el cual
una vez vencido, har que se realice un salto a la etiqueta tambin definida
por el programador.
Variable: en este campo se especifica la variable en la cual se desea sean
almacenados los datos recibidos.
Ejemplo:
Symbol T9600
dato var Byte

= 2

' Dato verdadero (Driven True)


' Define la variable dato como Byte

Pause 500

' Pausa de 500 milisegundos para la LCD

LCDOut $fe, 1

' Limpia la LCD

Inicio:
SerIn PORTC.7, T9600, dato

' espera datos durante 1 ms

342

LCDOUT $fe, 2,"Dato: "


LCDOut $fe,$C0,#dato,"
GoTo Inicio

"

' Salta a inicio

End

SEROUT
Sintaxis:
SEROUT pin, modo, [variable]
La instruccin SerOut se encarga de enviar uno o mas valores a travs de
un pin especfico usando el formato asncrono estndar 8N1 que significa 8
bits de datos, sin revisin de paridad y 1 bit de parada (stop).
Pin: en este campo definiremos cual ser el pin de salida entre los puertos
disponibles del microcontrolador.
Modo: define la velocidad de transmisin en baudios y emplea la misma tabla
de la instruccin SerIn.
Variable: en este campo se especifica la variable que contiene los datos que
sern enviados a travs de pin especificado.
Ejemplo:
Symbol T9600
I VAR Byte

= 2

' Dato verdadero (Driven True)


' Define la variable I como Byte

Inicio:
For I = 0 To 9

' Repeticin de 0 a 9

SerOut PORTC.6, T9600, [#I]


Pause 1000

' # enva los datos en ASCII

' Pausa de 1 segundo

Next I

343

GoTo Inicio

' Salta a inicio

End

SLEEP
Sintaxis:
SLEEP perodo
La instruccin SLEEP lleva a un estado de bajo consumo de energa a un
microcontrolador por un perodo de tiempo definido en segundos.
Ejemplo:
Inicio:
Sleep 10

' Bajo consumo de energa durante 10 segundos

Espera:
GoTo Espera

' Salta a la etiqueta "Espera"

End

SWAP
Sintaxis:
SWAP variable, variable
La instruccin SWAP intercambia el contenido de dos variables.

Ejemplo:
A1 VAR Byte
B1 VAR Byte

' Define la variable "A1" como Byte


' Define la variable "B1" como Byte

344

A1 = 10
B1 = 15

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

Inicio:
Swap A1,B1

' Intercambia datos entre variables

LCDOUT $fe, 2,"A1: ",#A1 ' Muestra variable A1 por la LCD


LCDOut $fe,$C0,"B1: ",#B1
' Muestra variable B1 por la LCD
Espera:
GoTo Espera

' Salta a la etiqueta "Espera"

End

TOGGLE
Sintaxis:
TOGGLE pin
La instruccin TOGGLE invierte el estado lgico de un pin especfico, es
decir, si un pin se encuentra en estado lgico cero (0), ste pasa a ser uno
lgico (1) y viceversa.

Ejemplo:
High PORTA.0

' Pone en uno (1) RA0

Inicio:
Toggle PORTA.0

' invierte el estado lgico de RA0

Pause 1000

' Pausa de 1 segundo

345

GoTo Inicio

' Salto a inicio

End

WHILE-WEND
Sintaxis:
WHILE

condicin

...instrucciones...
WEND
La instruccin WHILE WEND mantiene la ejecucin de las instrucciones
involucradas, es decir, entre While y Wend, hasta que se cumpla la condicin
establecida.
Ejemplo:
A VAR Byte

' Declaracin de variable "A"

A = 0

' Inicializa la variable "A"

Pause 200
LCDOut $fe, 1

' Pausa de 200 milisegundos para la LCD


' Limpia la LCD

Inicio:
While A < 5

' Condicional While - Wend

High PORTB.0
Pause 1000
Low PORTB.0
PAUSE 1000

'
'
'
'

A = A + 1

' incrementa en uno (1) la variable "A"

RB0 =
Pausa
RB0 =
Pausa

1
de 1 segundo
0
de 1 segundo

Wend

346

LCDOUT $fe, 2, "While - Wend" ' Muestra mensaje


LCDOut $fe,$C0,"ha terminado!"
' Muestra mensaje
Espera:
GoTo Espera

' Salta a la etiqueta "espera"

End

WRITE
Sintaxis:
WRITE direccin, variable
La instruccin WRITE almacena datos en la memoria EEPROM de un
microcontrolador en una direccin especfica.
Ejemplo:
Inicio:
WRITE
WRITE
WRITE
WRITE
WRITE

1,
2,
3,
9,
5,

$03
$A1
7
13
$F0

'
'
'
'
'

Escribe
Escribe
Escribe
Escribe
Escribe

en
en
en
en
en

la
la
la
la
la

direccin
direccin
direccin
direccin
direccin

espera:
GoTo espera
End

347

1 o $01 el dato $03


2 o $02 el dato $A1
3 o $03 el dato $07
9 o $09 el dato $0D
15 o $0F el dato $0F

Apndice B

Tabla ASCII

ASCII Control Characters

Decimal Hex ASCII Function

Key

NUL (null)

Ctrl-@

SOH (start of heading)

Ctrl-A

STX (start of text)

Ctrl-B

ETX (end of text)

Ctrl-C

EOT (end of transmission)

Ctrl-D

ENQ (enquiry)

Ctrl-E

ACK (acknowledge)

Ctrl-F

BEL (bell)

Ctrl-G
Ctrl-H

BS (backspace)

HT (horizontal tab)

Ctrl-I

10

LF (line feed)

Ctrl-J
Ctrl-K

11

VT (vertical tab)

12

FF (form feed)

Ctrl-L

13

CR (carriage return)

Ctrl-M

14

SO (shift out)

Ctrl-N

15

SI (shift in)

Ctrl-O

16

10

DLE (data link escape)

Ctrl-P

17

11

DC1 (device control 1)

Ctrl-Q

18

12

DC2 (device control 2)

Ctrl-R

19

13

DC3 (device control 3)

Ctrl-S

20

14

DC4 (device control 4)

Ctrl-T

21

15

NAK (negative acknowledge) Ctrl-U

22

16

SYN (synchronous idle)

Ctrl-V

23

17

ETB (end of trans. block)

Ctrl-W

24

18

CAN (cancel)

Ctrl-X

25

19

EM (end of medium)

Ctrl-Y

26

1A SUB (substitute)

Ctrl-Z

27

1B

Ctrl-[

28

1C FS (file separator)

Ctrl-\

29

1D GS (group separator)

Ctrl-]

30

1E

RS (record separator)

Ctrl-^

31

1F

US (unit separator)

Ctrl-_

ESC (escape)

Tabla B.1.
Fuente: http://www.melabs.com/resources/pbpmanual/

358

Caracteres ASCII Standard

Decimal Hex Display / Key

Decimal Hex Display / Key

Decimal Hex Display / Key

32

20

Space

64

40

96

60

33

21

65

41

97

61

34

22

"

66

42

98

62

35

23

67

43

99

63

36

24

68

44

100

64

37

25

69

45

101

65

38

26

&

70

46

102

66

39

27

'

71

47

103

67

40

28

72

48

104

68

41

29

73

49

105

69

42

2A

74

4A

106

6A

43

2B

75

4B

107

6B

44

2C

76

4C

108

6C

45

2D

77

4D

109

6D

46

2E

78

4E

110

6E

47

2F

79

4F

111

6F

48

30

80

50

112

70

49

31

81

51

113

71

50

32

82

52

114

72

51

33

83

53

115

73

52

34

84

54

116

74

53

35

85

55

117

75

54

36

86

56

118

76

55

37

87

57

119

77

56

38

88

58

120

78

57

39

89

59

121

79

58

3A

90

5A

122

7A

59

3B

91

5B

123

7B

60

3C

<

92

5C

124

7C

61

3D

93

5D

125

7D

62

3E

>

94

5E

126

7E

63

3F

95

5F

127

7F

DEL

Tabla B.2.
Fuente: http://www.melabs.com/resources/pbpmanual/

359

Vous aimerez peut-être aussi