Está en la página 1de 59

MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

INDICE
Capitulo 01 - La interfaz

Capitulo 02 - El menú principal

Capitulo 03 - Tools (Primera parte)

Capitulo 04 - Tools (Segunda parte)

Capitulo 05 - Sistemas de numeración

Capitulo 06 - Variables

Capitulo 07 - Operaciones Lógicas y Matemáticas

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 Análogo Digital ADC
• Usando Interrupciones
• Comunicación Serial Utilizando Hardware Interno UART
• Implementación UART por Software
• Comunicación con Dispositivos I2C
• Comunicación con Dispositivos Interfaz Serial Periférica 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

FORO DE TODO EN ELECTRONICA PAGINA1 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

CAPITULO 01 – LA INTERFAZ
Debido a que se trata de un software concebido desde el vamos como un entorno,
la integración entre los diferentes módulos 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 versión sobre la que se desarrolla este tutorial (la
5.91) esta en ingles:

Antes de ver en que consiste cada opción del menú principal, vamos a analizar
rápidamente cada sección 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

FORO DE TODO EN ELECTRONICA PAGINA2 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 simulación de nuestro programa) cual es la instrucción
assembler en curso (Last Instruction) y cual será la siguiente a ejecutar (Next
Instruction):

Luego tenemos un cuadro con información relativa a la ejecución del programa, en


la que vemos instrucción a instrucción durante todo el tiempo en que estemos
corriendo la simulación, 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
ejecución que llevaría en realidad dicho programa (Real Time Duration). Cabe
aclarar, que como en todo simulador, la relación entre el tiempo real y el tiempo de
simulación varia dependiendo de los recursos de nuestro ordenador, y en general
los programas simulados demoran mucho mas tiempo que el real en ejecutarse.

A continuación, 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 simulación va reflejando instrucción a instrucción 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 dirección (Address) y también por el nombre con el que figura en la
hoja de datos (Name).

FORO DE TODO EN ELECTRONICA PAGINA3 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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

CAPITULO 02 - EL MENÚ PRINCIPAL:

La mayoría de las funciones de las que dispone esta herramienta están agrupadas
dentro del menú principal de la aplicación. Es de destacar que todos los módulos
que se pueden invocar desde aquí se abren en ventanas separadas, y pueden ser
configuradas (como veremos) para que se sitúen permanentemente delante de las
demás ventanas, de manera que no las perdamos de vista. Este es el menú
principal:

FORO DE TODO EN ELECTRONICA PAGINA4 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Como es costumbre en toda aplicación de windows, la opción 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 típico que nos permite
seleccionar el archivo HEX que queremos simular. Esta función puede invocarse con
CTRL+L.
Dentro de la segunda opción, Simulation, tenemos tres opciones que se encargan
de manejar la simulación en curso: Start, Step y Stop. La primera de ellas arranca
la simulación, la segunda se encarga de avanzar una instrucción (solo esta
habilitada cuando en Rate hemos seleccionado el modo paso a paso) y la tercera
detiene la simulación. Es muy practico utilizar F1, F2 y F3 para invocar estas
opciones.
Rate es el submenú que determina el modo de ejecución de la simulación,
brindando 6 posibilidades:

Estas son: Step By Step (paso a paso), Slow (Lenta), Normal (Normal), Fast
(Rápida), Extremely Fast (muy rápida) y Ultimate (No Refresh) que es la mas
rápida de todas, pero que no actualiza la pantalla principal del simulador. Esta
opción 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 módulos que integran
el simulador, y que veremos en detalle en capítulos siguientes. Tal como se ve en la
figura, la mayoría de ellos se pueden activar mediante la combinación de la tecla
CTRL y alguna mas.

FORO DE TODO EN ELECTRONICA PAGINA5 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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


configuración. Dedicaremos bastante espacio a cada una de ellas en los capítulos
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 configuración) desde la que se puede elegir la función de algunos pines
(Reset o I/O, etc), el tipo de oscilador a usar, etc. La ultima opción de este
submenú permite cambiar los colores de la interfaz (Change Color Theme).

FORO DE TODO EN ELECTRONICA PAGINA6 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Capitulo 03 - Herramientas (primera parte):


PIC SIMULATOR IDE posee una nutrida caja de herramientas. Estas se encuentran
agrupadas en la opción Tools del menú principal, y a continuación 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 extensión dependerá del microcontrolador que
tengamos seleccionado, y se pueden ver tres columnas: dirección (Address), valor
en hexadecimal de esa dirección (Hex. Value) y el valor en binario (Binary
Value). Al igual que las demás 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 extensión 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 español). Esto puede resultar útil para
depurar los programas que tienen muchas subrutinas anidadas o cuando
sospechamos que hay desbordamientos del stack. Además de ver el nivel de stack

FORO DE TODO EN ELECTRONICA PAGINA7 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

