Está en la página 1de 35

PIC SIMULATOR IDE

ENTORNO DE DESARROLLO Y PROGRAMACIN EN


PIC BASIC PARA MICROCONTROLADORES
INTRODUCCIN:
Este documento es un intento de explicar el funcionamiento de una de las herramientas de
desarrollo ms interesantes para el aficionado a la programacin de PICs.
Se trata de un entorno de programacin integrado, que incorpora un muy completo BASIC, con
soporte para dispositivos 1-wire, LCD, RS-232 y muchos ms.
Otro aspecto destacable es la inclusin de una gran cantidad de mdulos de E/S que simulan
exactamente lo que esta pasando en nuestro programa, incluidos un modulo LCD, teclado,
osciloscopio, displays de 7 segmentos entre otros.
INDICE:
> Introduccin
> Capitulo 01 - La interfaz
> Capitulo 02 - El men principal
> Capitulo 03 - Tools (Primera parte)
> Capitulo 04 - Tools (Segunda parte)
> Capitulo 05 - Sistemas de numeracin
> Capitulo 06 - Variables
> Capitulo 07 - Operaciones Lgicas y Matemticas
> Capitulo 08 - Mi primer programa: Un led parpadeante
> Capitulo 09 - Mi segundo programa: Usando un pulsador
> Capitulo 10 - IF - THEN - ELSE - ENDIF
> Capitulo 11 - FOR-TO-STEP-NEXT
> Capitulo 12 - WHILE - END
> Capitulo 13 - LOOKUP
> Capitulo 14 - SHIFTLEFT y SHIFTRIGHT
> Capitulo 15 Displays LCD
Capitulo 01 - La interfaz:
Debido a que se trata de un software concebido como un entorno, la integracin entre los
diferentes mdulos que lo componen es completa y sin problemas.

Antes de ver en que consiste cada opcin del men principal, vamos a analizar rpidamente cada
seccin de esta pantalla:
En la parte superior, y justo debajo de la barra de men tenemos tres cuadros de texto que nos
muestran la ruta completa hacia el programa que tenemos cargado en el simulador ( Program
Location), el microcontrolador que hemos seleccionado para nuestro proyecto (Microcontroller)
y la frecuencia de clock elegida (Clock Frequency).

Todos estos valores pueden ser cambiados, como veremos en el segundo capitulo, desde la barra
de men.
El recuadro que esta inmediatamente debajo del anterior nos muestra (cuando estamos corriendo
una simulacin de nuestro programa) cual es la instruccin assembler en curso ( Last
Instruction) y cual ser la siguiente a ejecutar (Next Instruction):

Luego tenemos un cuadro con informacin relativa a la ejecucin del programa, en la que vemos
instruccin a instruccin durante todo el tiempo en que estemos corriendo la simulacin, el valor
que va tomando el contador de programa (PC o Program Counter), el registro de trabajo (W
Register, por "working") y sobre la derecha la cantidad de instrucciones simuladas
(Instructions Counter), la cantidad de ciclos de reloj transcurridos (Clock Cycles Counter) y
el tiempo de ejecucin que llevara en realidad dicho programa (Real Time Duration). Cabe
aclarar, que como en todo simulador, la relacin entre el tiempo real y el tiempo de simulacin
varia dependiendo de los recursos de nuestro ordenador, y en general los programas simulados
demoran mucho ms tiempo que el real en ejecutarse.

A continuacin, sobre la izquierda, vemos una lista de desplazamiento que contiene el valor de
todos los registros especiales con los que cuenta el microcontrolador elegido. Esta lista varia, por
supuesto, con cada microcontrolador, y en el momento de correr la simulacin va reflejando
instruccin a instruccin el valor de cada timer, puerto, registro de estado, interrupciones, etc.
Los valores se muestran en hexadecimal (Hex Value) y en binario (Binary Value). Cada registro
se identifica mediante su direccin (Address) y tambin por el nombre con el que figura en la
hoja de datos (Name).

Por ltimo, y a la derecha del cuadro anterior, tenemos el valor de todos los registros de
propsito general (GPRs, o general purpose register). La lista tiene dos columnas, cada una
indicando la direccin del registro (Addr.) y su valor en hexadecimal (Hex. Value):

Capitulo 02 - El men principal:


La mayora de las funciones de las que dispone esta herramienta estn agrupadas dentro del
men principal de la aplicacin. Es de destacar que todos los mdulos que se pueden invocar
desde aqu se abren en ventanas separadas, y pueden ser configuradas (como veremos) para que
se siten permanentemente delante de las dems ventanas, de manera que no las perdamos de
vista. Este es el men principal:

Como es costumbre en toda aplicacin de windows, la opcin File es la primera del men.
Contiene solo dos comandos: Clear Memory (Limpiar memoria) que se encarga de eliminar de la
memoria del simulador el programa que estuviese cargado, que puede ser invocada mediante las
teclas CTRL+R; y Load Program (Cargar Programa), que nos lleva a un cuadro de dialogo tpico
que nos permite seleccionar el archivo HEX que queremos simular. Esta funcin puede invocarse
con CTRL+L.
Dentro de la segunda opcin, Simulation, tenemos tres opciones que se encargan de manejar la
simulacin en curso: Start, Step y Stop. La primera de ellas arranca la simulacin, la segunda
se encarga de avanzar una instruccin (solo esta habilitada cuando en Rate hemos seleccionado
el modo paso a paso) y la tercera detiene la simulacin. Es muy prctico utilizar F1, F2 y F3 para
invocar estas opciones.
Rate es el submen que determina el modo de ejecucin de la simulacin, brindando 6
posibilidades:

Estas son: Step By Step (paso a paso), Slow (Lenta), Normal (Normal), Fast (Rpida),
Extremely Fast (muy rpida) y Ultimate (No Refresh) que es la mas rpida de todas, pero
que no actualiza la pantalla principal del simulador. Esta opcin resulta muy til para "adelantar"
partes del programa que sabemos que no tienen problemas. Todas pueden ser invocadas con
CTRL+F1 a CTRL+F6, tal como se ve en la figura anterior.
Tools es el submen encargado de invocar a cada uno de los mdulos que integran el simulador,
y que veremos en detalle en captulos siguientes. Tal como se ve en la figura, la mayora de ellos
se pueden activar mediante la combinacin de la tecla CTRL y alguna ms.

Desde Options (Opciones) tenemos acceso a un conjunto de alternativas de configuracin.


Dedicaremos bastante espacio a cada una de ellas en los captulos correspondientes, pero
podemos adelantar que las mas importantes y que debemos revisar en cada proyecto son Select
Microcontroler (seleccionar microcontrolador) que nos permite elegir el modelo concreto de PIC
a utilizar; Change Clock Frecuency (cambiar frecuencia de clock) y Configuration Bits (bits
de configuracin) desde la que se puede elegir la funcin de algunos pines (Reset o I/O, etc), el
tipo de oscilador a usar, etc. La ltima opcin de este submen permite cambiar los colores de la
interfaz (Change Color Theme).

Capitulo 03 - Herramientas (primera parte):


PIC SIMULATOR IDE posee una nutrida caja de herramientas. Estas se encuentran agrupadas en
la opcin Tools del men principal, y a continuacin veremos en que consiste cada una de ellas.
La primera es el visor de la memoria de programa (Program Memory Viewer), modulo que
podemos invocar presionando CTRL-M en cualquier momento. Se lista la memoria completa, cuya
extensin depender del microcontrolador que tengamos seleccionado, y se pueden ver tres
columnas: direccin (Address), valor en hexadecimal de esa direccin (Hex. Value) y el valor en
binario (Binary Value). Al igual que las dems herramientas, existe un check box que permit e
poner la ventana correspondiente siempre al frente (Always On Top).

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor, y como su


