Sei sulla pagina 1di 59

MANUAL PIC SIMULATOR IDE

INDICE
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 - MODULOS

Usar memoria interna de EEPROM


Convertidor Anlogo Digital ADC
Usando Interrupciones
Comunicacin Serial Utilizando Hardware Interno UART
Implementacin UART por Software
Comunicacin con Dispositivos I2C
Comunicacin con Dispositivos Interfaz Serial Perifrica SPI
Interfaz con LCD de Caracteres
Interfaz Para LCD Grafica de matriz de puntos 128x64
Interfaz Modulo Interno PWM
Interfaz para Servos de Radio Control
Interfaz para Motores Stepper
Interfaz para Dispositivos 1-Wire
Funciones Avanzadas
CAPITULO 01 LA INTERFAZ
Debido a que se trata de un software concebido desde el vamos como un entorno,
la integracin entre los diferentes mdulos que lo componen es completa y sin
problemas.
Una vez instalado el programa, el icono que lo representa aparecer en nuestro
escritorio, y haciendo doble clic sobre el se abrir la pantalla principal del
programa, que al menos hasta la versin sobre la que se desarrolla este tutorial (la
5.91) esta en ingles:

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 mas 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 ultimo, 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 practico 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 mas.
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 ultima 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 permite
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 sobre 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 mas 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 mas 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 permite 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 cdigo 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 mas 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 mas 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
tambin 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.

Mediante las herramientas Hardware UART Simulation Interface, Software


UART Simulation Interface y PC's Serial Port Terminal podremos simular una
comunicacin va RS-232. 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.
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 ultima 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 numero. De hecho, en teora es posible


hacerlo de infinitas maneras, ya que podemos elegir como base cualquier numero
entero. Generalmente, los mas usados en el mundo de la programacin son el
sistema decimal, que utiliza como base el numero 10; el sistema binario, que utiliza
como base el numero 2; y el hexadecimal, que utiliza el numero 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^7 10^6 10^5 10^4 10^3 10^2 10^1 10^0
10:

Valor: 10000000 1000000 100000 10000 1000 100 10 1

Dado que este sistema es el que usamos todo el tiempo, no nos detenemos a
pensar en como se construye cada numero, pero cuando leemos el numero "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 numero 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 mas cmodamente, y a esas agrupaciones de les da un
nombre, siendo los mas utilizados los siguientes:

Nombre Tamao (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracin, los ceros a la izquierda no modifican el


valor del numero representado. Es muy comn en el sistema binario agregar ceros
a la izquierda para completar un 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 mas comn) se numeran los bits que lo
componen de acuerdo a la siguiente convencin:

1) El bit ubicado mas a la derecha es el bit "cero".


2) Cada bit ubicado a su izquierda recibe el numero 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 mas a la izquierda se lo llama MSB
(most significant bit o "bit mas 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.
Como podemos ver en la tabla de mas arriba, el nibble es la unin de cuatro bits.
Dado que 2x2x2x2 = 16, este es el numero 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 numero
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

1 0000 0001 1

10 0000 1010 A

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 caja 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 del 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:

DIM A AS BIT
DIM B AS BYTE
DIM X AS WORD
DIM Y AS 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 compuestas por dos bytes. el primero
de ellos es llamado byte "alto" y el otro "bajo", dado que el primero contiene los 8
bits mas significativos. En BASIC podemos acceder individualmente a cada uno de
los bytes que componen un Word mediante las extensiones ".HB" (High byte, o
byte alto) y ".LB" (Low Byte o byte bajo) . Veamos un ejemplo:

DIM A AS BYTE
DIM B AS WORD
A = B.HB
A = B.LB 'Esto es lo mismo que A = B
B.HB = A
B.LB = A
B = A '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 A AS BYTE
DIM B AS BIT
B = A.1
B = A.7
A.0 = 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

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 mas claro y fcil de leer.

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 A AS BIT
DIM B AS BYTE
A = TRUE
B = 0x55
B = %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:

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 para 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 matemticas mas complejas.

DIM A AS WORD
DIM B AS WORD
DIM X AS WORD
A = 123
B = A * 234
X = 2
X = (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 mas flexibilidad. Este al tanto de las novedades!).
Estas operaciones tambin estn disponibles para variables tipo Word o Byte.
Veamos algunos ejemplos:

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

DIM A AS WORD
DIM B AS WORD
A = A OR B
PORTB = 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 practicas, utilizaremos un PIC16F628A, uno de los mas difundidos y que
mas o menos viene a reemplazar al viejo y popular PIC16F84, ya obsoleto. El
diagrama circuital que utilizaremos para las primeras practicas es el siguiente:
Si bien se supone que quien esta leyendo este tutorial tiene una buena idea sobre
electrnica y microcontroladores, igualmente vamos a hacer una muy breve
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 parlante mediante un transistor,
para hacer alguna prueba con sonidos.

Volviendo a nuestro programa, vamos a escribir el "hola mundo" de los


microcontroladores: encender un LED.

El primer paso es, desde el men "Opciones" -> "Select Microcontroller", elegir
el PIC16F628A.
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 .

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 numero 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
otras 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:
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 mas gil. Por supuesto, al momento de llevar el HEX a nuestro
microcontrolador en el circuito "real", debemos cambiar a los tiempos originales y
volver a compilar. Caso contrario, el LED permanecera encendido solo una
milsima de segundo, luego apagado el mismo tiempo, etc., por lo que nuestro ojo
lo percibira como encendido a medias, incapaz de discriminar su verdadero estado.

Se podra haber utilizado la instruccin SYMBOL para hacer mas claro el programa.
En el siguiente ejemplo, hemos hecho algunos cambio y obtenido un programa que
hace exactamente lo mismo que el anterior, pero que resulta mas claro de
entender, ya que se aproxima algo mas al "lenguaje natural":
El programa BASIC puede descargarse desde [aqu], y el correspondiente archivo
HEX desde [aqu] .

Capitulo 09 - Mi segundo programa: Usando un


pulsador
En la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC.
Utilizaremos el mismo esquema que vimos antes, y el programa que mostramos a
continuacin:
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:
l 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:

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.

El programa BASIC de este capitulo puede descargarse desde [aqu], y el


correspondiente archivo HEX desde [aqu] .

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 mas 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 '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 'Le asigno el valor 10 a la variable "TOTAL"


A = 2 '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 mas.

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 A = B THEN PORTA.0 = 1
IF B > A THEN A = B
IF B = 5 THEN A = 0
IF (A = 0) OR (B = 5) THEN C = 2
IF 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 mas 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 A AS BYTE 'Declaro la variable "A" como BYTE


DIM B AS BYTE 'Declaro la variable "B" como BYTE
DIM C AS BYTE 'Declaro la variable "C" como BYTE
DIM D AS BYTE 'Declaro la variable "D" como BYTE
DIM TOTAL AS BYTE 'Declaro la variable "TOTAL" como BYTE

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


A = 2 'Le asigno el valor 2 a la variable "A"
B = 5 'Le asigno el valor 5 a la variable "B"
C = 1 'Le asigno el valor 1 a la variable "C"
D = 0 '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 'Le asigno el valor 10 a la variable "TOTAL"


A = 2 '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 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 pila 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 'Declaro la variable "A" como BYTE


DIM TOTAL AS WORD '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 ultima en la que vale 100. Ese incremento (1 por ves) esta dado por el
valor a continuacin del 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 A AS BYTE 'Declaro la variable "A" como BYTE


DIM INICIO AS BYTE 'Declaro la variable "INICIO" como BYTE
DIM FINAL AS BYTE 'Declaro la variable "FINAL" como BYTE
DIM PASO AS BYTE 'Declaro la variable "PASO" como BYTE
DIM TOTAL AS WORD 'Declaro la variable "TOTAL" como WORD

INICIO = 1 'Asigno "1" a la variable "INICIO".


FINAL = 100 'Asigno "100" a la variable "FINAL".
PASO = 1 'Asigno "1" a la variable "PASO".
TOTAL = 0 'Asigno "0" a la variable "TOTAL".

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


TOTAL = TOTAL + A 'Sumo "A" al valor de "TOTAL".
NEXT A 'fin del bucle.

Y el mismo ejemplo, sin usar STEP:

DIM A AS BYTE 'Declaro la variable "A" como BYTE


DIM TOTAL AS WORD 'Declaro la variable "TOTAL" como WORD
TOTAL = 0 'Asigno "0" a la variable "TOTAL".

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


TOTAL = TOTAL + A 'Sumo "A" al valor de "TOTAL".
NEXT A '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 '"A" va de 50 a 20 de 5 en 5


instruccion1
instruccion2
...
instruccionn
NEXT A '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

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. 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 WHILE-WEND 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 momento 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 mas 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
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 A AS BYTE
DIM A AS BYTE
A = 0
B = 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), indice

