INTRODUCCIÓN: Este documento es un intento de explicar el funcionamiento de una de las herramientas de desarrollo (a mi entender) mas interesantes para el aficionado a la programación de PICs. Se trata de un entorno de programación integrado, que además de permitir la creación creaci ón de programas en lenguaje assembler incorpora un muy completo BASIC, con soporte para dispositivos 1-wire, LCD, RS-232 y muchos mas. Otro aspecto destacable es la inclusión de una gran cantidad de módulos de E/S que simulan exactamente lo que esta pasando en nuestro programa, incluidos i ncluidos un modulo LCD, teclado, osciloscopio, displays de 7 segmentos entre otros. El autor del programa es Vladimir Soso, Soso, y la web oficial del PIC SIMULATOR IDE es www.oshonsoft.com , desde donde puede bajarse una versión demo, mas que suficiente para realizar las practicas propuestas en este "curso". Además, el autor ha desarrollado entornos de programación similares para micros AVR, PIC18, PIC10F, Z80, etc. Una buena parte de esta GUÍA esta dedicada al lenguaje de programación PIC BASIC, y puede ser útil para aquellos que están aprendiendo a utilizar otros dialectos de BASIC de microcontroladores, como PIC BASIC PRO (PBP) o PROTON, PROTON, ya que se parecen mucho. He decidido publicar en forma de documento PDF esta guía. La primer parte, que comprende hasta el capitulo 10 inclusive puede ser descargada d escargada usando eMule desde aquí. La guía es gratuita, y puede ser distribuida libremente siempre que no se hagan cambios y se cite al autor. INDICE: > Introducción > 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 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 i cono 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 (Program Location), Location), el microcontrolador que hemos seleccionado para nuestro proyecto (Microcontroller (Microcontroller)) y la frecuencia de clock elegida (Clock ( Clock Frequency). 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 anteri or nos muestra (cuando estamos corriendo una simulación de nuestro programa) cual es la instrucción assembler en curso (Last (Last Instruction) Instruction) y cual será la siguiente a ejecutar (Next ( Next Instruction): Instruction ):
Luego tenemos un cuadro con información relativa a la l a 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), Counter ), el registro de trabajo (W (W Register, Register, por "working") y sobre la derecha la cantidad de instrucciones simuladas (Instructions ( Instructions Counter), Counter), la cantidad de ciclos de reloj transcurridos (Clock (Clock Cycles Counter) Counter) y el tiempo ti empo de ejecución que llevaría en realidad dicho programa (Real (Real Time Duration). 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. ejecuta rse.
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 (Binary Value). Value). Cada registro se identifica mediante su dirección (Address Address)) y también por el nombre con el que figura en la hoja de datos ( Name Name). ).
Por ultimo, y a la derecha del cuadro anterior, tenemos el valor de todos los registros de propósito general (GPRs ( GPRs,, o general purpose register). La lista tiene dos columnas, cada una indicando la dirección del registro (Addr ( Addr.) .) y su valor en hexadecimal (Hex. ( Hex. Value): Value ):
[ Volver al Índice ]
> Capitulo 02 - El menú principal: La mayoría de las funciones de las l as 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 si túen permanentemente delante de las demás ventanas, de manera que no las perdamos de vista. vi sta. Este es el menú principal:
Como es costumbre en toda aplicación de windows, wi ndows, 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 dial ogo típico que nos permite seleccionar el archivo archi vo HEX que queremos simular. Esta función puede invocarse con CTRL+L. Dentro de la segunda opción, Simulation Simulation,, tenemos tres opciones que se encargan de manejar la simulación en curso:Start curso:Start,, Step y Stop 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.
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 c olores de la interfaz (Change (Change Color Theme). Theme).
[ Volver al Índice ]
> Capitulo 03 - Herramientas (primera parte): PIC SIMULATOR IDE posee una nutrida caja caj a de herramientas. Estas se encuentran agrupadas en la opción Tools del menú principal, y a continuación c ontinuación veremos en que consiste cada una de ellas. La primera es el visor de la memoria de programa (Program (Program Memory Viewer), 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 di rección (Address ( Address), ), valor en hexadecimal de esa dirección (Hex. ( Hex. Value) Value) y el valor en binario (Binary ( Binary Value). Value). Al igual que las demás herramientas, existe un check box que permite poner la ventana correspondiente siempre al frente (Always ( Always On Top). Top).
La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor, 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 ( Stack Level), Level), el contenido en hexadecimal (Hex ( Hex Value) Value) y en binario (Binary (Binary Value), Value), en la parte inferior de la ventana una etiqueta nos informa de cual c ual es el nivel apuntado en cada paso de la simulación.
La herramienta Microcontroller View es una de las mas útiles, úti les, 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. a signado. Además, en cada pin hay un botón que permite cambiar el estado presente en el (T ( 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, Viewer, y muestra en columnas la dirección en hexa del registro, el nombre "de pila" del mismo (TMR0, PCL, STATUS, STA TUS, etc), y el valor del mismo, en hexadecimal y en binario.
PIC Disassembler es ni mas ni menos que un desensamblador, que nos brinda bri nda un texto con el contenido en assembler del programa cargado cargad o en la memoria del PIC SIMULATOR IDE. Este listado se genera independientemente i ndependientemente 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 Address), ), el opcode y la instrucción (instruction (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. etc . Hay un par de opciones adicionales, adic ionales, como el botón que permite eliminar todos los breakpoints definidos ( Clear All Breakpoints) 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 herramientaSpecial herramientaSpecial Breakpoints. 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) Condition) o por el estado de algún registro (Register (Register Address). 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.
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 r esultante en un solo paso.
[ Volver al Índice ]
> Capitulo 04 - Herramientas (Segunda parte): Las herramientas siguientes son las que podemos p odemos 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.
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 Setup.. Al presionarlo, la ventana aumenta su tamaño y aparecen una serie de cuadros de selección desde donde podremos elegir elegi r 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 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.
Otras dos herramientas sumamente útiles para comprender que esta haciendo en cada momento el microcontrolador son el osciloscopio ( Oscilloscope Oscilloscope)) de cuatro canales, con posibilidad total de configuración de cada uno de ellos, y elSignal 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.
No podía faltar el modulo con los displays di splays 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), ell os), y podemos elegir el pin pi n 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 apare ce el nombre de la variable variabl e en cuestión y en otra su valor. Esta lista l ista se actualiza constantemente durante la simulación.
[ Volver al Índice ]
> 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 el egir como base cualquier numero entero. Generalmente, los mas usados en el mundo de la programación pr ogramación son el sistema
decimal, que utiliza como base el numero 10; el sistema si stema 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 deci mal toma como base para construir los l os números potencias sucesivas del numero 10. Se utilizan los símbolos del "0" al "9", y el peso de cada cifra esta est a 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, der echa, y el de mas "peso" el que se encuentra mas a la izquierda. Potencia de 10:
10^7
10^6
10^5
10^4 10^3 10^2 10^1 10^0
Valor: 10000000 1000000 100000 10000 1000
100
10
1
Dado que este sistema es el que usamos todo t odo el tiempo, no nos detenemos a pensar en como se construye cada numero, pero cuando leemos el numero "123" en realidad real idad esta "construido" de la siguiente manera: (1 * 10^2) + (2 * 10^1) + (3 * 10^0) = (1 * 100) + (2 * 10) + (3 * 1) = 100 + 20 + 3 = 123 Sistema binario: El sistema binario, el ideal para usar en 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 l ugar del 10. En todo lo demás, es exactamente igual al decimal. Si nos parece mas complicado, es 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 binari o 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 s u 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 bi t 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, a rriba, el nibble es la unión de cuatro bits. Dado que 2x2x2x2 = 16, este es el numero de valores posibles que puede tomar un nibble. La estructura mas utilizada es el byte, que agrupa 8 bits (o dos nibbles), y que puede tomar valores entre 0 y 255 (2^8 valores val ores posibles). Si tomamos dos bytes y los l os "pegamos" uno detrás del otro, obtenemos una palabra ( word 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 l os símbolos 0..9 se agregan las letras A, B, C, D, E y F, y es un sistema de numeración 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 Algunos ejemplos.
3BB0
[ Volver al Índice ]
> Capitulo 06 - Variables: Vamos a comenzar a ver algo de la l a programación en el BASIC BAS IC incluido en el entorno PIC SIMULATOR IDE, al que en adelante adel ante 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 ell as determinados tipos de objetos. obj etos. 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 al macena números enteros entre 0 y 4,294,967,295) El tipo "Long" solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDE. A diferencia de otros BASIC, la 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 DIM DIM DIM
A B X Y
AS AS AS AS
BIT BYTE WORD 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 referi remos algunas veces como "array") de diez di ez 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 p or 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 variabl e pueden ser accedidos individualmente también, simplemente poniendo como extensión ".n" donde "n" es el numero de bit (1,2, 3, etc. ) DIM DIM B = B = A.0
A AS BYTE B AS BIT A.1 A.7 = A.5
Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC, como si se tratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA, PORTB, TRISA, etc.). Por supuesto, se puede acceder a bits individuales de los registros con la 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 DIM X = Y =
X AS WORD Y AS BYTE 0x3F 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 PORTB.0 = 1
podemos hacer LED1 = 1
que es mucho mas claro y fácil de leer. Por supuesto, el código que aparece aparec e a la derecha del igual no puede contener instrucciones o comandos. Las constantes (valores que usamos en nuestro programa, y que, por ejemplo, asignamos a las variables) pueden ser escritas en decimal (directamente el valor), en hexadecimal (anteponiendo "0x" o posponiendo "H" al valor) o en binario (anteponiendo "%" al valor). Por ejemplo: DIM DIM A = B = B =
A AS BIT B AS BYTE TRUE 0x55 %01010101
Por supuesto, se pueden asignar nombres a las constantes, usando la instrucción CONST: DIM A AS WORD CONST PI = 314 A = PI
Hay tres instrucciones para el manejo individual de bits, que si bien bi en no hacen nada que no se puede resolver con otras instrucciones instrucc iones o símbolos, ayudan mucho en la lectura l ectura del código. Se tratan de HIGH, LOW L OW y TOGGLE, que ponen el bit en alto, bajo o lo lo invierten, respectivamente. Importante: Si el bit implicado como argumento de una de estas instrucciones es un bit de un PORT, el mismo bit bi t en el TRIS correspondiente es puesto en cero, c ero, y dicho pin queda configurado como salida. Algunos ejemplos:
HIGH PORTB.0 LOW ADCON0.ADON TOGGLE OPTION_REG.INTEDG
[ Volver al Índice ]
> 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 MOD)) .Por supuesto, el compilador es capaz de combinarlas para obtener operaciones matemáticas mas complejas. DIM DIM DIM A = B = X = X =
A AS WORD B AS WORD X AS WORD 123 A * 234 2 (12345 - B * X) / (A + B)
Es posible calcular 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 DIM DIM X = X = X = X = X = X = X =
A AS BIT B AS BIT X AS BIT NOT A A AND B A OR B A XOR B A NAND B A NOR B A NXOR B
DIM A AS WORD
DIM B AS WORD A = A OR B PORTB = PORTC AND %11110000
[ Volver al Índice ]
> 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, compila , lo ejecuta y ya, en el mundo de los microcontroladores hay que, previamente, definir el tipo de microcontrolador mic rocontrolador que se va a utilizar, cual va a ser su frecuencia de clock, como va a ser el circuito en que se va a utilizar el mismo, etc. Para estas practicas, utilizaremos un PIC16F628A, uno de los mas difundidos y que mas o menos viene a reemplazar al viejo y popular PIC16F84, ya obsoleto. El diagrama circuital que utilizaremos para las primeras practicas es el siguiente:
Si bien se supone que quien esta leyendo este tutorial tiene una buena idea sobre 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 res istencias 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 s endos 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 bi en filtrados y regulados. Si no sabes como construir una fuente, puedes leer algo sobre el tema aquí. Volviendo a nuestro programa, vamos a escribir escri bir el "hola mundo" de los microcontroladores: encender un LED.
El primer paso es, desde el menú "Opciones" -> "Select Microcontroller", Microcontroller", elegir el PIC16F628A PIC16F628A..
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 c omportar como I/O y que usaremos como oscilador el oscilador interno INTRC INTRC.. Una vez hecho esto, arrancamos el edito de BASIC (presionando CTRL-C, por ejemplo), y escribimos el siguiente código:
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 l a ú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 pi nes 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. mis mo. Personalmente me gusta esta manera, ya que "veo" el estado de cada pin. Por supuesto, s upuesto, 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, P ORTB.0, de manera que en el pin pi n 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 n o haya mas circulación circulaci ón de corriente a través de la resistencia y del LED, con lo que este se apaga.
En 010 se hace nuevamente una pausa de medio segundo, y por ultimo, ulti mo, la línea Loop hace que el programa continúe en la l a línea 006 (que es donde esta la la etiqueta Loop).
Goto
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 c ontinuació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, IDE, y desde "Tools" -> "Microcontroller View" abrimos la vista del microntrolador, al darle "Start " Start"" a la simulación tendremos algo parecido a lo que sigue:
En la captura se puede apreciar que el pin 6, correspondiente a RB0 esta en "ON " ON". ". Si esperamos lo suficiente, veremos como pasa a " OFF OFF", ", y mas tarde vuelve a "ON " 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 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 ": ":
El programa BASIC puede descargarse desde [aquí], y el correspondiente archivo HEX desde [aquí] . [ Volver al Índice ]
> 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:
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 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 c onectado a PORTA.0 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 c onectado en ese pin se ilumine. Cuando soltamos el pulsador, PORTA.0 vuelve a estado bajo, ya que se s e 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 c ontinuación
PIC SIMULATOR IDE compilara el programa, y cargara el HEX resultante en el simulador. Aparecerá el cuadro de dialogo di alogo 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, IDE, y desde "Tools" -> "Microcontroller View" abrimos la vista del microntrolador, al darle "Start " Start"" a la simulación tendremos algo parecido a lo que sigue:
El pin 6, correspondiente a RB0 esta en "OFF "OFF"" por que el pulsador del pin 17 (RA0 ( RA0)) esta en OFF OFF.. Si con el mouse hacemos un click cli ck sobre la "T " 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 " T" significa "cambio" (Toggle) por lo que el estado del pin 17 permanecerá en alto hasta que lo pulsemos puls emos 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 Tambi én es interesante el realizar cambios en el programa BASIC BASIC,, recompilar y analizar los resultados. El programa BASIC de este capitulo puede descargarse desde [aquí], y el correspondiente archivo HEX desde [aquí] . [ Volver al Índice ]
> Capitulo 10 - IF - THEN - ELSE - ENDIF En cualquier programa medianamente complejo que queramos realizar, reali zar, 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. vari able. PIC BASIC incorpora instrucciones que nos permiten este tipo de comportamiento, siendo la mas sencilla y frecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF. 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"
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 vis to 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 val or 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 IF IF IF IF
A = B THEN PORTA.0 = 1 B > A THEN A = B B = 5 THEN A = 0 (A = 0) OR (B = 5) THEN C = 2 PORTA.0 THEN PORTB.3 = 0
En el ultimo ejemplo la 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 ... instrucción n ENDIF
No varia prácticamente nada respecto del d el primer caso, solo que esta vez ve z se van a ejecutar todas las instrucciones que se s e encuentren entre el THEN y el ENDIF cada vez que condición sea verdadera. Veamos un ejemplo. Supongamos el siguiente programa:
DIM DIM DIM DIM DIM
A AS BYTE 'Declaro la variable "A" B AS BYTE 'Declaro la variable "B" C AS BYTE 'Declaro la variable "C" D AS BYTE 'Declaro la variable "D" TOTAL AS BYTE 'Declaro la variable
TOTAL A = 2 B = 5 C = 1 D = 0
= 0 'Le 'Le 'Le 'Le
'Le asigno el valor asigno el valor 2 a asigno el valor 5 a asigno el valor 1 a asigno el valor 0 a
como BYTE como BYTE como BYTE como BYTE "TOTAL" como BYTE
0 a la variable "TOTAL" la variable "A" la variable "B" la variable "C" 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 THENENDIF 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 ... instrucciónv ELSE instrucciónf instrucciónf ... instrucciónf ENDIF
2 n 1 2 n
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. 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 si gue con la sentencia que se encuentre a continuación conti nuación delENDIF. Por ultimo, tenemos que saber que es posible "anidar" "ani dar" instrucciones IF-THEN-ELSEENDIF, 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. colaps ara. 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 s e encuentra dentro ("anidada" en) de la primera. [ Volver al Índice ]
> Capitulo 11 - FOR - TO - STEP - NEXT Así como la toma de decisiones decisi ones 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: 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 DIM TOTAL AS WORD
'Declaro la variable "A" como BYTE 'Declaro la variable "TOTAL" como WORD
TOTAL = 0
'Asigno "0" a la variable "TOTAL".
FOR A = 1 TO 100 STEP 1 '"A" va de 1 a 100 de 1 en 1 TOTAL = TOTAL + A 'Sumo "A" al valor de "TOTAL". NEXT A 'fin del bucle.
Hemos declarado la variable A como BYTE, ya que su valor va a mantenerse en el rango 0..255. Para TOTAL utilizamos una variable tipo WORD, ya que la suma va a superar el valor 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 STEPvale 1, puede omitirse, como veremos en ejemplos posteriores. comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada ca da iteración se le suma el valor que tenga Aen ese momento. De esa manera, TOTAL va tomando los valores 1, 3, 6, 10, .... 5050. TOTAL
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 DIM DIM DIM DIM
A AS BYTE INICIO AS BYTE FINAL AS BYTE PASO AS BYTE TOTAL AS WORD
INICIO = 1 FINAL = 100 PASO = 1 TOTAL = 0
'Declaro 'Declaro 'Declaro 'Declaro 'Declaro 'Asigno 'Asigno 'Asigno 'Asigno
la la la la la
variable variable variable variable variable
"1" a "100" "1" a "0" a
"A" como BYTE "INICIO" como BYTE "FINAL" como BYTE "PASO" como BYTE "TOTAL" como WORD
la variable "INICIO". a la variable "FINAL". la variable "PASO". 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 DIM TOTAL AS WORD
'Declaro la variable "A" como BYTE 'Declaro la variable "TOTAL" como WORD
TOTAL = 0
'Asigno "0" a la variable "TOTAL".
FOR A = 1 TO 100 TOTAL = TOTAL + A NEXT A
'"A" va de 1 a 100 de 1 en 1 'Sumo "A" al valor de "TOTAL". 'fin del bucle.
Hay casos en que es necesario que el valor de la variable de control del bucle se decremente en lugar de ir aumentando. En ese caso, se puede pu ede 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
compilado y corriendo sobre el simulador. Cuenta desde desd e 0 a 15 y muestra el valor sobre el puerto B en binario.
[ Volver al Índice ]
> Capitulo 12 - WHILE - WEND La segunda estructura de control que proporciona PIC BASIC es WHILE - WEND. Su propósito es el mismo que la que vimos en el capitulo anterior, 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 ejecuta r la primera vez el WHILE, el flujo del
programa pasara directamente a la instrucción posterior al dentro del bucle no se ejecutaran ninguna vez. No hay mucho mas para decir de
WHILE-WEND
WEND
y las instrucciones
, solo analizar algunos ejemplos:
E jemplo 1: El siguiente es un bucle infinito. Como dentro del cuerpo WEND no se cambia el valor de la variable A, esta siempre vale "0" y del WHILE nunca es falsa, por lo que se repite repi te eternamente:
del WHILEla condición
DIM A AS BYTE A = 0 ... WHILE A = 0 instruccion1 instruccion2 ... instruccionn WEND ... E jemplo
2: Las instrucciones dentro del siguiente dado que la condicion siempre es falsa:
WHILE-WEND
no se ejecutan nunca,
DIM A AS BYTE A = 0 ... WHILE A > 0 instruccion1 instruccion2 ... instruccionn WEND ... E jemplo
3: Las instrucciones dentro del siguiente WHILE-WEND se ejecutan 10 veces, y al terminar la variable Bcontiene la suma de los números del 0 al 10 naturales: DIM DIM A = B =
A AS BYTE A AS BYTE 0 0
WHILE A < 10 A = A + 1 'Incremento la variable A B = B + A 'Sumo a B el valor de la variable A WEND
Cuando A = 10, se suma su valor a A, y al llegar al WEND el control del programa se transfiere al WHILE, donde se 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.
[ Volver al Índice ] > 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 ...
tendrá el valor "70" (decimal) al ejecutar este código. El primer elemento de la lista, recordemos, corresponde al valor "0" de indice. variable
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, IDE, nos muestra como manejar un display LED de siete segmentos conectado al puerto B: Dim digito As Byte Dim mascara As Byte 'Comienzo el bucle principal loop: TRISB = %00000000 For digito = 0 To 9 &nb