nombre indica, nos permite modificar los valores almacenados en la memoria EEPROM del
microcontrolador. El contenido de la EEPROM se lista en 16 columnas numeradas del 0 al 15, y
por supuesto, su extensin depende del micro seleccionado. Haciendo click s obre cualquiera de
los valores se puede cambiar su contenido, que se encuentra en formato hexadecimal.

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack
(generalmente llamado pila en espaol). Esto puede resultar til para depurar los programas que
tienen muchas subrutinas anidadas o cuando sospechamos que hay desbordamientos del stack.
Adems de ver el nivel de stack (Stack Level), el contenido en hexadecimal (Hex Value) y en
binario (Binary Value), en la parte inferior de la ventana una etiqueta nos informa de cual es el
nivel apuntado en cada paso de la simulacin.

La herramienta Microcontroller View es una de las mas tiles, ya que en una ventana separada
(y que como las dems se puede poner en frente de todas) nos muestra un esquema del micro
elegido, con el rotulo correspondiente a cada pin, y lo mas importante, el estado en cada
momento de la simulacin de cada uno. En caso de ser un pin E/S nos muestra el estado
(ON/OFF) que presenta, y si se trata de una referencia de voltaje muestra el valor asignado.
Adems, en cada pin hay un botn que permite cambiar el estado presente en el ( T, supongo que
por "toggle", que significa "cambiar"), y los resultados se toman como entradas para la
simulacin.

Existe tambin una vista alternativa del estado de los registros especiales, que pude resultar ms
cmoda en algunos casos. Es la correspondiente a la opcin Alternative SFR Viewer, y muestra
en columnas la direccin en hexa del registro, el nombre "de pila" del mismo (TMR0, PCL,
STATUS, etc), y el valor del mismo, en hexadecimal y en binario.

PIC Disassembler es ni ms ni menos que un desensamblador, que nos brinda un texto con el
contenido en assembler del programa cargado en la memoria del PIC SIMULATOR IDE. Este
listado se genera independientemente del origen del programa, es decir, podemos obtener el
cdigo a partir de un archivo ya compilado con cualquier compilador (con extensin .HEX) o a
partir de un .HEX generado con el compilador BASIC incluido en el paquete. Se muestra, por cada
instruccin, la direccin (Address), el opcode y la instruccin (instruction). Ideal para
aprender assembler a partir de instrucciones BASIC, por ejemplo.

El manejador de "puntos de inspeccin" o Breakpoint Manager es una herramienta que permite


definir hasta 10 puntos en los que la simulacin se interrumpir (luego podremos reanudar la
ejecucin desde ese punto) para analizar con tranquilidad el estado de los registros, los puertos,
etc. Hay un par de opciones adicionales, como el botn que per mite eliminar todos los
breakpoints definidos (Clear All Breakpoints) o mantener siempre en foco el contador de
programa (PC o Program Counter). El contenido de la ventana es el cdigo assembler en el
mismo formato que comentamos en la herramienta anterior.

Adems de los diez puntos de parada anteriores, se pueden definir cinco puntos especiales,
mediante la herramienta Special Breakpoints. La diferencia entre esta y la anterior herramienta
(y lo que la hace tan especial) es que en este caso los puntos de inspeccin se fijan mediante una
condicin (Break Condition) o por el estado de algn registro (Register Address). Los botones
SET y DEL permiten habilitar y deshabilitar individualmente cada una de las condiciones.

La herramienta assembler tendr su capitulo propio, por que es aqu donde se escribe el cdig o
en dicho lenguaje para luego compilarlo.

Al igual que el editor de assembler, el BASIC tendr varios captulos dedicados a el, ya que
estudiaremos cada una de las instrucciones disponibles. Podemos adelantar que se trata de un
editor bastante decente, con verificacin de sintaxis y coloreado de palabras reservadas y
comentarios, y que la sintaxis del BASIC es compatible en un 90% con otros BASICs ms
populares, como PBP o PROTON. Desde aqu podemos compilar y cargar en la memoria del
simulador el archivo HEX resultante en un solo paso.

Capitulo 04 - Herramientas (Segunda parte):


Las herramientas siguientes son las que podemos usar como "perifricos" del microcontrolador,
para simular las E/S, o analizar su estado. La primera de este grupo es la llamada 8xLED Board
que es ni mas ni menos que un grupo de 8 LEDs virtuales, a los que podemos asignar un puerto y
un bit dentro de el, de manera que se enciendan o apaguen en tiempo real de acuerdo al estado
de dichos pines al ejecutar la simulacin.

El Keypad Matrix es ni ms ni menos que un teclado matricial de 4 filas y cuatro columnas que
podemos configurar con total flexibilidad para utilizarlo en nuestros proyectos simulados. Se
puede elegir el pin de cada fila y columna, y dinmicamente, durante la simulacin, el estado de
cada tecla. En los ejemplos de los captulos dedicados a la programacin usaremos esta
herramienta a menudo.

El LCD Module es la versin virtual del tpico display LCD con controlador Hitachi que usamos en
todos nuestros proyectos. Es posible configurar completamente su funcionamiento, mediante el
botn Setup. Al presionarlo, la ventana aumenta su tamao y aparecen una serie de cuadros de
seleccin desde donde podremos elegir el numero de filas y columnas del display, el color del
mismo, a que puerto estn conectadas las lneas de datos y si son 4 u 8, y donde estn
conectadas (puerto y pin) las lneas RS, R/W y E. Tambin se pueden configurar los tiempos de
delay del display, para que su simulacin sea lo mas fiel posible a la realidad.

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior, pero para simular
LCDs grficos de 128x64 pixeles. Las opciones de configuracin tamb in se esconden detrs del
botn Setup, y son muy similares a las ya vistas, incorporndose la posibilidad de configurar el
puerto y pin de las lneas CS1 y CS2.

10

Mediante las herramientas Hardware UART Simulation Interface, Software UART


Simulation Interface y PC's Serial Port Terminal podremos simular una comunicacin va RS232. Se trata de herramientas muy completas que tendrn su propio capitulo, por lo que
momentneamente nos limitamos a mencionarlas.

Otras dos herramientas sumamente tiles para comprender que esta haciendo en cada momento
el microcontrolador son el osciloscopio (Oscilloscope) de cuatro canales, con posibilidad total de
configuracin de cada uno de ellos, y el Signal Generator (generador de seales) tambin de
cuatro canales y con posibilidad de generar pulsos de periodo y relacin cclica ajustable. Por
supuesto, habr captulos en que haremos uso de ellas.

11

No poda faltar el modulo con los displays LED de 7 segmentos, presentes en una gran cantidad
de proyectos. En este caso, la herramienta 7-Segment LED Display Panel nos proporciona 4
dgitos completamente configurables (nuevamente mediante el botn Setup presente en cada
uno de ellos), y podemos elegir el pin al que esta conectada cada uno de los segmentos, si son de
nodo o ctodo comn, etc.

La ltima herramienta es una til lista con el valor de cada una de las variables presentes en
nuestro programa. Recibe el nombre de Watch Variables (ver variables) y es una lista de texto
donde en una columna aparece el nombre de la variable en cuestin y en otra su valor. Esta lista
se actualiza constantemente durante la simulacin.

Capitulo 05 - Sistemas de numeracin:


Existen muchas maneras de representar un nmero. De hecho, en teora es posible hacerlo de
infinitas maneras, ya que podemos elegir como base cualquier numero entero. Generalmente, los
ms usados en el mundo de la programacin son el sistema decimal, que utiliza como base el
nmero 10; el sistema binario, que utiliza como base el nmero 2; y el hexadecimal, que utiliza
el nmero 16 como base.
Sistema Decimal:
Como su nombre lo indica, el sistema decimal toma como base para construir los nmeros
potencias sucesivas del numero 10. Se utilizan los smbolos del "0" al "9", y el peso de cada cifra
esta dado por su posicin, dado que se multiplica por 10 elevado a la posicin en que se
encuentra el digito menos uno. Como en todos los sistemas de numeracin, el digito de menos
"peso" es el que esta mas a la derecha, y el de mas "peso" el que se encuentra mas a la
izquierda.
Potencia de 10:

10^7

10^6

10^5

10^4

Valor: 10000000 1000000 100000 10000

12

10^3 10^2 10^1 10^0


1000

100

10

Dado que este sistema es el que usamos todo el tiempo, no nos detenemos a pensar en como se
construye cada nmero, pero cuando leemos el nmero "123" en realidad esta "construido" de la
siguiente manera:
(1 * 10^2) + (2 * 10^1) + (3 * 10^0) =
(1 * 100) + (2 * 10) + (3 * 1) =
100 + 20 + 3 =
123
Sistema binario:
El sistema binario, el ideal para usar en electrnica debido a que solo posee dos smbolos, el 0 y
el 1, que pueden ser codificados como presencia o ausencia de tensin, utiliza como base el
nmero 2 en lugar del 10. En todo lo dems, es exactamente igual al decimal. Si nos parece mas
complicado, es solamente por que no tenemos la suficiente practica con el.
Un numero binario esta construido mediante una secuencia de dgitos binarios (que para abreviar
llamamos "bits"). Muchas veces, se agrupan de diferentes maneras para poder trabajarlos ms
cmodamente, y a esas agrupaciones de les da un nombre, siendo los ms utilizados los
siguientes:
Nombre Tamao (bits)

Ejemplo

Bit

Nibble

0101

Byte

00000101

Word

16

0000000000000101

Como en cualquier sistema de numeracin, los ceros a la izquierda no modific an el valor del
nmero representado. Es muy comn en el sistema binario agregar ceros a la izquierda para
completar una agrupacin de las anteriores. Por ejemplo, si tenemos el numero binario "101" lo
podemos escribir de algunas de las siguientes maneras:
Nibble

0101

Byte

00000101

Word 0000000000000101
Dentro de un byte (la agrupacin de bits ms comn) se numeran los bits que lo componen de
acuerdo a la siguiente convencin:
1) El bit ubicado ms a la derecha es el bit "cero".
2) Cada bit ubicado a su izquierda recibe el nmero siguiente
7 6 5 4 3 2 1 0
El bit cero recibe generalmente el nombre de LSB (least significant bit o "bit menos
significativo"). De la misma manera, al ubicado ms a la izquierda se lo llama MSB (most
significant bit o "bit ms significativo"). Y nos referimos a los dems bits intermedios por su
numero de bit correspondiente: bit 2, bit 3, etc.
De todo esto podemos deducir que el tipo de dato mas pequeo que podemos manejar es el bit,
que solo puede tener dos valores: 1 o 0. Estos dos estados representan generalmente
"encendido" o "apagado", "verdadero" o "falso", "si" o "no", etc.

13

Como podemos ver en la tabla de ms arriba, el nibble es la unin de cuatro bits. Dado que
2x2x2x2 = 16, este es el nmero de valores posibles que puede tomar un nibble.
La estructura mas utilizada es el byte, que agrupa 8 bits (o dos nibbles), y que puede tomar
valores entre 0 y 255 (2^8 valores posibles). Si tomamos dos bytes y los "pegamos" uno detrs
del otro, obtenemos una palabra (word), que permite 65536 (2^16) valores diferentes.
Sistema hexadecimal:
Si tomamos 16 smbolos para representar los nmeros (en lugar de dos o diez), obtenemos un
sistema que se llama hexadecimal. A los smbolos 0..9 se agregan las letras A, B, C, D, E y F, y
es un sistema de numeracin muy utilizado en programacin. Algunas de sus ventajas son que
cada digito de un nmero hexadecimal es exactamente un nibble, o que cada dos dgitos
hexadecimales son un byte. Esto proporciona una forma muy compacta de representar valores.
Decimal

Binario

Hexadecinal

0000 0001

10

0000 1010

233

11101001

E9

255

1111 1111

FF

15280 0011 1011 1011 0000

3BB0

Algunos ejemplos.
Capitulo 06 - Variables:
Vamos a comenzar a ver algo de la programacin en el BASIC incluido en el entorno PIC
SIMULATOR IDE, al que en adelante nos referiremos como "BASIC", a secas.
La programacin seria prcticamente imposible sin el uso de variables. Podemos hacernos una
imagen mental de las variables consistente en una caja en la que podemos guardar algo. Esa c aja
es una de las muchas que disponemos, y tiene en su frente pegada una etiqueta con su nombre.
Estas cajas tienen ciertas particularidades, que hace que solo se puedan guardar en ellas
determinados tipos de objetos.
En esta analoga, cada caja es una variable, su contenido es el valor que adopta, y la etiqueta es
el nombre de la variable. Como su nombre lo indica, y como veremos mas adelante, el contenido
de una variable puede ser modificado a lo largo del programa.
El BASIC tenemos distintos tipos de variable, segn el dato que puedan almacenar:
-

Bit (un bit de longitud, almacena 0 o 1 nicamente)


Byte (un byte de longitud, almacena nmeros enteros entre 0 y 255)
Word (dos bytes de longitud, almacena nmeros enteros entre 0 y 65,535)
Long (cuatro dos bytes de longitud, almacena nmeros enteros entre 0 y 4,294,967,295)

El tipo "Long" solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDE.
A diferencia de otros BASIC, la declaracin de variables puede ser hecha en cualquier parte de l
programa, y todas son consideradas globales, es decir, su valor es accesible desde todas las
subrutinas y zonas del programa. El numero de variables esta lgicamente limitado al monto de
memoria RAM disponible en cada microcontrolador. Las variables las declaramos utilizando la
instruccin DIM, como se muestra en los siguientes ejemplos:

14

DIM
DIM
DIM
DIM

A
B
X
Y

AS
AS
AS
AS

BIT
BYTE
WORD
LONG

Tambin es posible utilizar vectores, que son una matriz de dimensiones 1xN . Por ejemplo, la
sentencia siguiente:
DIM A(10) AS BYTE
Declara un vector (al que nos referiremos algunas veces como "array") de diez elementos del tipo
BYTE, que sern accedidos mediante el uso de subndice (entre parntesis) del 0 al 9.
LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM
para su uso en rutinas en assembler o para el In-Circuit Debugger de MPLAB. Simplemente, si
queremos reservar 20 bytes de RAM, escribimos:
RESERVE 20
Las variables tipo Word, como vimos, estn
llamado byte "alto" y el otro "bajo", dado que
BASIC podemos acceder individualmente a
mediante las extensiones ".HB" (High byte, o
un ejemplo:
DIM A AS BYTE
DIM B AS WORD
A = B.HB
A = B.LB
B.HB = A
B.LB = A
B = A

compuestas por dos by tes. El primero de ellos es


el primero contiene los 8 bits ms significativos. En
cada uno de los bytes que componen un Word
byte alto) y ".LB" (Low Byte o byte bajo) . Veamos

'Esto es lo mismo que A = B

'Esto tambin borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambin,
simplemente poniendo como extensin ".n" donde "n" es el numero de bit (1,2, 3, etc. )
DIM
DIM
B =
B =
A.0