Veamos un ejemplo sencillo:

DIM indice AS BYTE


DIM variable AS BYTE
indice = 3
variable = LOOKUP(25, 35, 55, 70, 85, 100), indice
...

variable tendr el valor "70" (decimal) al ejecutar este cdigo. El primer elemento
de la lista, recordemos, corresponde al valor "0" de indice.

Si bien la lista puede contener un mximo de 255 elementos, que es el mximo


direccionable por una variable indice 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:
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
caracteres, 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


argumentos 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 mas a la izquierda (SHIFTLEFT) o derecha (SHIFTRIGHT) se pierde. Y
el espacio creado en el otro extremo se completa con un "0".

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
PORTB, 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. La siguiente animacin flash ilustra el efecto, tal como se puede
ver en el simulador:
Capitulo 15 - MODULOS

Usar memoria interna de EEPROM


Tener acceso a la memoria de los datos de EEPROM puede ser programado usando
READ y WRITE declaraciones. La primera discusin es la direccin de un octeto en
memoria de EEPROM y puede ser una constante o una variable del octeto. La segunda
discusin es los datos se leen o se escriben que (para la declaracin READ debe ser una
variable del octeto). Se sugiere para mantener interrupciones inhabilitadas durante la
ejecucin de

DIM A AS BYTE
DIM B AS BYTE
A = 10
READ A, B
WRITE 11, B

Convertidor Analogo a Digital


Usar el mdulo DE ANALGICO A DIGITAL interno del convertidor
La declaracin de ADCIN est disponible como ayuda para el convertidor DE
ANALGICO A DIGITAL interno. Su primera argumento es nmero de canal del
ADC y la segundo argumento es una variable que ser utilizada para almacenar el
resultado de la conversin DE ANALGICO A DIGITAL. La declaracin de ADCIN
utiliza dos parmetros ADC_CLOCK y ADC_SAMPLEUS que tengan valores
prefijados 3 y 20. Estos valores prefijados pueden ser el usar cambiante DEFINEN
directorio. El parmetro de ADC_CLOCK determina la opcin para la fuente del reloj
del ADC (el rango est 0-3 o 0-7 dependiendo del dispositivo usado).
Sistemas de parmetro de ADC_SAMPLEUS el tiempo deseado de la adquisicin del
ADC en los microsegundos (0-255). La declaracin de ADCIN presupone que el pin
correspondiente est configurado como entrada anloga (TRIS, registro ADCON1 y en
el registro de algunos dispositivos ANSEL). Aqu est un ejemplo:

DIM V(5) AS BYTE


DIM VM AS WORD
DIM I AS BYTE
DEFINE ADC_CLOCK = 3
DEFINE ADC_SAMPLEUS = 50
TRISA = 0xFF
TRISB = 0
ADCON1 = 0
FOR I = 0 TO 4
ADCIN 0, V(I)
NEXT I
VM = 0
FOR I = 0 TO 4
VM = VM + V(I)
NEXT I
VM = VM / 5
PORTB = VM.LB
Usando interrupciones
La rutina de la interrupcin se debe poner como el resto de subprogramas despus de la
declaracin END. Debe comenzar con ON INTERRUPCIN y terminar con la
declaracion RESUMEN. Si las operaciones aritmticas, los rdenes o algunas otras
declaraciones complejas se utilizan en rutina de la interrupcin, entonces EXCEPTO la
declaracin SAVE SYSTEM debe ser colocado a la derecha despus de la declaracin ON
INTERRUPT para ahorrar el contenido de los registros usados por el sistema. ENABLE y
DISABLE las declaraciones puede ser utilizado en programa principal controlar el bit de
GIE en registro de INTCON. La declaracin RESUME fijar el bit de GIE que permitir
nuevas interrupciones. Por ejemplo:

