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