A AS BYTE
B AS BIT
A.1
A.7
= A.5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC,
como si se tratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet
(PORTA, PORTB, TRISA, etc.). Por supuesto, se puede acceder a bits individuales de los registros
con la tcnica vista prrafos atrs. Algunos ejemplos:
TRISA.1 = 0
TRISB = 0
PORTA.1 = 1
PORTB = 255
STATUS.RP0 = 1
INTCON.INTF = 0
Existe una "forma corta" de acceder a los bits individuales de cada port, simplemente usando las
variables BASIC tipo byte RA, RB, RC, RD, RE o bien las tipo bit RA0, RA1, RA2, ..., RE6, RE7
RA = 0xFF
RB0 = 1

15

En BASIC tambin podemos usar punteros. En realidad, cualquier variable definida como tipo
BYTE o WORD pude ser usada como un putero de memoria, usndola como argumento de la
funcin POINTER. El valor contenido por la variable debe tener un valor comprendido entre 0 y
511. Ejemplos:
DIM X AS WORD
DIM Y AS BYTE
X = 0x3F
Y = POINTER(X)
Y = Y + 0x55
X = X - 1
POINTER(X) = Y
Y = 0xAA
X = X - 1
POINTER(X) = Y
Una forma de escribir programas que nos resulten mucho mas fciles de entender es el uso de
nombres simblicos, o SYMBOL. Un "symbol" es una cadena que contiene cdigo, asignado a un
nombre. Al momento de compilar, PIC BASIC hace la "bsqueda y reemplazo" de nuestros
smbolos y luego genera el cdigo ASM y el HEX. Supongamos que tenemos un LED conectado al
bit cero del puerto B. Mediante SYMBOL podemos hacer:
SYMBOL LED1 = PORTB.0
Luego, si queremos encender el LED, en lugar de
PORTB.0 = 1
Podemos hacer
LED1 = 1
que es mucho ms claro y fcil de leer. Por supuesto, el cdigo que aparece a la derecha del igual
no puede contener instrucciones o comandos.
Las constantes (valores que usamos en nuestro programa, y que, por ejemplo, asignamos a las
variables) pueden ser escritas en decimal (directamente el valor), en hexadecimal (anteponiendo
"0x" o posponiendo "H" al valor) o en binario (anteponiendo "%" al valor). Por ejemplo:
DIM
DIM
A =
B =
B =

A AS BIT
B AS BYTE
TRUE
0x55
%01010101

Por supuesto, se pueden asignar nombres a las constantes, usando la instruccin CONST:
DIM A AS WORD
CONST PI = 314
A = PI
Hay tres instrucciones para el manejo individual de bits, que si bien no hacen nada que no se
puede resolver con otras instrucciones o smbolos, ayudan mucho en la lectura del cdigo. Se
tratan de HIGH, LOW y TOGGLE, que ponen el bit en alto, bajo o lo invierten, respectivamente.
Importante: Si el bit implicado como argumento de una de estas instrucciones es un bit de un
PORT, el mismo bit en el TRIS correspondiente es puesto en cero, y dicho pin queda configurado
como salida.
Algunos ejemplos:

16

HIGH PORTB.0
LOW ADCON0.ADON
TOGGLE OPTION_REG.INTEDG
Capitulo 07 - Operaciones Lgicas y Matemticas:
PIC SIMULATOR IDE dispone de cinco operaciones matemticas bsicas, disponibles p ara las
variables tipo Byte y Word. Estas son la suma (operador +), la sustraccin (operador -), el
producto (operador *), el cociente (operador /) y el mdulo (operador MOD) .Por supuesto, el
compilador es capaz de combinarlas para obtener operaciones mat emticas mas complejas.
DIM
DIM
DIM
A =
B =
X =
X =

A AS WORD
B AS WORD
X AS WORD
123
A * 234
2
(12345 - B * X) / (A + B)

Es posible calcular races cuadradas (aunque el resultado debe ser entero) con la funcin SQR:
DIM A AS WORD
A = 3600
A = SQR(A)
Para las variables de tipo Bit existen siete operaciones lgicas disponibles. Solo es posible
efectuar una operacin lgica por instruccin (aunque es muy posible que prximas versiones
permitan ms flexibilidad. Este al tanto de las novedades!). Estas operaciones tambin estn
disponibles para variables tipo Word o Byte. Veamos algunos ejemplos:

DIM
DIM
DIM
X =
X =
X =
X =
X =
X =
X =

A AS BIT
B AS BIT
X AS BIT
NOT A
A AND B
A OR B
A XOR B
A NAND B
A NOR B
A NXOR B

DIM A
DIM B
A = A
PORTB

AS WORD
AS WORD
OR B
= PORTC AND %11110000

Capitulo 08 - Mi primer programa: Un LED parpadeando


Luego de todos estos captulos de introduccin, puramente tericos, vamos a encarar nuestro
primer programa. A diferencia de un programa de ordenador, donde uno escribe el programa, lo
compila, lo ejecuta y ya, en el mundo de los microcontroladores hay que, previamente, definir el
tipo de microcontrolador que se va a utilizar, cual va a ser su frecuencia de clock, como va a ser
el circuito en que se va a utilizar el mismo, etc.
Para estas prcticas, utilizaremos un PIC16F628A, uno de los ms difundidos y que ms o menos
viene a reemplazar al viejo y popular PIC16F84, ya obsoleto.
El diagrama circuital que utilizaremos para las primeras prcticas es el siguiente:

17

Si bien se supone que quien esta leyendo este tutorial tiene una buena idea sobre electrnica y
microcontroladores, igualmente vamos a hacer una muy b reve descripcin del circuito.
En primer lugar, vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal y
condensadores asociados. El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante
8 resistencias de 220ohms, que tienen como funcin limitar la corriente que circula por los LEDS.
Estos sern nuestras "salidas". Los pines 17 y 18, correspondientes al PORTA.0 y PORTA.1 estn
conectados a sendos pulsadores, que al ser presionados conducen 5V (un "1") al pin respectivo.
Cuando estn en reposo, las resistencias R1 y R2 se encargan de mantener el pin en "0". Por
ultimo, el pin 1 (PORTA.2) comanda un altavoz mediante un transistor, para hacer alguna prueba
con sonidos.
El circuito debe alimentarse con 5v bien filtrados y regulados.
Volviendo a nuestro programa, vamos
microcontroladores: encender un LED.

escribir

el

ya

clasico

"hola mundo"

de

los

El primer paso es, desde el men "Opciones" -> "Select Microcontroller", elegir el
PIC16F628A.

18

Luego, debemos configurar los bits correspondientes:

Lo destacable por ahora de esta configuracin es que estamos dejando la memoria (FLASH y
EEPROM) sin proteccin, que el pin RESET se va a comportar como I/O y que usaremos como
oscilador el oscilador interno INTRC.
Una vez hecho esto, arrancamos el edito de BASIC (presionando CTRL -C, por ejemplo), y
escribimos el siguiente cdigo:

Vamos a analizarlo lnea por lnea para entender su funcionamiento:


La lnea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de
E/S. Esto equivale a deshabilitar los comparadores, conversores A/D y todos los mdulos que
pudiese tener nuestro microcontrolador. No es la nica manera de hacer esto, pero si la mas
sencilla desde el punto de vista del programador BASIC.
Las lneas 003 y 004 convierten todos los pines del puerto A en entradas ( TRISA = %11111111 )
y los del puerto B en salidas ( TRISB = %00000000 ). El "%" indica que el numero que viene a
continuacin esta en binario. Se podra haber escrito, por ejemplo TRISB = 0 y hubiera sido lo
mismo. Personalmente me gusta esta manera, ya que "veo" el estado de cada pin. Por supuesto,
es valido activar como entrada algunos pines, y como salidas otros, haciendo algo parecido a
TRISB = %11000111 .