DIM A AS BYTE
A = 255
TRISA = 0
PORTA = A
INTCON.INTE = 1
ENABLE
END
ON INTERRUPT
A = A - 1
PORTA = A
INTCON.INTF = 0
RESUME

DIM T AS WORD
T = 0
TRISA = 0xFF
ADCON1 = 0
TRISB = 0
OPTION_REG.T0CS = 0
INTCON.T0IE = 1
ENABLE
loop:
ADCIN 0, PORTB
GOTO loop
END
ON INTERRUPT
SAVE SYSTEM
T = T + 1
INTCON.T0IF = 0
RESUME

Comunicacin Serial utilizando el hardware


interno UART
La comunicacin serial tiene soporte tanto para hardware y software, Las declaraciones
de HSEROPEN, HSEROUT, HSERIN y HSERGET se pueden utilizar con los
dispositivos de PIC que tienen hardware interno UART. La declaracin de HSEROPEN
configura el modulo interno UART. Las velocidades permitidas son: 300, 600, 1200,

FORO DE TODO EN ELECTRONICA PAGINA43 - goslock


2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 56000 y 57600. Si se omite la
velocidad el UART, este es configurado para la velocidad 9600.

Es posible utilizar la declaracin de HSEROPEN ms de una vez en el programa, por


ejemplo para cambiar velocidad seleccionada. Si el parmetro
ALLOW_ALL_BAUDRATES se fija a 1 usando el comando DEFINE, con esto todas
las velocidades en la gama 100-57600 ser permitidas.

La declaracin de HSEROUT se utiliza para la transmisin serial. La declaracin de


HSEROUT puede tener discusiones mltiples separadas por ,. Puedes utilizar
secuencias, la palabra clave del LF para carcter de avance de lnea o palabra clave para
el retorno del carro - secuencia de CRLF del avance de lnea, constante y variable. Si se
utiliza el signo # antes de que el nombre de una variable entonces su representacin
decimal se enve al puerto serial.

La declaracin de HSERIN se puede utilizar para cargar una lista de las variables de un
Byte o Word con los valores recibidos en puerto serial. Esta declaracin esperar hasta
que el nmero requerido de Bytes se recibe en puerto serial.

La declaracin de HSERGET tiene un argumento que deba ser una variable de un Byte.
Si hay un carcter que espera en el almacenador intermediario de la recepcin que ser
cargado en la variable, si no 0 valores sern cargados. Aqu estn algunos ejemplos:

DIM I AS BYTE
HSEROPEN 38400
WAITMS 1000
FOR I = 20 TO 0 STEP -1
HSEROUT "Number: ", #I, CrLf
WAITMS 500
NEXT I

DIM I AS BYTE
HSEROPEN 19200
loop:
HSERIN I
HSEROUT "Number: ", #I, CrLf
GOTO loop

DIM I AS BYTE
HSEROPEN 19200
loop:
HSERGET I
IF I > 0 THEN
HSEROUT "Number: ", #I, CrLf
WAITMS 50
ENDIF
GOTO loop

Implementacion UART por Software


En todos los dispositivos PIC se puede implementar la comunicacin serial por medio
de software se puede poner en ejecucin con declaraciones de SEROUT y de SERIN.
La primer argumento de ambas declaraciones debe ser uno de los pines del
microcontrolador, mientras que el segundo argumento es velocidad: 300, 600, 1200,
2400, 4800, 9600 o 19200.

Usar velocidades ms altas con frecuencia de reloj baja poda causar errores de trama.
Para SEROUT la declaracin entonces sigue la lista de las discusiones que se enviarn
al puerto serial. Puedes utilizar secuencias, la palabra clave del LF para carcter de
avance de lnea o palabra clave para el retorno del carro - secuencia de CRLF del
avance de lnea, constante y variable. Si se utiliza el signo # antes de que el nombre
de una variable entonces su representacin decimal ser enviada a travs del puerto
serial.

La declaracin de SEROUT utiliza el parmetro de SEROUT_DELAYUS que se puede


declarar con el comando DEFINE y tiene valor prefijado de 1000 microsegundos. Esto
define intervalo de retrazo antes de que un carcter se enve realmente al puerto y se
utiliza para aumentar la confiabilidad de la rutina del software SEROUT. Para SERIN la
declaracin entonces sigue la lista de las variables de Byte o Word que se cargarn con
los valores recibidos en puerto serial. Esta declaracin esperar hasta que el nmero
requerido de octetos se recibe en puerto serial. Para la interfaz en serie con los niveles
invertidos de la lgica hay declaraciones de SERININV y de SEROUTINV disponibles.
Algunos ejemplos:

DEFINE SEROUT_DELAYUS = 5000


SEROUT PORTC.6, 1200, "Hello world!", CrLf

DIM I AS BYTE
loop:
SERIN PORTC.7, 9600, I
SEROUT PORTC.6, 9600, "Number: ", #I, CrLf
GOTO loop

Comunicacin I2C con dispositivos externos


La comunicacin de I2C se puede poner en ejecucin en programas bsicos usando
declaraciones de I2CWRITE y de I2CREAD. El primer argumento de ambas
declaraciones debe ser el pin del microcontrolador que est conectado con la lnea de
SDA del dispositivo externo de I2C. El segundo argumento de ambas declaraciones
debe ser el pin del microcontrolador que est conectado con la lnea de la LCC.
Mientras que el tercer argumento de ambas declaraciones debe ser direccin llamada
variable, Byte o un valor llamado SLAVE ADDREES. Su formato se describe en el
datasheet del dispositivo usado.