(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 simulación.

La herramienta Microcontroller View es una de las mas útiles, ya que en una


ventana separada (y que como las demás 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 simulación 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. Además, en cada pin hay
un botón 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
simulación.

Existe también una vista alternativa del estado de los registros especiales, que
pude resultar mas cómoda en algunos casos. Es la correspondiente a la opción
Alternative SFR Viewer, y muestra en columnas la dirección en hexa del registro,
el nombre "de pila" del mismo (TMR0, PCL, STATUS, etc), y el valor del mismo, en
hexadecimal y en binario.

FORO DE TODO EN ELECTRONICA PAGINA8 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 código a partir de un archivo ya compilado
con cualquier compilador (con extensión .HEX) o a partir de un .HEX generado con
el compilador BASIC incluido en el paquete. Se muestra, por cada instrucción, la
dirección (Address), el opcode y la instrucción (instruction). Ideal para aprender
assembler a partir de instrucciones BASIC, por ejemplo.

El manejador de "puntos de inspección" o Breakpoint Manager es una


herramienta que permite definir hasta 10 puntos en los que la simulación se
interrumpirá (luego podremos reanudar la ejecución desde ese punto) para analizar
con tranquilidad el estado de los registros, los puertos, etc. Hay un par de opciones
adicionales, como el botón que permite eliminar todos los breakpoints definidos

FORO DE TODO EN ELECTRONICA PAGINA9 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

(Clear All Breakpoints) o mantener siempre en foco el contador de programa (PC


o Program Counter). El contenido de la ventana es el código assembler en el mismo
formato que comentamos en la herramienta anterior.

Además 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 inspección se fijan mediante una condición (Break Condition) o por el
estado de algún 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 código en dicho lenguaje para luego compilarlo.

FORO DE TODO EN ELECTRONICA PAGINA10 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Al igual que el editor de assembler, el BASIC tendrá varios capítulos dedicados a


el, ya que estudiaremos cada una de las instrucciones disponibles. Podemos
adelantar que se trata de un editor bastante decente, con verificación 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.

FORO DE TODO EN ELECTRONICA PAGINA11 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

FORO DE TODO EN ELECTRONICA PAGINA12 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Capitulo 04 - Herramientas (Segunda parte):


Las herramientas siguientes son las que podemos usar como "periféricos" 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 simulación.

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
dinámicamente, durante la simulación, el estado de cada tecla. En los ejemplos de
los capítulos dedicados a la programación usaremos esta herramienta a menudo.

FORO DE TODO EN ELECTRONICA PAGINA13 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

El LCD Module es la versión virtual del típico display LCD con controlador Hitachi
que usamos en todos nuestros proyectos. Es posible configurar completamente su
funcionamiento, mediante el botón Setup. Al presionarlo, la ventana aumenta su
tamaño y aparecen una serie de cuadros de selección desde donde podremos elegir
el numero de filas y columnas del display, el color del mismo, a que puerto están
conectadas las líneas de datos y si son 4 u 8, y donde están conectadas (puerto y
pin) las líneas RS, R/W y E. También se pueden configurar los tiempos de delay del
display, para que su simulación sea lo mas fiel posible a la realidad.

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior, pero


para simular LCDs gráficos de 128x64 pixeles. Las opciones de configuración
también se esconden detrás del botón Setup, y son muy similares a las ya vistas,
incorporándose la posibilidad de configurar el puerto y pin de las líneas CS1 y CS2.

Mediante las herramientas Hardware UART Simulation Interface, Software


UART Simulation Interface y PC's Serial Port Terminal podremos simular una
comunicación vía RS-232. Se trata de herramientas muy completas que tendrán su
propio capitulo, por lo que momentáneamente nos limitamos a mencionarlas.

FORO DE TODO EN ELECTRONICA PAGINA14 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

FORO DE TODO EN ELECTRONICA PAGINA15 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 configuración de cada uno de ellos, y el Signal
Generator (generador de señales) también de cuatro canales y con posibilidad de
generar pulsos de periodo y relación cíclica ajustable. Por supuesto, habrá capítulos
en que haremos uso de ellas.

FORO DE TODO EN ELECTRONICA PAGINA16 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

No podía 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 dígitos completamente configurables (nuevamente
mediante el botón 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 cátodo común,
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 cuestión y en otra su valor. Esta lista se actualiza constantemente
durante la simulación.

FORO DE TODO EN ELECTRONICA PAGINA17 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

CAPITULO 05 - SISTEMAS DE NUMERACIÓN:

Existen muchas maneras de representar un numero. De hecho, en teoría es posible


hacerlo de infinitas maneras, ya que podemos elegir como base cualquier numero
entero. Generalmente, los mas usados en el mundo de la programación 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
números potencias sucesivas del numero 10. Se utilizan los símbolos del "0" al "9",
y el peso de cada cifra esta dado por su posición, dado que se multiplica por 10
elevado a la posición en que se encuentra el digito menos uno. Como en todos los
sistemas de numeración, 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) =

FORO DE TODO EN ELECTRONICA PAGINA18 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

100 + 20 + 3 =
123

Sistema binario:

El sistema binario, el ideal para usar en electrónica debido a que solo posee dos
símbolos, el 0 y el 1, que pueden ser codificados como presencia o ausencia de
tensión, utiliza como base el numero 2 en lugar del 10. En todo lo demás, 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 dígitos binarios (que
para abreviar llamamos "bits"). Muchas veces, se agrupan de diferentes maneras
para poder trabajarlos mas cómodamente, y a esas agrupaciones de les da un
nombre, siendo los mas utilizados los siguientes:

Nombre Tamaño (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeración, los ceros a la izquierda no modifican el


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

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 demás bits
intermedios por su numero de bit correspondiente: bit 2, bit 3, etc.
De todo esto podemos deducir que el tipo de dato mas pequeño 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 unión de cuatro bits.
Dado que 2x2x2x2 = 16, este es el numero de valores posibles que puede tomar

FORO DE TODO EN ELECTRONICA PAGINA19 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 detrás del otro, obtenemos una palabra (word), que permite
65536 (2^16) valores diferentes.

Sistema hexadecimal:

Si tomamos 16 símbolos para representar los números (en lugar de dos o diez),
obtenemos un sistema que se llama hexadecimal. A los símbolos 0..9 se agregan
las letras A, B, C, D, E y F, y es un sistema de numeración muy utilizado en
programación. Algunas de sus ventajas son que cada digito de un numero
hexadecimal es exactamente un nibble, o que cada dos dígitos 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 programación en el BASIC incluido en el


entorno PIC SIMULATOR IDE, al que en adelante nos referiremos como "BASIC", a
secas.
La programación seria prácticamente 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 analogía, 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, según el dato que puedan almacenar:

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


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

FORO DE TODO EN ELECTRONICA PAGINA20 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

El tipo "Long" solo esta disponible mediante un modulo opcional al PIC SIMULATOR
IDE.
A diferencia de otros BASIC, la declaración 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 lógicamente limitado al monto de memoria RAM disponible en cada
microcontrolador. Las variables las declaramos utilizando la instrucción DIM, como
se muestra en los siguientes ejemplos:

DIM A AS BIT
DIM B AS BYTE
DIM X AS WORD
DIM Y AS LONG

También 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 serán accedidos mediante el uso de subíndice (entre
paréntesis) 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, están 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 también borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente


también, simplemente poniendo como extensión ".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

FORO DE TODO EN ELECTRONICA PAGINA21 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 técnica vista párrafos atrás.

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 también podemos usar punteros. En realidad, cualquier variable definida


como tipo BYTE o WORD pude ser usada como un putero de memoria, usándola
como argumento de la función 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 fáciles de entender
es el uso de nombres simbólicos, o SYMBOL. Un "symbol" es una cadena que
contiene código, asignado a un nombre. Al momento de compilar, PIC BASIC hace
la "búsqueda y reemplazo" de nuestros símbolos y luego genera el código 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

FORO DE TODO EN ELECTRONICA PAGINA22 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

PORTB.0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y fácil 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 instrucción


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 símbolos, ayudan mucho en la
lectura del código. 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 Lógicas y Matemáticas:

PIC SIMULATOR IDE dispone de cinco operaciones matemáticas básicas,


disponibles para las variables tipo Byte y Word. Estas son la suma (operador +), la
sustracción (operador -), el producto (operador *), el cociente (operador /) y el
módulo (operador MOD) .Por supuesto, el compilador es capaz de combinarlas para
obtener operaciones matemáticas mas complejas.

DIM A AS WORD
DIM B AS WORD
DIM X AS WORD
A = 123

FORO DE TODO EN ELECTRONICA PAGINA23 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

B = A * 234
X = 2
X = (12345 - B * X) / (A + B)

Es posible calcular raíces cuadradas (aunque el resultado debe ser entero) con la
función SQR:

DIM A AS WORD
A = 3600
A = SQR(A)

Para las variables de tipo Bit existen siete operaciones lógicas disponibles. Solo es
posible efectuar una operación lógica por instrucción (aunque es muy posible que
próximas versiones permitan mas flexibilidad. Este al tanto de las novedades!).
Estas operaciones también están 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 capítulos de introducción, puramente teóricos, 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:

FORO DE TODO EN ELECTRONICA PAGINA24 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Si bien se supone que quien esta leyendo este tutorial tiene una buena idea sobre
electrónica y microcontroladores, igualmente vamos a hacer una muy breve
descripción 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
función limitar la corriente que circula por los LEDS. Estos serán nuestras "salidas".
Los pines 17 y 18, correspondientes al PORTA.0 y PORTA.1 están conectados a
sendos pulsadores, que al ser presionados conducen 5V (un "1") al pin respectivo.
Cuando están 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.

El circuito debe alimentarse con 5v bien filtrados y regulados. Si no sabes como


construir una fuente, puedes leer algo sobre el tema aquí.

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.

FORO DE TODO EN ELECTRONICA PAGINA25 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Luego, debemos configurar los bits correspondientes:

Lo destacable por ahora de esta configuración es que estamos dejando la memoria


(FLASH y EEPROM) sin protección, 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 código:

FORO DE TODO EN ELECTRONICA PAGINA26 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Vamos a analizarlo línea por línea para entender su funcionamiento:

La línea 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 módulos 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 líneas 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 continuación esta en binario. Se podría 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 línea 006 encontramos una "etiqueta" ( loop: ). Esta no hace nada, solo sirve
como referencia para enviar el flujo del programa a esa línea desde otro lugar,
mediante la sentencia "Goto".

La línea 007 pone en "1" el pin correspondiente a PORTB.0, de manera que en el


pin 6 del microcontrolador habrá 5V. Esta tensión hará que circule una corriente a
través de la resistencia limitadora y el LED1, haciendo que este se encienda, ya que
el cátodo se encuentra conectado a 0V.

En 008 tenemos la sentencia WaitMs 500 . WaitMs se encarga de hacer una pausa
en milisegundos. La duración de la pausa esta dada por el numero que sigue a la
instrucción, 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 circulación de corriente a
través de la resistencia y del LED, con lo que este se apaga.

FORO DE TODO EN ELECTRONICA PAGINA27 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

En 010 se hace nuevamente una pausa de medio segundo, y por ultimo, la línea
Goto Loop hace que el programa continúe en la línea 006 (que es donde esta la
etiqueta Loop).

El programa se repite indefinidamente, encendiendo el LED medio segundo,


apagándolo otro medio segundo.

Si presionamos F9 o vamos al menú que vemos a continuación

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 tamaño 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
simulación tendremos algo parecido a lo que sigue:

FORO DE TODO EN ELECTRONICA PAGINA28 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 simulación 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 permanecería encendido solo una
milésima de segundo, luego apagado el mismo tiempo, etc., por lo que nuestro ojo
lo percibiría como encendido a medias, incapaz de discriminar su verdadero estado.

Se podría haber utilizado la instrucción 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":

FORO DE TODO EN ELECTRONICA PAGINA29 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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
continuación:

FORO DE TODO EN ELECTRONICA PAGINA30 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Como resulta evidente a simple vista, el programa ejemplo2.bas es muy similar al


ejemplo1.bas que vimos en el capitulo anterior. Las diferencias están dentro del
bucle. La instrucción de la línea 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 podrían 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 también
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 través de la resistencia de 10K, y PORTB.0 hará lo propio, apagando el
LED.

Nuestro sencillo (sencillísimo!) programa todo lo que hace es "copiar" en el LED el


estado del pulsador.

Si presionamos F9 o vamos al menú que vemos a continuación

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 tamaño 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
simulación tendremos algo parecido a lo que sigue:

FORO DE TODO EN ELECTRONICA PAGINA31 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 botón "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. También 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 algún punto tomar alguna decisión basándonos 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 instrucción. 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 condición THEN instrucción

"IF" significa "SI....", y "THEN" significa "LUEGO" o "ENTONCES". El caso anterior


puede leerse como "SI se cumple la condición, entonces ejecuto la instrucción"

FORO DE TODO EN ELECTRONICA PAGINA32 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

La "condición" es una expresión lógica que puede ser verdadera o falsa. En caso
de ser verdadera, la instrucción a continuación del THEN será ejecutada. En caso de
la condición sea falsa, el programa seguirá su ejecución con la instrucción 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 línea siguiente realiza la siguiente tarea: evalúa si la condición PORTA.4 = 1 es


cierta. En caso de que efectivamente el valor presente en el bit 4 del PORTA sea "1",
se ejecuta la instrucción a continuación del THEN, la variable "A" toma el valor "4",
y se pasa a la instrucción de abajo. Si PORTA es igual a "0", se pasa a la instrucción
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 evaluación. 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 condición PORTA.0 equivale a PORTA.0 = 1.

CASO 2: Muchas veces, luego de evaluar la condición necesitamos ejecutar mas de


una instrucción. En los ejemplos vistos en el CASO 1 siempre se ejecutaba una sola
instrucción cuando la condición era cierta. La manera de ejecutar múltiples
sentencias dentro de una estructura IF-THEN implica emplear el ENDIF:

IF condición THEN
instrucción 1
instrucción 2
...

FORO DE TODO EN ELECTRONICA PAGINA33 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

instrucción n
ENDIF

No varia prácticamente 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 condición 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 condición 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 ejecutarían
y TOTAL seguiría valiendo "0" al terminar el programa.

CASO 3: Hay veces que de acuerdo a la condición, queremos ejecutar un grupo u


otro de instrucciones. Para eso, utilizamos el ELSE:

IF condición THEN
instrucciónv 1
instrucciónv 2
...
instrucciónv n
ELSE
instrucciónf 1
instrucciónf 2
...
instrucciónf n
ENDIF

Es decir, si la condición es verdadera, se ejecutan las sentencias entre THEN y ELSE.


Y si la condición es falsa, las que estén 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.

FORO DE TODO EN ELECTRONICA PAGINA34 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 condición 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 continuación 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 característica ya que
debido a limitaciones en el tamaño 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 están 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 también 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
iteración 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:

FORO DE TODO EN ELECTRONICA PAGINA35 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

FOR variable = valor_inicial TO valor_final STEP paso


instruccion1
instruccion2
...
instruccionn
NEXT variable

Veamos un ejemplo concreto. Supongamos que queremos sumar los números del 1
al 100. El programa quedaría 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 máximo 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 continuación 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
iteración 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 código 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

FORO DE TODO EN ELECTRONICA PAGINA36 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 ocurría 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 condición es que un bucle este completamente dentro del otro. El siguiente
anidamiento daría 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 código:

AllDigital
TRISB = 0

Dim a As Byte

For a = 0 To 15
PORTB = a
Next a

FORO DE TODO EN ELECTRONICA PAGINA37 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 condición
instruccion1
instruccion2
...
instruccionn
WEND

Mientras que la condición sea verdadera, el grupo de instrucciones dentro del


cuerpo del WHILE-WEND se ejecuta. Las características de la condición 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 condición, 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. También hay que tener
presente que si la condición no es cierta al momento de ejecutar la primera vez el
WHILE, el flujo del programa pasara directamente a la instrucción 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 condición
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

FORO DE TODO EN ELECTRONICA PAGINA38 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 números 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 evalúa la condición A < 10, se determina que es
falsa, y el programa pasa el control a la línea que exista después del WEND.

Capitulo 13 – LOOKUP
La función LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de
constantes del mismo tipo, de acuerdo al valor de un índice (también de tipo Byte).
El resultado de la selección se almacena (como no!) también en una variable tipo
byte.

La forma de la función 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 código. El primer elemento
de la lista, recordemos, corresponde al valor "0" de indice.

Si bien la lista puede contener un máximo de 255 elementos, que es el máximo


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, extraído de la propia ayuda del PIC SIMULATOR IDE,


nos muestra como manejar un display LED de siete segmentos conectado al
puerto B:

FORO DE TODO EN ELECTRONICA PAGINA39 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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
simulación!
Next digito
Goto loop

Este es el aspecto que muestra el simulador cuando ejecutamos el programa


anterior. Debemos asegurarnos de que uno de los dígitos LED este configurado
como conectado al puerto PORTB, tal como se ve en la imagen:

FORO DE TODO EN ELECTRONICA PAGINA40 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 continuación.

MASK = LOOKUP("ABCDEFGHIJK"), INDEX

"A" seria el valor que tendría 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 posición (a la izquierda o a la derecha,
de acuerdo a que función 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 simulación!
PORTB = ShiftLeft(PORTB, 1)
If PORTB = %11000000 Then Goto goright
Goto goleft
goright:
WaitUs 5 'esta demora debe ser mayor si no es una simulación!
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 animación flash ilustra el efecto, tal como se puede
ver en el simulador:

FORO DE TODO EN ELECTRONICA PAGINA41 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 discusión es la dirección de un octeto en
memoria de EEPROM y puede ser una constante o una variable del octeto. La segunda
discusión es los datos se leen o se escriben que (para la declaración READ debe ser una
variable del octeto). Se sugiere para mantener interrupciones inhabilitadas durante la
ejecución de

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

Convertidor Analogo a Digital


Usar el módulo DE ANALÓGICO A DIGITAL interno del convertidor
La declaración de ADCIN está disponible como ayuda para el convertidor DE
ANALÓGICO A DIGITAL interno. Su primera argumento es número de canal del
ADC y la segundo argumento es una variable que será utilizada para almacenar el
resultado de la conversión DE ANALÓGICO A DIGITAL. La declaración de ADCIN
utiliza dos parámetros ADC_CLOCK y ADC_SAMPLEUS que tengan valores
prefijados 3 y 20. Estos valores prefijados pueden ser el usar cambiante DEFINEN
directorio. El parámetro de ADC_CLOCK determina la opción para la fuente del reloj
del ADC (el rango está 0-3 o 0-7 dependiendo del dispositivo usado).
Sistemas de parámetro de ADC_SAMPLEUS el tiempo deseado de la adquisición del
ADC en los microsegundos (0-255). La declaración de ADCIN presupone que el pin
correspondiente está configurado como entrada análoga (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

FORO DE TODO EN ELECTRONICA PAGINA42 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

Usando interrupciones
La rutina de la interrupción se debe poner como el resto de subprogramas después de la
declaración END. Debe comenzar con ON INTERRUPCIÓN y terminar con la
declaracion RESUMEN. Si las operaciones aritméticas, los órdenes o algunas otras
declaraciones complejas se utilizan en rutina de la interrupción, entonces EXCEPTO la
declaración SAVE SYSTEM debe ser colocado a la derecha después de la declaración 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 declaración 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

Comunicación Serial utilizando el hardware


interno UART
La comunicación 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 declaración de HSEROPEN
configura el modulo interno UART. Las velocidades permitidas son: 300, 600, 1200,

FORO DE TODO EN ELECTRONICA PAGINA43 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 declaración de HSEROPEN más de una vez en el programa, por


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

La declaración de HSEROUT se utiliza para la transmisión serial. La declaración de


HSEROUT puede tener discusiones múltiples separadas por “,”. Puedes utilizar
secuencias, la palabra clave del LF para carácter de avance de línea o palabra clave para
el retorno del carro - secuencia de CRLF del avance de línea, constante y variable. Si se
utiliza el signo “#” antes de que el nombre de una variable entonces su representación
decimal se envíe al puerto serial.

La declaración 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 declaración esperará hasta
que el número requerido de Bytes se recibe en puerto serial.

La declaración de HSERGET tiene un argumento que deba ser una variable de un Byte.
Si hay un carácter que espera en el almacenador intermediario de la recepción que será
cargado en la variable, si no 0 valores serán cargados. Aquí están 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 comunicación serial por medio
de software se puede poner en ejecución con declaraciones de SEROUT y de SERIN.

FORO DE TODO EN ELECTRONICA PAGINA44 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 más altas con frecuencia de reloj baja podía causar errores de trama.
Para SEROUT la declaración entonces sigue la lista de las discusiones que se enviarán
al puerto serial. Puedes utilizar secuencias, la palabra clave del LF para carácter de
avance de línea o palabra clave para el retorno del carro - secuencia de CRLF del
avance de línea, constante y variable. Si se utiliza el signo “#” antes de que el nombre
de una variable entonces su representación decimal será enviada a través del puerto
serial.

La declaración de SEROUT utiliza el parámetro 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 carácter se envíe realmente al puerto y se
utiliza para aumentar la confiabilidad de la rutina del software SEROUT. Para SERIN la
declaración entonces sigue la lista de las variables de Byte o Word que se cargarán con
los valores recibidos en puerto serial. Esta declaración esperará hasta que el número
requerido de octetos se recibe en puerto serial. Para la interfaz en serie con los niveles
invertidos de la lógica 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

Comunicación I2C con dispositivos externos


La comunicación de I2C se puede poner en ejecución en programas básicos usando
declaraciones de I2CWRITE y de I2CREAD. El primer argumento de ambas
declaraciones debe ser el pin del microcontrolador que está conectado con la línea de
SDA del dispositivo externo de I2C. El segundo argumento de ambas declaraciones
debe ser el pin del microcontrolador que está conectado con la línea de la LCC.
Mientras que el tercer argumento de ambas declaraciones debe ser dirección 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 dirección de
dispositivo conectadas con la tierra) el valor 0xA0 podria ser utilizado para el slave
address. Ambas declaraciones tomarán control sobre el bit 0 del slave address durante la
comunicación.
Adelante la discusión de ambas declaraciones debe ser una variable del octeto o de la
palabra (ésta depende del dispositivo usado) que contiene la dirección de la localización

FORO DE TODO EN ELECTRONICA PAGINA45 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

que será alcanzada. Si un valor constante se utiliza para el parámetro de la dirección


debe estar en gama del valor del octeto. (La quinto) discusión pasada de la declaración
de I2CWRITE es un octeto constante o la variable que serán escritos a la dirección
especificada, y para la declaración de I2CREAD debe ser una variable del octeto para
almacenar el valor que será leído en la dirección especificada. Se permite utilizar más
de uno “discusión de los datos”. Para los dispositivos de I2C que no lo hacen discusión
de la dirección de los datos de apoyo hay forma corta de declaraciones de I2C
(I2CWRITE1 e I2CREAD1) disponibles donde la discusión de la dirección del esclavo
se sigue con unas o más discusiones de los datos directamente. Para algún I2C que los
dispositivos auxiliares él son necesarios hacer retrasa para cerciorarse de que el
dispositivo es listo responder a la declaración de I2CREAD. Para ese propósito hay el
parámetro de I2CREAD_DELAYUS que se puede fijar cerca DEFINE directorio y
tiene valor prefijado de 0 microsegundos. También, para dispositivos más lentos de I2C,
puede ser que sea necesario utilizar impulsos de reloj más largos. Eso se puede hacer
fijando usar del parámetro de I2CCLOCK_STRETCH DEFINE directorio. Este
parámetro fijará factor del estiramiento del reloj. Su valor prefijado es 1. Aquí está un
ejemplo combinado con el módulo 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

FORO DE TODO EN ELECTRONICA PAGINA46 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

● 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 parámetros de la
conexión de SCK, SDI, la organización de desarrollo de normas y (opcionalmente) CS
líneas:

• SPI_SCK_REG - define el puerto donde SCK está conectado a la línea


• SPI_SCK_BIT - define el pin SCK cuando está conectado a la línea
• SPI_SDI_REG - define el puerto IDE que se conecta a la línea
• SPI_SDI_BIT - define el pin IDE que se conecta a la línea
• SPI_SDO_REG - define a la organización de desarrollo de normas puerto
donde está conectado a la línea.
• SPI_SDO_BIT - define a la organización de desarrollo de normas pin donde
se conecta a la línea
• SPI_CS_REG - define el puerto en el CS está conectado a la línea
• SPI_CS_BIT - define el pin CS cuando está conectado a la línea

Los ajustes se supone activa-Reloj de la línea de alta y baja de activo-ChipSelect línea.


Que se puede cambiar por asignar el valor 1. SPICLOCK_INVERT y/o
SPICS_INVERT parámetros de DEFINE directiva. For slower SPI devices, podría ser
necesario utilizar más tiempo de reloj pulsos. El valor por defecto de reloj tramo factor
(1) se puede cambiar mediante el establecimiento de parámetros PICLOCK_STRETCH.

SPIPREPARE declaración (sin argumentos) preparará interfaz SPI líneas de


comunicación. SPICSON y SPICSOFF declaraciones activar / desactivar la ChipSelect
línea de la interfaz.

Un byte se pueden enviar a la SPI periféricos utilizando declaracion SPISEND. Para


recibir un byte se utiliza la declaracion SPIRECEIVE. Para enviar el número
especificado de bits esta la declaración SPISENDBITS. Su primer argumento debe ser
el número de bits que se enviarán [1-8], y el segundo argumento es un byte variable o
constante. Aquí está un ejemplo de utilización

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

FORO DE TODO EN ELECTRONICA PAGINA47 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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

FORO DE TODO EN ELECTRONICA PAGINA48 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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


Básica compilador también cuenta con el apoyo de módulos 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 parámetros 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

FORO DE TODO EN ELECTRONICA PAGINA49 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

• LCD_DBIT – Define la posición 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 parámetro 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 línea (por
defecto es PORTB)
• LCD_RSBIT - define el pin RS cuando está conectado a la línea (por defecto es
3)
• LCD_EREG - define el puerto donde E es conectado a la línea (por defecto es
PORTB)
• LCD_EBIT - define el pin donde E es conectado a la línea (por defecto es 2)
• LCD_RWREG - define el puerto en el R / W está conectado a la línea (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 línea (se pone
a 0 si no se utilizan; 0 es el valor predeterminado)
• LCD_COMMANDUS - define la demora después de LCDCMDOUT
declaración (valor por defecto es 5000)
• LCD_DATAUS - define la demora después de LCDOUT declaración (valor por
defecto es 100)
• LCD_INITMS - define el retraso de LCDINIT declaración (valor por defecto es
100)

Los tres últimos parámetros pueden ser fijados a los valores más bajos cuando se utiliza
el módulo LCD integrada simulador. Si R / W se conecta a la línea de
microcontroladores y LCD_READ_BUSY_FLAG parámetro se pone a 1 usando
DEFINE directiva, entonces estos parámetros demora será ignorado por el compilador y
el momento correcto será ejecutado por la lectura de la situación de la bandera ocupado
en la pantalla LCD.

LCDINIT declaración debe ser colocado en el programa antes de cualquier de las


declaraciones LCDOUT (utilizada para el envío de datos) y LCDCMDOUT (utilizada
para el envío 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 múltiples argumentos


separados por ','. Strings, constantes y variables se pueden utilizar como argumentos de
LCDOUT declaración. Si el signo '#' se utiliza antes de que el nombre de una variable
entonces su representación decimal se envía al módulo LCD.

Constantes y variables se pueden utilizar como argumentos de LCDCMDOUT


declaración y las siguientes palabras clave también están disponibles:

FORO DE TODO EN ELECTRONICA PAGINA50 - goslock


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 número 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 simbólico 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 Módulo 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

FORO DE TODO EN ELECTRONICA PAGINA51 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

la pantalla LCD. Esto se puede hacer fácilmente con LCDDEFCHAR declaración. El


primer argumento de esta declaración es el número, características y tiene que estar en
la gama 0-7. Siguiente 8 argumentos formulario 8-char patrón de la línea (de arriba
abajo) y debe estar en el rango 0-31 (5-bits de ancho). Estos 8 caracteres de usuario se
asignan a los códigos char 0-7 y 8-15 y puede visualizarse mediante LCDOUT
declaración. Después de la declaración LCDDEFCHAR cursor estará en posición
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 líneas de caracteres adicionales simbólico LCDCMDOUT
declaración de los argumentos se pueden utilizar: LcdLine3Home, LcdLine4Home,
LcdLine3Clear, LcdLine4Clear, LcdLine3Pos y LcdLine4Pos () (). Argumento de
LcdLine3Pos y LcdLine4Pos () () puede ser un número 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 parámetros 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"

FORO DE TODO EN ELECTRONICA PAGINA52 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

WAITMS 1000
GOTO loop

● INTERFAZ PARA LCD GRAFICA DE MATRIZ DE


PUNTOS
La interfaz gráfica LCD con matriz de puntos de resolución 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 gráfica, el usuario debe
configurar la interfaz gráfica con el módulo LCD utilizando DEFINE directivas. Aquí
está la lista de parámetros 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 línea
• GLCD_RSBIT - define el pin RS cuando está conectado a la línea
• GLCD_EREG - define el puerto donde E es conectado a la línea
• GLCD_EBIT - define el pin donde E es conectado a la línea
• GLCD_RWREG - define el puerto en el R / W está conectado a la línea
• GLCD_RWBIT - donde se define el pin R / W está conectado a la línea
• GLCD_CS1REG - define el puerto donde CS1 está conectado a la línea
• GLCD_CS1BIT - define el pin donde CS1 está conectado a la línea
• GLCD_CS2REG - define el puerto donde CS2 está conectado a la línea
• GLCD_CS2BIT - define el pin donde CS2 está conectado a la línea

La declaracion GLCDINIT debe ser colocado en algún lugar al comienzo del programa
básico 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 módulos de la comparación,
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 pondrán en cada byte posición
en la pantalla (128x64 gráfica muestra internaly se divide en dos mitades de 64x64;
ambas mitades se dividen en ocho 64x8 horizontal de las páginas, cada página Tiene su
número abordar en el rango 0-15; página en esquina superior izquierda tiene el número
0; página en esquina inferior izquierda tiene el número 7; página en esquina superior
derecha tiene el número 8; página en esquina inferior derecha tiene el número 15 ; Cada
página ha dirigido 64 byte posiciones con números en el rango 0-63; posición cada byte
tiene 8 bits, la más alta es poco LSB y el MSB es algo inferior). Por ejemplo:

GLCDINIT
loop:

FORO DE TODO EN ELECTRONICA PAGINA53 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 gráfica. 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 sección de la página en la


pantalla. Tiene tres argumentos. El primer argumento dirección de la página 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 posición en la página 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 posición en la página 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
página 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 posición en la


pantalla. Se debe utilizar antes de cualquiera de las declaraciones GLCDWRITE,
GLCDIN, GLCDOUT y GLCDCMDOUT. El primer argumento dirección de la página
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 posición en la página y debe ser un byte de datos de tipo
variable o constante en el rango 0-63. Si el segundo argumento es omitido, la posición
cero byte se utiliza.

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


a escribir a partir de la posición actual de byte en la pantalla. Debe ser utilizada con
cuidado, porque cuando el byte posición (63) de la página que se alcance, la escritura
continuará desde la posición de byte 0 quedándose en la misma página. El ancho de
cada carácter escrito es de 5 posiciones más un byte byte posición clara. Después de la
declaración se ejecuta el actual byte posición será al final del texto escrito.

FORO DE TODO EN ELECTRONICA PAGINA54 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

GLCDWRITE declaración 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 códigos ASCII. Si '#' signo se utiliza antes
de que el nombre de una variable (byte o palabra tipo de datos) entonces su
representación 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 posición en la pantalla. La actual posición de byte se aumentan
en uno. GLCDIN declaración leerá el valor de la posición actual de byte en la pantalla y
ponerla en el byte variable especificada como argumento. GLCDCMDOUT declaración
se utiliza para enviar comandos de bajo nivel a la gráfica LCD. Su argumento puede ser
una constante o variable de tipo byte de datos. Todos estos tres estados se puede utilizar
con múltiples argumentos separados por ','.

● UTILIZANDO EL MODULO INTERNO PWM


Interna módulos PWM (con mayor precisión: los modos PWM de los módulos CCP) se
convierten en la utilización PWMON declaración. Esta declaración tiene dos
argumentos.

1. El primer argumento es el módulo número, y debe ser una constante en la gama


1-3.
2. El segundo argumento se utiliza para la selección 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 declaración (de 10
bits, 9 bits, 8-bits y 7 bits). Así, el módulo PWM se puede activar con PWMON
declaración 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

FORO DE TODO EN ELECTRONICA PAGINA55 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

El módulo PWM inicialmente se comenzó con el ciclo de 0, por lo que la producción se


mantendrá de baja hasta que el ciclo de trabajo se cambia. PWM módulo se puede
apagar con PWMOFF declaración. Solamente tiene un argumento - módulo número.

El ciclo de trabajo de la señal PWM se puede cambiar con PWMDUTY declaración. Su


primer argumento es el módulo número. 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 resolución, 0-511 para el 9 de bits de resolución, 0-255 de 8 bits de
resolución y 0-127 de 7-bit de resolución ). 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 posición del brazo de servo. La duración de los pulsos
válido 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 señal de transmisión. Por SERVOIN declaración de que la
clavija debe ser previamente configuración como un pin de entrada y de la
declaración SERVOOUT pin debe ser la configuración de la producción.
2. El segundo argumento de SERVOIN declaración debe ser una variable Byte
cuando la duración del pulso se guardarán.

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 debería
estar en el rango 100-200. El segundo argumento de la SERVOOUT declaración debe
ser un Byte variable o constante que determina la duración de los impulsos generados.
Para un funcionamiento adecuado de la meta servo SERVOOUT declaración debe ser
ejecutado 15-20 veces durante un segundo. Aquí hay un ejemplo de la servo operación
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

FORO DE TODO EN ELECTRONICA PAGINA56 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

● Interfaz para Motor Stepper


Antes de utilizar las declaraciones de pasos relacionados con el motor, y su conexión
deseada unidad modo se debe crear usando la directiva DEFINE. Hay ocho disponibles
para definir los parámetros de la conexión 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 conexión común. Lo mismo
es válido para B, D bobina y conexiones.

También hay STEP_MODE parámetro 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 declaración de base que se
debe utilizar es STEPHOLD. Se utilizan las clavijas como configurar los productos y
también energizar AyB bobinas para fijar el rotor en su posición inicial. Para mover el
rotor en sentido horario y en sentido direcciones hay STEPCW y STEPCCW
declaraciones disponibles. Su primer argumento es el número de rotor medidas que se
llevarán 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 declaración
resultados rotor en movimiento en dirección a continuación la configuración de la
conexión 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

FORO DE TODO EN ELECTRONICA PAGINA57 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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
parámetros son 1WIRE_REG y 1WIRE_BIT. Por ejemplo:

DEFINE 1WIRE_REG = PORTB


DEFINE 1WIRE_BIT = 0

Secuencia de inicialización puede realizarse por 1WIREINIT declaración. 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 línea.
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 declaración).

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 declaración). Aquí está un ejemplo para medir la
temperatura utilizando DS18S20 dispositivo:

DIM finish AS BIT


DIM temp AS BYTE
DIM sign AS BYTE
1WIREINIT

FORO DE TODO EN ELECTRONICA PAGINA58 - goslock


MANUAL PIC SIMULATOR IDE – FORO DE TODO EN ELECTRONICA

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 declaración iniciará una sola conversión de
temperatura. Según la hoja de datos del dispositivo de conversión se completará en en la
mayoría de 750ms. Después de ese período, el valor medido puede ser leído por
DS18S20READT declaración 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
centígrados 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 ubicación de memoria flash (reset vector) y utilizar el programa de la
memoria disponible. Interrupción de la rutina si se utilizan, deben ejecutarse mediante el
uso de código ensamblador. El compilador también dejará el control de registro
PCLATH al usuario suponiendo que todo el código está en la misma página de la
memoria del programa. Esta característica avanzada se puede utilizar en el desarrollo de
aplicaciones del gestor de arranque, por ejemplo.

FORO DE TODO EN ELECTRONICA PAGINA59 - goslock