19

En la lnea 006 encontramos una "etiqueta" ( loop: ). Esta no hace nada, solo sirve como
referencia para enviar el flujo del programa a esa lnea desde otro lugar, mediante la sentencia
"Goto".
La lnea 007 pone en "1" el pin correspondiente a PORTB.0, de manera que en el pin 6 del
microcontrolador habr 5V. Esta tensin har que circule una corriente a travs de la resistencia
limitadora y el LED1, haciendo que este se encienda, ya que el ctodo se encuentra conectado a
0V.
En 008 tenemos la sentencia WaitMs 500 . WaitMs se encarga de hacer una pausa en
milisegundos. La duracin de la pausa esta dada por el nmero que sigue a la instruccin, en este
caso 500 milisegundos, o medio segundo.
Luego, en 009, otra vez se vuelve a poner en 0 el pin 6, mediante PORTB.0 = 0 , lo que provoca
que ese pin se ponga a 0V, y no haya mas circulacin de corriente a travs de la resistencia y del
LED, con lo que este se apaga.
En 010 se hace nuevamente una pausa de medio segundo, y por ultimo, la lnea Goto Loop hace
que el programa contine en la lnea 006 (que es donde esta la etiqueta Loop).
El programa se repite indefinidamente, encendiendo el LED medio segundo, apagndolo otro
medio segundo.
Si presionamos F9 o vamos al men que vemos a continuacin

PIC SIMULATOR IDE compilara el programa, y cargara el HEX resultante en el simulador.


Aparecer el cuadro de dialogo siguiente, en donde se nos informa entre ot ras cosas que no han
ocurrido errores, el tamao del programa (69 words), y la ruta a donde se ubicaron los archivos
generados.

Si volvemos a la ventana principal del PIC SIMULATOR IDE, y desde "Tools" ->
"Microcontroller View" abrimos la vista del microntrolador, al darle "Start" a la simulacin
tendremos algo parecido a lo que sigue:

20

En la captura se puede apreciar que el pin 6, correspondiente a RB0 esta en " ON". Si esperamos
lo suficiente, veremos como pasa a "OFF", y mas tarde vuelve a "ON", etc. Si queremos esperar
menos tiempo, y esto lo debemos tomar como una regla general al correr simulaciones, podemos
disminuir el tiempo indicado en las instrucciones "WaitMS" a valores iguales a 1, de esta manera
la simulacin ser mucho ms gil.
Por supuesto, al momento de llevar el HEX a nuestro
debemos cambiar a los tiempos originales y volver
permanecera encendido solo una milsima de segundo,
por lo que nuestro ojo lo percibira como encendido
verdadero estado.

microcontrolador en el circuito "real",


a compilar. Caso contrario, el LED
luego apagado el mismo tiempo, etc.,
a med ias, incapaz de discriminar su

Se podra haber utilizado la instruccin SYMBOL para hacer mas claro el programa. En el siguiente
ejemplo, hemos hecho algn cambio y obtenido un programa que hace exactamente lo mismo
que el anterior, pero que resulta ms claro de entender, ya que se aproxima algo ms al
"lenguaje natural":

21

Capitulo 09 - Mi segundo programa: Usando un pulsador


En la segunda prctica del lenguaje BASIC veremos como leer una entrada del PIC. Utilizaremos
el mismo esquema que vimos antes, y el programa que mostramos a continuacin:

22

Como resulta evidente a simple vista, el programa ejemplo2.bas es muy similar al ejemplo1.bas
que vimos en el capitulo anterior. Las diferencias estn dentro del bucle. La instruccin de la lnea
007 ( PORTB.0 = PORTA.0 ) hace que el valor del bit 0 del PORTB tome el valor del bit 0 del
PORTA. Que ambos bits sean el cero es solo una coincidencia, se podran haber elegido otros
valores.
Al ejecutarse el programa, cada vez que se accione el pulsador conectado a PORTA.0, ese pin se
pondr a estado alto, ya que la corriente circulara desde +V al pin 17 del PIC por medio del
pulsador. Ese "estado alto" se interpreta dentro del PIC como un "1", y es el valor que se le
asigna a PORTB.0 , con lo que el tambin pasara a estado alto. Eso provocara que el led
conectado en ese pin se ilumine.
Cuando soltamos el pulsador, PORTA.0 vuelve a estado bajo, ya que se pone a masa a travs de
la resistencia de 10K, y PORTB.0 har lo propio, apagando el LED.
Nuestro sencillo (sencillsimo!) programa todo lo que hace es "copiar" en el LED el estado del
pulsador.
Si presionamos F9 o vamos al men que vemos a continuacin

PIC SIMULATOR IDE compilara el programa, y cargara el HEX resultante en el simulador.


Aparecer el cuadro de dialogo que nos informa que no han ocurrido errores y que el tamao del
programa esta vez es de 20 words.
Si volvemos a la ventana principal del PIC SIMULATOR IDE, y desde "Tools" ->
"Microcontroller View" abrimos la vista del microntrolador, al darle "Start" a la simulacin
tendremos algo parecido a lo que sigue:

El pin 6, correspondiente a RB0 esta en "OFF" por que el pulsador del pin 17 (RA0) esta en OFF.
Si con el mouse hacemos un click sobre la "T" que esta al lado del pin 17, la vista del
microcontrolador pasara al estado que muestra la imagen siguiente:

23

Recordemos que el botn "T" significa "cambio" (Toggle) por lo que el estado del pin 17
permanecer en alto hasta que lo pulsemos otra vez, y el estado del microcontrolador volver a
ser el inicial. Como en cualquier curso, conviene realizar estas practicas, que aunque puedan
parecer muy sencillas nos ayudaran a conocer las herramientas disponibles y "tomar confianza" al
programa. Tambin es interesante el realizar cambios en el programa BASIC, recompilar y
analizar los resultados.
Capitulo 10 - IF - THEN - ELSE ENDIF
En cualquier programa medianamente complejo que queramos realizar, seguramente
necesitaremos en algn punto tomar alguna decisin basndonos en el estado de una entrada o
en el valor de una variable. PIC BASIC incorpora instrucciones que nos permiten este tipo de
comportamiento, siendo la mas sencilla y frecuentemente utilizada la sentencia IF - THEN ELSE - ENDIF.
Existen varias formas de utilizar esta instruccin. Comenzaremos con los casos mas sencillos y a
lo largo de este capitulo iremos agregando complejidad hasta ver todas las posibilidades.
CASO 1: El caso ms simple es el siguiente:
IF condicin THEN instruccin
"IF" significa "SI....", y "THEN" significa "LUEGO" o "ENTONCES". El caso anterior puede leerse
como "SI se cumple la condicin, entonces ejecuto la instruccin"
La "condicin" es una expresin lgica que puede ser verdadera o falsa. En caso de ser
verdadera, la instruccin a continuacin del THEN ser ejecutada. En caso de la condicin sea
falsa, el programa seguir su ejecucin con la instruccin siguiente al " IF - THEN".
Veamos un ejemplo. Supongamos el siguiente programa:

ALLDIGITAL

'Voy a usar todos los pines como E/S.

TRISA = %11111111
DIM A AS BYTE
DIM TOTAL AS BYTE

'Todo el PORTA como entradas


'Declaro la variable "A" como BYTE
'Declaro la variable "TOTAL" como BYTE

24

TOTAL = 10
A = 2

'Le asigno el valor 10 a la variable "TOTAL"


'Le asigno el valor 2 a la variable "A"

IF PORTA.4 = 1 THEN A = 4
TOTAL = TOTAL + A

'Sumo a "TOTAL" el valor de "A"