Por ejemplo, porque EEPROMs de la familia 24C (con las entradas de la direccin de
dispositivo conectadas con la tierra) el valor 0xA0 podria ser utilizado para el slave
address. Ambas declaraciones tomarn control sobre el bit 0 del slave address durante la
comunicacin.
Adelante la discusin de ambas declaraciones debe ser una variable del octeto o de la
palabra (sta depende del dispositivo usado) que contiene la direccin de la localizacin
que ser alcanzada. Si un valor constante se utiliza para el parmetro de la direccin
debe estar en gama del valor del octeto. (La quinto) discusin pasada de la declaracin
de I2CWRITE es un octeto constante o la variable que sern escritos a la direccin
especificada, y para la declaracin de I2CREAD debe ser una variable del octeto para
almacenar el valor que ser ledo en la direccin especificada. Se permite utilizar ms
de uno discusin de los datos. Para los dispositivos de I2C que no lo hacen discusin
de la direccin de los datos de apoyo hay forma corta de declaraciones de I2C
(I2CWRITE1 e I2CREAD1) disponibles donde la discusin de la direccin del esclavo
se sigue con unas o ms discusiones de los datos directamente. Para algn I2C que los
dispositivos auxiliares l son necesarios hacer retrasa para cerciorarse de que el
dispositivo es listo responder a la declaracin de I2CREAD. Para ese propsito hay el
parmetro de I2CREAD_DELAYUS que se puede fijar cerca DEFINE directorio y
tiene valor prefijado de 0 microsegundos. Tambin, para dispositivos ms lentos de I2C,
puede ser que sea necesario utilizar impulsos de reloj ms largos. Eso se puede hacer
fijando usar del parmetro de I2CCLOCK_STRETCH DEFINE directorio. Este
parmetro fijar factor del estiramiento del reloj. Su valor prefijado es 1. Aqu est un
ejemplo combinado con el mdulo y 24C64 EEPROM del LCD (SDA conect con
RC2; LCC conectada con RC3):

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 ADDR AS WORD
DIM DATA AS BYTE
SYMBOL SDA = PORTC.2
SYMBOL SCL = PORTC.3
LCDINIT 3
WAITMS 1000
FOR ADDR = 0 TO 31
LCDCMDOUT LcdClear
DATA = 255 - ADDR
I2CWRITE SDA, SCL, 0xA0, ADDR, DATA
LCDOUT "Write To EEPROM"
LCDCMDOUT LcdLine2Home
LCDOUT "(", #ADDR, ") = ", #DATA
WAITMS 1000
NEXT ADDR
FOR ADDR = 0 TO 31
LCDCMDOUT LcdClear
I2CREAD SDA, SCL, 0xA0, ADDR, DATA
LCDOUT "Read From EEPROM"
LCDCMDOUT LcdLine2Home
LCDOUT "(", #ADDR, ") = ", #DATA
WAITMS 1000
NEXT ADDR
SOPORTE PARA COMUNICACION SPI (SERIAL
PERIPHERAL INTERFACE)
Antes de las declaraciones relacionadas con el uso de SPI, interfaz SPI se debe crear
usando DEFINE directivas. Hay ocho disponibles para definir los parmetros de la
conexin de SCK, SDI, la organizacin de desarrollo de normas y (opcionalmente) CS
lneas:

SPI_SCK_REG - define el puerto donde SCK est conectado a la lnea


SPI_SCK_BIT - define el pin SCK cuando est conectado a la lnea
SPI_SDI_REG - define el puerto IDE que se conecta a la lnea
SPI_SDI_BIT - define el pin IDE que se conecta a la lnea
SPI_SDO_REG - define a la organizacin de desarrollo de normas puerto
donde est conectado a la lnea.
SPI_SDO_BIT - define a la organizacin de desarrollo de normas pin donde
se conecta a la lnea
SPI_CS_REG - define el puerto en el CS est conectado a la lnea
SPI_CS_BIT - define el pin CS cuando est conectado a la lnea

Los ajustes se supone activa-Reloj de la lnea de alta y baja de activo-ChipSelect lnea.


Que se puede cambiar por asignar el valor 1. SPICLOCK_INVERT y/o
SPICS_INVERT parmetros de DEFINE directiva. For slower SPI devices, podra ser
necesario utilizar ms tiempo de reloj pulsos. El valor por defecto de reloj tramo factor
(1) se puede cambiar mediante el establecimiento de parmetros PICLOCK_STRETCH.

SPIPREPARE declaracin (sin argumentos) preparar interfaz SPI lneas de


comunicacin. SPICSON y SPICSOFF declaraciones activar / desactivar la ChipSelect
lnea de la interfaz.

Un byte se pueden enviar a la SPI perifricos utilizando declaracion SPISEND. Para


recibir un byte se utiliza la declaracion SPIRECEIVE. Para enviar el nmero
especificado de bits esta la declaracin SPISENDBITS. Su primer argumento debe ser
el nmero de bits que se enviarn [1-8], y el segundo argumento es un byte variable o
constante. Aqu est un ejemplo de utilizacin

de orden eeprom 25C040 SPI:

AllDigital

Define SPI_CS_REG = PORTC


Define SPI_CS_BIT = 0
Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
SPIPrepare

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_EREG = PORTE
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
Lcdinit

Dim addr As Byte


Dim data As Byte

For addr = 0 To 10
data = 200 - addr
SPICSOn
SPISend 0x06
SPICSOff
SPICSOn
SPISend 0x02
SPISend addr
SPISend data
SPICSOff
Lcdcmdout LcdClear
Lcdout "Write To EEPROM"
Lcdcmdout LcdLine2Home
Lcdout "(", #addr, ") = ", #data
WaitMs 500
Next addr

For addr = 0 To 10
SPICSOn
SPISend 0x03
SPISend addr
SPIReceive data
SPICSOff
Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
Lcdcmdout LcdLine2Home
Lcdout "(", #addr, ") = ", #data
WaitMs 500
Next addr

El Siguiente ejemplo para una memoria 93C86 EEPROM:


AllDigital

Define SPI_CS_REG = PORTC


Define SPI_CS_BIT = 0
Define SPICS_INVERT = 1
Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
SPIPrepare

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_EREG = PORTE
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
Lcdinit

Dim addr As Byte


Dim data As Byte

SPICSOn
SPISendBits 6, %100110
SPISendBits 8, %00000000
SPICSOff

For addr = 0 To 10
data = 200 - addr
SPICSOn
SPISendBits 6, %101000
SPISendBits 8, addr
SPISend data
SPICSOff
SPICSOn
SPISend 0x00
SPICSOff
Lcdcmdout LcdClear
Lcdout "Write To EEPROM"
Lcdcmdout LcdLine2Home
Lcdout "(", #addr, ") = ", #data
WaitMs 500
Next addr

For addr = 0 To 10
SPICSOn
SPISendBits 6, %110000
SPISendBits 8, addr
SPIReceive data
SPICSOff
Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
Lcdcmdout LcdLine2Home
Lcdout "(", #addr, ") = ", #data
WaitMs 500
Next addr

INTERFAZ PARA LCD


Bsica compilador tambin cuenta con el apoyo de mdulos basados en LCD HD44780
o compatible chip controlador. Antes de utilizar las declaraciones relacionadas con
LCD, el usuario debe configurar la interfaz utilizando LCD DEFINE directivas. Aqu
est la lista de parmetros disponibles:

LCD_BITS Define el numero de lineas de Datos (Los valores disponibles son


4 y 8 si no se especifica el valor es 4)
LCD_DREG Define el puerto de las lineas de datos si no se especifica el
puerto es el
LCD_DBIT Define la posicin en el puerto de las lineas de datos si se utiliza
la opcion de 4 bit de datos. Si no se especifica la configuaracion es 0 a 4. Es
ignorado con la interfaz de 8 bits.
LCD_RSREG Define el Puerto donde se conectara la linea RS de la LCD si
no se especifica este parmetro se toma como el PORTB
LCD_RSBIT Define del puerto donde se conectara la linea RS (si no se
especifica sera el pin 3).
LCD_RSREG - define el puerto RS cuando est conectado a la lnea (por
defecto es PORTB)
LCD_RSBIT - define el pin RS cuando est conectado a la lnea (por defecto es
3)
LCD_EREG - define el puerto donde E es conectado a la lnea (por defecto es
PORTB)
LCD_EBIT - define el pin donde E es conectado a la lnea (por defecto es 2)
LCD_RWREG - define el puerto en el R / W est conectado a la lnea (se pone
a 0 si no se utilizan; 0 es el valor predeterminado)
LCD_RWBIT - donde se define el pin R / W est conectado a la lnea (se pone
a 0 si no se utilizan; 0 es el valor predeterminado)
LCD_COMMANDUS - define la demora despus de LCDCMDOUT
declaracin (valor por defecto es 5000)
LCD_DATAUS - define la demora despus de LCDOUT declaracin (valor por
defecto es 100)
LCD_INITMS - define el retraso de LCDINIT declaracin (valor por defecto es
100)

Los tres ltimos parmetros pueden ser fijados a los valores ms bajos cuando se utiliza
el mdulo LCD integrada simulador. Si R / W se conecta a la lnea de
microcontroladores y LCD_READ_BUSY_FLAG parmetro se pone a 1 usando
DEFINE directiva, entonces estos parmetros demora ser ignorado por el compilador y
el momento correcto ser ejecutado por la lectura de la situacin de la bandera ocupado
en la pantalla LCD.

LCDINIT declaracin debe ser colocado en el programa antes de cualquier de las


declaraciones LCDOUT (utilizada para el envo de datos) y LCDCMDOUT (utilizada
para el envo de comandos). La constante numerica argumento de LCDINIT se utiliza
para definir el tipo de cursor:

0 = no cursor (por defecto),


1 = parpadeo,
2 = subrayar,
3 = + subrayar parpadear.

LCDOUT y LCDCMDOUT declaraciones pueden tener mltiples argumentos


separados por ','. Strings, constantes y variables se pueden utilizar como argumentos de
LCDOUT declaracin. Si el signo '#' se utiliza antes de que el nombre de una variable
entonces su representacin decimal se enva al mdulo LCD.

Constantes y variables se pueden utilizar como argumentos de LCDCMDOUT


declaracin y las siguientes palabras clave tambin estn disponibles:
MANUAL PIC SIMULATOR IDE FORO DE TODO EN ELECTRONICA

LcdClear, LcdHome, LcdLine2Home, LcdDisplayOn, LcdDisplayOff, LcdCurOff,


LcdCurBlink, LcdCurUnderline, LcdCurBlinkUnderline, LcdLeft, LcdRight,
LcdShiftLeft, LcdShiftRight, LcdLine1Clear, LcdLine2Clear, LcdLine1Pos () () Y
LcdLine2Pos.

Argumento de LcdLine1Pos y LcdLine2Pos () () puede ser un nmero en el rango (1-


40) o variable de tipo Byte de datos. El valor que figura en la variable que debe ser de la
mismo tipo. LcdDisplayOn y LcdDisplayOff se convertir el cursor off. Cursor
relacionados simblico comandos pueden ser utilizados como argumentos de LCDINIT.

He aqu algunos ejemplos:

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 LcdCurBlink
loop:
LCDOUT "Hello world!"
WAITMS 1000
LCDCMDOUT LcdClear
WAITMS 1000
GOTO loop

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
WAITMS 1000
loop:
LCDOUT "I am counting!"
LCDCMDOUT LcdLine2Home
LCDOUT #A
A = A - 1
WAITMS 250
LCDCMDOUT LcdClear
GOTO loop

Las declaraciones relacionadas LCD tendr control sobre TRIS registros relacionados
con los pines utilizados para interfaz LCD, pero si usted utiliza los pines PORTA
PORTE en los dispositivos con A / D Converter Mdulo entonces debe tomar el control
sobre el registro ADCON1 utilizado para fijar las patillas como digital I / O.

Usted puede configurar hasta ocho caracteres definidos por el usuario que se utilizar en
la pantalla LCD. Esto se puede hacer fcilmente con LCDDEFCHAR declaracin. El
primer argumento de esta declaracin es el nmero, caractersticas y tiene que estar en
la gama 0-7. Siguiente 8 argumentos formulario 8-char patrn de la lnea (de arriba
abajo) y debe estar en el rango 0-31 (5-bits de ancho). Estos 8 caracteres de usuario se
asignan a los cdigos char 0-7 y 8-15 y puede visualizarse mediante LCDOUT
declaracin. Despus de la declaracin LCDDEFCHAR cursor estar en posicin
INICIO. Por ejemplo:

LCDDEFCHAR 0, 10, 10, 10, 10, 10, 10, 10, 10


LCDDEFCHAR 1, %11111, %10101, %10101, %10101, %10101,
%10101, %10101, %11111
LCDOUT 0, 1, "Hello!", 1, 0