Cundo comienza el programa, se declaran dos variables tipo BYTE (que pueden almacenar valores
entre 0 y 255), y a TOTAL se le asigna el valor "0" y a "A" el valor "2". Hasta aqu, no hay nada
que no hayamos visto antes.
La lnea siguiente realiza la siguiente tarea: evala si la condicin PORTA.4 = 1 es cierta. En
caso de que efectivamente el valor presente en el bit 4 del PORTA sea "1", se ejecuta la
instruccin a continuacin del THEN, la variable "A" toma el valor "4", y se pasa a la instruccin
de abajo. Si PORTA es igual a "0", se pasa a la instruccin siguiente sin ms.
El valor final de la variable "TOTAL" depende entonces de cual sea el estado de PORTA.4 al
momento de hacer la evaluacin. Si es igual a "1", "TOTAL" tendr un valor de 14 (10 + 4). Si
PORTA.4 = 0, "TOTAL" tendr un valor de 12 (10 + 2).
Veamos algunos ejemplos validos de este caso:
IF
IF
IF
IF
IF

A = B THEN PORTA.0 = 1
B > A THEN A = B
B = 5 THEN A = 0
(A = 0) OR (B = 5) THEN C = 2
PORTA.0 THEN PORTB.3 = 0

En el ultimo ejemplo la condicin PORTA.0 equivale a PORTA.0 = 1.


CASO 2: Muchas veces, luego de evaluar la condicin necesitamos ejecutar ms de una
instruccin. En los ejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccin
cuando la condicin era cierta. La manera de ejecutar mltiples sentencias dentro de una
estructura IF-THEN implica emplear el ENDIF:
IF condicin THEN
instruccin 1
instruccin 2
...
instruccin n
ENDIF
No varia prcticamente nada respecto del primer caso, solo que esta vez se van a ejecutar todas
las instrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicin sea
verdadera.
Veamos un ejemplo. Supongamos el siguiente programa:

DIM
DIM
DIM
DIM
DIM

A AS BYTE
B AS BYTE
C AS BYTE
D AS BYTE
TOTAL AS BYTE

TOTAL = 0
A = 2

'Declaro
'Declaro
'Declaro
'Declaro
'Declaro

la
la
la
la
la

variable
variable
variable
variable
variable

"A" como BYTE


"B" como BYTE
"C" como BYTE
"D" como BYTE
"TOTAL" como BYTE

'Le asigno el valor 0 a la variable "TOTAL"


'Le asigno el valor 2 a la variable "A"

25

B = 5
C = 1
D = 0

'Le asigno el valor 5 a la variable "B"


'Le asigno el valor 1 a la variable "C"
'Le asigno el valor 0 a la variable "D"

IF A = 2 THEN
A = B + (C * D)
TOTAL = A * B
ENDIF

El ejemplo anterior, la condicin A = 2 es verdadera (puesto que ese es el valor que le asignamos
a "A" mas arriba), por lo que las dos instrucciones dentro del THEN-ENDIF se ejecutaran. Esto
hace que TOTAL tome el valor de 10 (hagan las cuentitas!). Si "A" hubiese tenido otro valor, esas
dos sentencias no se ejecutaran y TOTAL seguira valiendo "0" al terminar el programa.
CASO 3: Hay veces que de acuerdo a la condicin, queremos ejecutar un grupo u otro de
instrucciones. Para eso, utilizamos el ELSE:
IF condicin THEN
instruccinv 1
instruccinv 2
...
instruccinv n
ELSE
instruccinf 1
instruccinf 2
...
instruccinf n
ENDIF
Es decir, si la condicin es verdadera, se ejecutan las sentencias entre THEN y ELSE. Y si la
condicin es falsa, las que estn entre ELSE y ENDIF. "ELSE" puede ser traducido como "en otro
caso" o "si no...".
Veamos un ejemplo. Supongamos el siguiente programa:

ALLDIGITAL

'Voy a usar todos los pines como E/S.

TRISA = %11111111 'Todo el PORTA como entradas


DIM A AS BYTE
'Declaro la variable "A" como BYTE
DIM TOTAL AS BYTE 'Declaro la variable "TOTAL" como BYTE
TOTAL = 10
A = 2

'Le asigno el valor 10 a la variable "TOTAL"


'Le asigno el valor 2 a la variable "A"

IF PORTA.4 = 1 THEN
A = 4
TOTAL = TOTAL + 5
ELSE
A = 0
TOTAL = TOTAL + 15
ENDIF

El ejemplo anterior, la condicin PORTA.4 = 1 determina que bloque de instrucciones se ejecutan.


Si es verdadera, A = 4 y TOTAL = TOTAL + 5 son usadas. Caso contrario se ejecutan A = 0 y

26

TOTAL = TOTAL + 15. Luego, independientemente de cual haya sido el caso, el programa sigue
con la sentencia que se encuentre a continuacin del ENDIF.
Por ultimo, tenemos que saber que es posible "anidar" instrucciones IF-THEN-ELSE-ENDIF, con lo
que se pueden tomar decisiones verdaderamente complejas. Por supuesto, tenemos que ser
cautos en el uso de esta caracterstica ya que debido a limitaciones en el tamao de la pil a y
cantidad de memoria disponible del PIC podemos ocasionar un desborde y el programa colapsara.
Este seria un ejemplo de un anidamiento:
IF PORTB.1 = 1 THEN
IF A = 2 THEN
A = B + (C * D)
TOTAL = A * B
ELSE
A = 0
ENDIF
ELSE
A = 19
ENDIF
Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estn
en azul a la otra, que se encuentra dentro ("anidada" en) de la primera.
Capitulo 11 - FOR - TO - STEP NEXT
As como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos
nuestros programas, las estructuras que permiten repetir un grupo de instrucciones un numero
determinado de veces tambin son indispensables. En PIC SIMULATOR IDE hay dos de ellas.
Veremos en este capitulo la primera, FOR - TO - STEP - NEXT.
Esta estructura necesita una variable (tipo Byte o Word) para funcionar. En cada iteracin del
bucle, la variable va cambiando su valor. Cuando el valor de la variable alcanza o supera el valor
prefijado, el bucle termina. La forma del bucle es la siguiente:
FOR variable = valor_inicial TO valor_final STEP paso
instruccion1
instruccion2
...
instruccionn
NEXT variable
Veamos un ejemplo concreto. Supongamos que queremos sumar los nmeros del 1 al 100. El
programa quedara como sigue:
DIM A AS BYTE
DIM TOTAL AS WORD

'Declaro la variable "A" como BYTE


'Declaro la variable "TOTAL" como WORD

TOTAL = 0

'Asigno "0" a la variable "TOTAL".

FOR A = 1 TO 100 STEP 1 '"A" va de 1 a 100 de 1 en 1


TOTAL = TOTAL + A
'Sumo "A" al valor de "TOTAL".
NEXT A
'fin del bucle.
Hemos declarado la variable A como BYTE, ya que su valor va a mantenerse en el rango 0..255.
Para TOTAL utilizamos una variable tipo WORD, ya que la suma va a superar el valor mximo de
un BYTE. (Recordemos que WORD permite valores en el rango 0..65535)
El bucle se ejecuta 100 veces, la primera de ellas A vale 1, la segunda 2, la tercera 3, hasta la
ltima en la que vale 100. Ese incremento (1 por ves) esta dado por el valor a continuacin del

27

STEP. En los casos como este en que STEP vale 1, puede omitirse, como veremos en ejemplos
posteriores.
TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracin se le suma
el valor que tenga A en ese momento. De esa manera, TOTAL va tomando los valores 1, 3, 6, 10,
.... 5050.
Tanto valor_inicial como valor_final y paso pueden ser variables. El siguiente trozo de
cdigo hace lo mismo que el anterior, pero usa variables:
DIM
DIM
DIM
DIM
DIM

A AS BYTE
INICIO AS BYTE
FINAL AS BYTE
PASO AS BYTE
TOTAL AS WORD

'Declaro
'Declaro
'Declaro
'Declaro
'Declaro

la
la
la
la
la

variable
variable
variable
variable
variable

"1" a
"100"
"1" a
"0" a

"A" como BYTE


"INICIO" como BYTE
"FINAL" como BYTE
"PASO" como BYTE
"TOTAL" como WORD

INICIO = 1
FINAL = 100
PASO = 1
TOTAL = 0

'Asigno
'Asigno
'Asigno
'Asigno

la variable "INICIO".
a la variable "FINAL".
la variable "PASO".
la variable "TOTAL".

FOR A = INICIO TO FINAL STEP PASO


TOTAL = TOTAL + A
NEXT A

'"A" va de 1 a 100 de 1 en 1
'Sumo "A" al valor de "TOTAL".
'fin del bucle.

Y el mismo ejemplo, sin usar STEP:


DIM A AS BYTE
DIM TOTAL AS WORD

'Declaro la variable "A" como BYTE


'Declaro la variable "TOTAL" como WORD

TOTAL = 0

'Asigno "0" a la variable "TOTAL".

FOR A = 1 TO 100
TOTAL = TOTAL + A
NEXT A

'"A" va de 1 a 100 de 1 en 1
'Sumo "A" al valor de "TOTAL".
'fin del bucle.

Hay casos en que es necesario que el valor de la variable de control del bucle se decremente en
lugar de ir aumentando. En ese caso, se puede usar un valor negativo para STEP. El siguiente
ejemplo cuenta desde 50 hasta 20, de 5 en 5:
DIM A AS BYTE

'Declaro la variable "A" como BYTE

FOR A = 50 TO 20 STEP -5
instruccion1
instruccion2
...
instruccionn
NEXT A

'"A" va de 50 a 20 de 5 en 5

'fin del bucle.

De la misma manera que ocurra con IF-THEN-ELSE-ENDIF, pueden anidarse diferentes bucles
FOR-TO-STEP-NEXT , uno dentro de otro:
FOR variable1 = valor_inicial1 TO valor_final1 STEP paso1
FOR variable2 = valor_inicial2 TO valor_final2 STEP paso2
instruccion1
instruccion2
...
instruccionn
NEXT variable2
NEXT variable1

28

La nica condicin es que un bucle este completamente dentro del otro. El siguiente anidamiento
dara un error en el compilador:
FOR variable1 = valor_inicial1 TO valor_final1 STEP paso1
FOR variable2 = valor_inicial2 TO valor_final2 STEP paso2
instruccion1
instruccion2
...
instruccionn
NEXT variable1
NEXT variable2
Para terminar, veamos el siguiente cdigo:
AllDigital
TRISB = 0
Dim a As Byte
For a = 0 To 15
PORTB = a
Next a
compilado y corriendo sobre el simulador. Cuenta desde 0 a 15 y muestra el valor sobre el puerto
B en binario.
Capitulo 12 - WHILE WEND
La segunda estructura de control que proporciona PIC BASIC es WHILE - WEND. Su propsito es el
mismo que la que vimos en el capitulo anterior, y su estructura es la siguiente:
WHILE condicin
instruccion1
instruccion2
...
instruccionn
WEND
Mientras que la condicin sea verdadera, el grupo de instrucciones dentro del cuerpo del WHILEWEND se ejecuta. Las caractersticas de la condicin son las mismas que vimos en el capitulo 10
para IF-THEN-ELSE-ENDIF.
Por supuesto, si no somos cuidadosos al momento de elegir la condicin, puede darse el caso de
que el numero de repeticiones del bucle sea infinito, y nunca salgamos de el. De hecho, esta
circunstancia se aprovecha en algunos programas para repetir indefinidamente un grupo de
instrucciones. Tambin hay que tener presente que si la condicin no es cierta al mo mento de
ejecutar la primera vez el WHILE, el flujo del programa pasara directamente a la instruccin
posterior al WEND y las instrucciones dentro del bucle no se ejecutaran ninguna vez.
No hay mucho ms para decir de WHILE-WEND , solo analizar algunos ejemplos:

Ejemplo 1: El siguiente es un bucle infinito. Como dentro del cuerpo del WHILE-WEND no se
cambia el valor de la variable A, esta siempre vale "0" y la condicin del WHILE nunca es falsa,
por lo que se repite eternamente:
DIM A AS BYTE
A = 0
...
WHILE A = 0
instruccion1

29

instruccion2
...
instruccionn
WEND
...

Ejemplo 2: Las instrucciones dentro del siguiente WHILE-WEND no se ejecutan nunca, dado que
la condicion siempre es falsa:
DIM A AS BYTE
A = 0
...
WHILE A > 0
instruccion1
instruccion2
...
instruccionn
WEND
...

Ejemplo 3: Las instrucciones dentro del siguiente WHILE-WEND se ejecutan 10 veces, y al


terminar la variable B contiene la suma de los nmeros del 0 al 10 naturales:
DIM
DIM
A =
B =

A AS BYTE
A AS BYTE
0
0

WHILE A < 10
A = A + 1 'Incremento la variable A
B = B + A 'Sumo a B el valor de la variable A
WEND
Cuando A = 10, se suma su valor a A, y al llegar al WEND el control del programa se transfiere al
WHILE, donde se evala la condicin A < 10, se determina que es falsa, y el programa pasa el
control a la lnea que exista despus del WEND.
Capitulo 13 LOOKUP
La funcin LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del
mismo tipo, de acuerdo al valor de un ndice (tambin de tipo Byte). El resultado de la seleccin
se almacena (como no!) tambin en una variable tipo byte.
La forma de la funcin LOOKUP es la siguiente:
variable = LOOKUP(byte0, byte1, ..., byteN), ndice
Veamos un ejemplo sencillo:
DIM ndice AS BYTE
DIM variable AS BYTE
ndice = 3
variable = LOOKUP(25, 35, 55, 70, 85, 100), ndice
...
variable tendr el valor "70" (decimal) al ejecutar este cdigo. El primer elemento de la lista,
recordemos, corresponde al valor "0" de ndice.

30

Si bien la lista puede contener un mximo de 255 elementos, que es el mximo direccionable por
una variable ndice de tipo byte, hay que asegurarse que el microcontrolador que estamos
empleando tenga memoria suficiente para albergarla.
El segundo ejemplo, extrado de la propia ayuda del PIC SIMULATOR IDE, nos muestra como
manejar un display LED de siete segmentos conectado al puerto B:
Dim digito As Byte
Dim mascara As Byte
'Comienzo el bucle principal
loop:
TRISB = %00000000
For digito = 0 To 9
mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,
0x6f), digito
PORTB = mascara
WaitUs 10 'esta demora debe ser mayor si no es una simulacin!
Next digito
Goto loop
Este es el aspecto que muestra el simulador cuando ejecutamos el programa anterior. Debemos
asegurarnos de que uno de los dgitos LED este configurado como conectado al puerto PORTB, tal
como se ve en la imagen:

31