Para los LCD con cuatro lneas de caracteres adicionales simblico LCDCMDOUT
declaracin de los argumentos se pueden utilizar: LcdLine3Home, LcdLine4Home,
LcdLine3Clear, LcdLine4Clear, LcdLine3Pos y LcdLine4Pos () (). Argumento de
LcdLine3Pos y LcdLine4Pos () () puede ser un nmero en el rango (1-40) o variable de
tipo Byte de datos. El valor que figura en la variable que debe ser de la misma gama.
Antes de utilizar estos elementos de idioma, valores correctos determinar LCD tipo
debe ser asignado a LCD_LINES y LCD_CHARS parmetros usando DEFINE
directivas.

DEFINE LCD_LINES = 4
DEFINE LCD_CHARS = 16
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 3
loop:
LCDCMDOUT LcdClear
LCDCMDOUT LcdLine1Home
LCDOUT "This is line 1"
LCDCMDOUT LcdLine2Home
LCDOUT "This is line 2"
LCDCMDOUT LcdLine3Home
LCDOUT "This is line 3"
LCDCMDOUT LcdLine4Home
LCDOUT "This is line 4"
WAITMS 1000
LCDCMDOUT LcdLine1Clear
LCDCMDOUT LcdLine2Clear
LCDCMDOUT LcdLine3Clear
LCDCMDOUT LcdLine4Clear
LCDCMDOUT LcdLine1Pos(1)
LCDOUT "Line 1"
LCDCMDOUT LcdLine2Pos(2)
LCDOUT "Line 2"
LCDCMDOUT LcdLine3Pos(3)
LCDOUT "Line 3"
LCDCMDOUT LcdLine4Pos(4)
LCDOUT "Line 4"
WAITMS 1000
GOTO loop

INTERFAZ PARA LCD GRAFICA DE MATRIZ DE


PUNTOS
La interfaz grfica LCD con matriz de puntos de resolucin 128x64 controlada por
KS0107 o compatible con el apoyo a la siguiente lista de elementos en Lenguaje Basic:

GLCDINIT, GLCDCLEAR, GLCDPSET, GLCDPRESET, GLCDPOSITION,


GLCDWRITE, GLCDCLEAN, GLCDOUT, GLCDIN, GLCDCMDOUT.

Antes de utilizar las declaraciones relacionadas con los LCD grfica, el usuario debe
configurar la interfaz grfica con el mdulo LCD utilizando DEFINE directivas. Aqu
est la lista de parmetros disponibles:

GLCD_DREG - define el puerto cuando las lineas de datos (tiene que ser un
puerto de 8 bits)
GLCD_RSREG - define el puerto RS cuando est conectado a la lnea
GLCD_RSBIT - define el pin RS cuando est conectado a la lnea
GLCD_EREG - define el puerto donde E es conectado a la lnea
GLCD_EBIT - define el pin donde E es conectado a la lnea
GLCD_RWREG - define el puerto en el R / W est conectado a la lnea
GLCD_RWBIT - donde se define el pin R / W est conectado a la lnea
GLCD_CS1REG - define el puerto donde CS1 est conectado a la lnea
GLCD_CS1BIT - define el pin donde CS1 est conectado a la lnea
GLCD_CS2REG - define el puerto donde CS2 est conectado a la lnea
GLCD_CS2BIT - define el pin donde CS2 est conectado a la lnea

La declaracion GLCDINIT debe ser colocado en algn lugar al comienzo del programa
bsico antes de cualquier otra declaracion relacionada con el modulo Grafico LCD.
Las declaraciones relacionadas con el modulo Grafico LCD tendr control sobre TRIS
registros relacionados con las clavijas utilizadas para LCD de interfaz, pero si utiliza los
pines de los puertos donde esten los Modulos A / D y / o mdulos de la comparacin,
debe tomar el control Durante el registro correspondiente (s) (ADCON1, ANSEL,

CMCON) para ajustar las pines utilizadas como digital I / O.

La declaracion GLCDCLEAR Limpiar todo la LCD. Se puede utilizar con un


argumento opcional constante en el rango 0-255, que se pondrn en cada byte posicin
en la pantalla (128x64 grfica muestra internaly se divide en dos mitades de 64x64;
ambas mitades se dividen en ocho 64x8 horizontal de las pginas, cada pgina Tiene su
nmero abordar en el rango 0-15; pgina en esquina superior izquierda tiene el nmero
0; pgina en esquina inferior izquierda tiene el nmero 7; pgina en esquina superior
derecha tiene el nmero 8; pgina en esquina inferior derecha tiene el nmero 15 ; Cada
pgina ha dirigido 64 byte posiciones con nmeros en el rango 0-63; posicin cada byte
tiene 8 bits, la ms alta es poco LSB y el MSB es algo inferior). Por ejemplo:

GLCDINIT
loop:
GLCDCLEAR 0xAA
WAITMS 1000
GLCDCLEAR 0x55
WAITMS 1000
GOTO loop

Las declaraciones GLCDPSET y GLCDPRESET se utilizan para activar y desactivar


uno de los puntos en la pantalla grfica. El primer argumento es la coordenada
horizontal y debe ser un byte de datos de tipo variable o constante en el rango 0-127. El
segundo argumento es la coordenada vertical y debe ser un byte de datos de tipo
variable o constante en el rango 0-63. El punto en la esquina superior izquierda de la
pantalla es el origen de coordenadas 0,0. Por ejemplo:

DIM I AS BYTE
DIM J AS BYTE
GLCDINIT
FOR I = 0 TO 127
FOR J = 0 TO 63
GLCDPSET I, J
NEXT J
NEXT I

La declaracion GLCDCLEAN se utiliza para borrar una seccin de la pgina en la


pantalla. Tiene tres argumentos. El primer argumento direccin de la pgina es y debe
ser un byte de datos de tipo variable o constante en el rango 0-15. El segundo
argumento es el primer byte posicin en la pgina que se limpien y que debe ser un byte
de datos de tipo variable o constante en el rango 0-63. El tercer argumento es el ltimo
byte posicin en la pgina que se limpien y que debe ser un byte de datos de tipo
variable o constante en el rango 0-63. Si los dos ltimos argumentos se omiten toda la
pgina se borrar. Por ejemplo:

DIM I AS BYTE
GLCDINIT
GLCDCLEAR 0xFF
FOR I = 0 TO 15
GLCDCLEAN I
WAITMS 500
NEXT I

La declaracion GLCDPOSITION se utiliza para hacer frente a un byte posicin en la