Si algunas o todas las constantes de la lista son valores ASCII, se puede hacer mas corta y
legible la misma utilizando como parte de ella una cadena de c aracteres, como se ve a
continuacin.
MASK = LOOKUP("ABCDEFGHIJK"), INDEX
"A" seria el valor que tendra MASK cuando INDEX vale "0", y "K" cuando INDEX tenga el valor
"10".
Por ultimo, en caso de que el valor de INDEX sea mayor a la cantidad de argument os de la lista,
el valor de la variable (en este ejemplo MASK) no cambia.
Capitulo 14 SHIFTLEFT y SHIFTRIGHT
SHIFTLEFT y SHIFTRIGHT son funciones a nivel bit que pueden ser utilizadas para "correr" el
contenido de variable a la izquierda o a la derecha. Cada uno de los bits que componen la
variable se desplazan una posicin (a la izquierda o a la derecha, de acuerdo a que funcin
utilicemos). Esto tiene dos consecuencias. En primer lugar, el bit de ms a la izquierda
(SHIFTLEFT) o derecha (SHIFTRIGHT) se pierde. Y el espacio creado en el otro extremo se
completa con un "0".

SHIFTLEFT

SHIFTRIGHT
El siguiente ejemplo muestra como utilizar estas funciones en un programa:
TRISB = 0x00
PORTB = %00000011
goleft:
WaitUs 5 'esta demora debe ser mayor si no es una simulacin!
PORTB = ShiftLeft(PORTB, 1)
If PORTB = %11000000 Then Goto goright
Goto goleft
goright:
WaitUs 5 'esta demora debe ser mayor si no es una simulacin!
PORTB = ShiftRight(PORTB, 1)
If PORTB = %00000011 Then Goto goleft
Goto goright
Lo que hace el programa es muy sencillo: enciende los dos primeros bits del POR TB, espera un
tiempo, los desplaza hacia la izquierda, si esos bits llegaron al extremo de la variable tipo byte
que es el PORTB, se invierte el sentido del desplazamiento.
Capitulo 15 Displays LCD
LCD alfanumricos
A grandes rasgos, y a pesar de la simplicidad que brinda el disponer de un mismo integrado
especializado en casi todos los modelos de displays, la escritura en estos es relativamente

32

compleja, dado que se deben respetar protocolos de inicializacin, tiempos entre envo de datos,
etc., lo que hace bastante tediosa su programacin en assembler.
Pero PIC BASIC dispone de un juego de instrucciones especiales para manejar displays en modo
8 bits y en modo 4 bits que nos evitan toda esa complejidad.
El manejo de los LCD se hace mediante el uso de sentencias DEFINE, que le dicen al
compilador a que pines del microcontrolador hemos conectado cada uno de los pines del LCD. La
forma de la instruccin DEFINE es la siguiente:
DEFINE parmetro = valor
Donde parmetro es el nombre del parmetro al que le queremos asignar el valor. Los
parmetros disponibles para el manejo de LCD alfanumricos son los siguientes:
LCD_BITS: Define el nmero de bits de la interfaz de datos. Se pueden asignar valores de 4 u 8,
siendo 4 el valor por defecto.
LCD_DREG: Define a que puerto del PIC tenemos conectado el port de datos del LCD. Los
valores permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.
LCD_DBIT: Define cual es el primer pin del puerto que usamos para enviar los datos al LCD
cuando seleccionamos un bus de 4 bits. Solo puede ser el 0 (para los pines el 0, 1, 2 y 3) o 4
(para usar los pines 4, 5, 6 y 7). Por defecto se asume 4, y esta instruccin se ignora para
LCD_BITS = 8.
LCD_RSREG: Define a que puerto del PIC tenemos conectado el pin RS del LCD. Los valores
permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.
LCD_RSBIT: Define a que pin del puerto tenemos conectado el pin RS del LCD. Por defecto se
asume 3.
LCD_EREG: Define a que puerto del PIC tenemos conectado el pin E del LCD. Los valores
permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.
LCD_EBIT: Define a que pin del puerto tenemos conectado el pin E del LCD. Por defecto se
asume 2.
LCD_RWREG: Define a que puerto del PIC tenemos conectado el pin RW del LCD. Los valores
permitidos son 0, PORTA, PORTB, PORTC, etc. Por defecto se asume 0, que significa no
usamos el pin RW.
LCD_RWBIT: Define a que pin del puerto tenemos conectado el pin RW del LCD. Por defecto se
asume 0, que significa no usamos el pin RW.
LCD_COMMANDUS: Define cuantos microsegundos demora la escritura de un comando en el
display. Por defecto, este valor es de 5000. La mayora de los LCD funcionan bien con un valor de
2000, lo que hace ms rpidos nuestros programas.
LCD_DATAUS: Define cuantos microsegundos demora la escritura de un dato en el LCD. Por
defecto, este valor es de 100.
LCD_INITMS: Define cuantos milisegundos demora la inicializacin e la electrnica del LCD. Por
defecto, este valor es de 100.
Luego, tenemos una serie de instrucciones que manejan el envo de comandos e instrucciones al
display:
LCDINIT debe utilizarse antes de enviar cualquier comando o dato al LCD. La forma de esta
instruccin es al siguiente:
LCDINIT n
Donde n es el tipo de cursor que queremos que muestre el display. 0 significa que el cursor
estar oculto, 1 significa que el cursor parpadeara, 2 nos mostrara un cursor subrayado, y 3
un cursor subrayado y parpadeando.
LCDCMDOUT es la instruccin que enva comandos al LCD. Se emplea de la siguiente manera:
LCDCMDOUT comando
Donde comando es alguno de los siguientes:
LcdClear: Borra el contenido del LCD.
LcdHome: Lleva el cursor a la primera posicin del primer rengln del LCD.
LcdLine2Home: Lleva el cursor a la primera posicin del segundo rengln del LCD.
LcdLeft: Mueve el cursor una posicin a la izquierda.

33

LcdRight: Mueve el cursor una posicin a la derecha.


LcdShiftLeft: Desplaza el contenido del LCD una posicin a la izquierda.
LcdShiftRight: Desplaza el contenido del LCD una posicin a la derecha.
LcdLine1Clear: Borra la primera lnea del LCD.
LcdLine2Clear: Borra la segunda lnea del LCD.
LcdLine1Pos(x): Coloca el cursor en la posicin x del primer rengln del LCD. X puede tener
cualquier valor entre 1 y 40
LcdLine2Pos(x): Coloca el cursor en la posicin x del segundo rengln del LCD. X puede
tener cualquier valor entre 1 y 40
LCDOUT enva datos al display. Si son caracteres, simplemente los ponemos entre comillas a
continuacin del comando. Si se trata de mostrar el contenido de una variable, se escribe la
variable (precedida por #) a continuacin del comando. Si se necesitan imprimir varias
variables, se pueden separar por comas.
A continuacin, un par de ejemplos de cmo se utilizan todas estas instrucciones. El primero se
encarga de mostrar un texto parpadeando en la primera lnea del display. Intenten deducir como
est conectado el LCD al PIC mirando las instrucciones DEFINE del principio del programa.
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
'
LCDINIT 0 inicializo el LCD sin cursor.
'
loop:
LCDOUT "www.uControl.com" Muestra el texto
WAITMS 1000 Espero un segundo
LCDCMDOUT LcdClear Borro el display
WAITMS 1000 Espero un segundo
GOTO loop Vuelvo a loop: para repetir indefinidamente.
El segundo ejemplo muestra como imprimir el contenido de una variable (A) en el LCD.
Concretamente, se muestra un texto en el primer rengln, mientras que en el segundo se
cuentan los nmeros del 65535 al 0.
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
'
DIM A AS WORD
A = 65535
'
LCDINIT 3 Cursor parpadeando
WAITMS 1000
'
loop:
LCDOUT "Estoy contando! Texto del primer rengln
LCDCMDOUT LcdLine2Home Paso al Segundo rengln
LCDOUT #A Muestro el valor de A
A=A-1

34

WAITMS 250
LCDCMDOUT LcdClear Limpio el display
GOTO loop

35

También podría gustarte