pantalla. Se debe utilizar antes de cualquiera de las declaraciones GLCDWRITE,
GLCDIN, GLCDOUT y GLCDCMDOUT. El primer argumento direccin de la pgina
es y debe ser un byte de datos de tipo variable o constante en el rango 0-15. El segundo
argumento es el objetivo byte posicin en la pgina y debe ser un byte de datos de tipo
variable o constante en el rango 0-63. Si el segundo argumento es omitido, la posicin
cero byte se utiliza.

La declaracion GLCDWRITE se utiliza para escribir texto en la pantalla. Se comenzar


a escribir a partir de la posicin actual de byte en la pantalla. Debe ser utilizada con
cuidado, porque cuando el byte posicin (63) de la pgina que se alcance, la escritura
continuar desde la posicin de byte 0 quedndose en la misma pgina. El ancho de
cada carcter escrito es de 5 posiciones ms un byte byte posicin clara. Despus de la
declaracin se ejecuta el actual byte posicin ser al final del texto escrito.
GLCDWRITE declaracin puede tener varios argumentos separados por ','. Cuerdas,
constantes y variables byte se puede utilizar como sus argumentos. Constantes y de los
valores de las variables se interpretan como cdigos ASCII. Si '#' signo se utiliza antes
de que el nombre de una variable (byte o palabra tipo de datos) entonces su
representacin decimal est escrito. Por ejemplo:

DIM I AS BYTE
GLCDINIT
FOR I = 0 TO 15
GLCDPOSITION I, 0
GLCDWRITE "Page: ", #I
WAITMS 250
NEXT I

La declaracion GLCDOUT se utiliza para escribir el valor de la variable o constante


byte a byte de la actual posicin en la pantalla. La actual posicin de byte se aumentan
en uno. GLCDIN declaracin leer el valor de la posicin actual de byte en la pantalla y
ponerla en el byte variable especificada como argumento. GLCDCMDOUT declaracin
se utiliza para enviar comandos de bajo nivel a la grfica LCD. Su argumento puede ser
una constante o variable de tipo byte de datos. Todos estos tres estados se puede utilizar
con mltiples argumentos separados por ','.

UTILIZANDO EL MODULO INTERNO PWM


Interna mdulos PWM (con mayor precisin: los modos PWM de los mdulos CCP) se
convierten en la utilizacin PWMON declaracin. Esta declaracin tiene dos
argumentos.

1. El primer argumento es el mdulo nmero, y debe ser una constante en la gama


1-3.
2. El segundo argumento se utiliza para la seleccin del modo.

El modulo interno PWM se puede utilizar en tres diferentes frecuencias de salida para
cada ciclo de trabajo de cuatro resoluciones de apoyo de PWMON declaracin (de 10
bits, 9 bits, 8-bits y 7 bits). As, el mdulo PWM se puede activar con PWMON
declaracin en 12 modalidades. Aqu est la lista de todos los modos en 4MHz
frecuencia de reloj (de otras frecuencias de reloj, los valores deben ser ajustados
proporcionalmente):

mode 1: 10-bit, 244Hz


mode 2: 10-bit, 977Hz
mode 3: 10-bit, 3906Hz
mode 4: 9-bit, 488Hz
mode 5: 9-bit, 1953Hz
mode 6: 9-bit, 7813Hz
mode 7: 8-bit, 977Hz
mode 8: 8-bit, 3906Hz
mode 9: 8-bit, 15625Hz
mode 10: 7-bit, 1953Hz
mode 11: 7-bit, 7813Hz
mode 12: 7-bit, 31250Hz
El mdulo PWM inicialmente se comenz con el ciclo de 0, por lo que la produccin se
mantendr de baja hasta que el ciclo de trabajo se cambia. PWM mdulo se puede
apagar con PWMOFF declaracin. Solamente tiene un argumento - mdulo nmero.

El ciclo de trabajo de la seal PWM se puede cambiar con PWMDUTY declaracin. Su


primer argumento es el mdulo nmero. El segundo argumento es el ciclo y puede ser
una constante en el rango 0-1023 o byte o palabra variable de tipo de datos. El usuario
debe tener cuidado de usar el buen valor para todos los rangos de los modos PWM (0-
1023 de 10 bits de resolucin, 0-511 para el 9 de bits de resolucin, 0-255 de 8 bits de
resolucin y 0-127 de 7-bit de resolucin ). Aqu est un ejemplo ejemplo:

DIM duty AS BYTE


PWMON 1, 9
loop:
ADCIN 0, duty
PWMDUTY 1, duty
GOTO loop

INTERFAZ PARA SERVOS RADIO CONTROL (R/C)


Para escribir aplicaciones de interfaz de servos R / C hay dos declaraciones: SERVOIN
y SERVOOUT. Servo R / C es controlado por un tren de pulsos (15-20 pulsos por
segundo), cuya longitud define la posicin del brazo de servo. La duracin de los pulsos
vlido est en el rango de 1-2ms. Estos dos estados tienen dos argumentos.

1. El primer argumento de los dos estados es el microcontrolador pin cuando el


servo o se recibe la seal de transmisin. Por SERVOIN declaracin de que la
clavija debe ser previamente configuracin como un pin de entrada y de la
declaracin SERVOOUT pin debe ser la configuracin de la produccin.
2. El segundo argumento de SERVOIN declaracin debe ser una variable Byte
cuando la duracin del pulso se guardarn.

Los pulsos se miden en unidades de 10us, por lo que es posible medir los pulsos en el
rango de 0.01-2.55ms. El valor almacenado en la variable de servos normales debera
estar en el rango 100-200. El segundo argumento de la SERVOOUT declaracin debe
ser un Byte variable o constante que determina la duracin de los impulsos generados.
Para un funcionamiento adecuado de la meta servo SERVOOUT declaracin debe ser
ejecutado 15-20 veces durante un segundo. Aqu hay un ejemplo de la servo operacin
inversa:

DIM length AS BYTE


TRISB.0 = 1
TRISB.1 = 0
loop:
SERVOIN PORTB.0, length
IF length < 100 THEN length = 100
IF length > 200 THEN length = 200
length = length - 100
length = 100 - length
length = length + 100
SERVOOUT PORTB.1, length
GOTO loop
Interfaz para Motor Stepper
Antes de utilizar las declaraciones de pasos relacionados con el motor, y su conexin
deseada unidad modo se debe crear usando la directiva DEFINE. Hay ocho disponibles
para definir los parmetros de la conexin de A, B, C y D bobinas:

1. STEP_A_REG - define el puerto donde se conecta la bobina A


2. STEP_A_BIT - define el pin de una bobina cuando est conectado
3. STEP_B_REG - define el puerto donde B est conectada a la bobina
4. STEP_B_BIT - define el pin donde B est conectada a la bobina
5. STEP_C_REG - define el puerto donde C est conectada a la bobina
6. STEP_C_BIT - define el pin donde C bobina est conectado
7. STEP_D_REG - define el puerto donde D bobina est conectado
8. STEP_D_BIT - define el pin de una bobina cuando est conectado

Bobinas A y C son en realidad parte de una sola bobina con conexin comn. Lo mismo
es vlido para B, D bobina y conexiones.

Tambin hay STEP_MODE parmetro utilizado para definir el modo de conducir. Si se


pone a 1 (por defecto) ser el motor impulsado por completo el modo de paso. El valor
2 se debe utilizar para el modo de medio paso. La primera declaracin de base que se
debe utilizar es STEPHOLD. Se utilizan las clavijas como configurar los productos y
tambin energizar AyB bobinas para fijar el rotor en su posicin inicial. Para mover el
rotor en sentido horario y en sentido direcciones hay STEPCW y STEPCCW
declaraciones disponibles. Su primer argumento es el nmero de rotor medidas que se
llevarn a cabo y que pueden ser de tipo Byte de datos constante o variable. El segundo
argumento define la demora entre pasos consecutivos expresada en microsegundos por
un Byte o Word tipo de datos constante o variable. Si se utiliza STEPCW declaracin
resultados rotor en movimiento en direccin a continuacin la configuracin de la
conexin para el B y D bobinas deben intercambiar. He aqu dos ejemplos (el segundo
ejemplo se utiliza retrasos adecuados para la simulacion):

AllDigital
ADCON1 = 0x0E
Define STEP_A_REG = PORTB
Define STEP_A_BIT = 7
Define STEP_B_REG = PORTB
Define STEP_B_BIT = 6
Define STEP_C_REG = PORTB
Define STEP_C_BIT = 5
Define STEP_D_REG = PORTB
Define STEP_D_BIT = 4
Define STEP_MODE = 2

WaitMs 1000
StepHold
WaitMs 1000

Dim an0 As Word

loop:
Adcin 0, an0
an0 = an0 * 60
an0 = an0 + 2000
StepCW 1, an0
Goto loop

AllDigital
Define STEP_A_REG = PORTB
Define STEP_A_BIT = 7
Define STEP_B_REG = PORTB
Define STEP_B_BIT = 6
Define STEP_C_REG = PORTB
Define STEP_C_BIT = 5
Define STEP_D_REG = PORTB
Define STEP_D_BIT = 4
Define STEP_MODE = 2

WaitUs 300
StepHold
WaitUs 1000

loop:
StepCCW 16, 300
WaitUs 1000
StepCW 24, 300
WaitUs 1000
Goto loop

INTERFAZ PARA DISPOSITIVO 1-WIRE


Antes de utilizar 1-WIRE relacionados con declaraciones, el usuario debe definir el pin
cuando el dispositivo est conectado a utilizando la directiva DEFINE. Disponible
parmetros son 1WIRE_REG y 1WIRE_BIT. Por ejemplo:

DEFINE 1WIRE_REG = PORTB


DEFINE 1WIRE_BIT = 0

Secuencia de inicializacin puede realizarse por 1WIREINIT declaracin. Puede haber


un argumento opcional (Variable Bit tipo de datos) que se pone a 0 si la presencia del
dispositivo se ha detectado y el valor de 1 si no hay un dispositivo en la lnea.
Individual bits (de tiempo) pueden ser enviados y recibidos a partir del dispositivo
mediante las declaraciones 1WIRESENDBIT y 1WIREGETBIT. Ambas declaraciones
puede tener varios argumentos - lista separada por comas de Bit tipo de datos de
variables (o de bit constantes para 1WIRESENDBIT declaracin).

Las declaraciones 1WIRESENDBYTE y 1WIREGETBYTE se puede utilizar para


enviar y recibir a los bytes del dispositivo. Ambas declaraciones puede tener varios
argumentos - lista separada por comas de las variables de tipo de datos Byte (Byte o
constantes para 1WIRESENDBYTE declaracin). Aqu est un ejemplo para medir la
temperatura utilizando DS18S20 dispositivo:

DIM finish AS BIT


DIM temp AS BYTE
DIM sign AS BYTE
1WIREINIT
1WIRESENDBYTE 0xCC, 0x44
WAITMS 1
loop:
1WIREGETBIT finish
IF finish = 0 THEN GOTO loop
1WIREINIT
1WIRESENDBYTE 0xCC, 0xBE
1WIREGETBYTE temp, sign

Este ejemplo puede ser muy corto mediante dos declaraciones de alto nivel especifico
en BASIC DS18S20. DS18S20START declaracin iniciar una sola conversin de
temperatura. Segn la hoja de datos del dispositivo de conversin se completar en en la
mayora de 750ms. Despus de ese perodo, el valor medido puede ser ledo por
DS18S20READT declaracin en la que requiere de dos variables de tipo Byte de datos
como argumentos. El primer argumento contendr el valor de temperatura de 0,5 grados
centgrados en las unidades (por ejemplo, el valor 100 representa la temperatura de 50
grados). El segundo argumento contendr el valor 0x00 si la temperatura es positivo y
valor 0xFF si es negativo. Por ejemplo:

DIM temp AS BYTE


DIM sign AS BYTE
DS18S20START
WAITMS 1000
DS18S20READT temp, sign

FUNCIONES AVANZADAS
La directiva STARTFROMZERO se utiliza en el compilador se inicia el programa de
cero programa de ubicacin de memoria flash (reset vector) y utilizar el programa de la
memoria disponible. Interrupcin de la rutina si se utilizan, deben ejecutarse mediante el
uso de cdigo ensamblador. El compilador tambin dejar el control de registro
PCLATH al usuario suponiendo que todo el cdigo est en la misma pgina de la
memoria del programa. Esta caracterstica avanzada se puede utilizar en el desarrollo de
aplicaciones del gestor de arranque, por ejemplo.