37
ENTORNO DE DESARROLLO Y PROGRAMACIÓN EN PIC BASIC PARA MICROCONTROLADORES PIC SIMULATOR IDE ENTORNO DE DESARROLLO PIC SIMULATOR IDE (Incluye curso de PIC BASIC) 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 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 un modulo LCD, teclado, osciloscopio, displays de 7 segmentos entre otros. El autor del programa es Vladimir 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, 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 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

Pic Simulator IDE Manual

Embed Size (px)

Citation preview

Page 1: Pic Simulator IDE Manual

ENTORNO DE DESARROLLO Y

PROGRAMACIOacuteN EN

PIC BASIC PARA MICROCONTROLADORES

PIC SIMULATOR IDE

ENTORNO DE DESARROLLO

PIC SIMULATORIDE

(Incluye curso de PIC BASIC)

INTRODUCCIOacuteNEste documento es un intento de explicar el funcionamiento de unade las herramientas de desarrollo (a mi entender) mas interesantespara el aficionado a la programacioacuten de PICsSe trata de un entorno de programacioacuten integrado que ademaacutes depermitir la creacioacuten de programas en lenguaje assembler incorporaun muy completo BASIC con soporte para dispositivos 1-wire LCDRS-232 y muchos masOtro aspecto destacable es la inclusioacuten de una gran cantidad demoacutedulos de ES que simulan exactamente lo que esta pasando ennuestro programa incluidos un modulo LCD teclado osciloscopiodisplays de 7 segmentos entre otros

El autor del programa es Vladimir Soso y la web oficial del PIC SIMULATOR IDE es wwwoshonsoftcom desde donde puede bajarse una versioacuten demo mas que suficiente para realizar las practicas propuestas eneste curso Ademaacutes el autor ha desarrollado entornos de programacioacuten similares para micros AVR PIC18PIC10F Z80 etc

Una buena parte de esta GUIacuteA esta dedicada al lenguaje de programacioacuten PIC BASIC y puede ser uacutetil paraaquellos que estaacuten aprendiendo a utilizar otros dialectos de BASIC de microcontroladores como PIC BASICPRO (PBP) o PROTON ya que se parecen mucho

He decidido publicar en forma de documento PDF esta guiacutea La primer parte que comprende hasta elcapitulo 10 inclusive puede ser descargada usando eMule desde aquiacute La guiacutea es gratuita y puede serdistribuida libremente siempre que no se hagan cambios y se cite al autor

INDICE gt Introduccioacutengt Capitulo 01 - La interfazgt Capitulo 02 - El menuacute principalgt Capitulo 03 - Tools (Primera parte)gt Capitulo 04 - Tools (Segunda parte)gt Capitulo 05 - Sistemas de numeracioacutengt Capitulo 06 - Variablesgt Capitulo 07 - Operaciones Loacutegicas y Matemaacuteticasgt Capitulo 08 - Mi primer programa Un led parpadeantegt Capitulo 09 - Mi segundo programa Usando un pulsadorgt Capitulo 10 - IF - THEN - ELSE - ENDIFgt Capitulo 11 - FOR-TO-STEP-NEXTgt Capitulo 12 - WHILE - ENDgt Capitulo 13 - LOOKUPgt Capitulo 14 - SHIFTLEFT y SHIFTRIGHT

gt Capitulo 01 - La interfazDebido a que se trata de un software concebido desde el vamos como un entorno la integracioacuten entre los

diferentes moacutedulos que lo componen es completa y sin problemasUna vez instalado el programa el icono que lo representa apareceraacute en nuestro escritorio y haciendo dobleclic sobre el se abriraacute la pantalla principal del programa que al menos hasta la versioacuten sobre la que sedesarrolla este tutorial (la 591) esta en ingles

Antes de ver en que consiste cada opcioacuten del menuacute principal vamos a analizar raacutepidamente cada seccioacutende esta pantallaEn la parte superior y justo debajo de la barra de menuacute tenemos tres cuadros de texto que nos muestranla ruta completa hacia el programa que tenemos cargado en el simulador (Program Location) elmicrocontrolador que hemos seleccionado para nuestro proyecto (Microcontroller) y la frecuencia declock elegida (Clock Frequency)

Todos estos valores pueden ser cambiados como veremos en el segundo capitulo desde la barra de menuacuteEl recuadro que esta inmediatamente debajo del anterior nos muestra (cuando estamos corriendo unasimulacioacuten de nuestro programa) cual es la instruccioacuten assembler en curso (Last Instruction) y cual seraacutela siguiente a ejecutar (Next Instruction)

Luego tenemos un cuadro con informacioacuten relativa a la ejecucioacuten del programa en la que vemos instruccioacutena instruccioacuten durante todo el tiempo en que estemos corriendo la simulacioacuten el valor que va tomando elcontador de programa (PC o Program Counter) el registro de trabajo (W Register por working) ysobre la derecha la cantidad de instrucciones simuladas (Instructions Counter) la cantidad de ciclos dereloj transcurridos (Clock Cycles Counter) y el tiempo de ejecucioacuten que llevariacutea en realidad dichoprograma (Real Time Duration) Cabe aclarar que como en todo simulador la relacioacuten entre el tiempo realy el tiempo de simulacioacuten varia dependiendo de los recursos de nuestro ordenador y en general losprogramas simulados demoran mucho mas tiempo que el real en ejecutarse

A continuacioacuten sobre la izquierda vemos una lista de desplazamiento que contiene el valor de todos losregistros especiales con los que cuenta el microcontrolador elegido Esta lista varia por supuesto concada microcontrolador y en el momento de correr la simulacioacuten va reflejando instruccioacuten a instruccioacuten elvalor de cada timer puerto registro de estado interrupciones etc Los valores se muestran enhexadecimal (Hex Value) y en binario (Binary Value) Cada registro se identifica mediante su direccioacuten(Address) y tambieacuten por el nombre con el que figura en la hoja de datos (Name)

Por ultimo y a la derecha del cuadro anterior tenemos el valor de todos los registros de propoacutesito general(GPRs o general purpose register) La lista tiene dos columnas cada una indicando la direccioacuten delregistro (Addr) y su valor en hexadecimal (Hex Value)

[ Volver al Iacutendice ]

gt Capitulo 02 - El menuacute principalLa mayoriacutea de las funciones de las que dispone esta herramienta estaacuten agrupadas dentro del menuacute principalde la aplicacioacuten Es de destacar que todos los moacutedulos que se pueden invocar desde aquiacute se abren enventanas separadas y pueden ser configuradas (como veremos) para que se situacuteen permanentementedelante de las demaacutes ventanas de manera que no las perdamos de vista Este es el menuacute principal

Como es costumbre en toda aplicacioacuten de windows la opcioacuten File es la primera del menuacute Contiene solodos comandosClear Memory (Limpiar memoria) que se encarga de eliminar de la memoria del simulador elprograma que estuviese cargado que puede ser invocada mediante las teclas CTRL+R y LoadProgram (Cargar Programa) que nos lleva a un cuadro de dialogo tiacutepico que nos permite seleccionar elarchivo HEX que queremos simular Esta funcioacuten puede invocarse con CTRL+LDentro de la segunda opcioacuten Simulation tenemos tres opciones que se encargan de manejar lasimulacioacuten en cursoStart Step y Stop La primera de ellas arranca la simulacioacuten la segunda se encargade avanzar una instruccioacuten (solo esta habilitada cuando en Rate hemos seleccionado el modo paso a paso)y la tercera detiene la simulacioacuten Es muy practico utilizar F1 F2 y F3 para invocar estas opcionesRate es el submenuacute que determina el modo de ejecucioacuten de la simulacioacuten brindando 6 posibilidades

Estas son Step By Step (paso a paso) Slow (Lenta) Normal (Normal) Fast (Raacutepida) ExtremelyFast (muy raacutepida) y Ultimate (No Refresh) que es la mas raacutepida de todas pero que no actualiza lapantalla principal del simulador Esta opcioacuten resulta muy uacutetil para adelantar partes del programa que

sabemos que no tienen problemas Todas pueden ser invocadas con CTRL+F1 a CTRL+F6 tal como se veen la figura anteriorTools es el submenuacute encargado de invocar a cada uno de los moacutedulos que integran el simulador y queveremos en detalle en capiacutetulos siguientes Tal como se ve en la figura la mayoriacutea de ellos se puedenactivar mediante la combinacioacuten de la tecla CTRL y alguna mas

Desde Options (Opciones) tenemos acceso a un conjunto de alternativas de configuracioacuten Dedicaremosbastante espacio a cada una de ellas en los capiacutetulos correspondientes pero podemos adelantar que lasmas importantes y que debemos revisar en cada proyecto son Select Microcontroler (seleccionarmicrocontrolador) que nos permite elegir el modelo concreto de PIC a utilizar Change ClockFrecuency (cambiar frecuencia de clock) y Configuration Bits (bits de configuracioacuten) desde la que sepuede elegir la funcioacuten de algunos pines (Reset o IO etc) el tipo de oscilador a usar etc La ultimaopcioacuten de este submenuacute permite cambiar los colores de la interfaz (Change Color Theme)

[ Volver al Iacutendice ]

gt Capitulo 03 - Herramientas (primera parte)PIC SIMULATOR IDE posee una nutrida caja de herramientas Estas se encuentran agrupadas en laopcioacuten Tools del menuacute principal y a continuacioacuten veremos en que consiste cada una de ellasLa primera es el visor de la memoria de programa (Program Memory Viewer) modulo que podemosinvocar presionando CTRL-M en cualquier momento Se lista la memoria completa cuya extensioacutendependeraacute del microcontrolador que tengamos seleccionado y se pueden ver tres columnas direccioacuten(Address) valor en hexadecimal de esa direccioacuten (Hex Value) y el valor en binario (Binary Value) Aligual que las demaacutes herramientas existe un check box que permite poner la ventana correspondientesiempre al frente (Always On Top)

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor y como su nombre indicanos permite modificar los valores almacenados en la memoria EEPROM del microcontrolador El contenido dela EEPROM se lista en 16 columnas numeradas del 0 al 15 y por supuesto su extensioacuten depende del microseleccionado Haciendo click sobre cualquiera de los valores se puede cambiar su contenido que seencuentra en formato hexadecimal

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack (generalmentellamado pila en espantildeol) Esto puede resultar uacutetil para depurar los programas que tienen muchas subrutinasanidadas o cuando sospechamos que hay desbordamientos del stack Ademaacutes de ver el nivel de stack(Stack Level) el contenido en hexadecimal (Hex Value) y en binario (Binary Value) en la parte inferiorde la ventana una etiqueta nos informa de cual es el nivel apuntado en cada paso de la simulacioacuten

La herramienta Microcontroller View es una de las mas uacutetiles ya que en una ventana separada (y quecomo las demaacutes se puede poner en frente de todas) nos muestra un esquema del micro elegido con elrotulo correspondiente a cada pin y lo mas importante el estado en cada momento de la simulacioacuten decada uno En caso de ser un pin ES nos muestra el estado (ONOFF) que presenta y si se trata de unareferencia de voltaje muestra el valor asignado Ademaacutes en cada pin hay un botoacuten que permite cambiar elestado presente en el (T supongo que por toggle que significa cambiar) y los resultados se tomancomo entradas para la simulacioacuten

Existe tambieacuten una vista alternativa del estado de los registros especiales que pude resultar mas coacutemodaen algunos casos Es la correspondiente a la opcioacuten Alternative SFR Viewer y muestra en columnas ladireccioacuten en hexa del registro el nombre de pila del mismo (TMR0 PCL STATUS etc) y el valor delmismo en hexadecimal y en binario

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 2: Pic Simulator IDE Manual

diferentes moacutedulos que lo componen es completa y sin problemasUna vez instalado el programa el icono que lo representa apareceraacute en nuestro escritorio y haciendo dobleclic sobre el se abriraacute la pantalla principal del programa que al menos hasta la versioacuten sobre la que sedesarrolla este tutorial (la 591) esta en ingles

Antes de ver en que consiste cada opcioacuten del menuacute principal vamos a analizar raacutepidamente cada seccioacutende esta pantallaEn la parte superior y justo debajo de la barra de menuacute tenemos tres cuadros de texto que nos muestranla ruta completa hacia el programa que tenemos cargado en el simulador (Program Location) elmicrocontrolador que hemos seleccionado para nuestro proyecto (Microcontroller) y la frecuencia declock elegida (Clock Frequency)

Todos estos valores pueden ser cambiados como veremos en el segundo capitulo desde la barra de menuacuteEl recuadro que esta inmediatamente debajo del anterior nos muestra (cuando estamos corriendo unasimulacioacuten de nuestro programa) cual es la instruccioacuten assembler en curso (Last Instruction) y cual seraacutela siguiente a ejecutar (Next Instruction)

Luego tenemos un cuadro con informacioacuten relativa a la ejecucioacuten del programa en la que vemos instruccioacutena instruccioacuten durante todo el tiempo en que estemos corriendo la simulacioacuten el valor que va tomando elcontador de programa (PC o Program Counter) el registro de trabajo (W Register por working) ysobre la derecha la cantidad de instrucciones simuladas (Instructions Counter) la cantidad de ciclos dereloj transcurridos (Clock Cycles Counter) y el tiempo de ejecucioacuten que llevariacutea en realidad dichoprograma (Real Time Duration) Cabe aclarar que como en todo simulador la relacioacuten entre el tiempo realy el tiempo de simulacioacuten varia dependiendo de los recursos de nuestro ordenador y en general losprogramas simulados demoran mucho mas tiempo que el real en ejecutarse

A continuacioacuten sobre la izquierda vemos una lista de desplazamiento que contiene el valor de todos losregistros especiales con los que cuenta el microcontrolador elegido Esta lista varia por supuesto concada microcontrolador y en el momento de correr la simulacioacuten va reflejando instruccioacuten a instruccioacuten elvalor de cada timer puerto registro de estado interrupciones etc Los valores se muestran enhexadecimal (Hex Value) y en binario (Binary Value) Cada registro se identifica mediante su direccioacuten(Address) y tambieacuten por el nombre con el que figura en la hoja de datos (Name)

Por ultimo y a la derecha del cuadro anterior tenemos el valor de todos los registros de propoacutesito general(GPRs o general purpose register) La lista tiene dos columnas cada una indicando la direccioacuten delregistro (Addr) y su valor en hexadecimal (Hex Value)

[ Volver al Iacutendice ]

gt Capitulo 02 - El menuacute principalLa mayoriacutea de las funciones de las que dispone esta herramienta estaacuten agrupadas dentro del menuacute principalde la aplicacioacuten Es de destacar que todos los moacutedulos que se pueden invocar desde aquiacute se abren enventanas separadas y pueden ser configuradas (como veremos) para que se situacuteen permanentementedelante de las demaacutes ventanas de manera que no las perdamos de vista Este es el menuacute principal

Como es costumbre en toda aplicacioacuten de windows la opcioacuten File es la primera del menuacute Contiene solodos comandosClear Memory (Limpiar memoria) que se encarga de eliminar de la memoria del simulador elprograma que estuviese cargado que puede ser invocada mediante las teclas CTRL+R y LoadProgram (Cargar Programa) que nos lleva a un cuadro de dialogo tiacutepico que nos permite seleccionar elarchivo HEX que queremos simular Esta funcioacuten puede invocarse con CTRL+LDentro de la segunda opcioacuten Simulation tenemos tres opciones que se encargan de manejar lasimulacioacuten en cursoStart Step y Stop La primera de ellas arranca la simulacioacuten la segunda se encargade avanzar una instruccioacuten (solo esta habilitada cuando en Rate hemos seleccionado el modo paso a paso)y la tercera detiene la simulacioacuten Es muy practico utilizar F1 F2 y F3 para invocar estas opcionesRate es el submenuacute que determina el modo de ejecucioacuten de la simulacioacuten brindando 6 posibilidades

Estas son Step By Step (paso a paso) Slow (Lenta) Normal (Normal) Fast (Raacutepida) ExtremelyFast (muy raacutepida) y Ultimate (No Refresh) que es la mas raacutepida de todas pero que no actualiza lapantalla principal del simulador Esta opcioacuten resulta muy uacutetil para adelantar partes del programa que

sabemos que no tienen problemas Todas pueden ser invocadas con CTRL+F1 a CTRL+F6 tal como se veen la figura anteriorTools es el submenuacute encargado de invocar a cada uno de los moacutedulos que integran el simulador y queveremos en detalle en capiacutetulos siguientes Tal como se ve en la figura la mayoriacutea de ellos se puedenactivar mediante la combinacioacuten de la tecla CTRL y alguna mas

Desde Options (Opciones) tenemos acceso a un conjunto de alternativas de configuracioacuten Dedicaremosbastante espacio a cada una de ellas en los capiacutetulos correspondientes pero podemos adelantar que lasmas importantes y que debemos revisar en cada proyecto son Select Microcontroler (seleccionarmicrocontrolador) que nos permite elegir el modelo concreto de PIC a utilizar Change ClockFrecuency (cambiar frecuencia de clock) y Configuration Bits (bits de configuracioacuten) desde la que sepuede elegir la funcioacuten de algunos pines (Reset o IO etc) el tipo de oscilador a usar etc La ultimaopcioacuten de este submenuacute permite cambiar los colores de la interfaz (Change Color Theme)

[ Volver al Iacutendice ]

gt Capitulo 03 - Herramientas (primera parte)PIC SIMULATOR IDE posee una nutrida caja de herramientas Estas se encuentran agrupadas en laopcioacuten Tools del menuacute principal y a continuacioacuten veremos en que consiste cada una de ellasLa primera es el visor de la memoria de programa (Program Memory Viewer) modulo que podemosinvocar presionando CTRL-M en cualquier momento Se lista la memoria completa cuya extensioacutendependeraacute del microcontrolador que tengamos seleccionado y se pueden ver tres columnas direccioacuten(Address) valor en hexadecimal de esa direccioacuten (Hex Value) y el valor en binario (Binary Value) Aligual que las demaacutes herramientas existe un check box que permite poner la ventana correspondientesiempre al frente (Always On Top)

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor y como su nombre indicanos permite modificar los valores almacenados en la memoria EEPROM del microcontrolador El contenido dela EEPROM se lista en 16 columnas numeradas del 0 al 15 y por supuesto su extensioacuten depende del microseleccionado Haciendo click sobre cualquiera de los valores se puede cambiar su contenido que seencuentra en formato hexadecimal

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack (generalmentellamado pila en espantildeol) Esto puede resultar uacutetil para depurar los programas que tienen muchas subrutinasanidadas o cuando sospechamos que hay desbordamientos del stack Ademaacutes de ver el nivel de stack(Stack Level) el contenido en hexadecimal (Hex Value) y en binario (Binary Value) en la parte inferiorde la ventana una etiqueta nos informa de cual es el nivel apuntado en cada paso de la simulacioacuten

La herramienta Microcontroller View es una de las mas uacutetiles ya que en una ventana separada (y quecomo las demaacutes se puede poner en frente de todas) nos muestra un esquema del micro elegido con elrotulo correspondiente a cada pin y lo mas importante el estado en cada momento de la simulacioacuten decada uno En caso de ser un pin ES nos muestra el estado (ONOFF) que presenta y si se trata de unareferencia de voltaje muestra el valor asignado Ademaacutes en cada pin hay un botoacuten que permite cambiar elestado presente en el (T supongo que por toggle que significa cambiar) y los resultados se tomancomo entradas para la simulacioacuten

Existe tambieacuten una vista alternativa del estado de los registros especiales que pude resultar mas coacutemodaen algunos casos Es la correspondiente a la opcioacuten Alternative SFR Viewer y muestra en columnas ladireccioacuten en hexa del registro el nombre de pila del mismo (TMR0 PCL STATUS etc) y el valor delmismo en hexadecimal y en binario

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 3: Pic Simulator IDE Manual

Luego tenemos un cuadro con informacioacuten relativa a la ejecucioacuten del programa en la que vemos instruccioacutena instruccioacuten durante todo el tiempo en que estemos corriendo la simulacioacuten el valor que va tomando elcontador de programa (PC o Program Counter) el registro de trabajo (W Register por working) ysobre la derecha la cantidad de instrucciones simuladas (Instructions Counter) la cantidad de ciclos dereloj transcurridos (Clock Cycles Counter) y el tiempo de ejecucioacuten que llevariacutea en realidad dichoprograma (Real Time Duration) Cabe aclarar que como en todo simulador la relacioacuten entre el tiempo realy el tiempo de simulacioacuten varia dependiendo de los recursos de nuestro ordenador y en general losprogramas simulados demoran mucho mas tiempo que el real en ejecutarse

A continuacioacuten sobre la izquierda vemos una lista de desplazamiento que contiene el valor de todos losregistros especiales con los que cuenta el microcontrolador elegido Esta lista varia por supuesto concada microcontrolador y en el momento de correr la simulacioacuten va reflejando instruccioacuten a instruccioacuten elvalor de cada timer puerto registro de estado interrupciones etc Los valores se muestran enhexadecimal (Hex Value) y en binario (Binary Value) Cada registro se identifica mediante su direccioacuten(Address) y tambieacuten por el nombre con el que figura en la hoja de datos (Name)

Por ultimo y a la derecha del cuadro anterior tenemos el valor de todos los registros de propoacutesito general(GPRs o general purpose register) La lista tiene dos columnas cada una indicando la direccioacuten delregistro (Addr) y su valor en hexadecimal (Hex Value)

[ Volver al Iacutendice ]

gt Capitulo 02 - El menuacute principalLa mayoriacutea de las funciones de las que dispone esta herramienta estaacuten agrupadas dentro del menuacute principalde la aplicacioacuten Es de destacar que todos los moacutedulos que se pueden invocar desde aquiacute se abren enventanas separadas y pueden ser configuradas (como veremos) para que se situacuteen permanentementedelante de las demaacutes ventanas de manera que no las perdamos de vista Este es el menuacute principal

Como es costumbre en toda aplicacioacuten de windows la opcioacuten File es la primera del menuacute Contiene solodos comandosClear Memory (Limpiar memoria) que se encarga de eliminar de la memoria del simulador elprograma que estuviese cargado que puede ser invocada mediante las teclas CTRL+R y LoadProgram (Cargar Programa) que nos lleva a un cuadro de dialogo tiacutepico que nos permite seleccionar elarchivo HEX que queremos simular Esta funcioacuten puede invocarse con CTRL+LDentro de la segunda opcioacuten Simulation tenemos tres opciones que se encargan de manejar lasimulacioacuten en cursoStart Step y Stop La primera de ellas arranca la simulacioacuten la segunda se encargade avanzar una instruccioacuten (solo esta habilitada cuando en Rate hemos seleccionado el modo paso a paso)y la tercera detiene la simulacioacuten Es muy practico utilizar F1 F2 y F3 para invocar estas opcionesRate es el submenuacute que determina el modo de ejecucioacuten de la simulacioacuten brindando 6 posibilidades

Estas son Step By Step (paso a paso) Slow (Lenta) Normal (Normal) Fast (Raacutepida) ExtremelyFast (muy raacutepida) y Ultimate (No Refresh) que es la mas raacutepida de todas pero que no actualiza lapantalla principal del simulador Esta opcioacuten resulta muy uacutetil para adelantar partes del programa que

sabemos que no tienen problemas Todas pueden ser invocadas con CTRL+F1 a CTRL+F6 tal como se veen la figura anteriorTools es el submenuacute encargado de invocar a cada uno de los moacutedulos que integran el simulador y queveremos en detalle en capiacutetulos siguientes Tal como se ve en la figura la mayoriacutea de ellos se puedenactivar mediante la combinacioacuten de la tecla CTRL y alguna mas

Desde Options (Opciones) tenemos acceso a un conjunto de alternativas de configuracioacuten Dedicaremosbastante espacio a cada una de ellas en los capiacutetulos correspondientes pero podemos adelantar que lasmas importantes y que debemos revisar en cada proyecto son Select Microcontroler (seleccionarmicrocontrolador) que nos permite elegir el modelo concreto de PIC a utilizar Change ClockFrecuency (cambiar frecuencia de clock) y Configuration Bits (bits de configuracioacuten) desde la que sepuede elegir la funcioacuten de algunos pines (Reset o IO etc) el tipo de oscilador a usar etc La ultimaopcioacuten de este submenuacute permite cambiar los colores de la interfaz (Change Color Theme)

[ Volver al Iacutendice ]

gt Capitulo 03 - Herramientas (primera parte)PIC SIMULATOR IDE posee una nutrida caja de herramientas Estas se encuentran agrupadas en laopcioacuten Tools del menuacute principal y a continuacioacuten veremos en que consiste cada una de ellasLa primera es el visor de la memoria de programa (Program Memory Viewer) modulo que podemosinvocar presionando CTRL-M en cualquier momento Se lista la memoria completa cuya extensioacutendependeraacute del microcontrolador que tengamos seleccionado y se pueden ver tres columnas direccioacuten(Address) valor en hexadecimal de esa direccioacuten (Hex Value) y el valor en binario (Binary Value) Aligual que las demaacutes herramientas existe un check box que permite poner la ventana correspondientesiempre al frente (Always On Top)

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor y como su nombre indicanos permite modificar los valores almacenados en la memoria EEPROM del microcontrolador El contenido dela EEPROM se lista en 16 columnas numeradas del 0 al 15 y por supuesto su extensioacuten depende del microseleccionado Haciendo click sobre cualquiera de los valores se puede cambiar su contenido que seencuentra en formato hexadecimal

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack (generalmentellamado pila en espantildeol) Esto puede resultar uacutetil para depurar los programas que tienen muchas subrutinasanidadas o cuando sospechamos que hay desbordamientos del stack Ademaacutes de ver el nivel de stack(Stack Level) el contenido en hexadecimal (Hex Value) y en binario (Binary Value) en la parte inferiorde la ventana una etiqueta nos informa de cual es el nivel apuntado en cada paso de la simulacioacuten

La herramienta Microcontroller View es una de las mas uacutetiles ya que en una ventana separada (y quecomo las demaacutes se puede poner en frente de todas) nos muestra un esquema del micro elegido con elrotulo correspondiente a cada pin y lo mas importante el estado en cada momento de la simulacioacuten decada uno En caso de ser un pin ES nos muestra el estado (ONOFF) que presenta y si se trata de unareferencia de voltaje muestra el valor asignado Ademaacutes en cada pin hay un botoacuten que permite cambiar elestado presente en el (T supongo que por toggle que significa cambiar) y los resultados se tomancomo entradas para la simulacioacuten

Existe tambieacuten una vista alternativa del estado de los registros especiales que pude resultar mas coacutemodaen algunos casos Es la correspondiente a la opcioacuten Alternative SFR Viewer y muestra en columnas ladireccioacuten en hexa del registro el nombre de pila del mismo (TMR0 PCL STATUS etc) y el valor delmismo en hexadecimal y en binario

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 4: Pic Simulator IDE Manual

[ Volver al Iacutendice ]

gt Capitulo 02 - El menuacute principalLa mayoriacutea de las funciones de las que dispone esta herramienta estaacuten agrupadas dentro del menuacute principalde la aplicacioacuten Es de destacar que todos los moacutedulos que se pueden invocar desde aquiacute se abren enventanas separadas y pueden ser configuradas (como veremos) para que se situacuteen permanentementedelante de las demaacutes ventanas de manera que no las perdamos de vista Este es el menuacute principal

Como es costumbre en toda aplicacioacuten de windows la opcioacuten File es la primera del menuacute Contiene solodos comandosClear Memory (Limpiar memoria) que se encarga de eliminar de la memoria del simulador elprograma que estuviese cargado que puede ser invocada mediante las teclas CTRL+R y LoadProgram (Cargar Programa) que nos lleva a un cuadro de dialogo tiacutepico que nos permite seleccionar elarchivo HEX que queremos simular Esta funcioacuten puede invocarse con CTRL+LDentro de la segunda opcioacuten Simulation tenemos tres opciones que se encargan de manejar lasimulacioacuten en cursoStart Step y Stop La primera de ellas arranca la simulacioacuten la segunda se encargade avanzar una instruccioacuten (solo esta habilitada cuando en Rate hemos seleccionado el modo paso a paso)y la tercera detiene la simulacioacuten Es muy practico utilizar F1 F2 y F3 para invocar estas opcionesRate es el submenuacute que determina el modo de ejecucioacuten de la simulacioacuten brindando 6 posibilidades

Estas son Step By Step (paso a paso) Slow (Lenta) Normal (Normal) Fast (Raacutepida) ExtremelyFast (muy raacutepida) y Ultimate (No Refresh) que es la mas raacutepida de todas pero que no actualiza lapantalla principal del simulador Esta opcioacuten resulta muy uacutetil para adelantar partes del programa que

sabemos que no tienen problemas Todas pueden ser invocadas con CTRL+F1 a CTRL+F6 tal como se veen la figura anteriorTools es el submenuacute encargado de invocar a cada uno de los moacutedulos que integran el simulador y queveremos en detalle en capiacutetulos siguientes Tal como se ve en la figura la mayoriacutea de ellos se puedenactivar mediante la combinacioacuten de la tecla CTRL y alguna mas

Desde Options (Opciones) tenemos acceso a un conjunto de alternativas de configuracioacuten Dedicaremosbastante espacio a cada una de ellas en los capiacutetulos correspondientes pero podemos adelantar que lasmas importantes y que debemos revisar en cada proyecto son Select Microcontroler (seleccionarmicrocontrolador) que nos permite elegir el modelo concreto de PIC a utilizar Change ClockFrecuency (cambiar frecuencia de clock) y Configuration Bits (bits de configuracioacuten) desde la que sepuede elegir la funcioacuten de algunos pines (Reset o IO etc) el tipo de oscilador a usar etc La ultimaopcioacuten de este submenuacute permite cambiar los colores de la interfaz (Change Color Theme)

[ Volver al Iacutendice ]

gt Capitulo 03 - Herramientas (primera parte)PIC SIMULATOR IDE posee una nutrida caja de herramientas Estas se encuentran agrupadas en laopcioacuten Tools del menuacute principal y a continuacioacuten veremos en que consiste cada una de ellasLa primera es el visor de la memoria de programa (Program Memory Viewer) modulo que podemosinvocar presionando CTRL-M en cualquier momento Se lista la memoria completa cuya extensioacutendependeraacute del microcontrolador que tengamos seleccionado y se pueden ver tres columnas direccioacuten(Address) valor en hexadecimal de esa direccioacuten (Hex Value) y el valor en binario (Binary Value) Aligual que las demaacutes herramientas existe un check box que permite poner la ventana correspondientesiempre al frente (Always On Top)

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor y como su nombre indicanos permite modificar los valores almacenados en la memoria EEPROM del microcontrolador El contenido dela EEPROM se lista en 16 columnas numeradas del 0 al 15 y por supuesto su extensioacuten depende del microseleccionado Haciendo click sobre cualquiera de los valores se puede cambiar su contenido que seencuentra en formato hexadecimal

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack (generalmentellamado pila en espantildeol) Esto puede resultar uacutetil para depurar los programas que tienen muchas subrutinasanidadas o cuando sospechamos que hay desbordamientos del stack Ademaacutes de ver el nivel de stack(Stack Level) el contenido en hexadecimal (Hex Value) y en binario (Binary Value) en la parte inferiorde la ventana una etiqueta nos informa de cual es el nivel apuntado en cada paso de la simulacioacuten

La herramienta Microcontroller View es una de las mas uacutetiles ya que en una ventana separada (y quecomo las demaacutes se puede poner en frente de todas) nos muestra un esquema del micro elegido con elrotulo correspondiente a cada pin y lo mas importante el estado en cada momento de la simulacioacuten decada uno En caso de ser un pin ES nos muestra el estado (ONOFF) que presenta y si se trata de unareferencia de voltaje muestra el valor asignado Ademaacutes en cada pin hay un botoacuten que permite cambiar elestado presente en el (T supongo que por toggle que significa cambiar) y los resultados se tomancomo entradas para la simulacioacuten

Existe tambieacuten una vista alternativa del estado de los registros especiales que pude resultar mas coacutemodaen algunos casos Es la correspondiente a la opcioacuten Alternative SFR Viewer y muestra en columnas ladireccioacuten en hexa del registro el nombre de pila del mismo (TMR0 PCL STATUS etc) y el valor delmismo en hexadecimal y en binario

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 5: Pic Simulator IDE Manual

sabemos que no tienen problemas Todas pueden ser invocadas con CTRL+F1 a CTRL+F6 tal como se veen la figura anteriorTools es el submenuacute encargado de invocar a cada uno de los moacutedulos que integran el simulador y queveremos en detalle en capiacutetulos siguientes Tal como se ve en la figura la mayoriacutea de ellos se puedenactivar mediante la combinacioacuten de la tecla CTRL y alguna mas

Desde Options (Opciones) tenemos acceso a un conjunto de alternativas de configuracioacuten Dedicaremosbastante espacio a cada una de ellas en los capiacutetulos correspondientes pero podemos adelantar que lasmas importantes y que debemos revisar en cada proyecto son Select Microcontroler (seleccionarmicrocontrolador) que nos permite elegir el modelo concreto de PIC a utilizar Change ClockFrecuency (cambiar frecuencia de clock) y Configuration Bits (bits de configuracioacuten) desde la que sepuede elegir la funcioacuten de algunos pines (Reset o IO etc) el tipo de oscilador a usar etc La ultimaopcioacuten de este submenuacute permite cambiar los colores de la interfaz (Change Color Theme)

[ Volver al Iacutendice ]

gt Capitulo 03 - Herramientas (primera parte)PIC SIMULATOR IDE posee una nutrida caja de herramientas Estas se encuentran agrupadas en laopcioacuten Tools del menuacute principal y a continuacioacuten veremos en que consiste cada una de ellasLa primera es el visor de la memoria de programa (Program Memory Viewer) modulo que podemosinvocar presionando CTRL-M en cualquier momento Se lista la memoria completa cuya extensioacutendependeraacute del microcontrolador que tengamos seleccionado y se pueden ver tres columnas direccioacuten(Address) valor en hexadecimal de esa direccioacuten (Hex Value) y el valor en binario (Binary Value) Aligual que las demaacutes herramientas existe un check box que permite poner la ventana correspondientesiempre al frente (Always On Top)

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor y como su nombre indicanos permite modificar los valores almacenados en la memoria EEPROM del microcontrolador El contenido dela EEPROM se lista en 16 columnas numeradas del 0 al 15 y por supuesto su extensioacuten depende del microseleccionado Haciendo click sobre cualquiera de los valores se puede cambiar su contenido que seencuentra en formato hexadecimal

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack (generalmentellamado pila en espantildeol) Esto puede resultar uacutetil para depurar los programas que tienen muchas subrutinasanidadas o cuando sospechamos que hay desbordamientos del stack Ademaacutes de ver el nivel de stack(Stack Level) el contenido en hexadecimal (Hex Value) y en binario (Binary Value) en la parte inferiorde la ventana una etiqueta nos informa de cual es el nivel apuntado en cada paso de la simulacioacuten

La herramienta Microcontroller View es una de las mas uacutetiles ya que en una ventana separada (y quecomo las demaacutes se puede poner en frente de todas) nos muestra un esquema del micro elegido con elrotulo correspondiente a cada pin y lo mas importante el estado en cada momento de la simulacioacuten decada uno En caso de ser un pin ES nos muestra el estado (ONOFF) que presenta y si se trata de unareferencia de voltaje muestra el valor asignado Ademaacutes en cada pin hay un botoacuten que permite cambiar elestado presente en el (T supongo que por toggle que significa cambiar) y los resultados se tomancomo entradas para la simulacioacuten

Existe tambieacuten una vista alternativa del estado de los registros especiales que pude resultar mas coacutemodaen algunos casos Es la correspondiente a la opcioacuten Alternative SFR Viewer y muestra en columnas ladireccioacuten en hexa del registro el nombre de pila del mismo (TMR0 PCL STATUS etc) y el valor delmismo en hexadecimal y en binario

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 6: Pic Simulator IDE Manual

[ Volver al Iacutendice ]

gt Capitulo 03 - Herramientas (primera parte)PIC SIMULATOR IDE posee una nutrida caja de herramientas Estas se encuentran agrupadas en laopcioacuten Tools del menuacute principal y a continuacioacuten veremos en que consiste cada una de ellasLa primera es el visor de la memoria de programa (Program Memory Viewer) modulo que podemosinvocar presionando CTRL-M en cualquier momento Se lista la memoria completa cuya extensioacutendependeraacute del microcontrolador que tengamos seleccionado y se pueden ver tres columnas direccioacuten(Address) valor en hexadecimal de esa direccioacuten (Hex Value) y el valor en binario (Binary Value) Aligual que las demaacutes herramientas existe un check box que permite poner la ventana correspondientesiempre al frente (Always On Top)

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor y como su nombre indicanos permite modificar los valores almacenados en la memoria EEPROM del microcontrolador El contenido dela EEPROM se lista en 16 columnas numeradas del 0 al 15 y por supuesto su extensioacuten depende del microseleccionado Haciendo click sobre cualquiera de los valores se puede cambiar su contenido que seencuentra en formato hexadecimal

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack (generalmentellamado pila en espantildeol) Esto puede resultar uacutetil para depurar los programas que tienen muchas subrutinasanidadas o cuando sospechamos que hay desbordamientos del stack Ademaacutes de ver el nivel de stack(Stack Level) el contenido en hexadecimal (Hex Value) y en binario (Binary Value) en la parte inferiorde la ventana una etiqueta nos informa de cual es el nivel apuntado en cada paso de la simulacioacuten

La herramienta Microcontroller View es una de las mas uacutetiles ya que en una ventana separada (y quecomo las demaacutes se puede poner en frente de todas) nos muestra un esquema del micro elegido con elrotulo correspondiente a cada pin y lo mas importante el estado en cada momento de la simulacioacuten decada uno En caso de ser un pin ES nos muestra el estado (ONOFF) que presenta y si se trata de unareferencia de voltaje muestra el valor asignado Ademaacutes en cada pin hay un botoacuten que permite cambiar elestado presente en el (T supongo que por toggle que significa cambiar) y los resultados se tomancomo entradas para la simulacioacuten

Existe tambieacuten una vista alternativa del estado de los registros especiales que pude resultar mas coacutemodaen algunos casos Es la correspondiente a la opcioacuten Alternative SFR Viewer y muestra en columnas ladireccioacuten en hexa del registro el nombre de pila del mismo (TMR0 PCL STATUS etc) y el valor delmismo en hexadecimal y en binario

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 7: Pic Simulator IDE Manual

La herramienta Microcontroller View es una de las mas uacutetiles ya que en una ventana separada (y quecomo las demaacutes se puede poner en frente de todas) nos muestra un esquema del micro elegido con elrotulo correspondiente a cada pin y lo mas importante el estado en cada momento de la simulacioacuten decada uno En caso de ser un pin ES nos muestra el estado (ONOFF) que presenta y si se trata de unareferencia de voltaje muestra el valor asignado Ademaacutes en cada pin hay un botoacuten que permite cambiar elestado presente en el (T supongo que por toggle que significa cambiar) y los resultados se tomancomo entradas para la simulacioacuten

Existe tambieacuten una vista alternativa del estado de los registros especiales que pude resultar mas coacutemodaen algunos casos Es la correspondiente a la opcioacuten Alternative SFR Viewer y muestra en columnas ladireccioacuten en hexa del registro el nombre de pila del mismo (TMR0 PCL STATUS etc) y el valor delmismo en hexadecimal y en binario

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 8: Pic Simulator IDE Manual

PIC Disassembler es ni mas ni menos que un desensamblador que nos brinda un texto con el contenidoen assembler del programa cargado en la memoria del PIC SIMULATOR IDE Este listado se generaindependientemente del origen del programa es decir podemos obtener el coacutedigo a partir de un archivo yacompilado con cualquier compilador (con extensioacuten HEX) o a partir de un HEX generado con el compiladorBASIC incluido en el paquete Se muestra por cada instruccioacuten la direccioacuten (Address) el opcode y lainstruccioacuten (instruction) Ideal para aprender assembler a partir de instrucciones BASIC por ejemplo

El manejador de puntos de inspeccioacuten o Breakpoint Manager es una herramienta que permite definirhasta 10 puntos en los que la simulacioacuten se interrumpiraacute (luego podremos reanudar la ejecucioacuten desde esepunto) para analizar con tranquilidad el estado de los registros los puertos etc Hay un par de opcionesadicionales como el botoacuten que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) omantener siempre en foco el contador de programa (PC o Program Counter) El contenido de la ventana esel coacutedigo assembler en el mismo formato que comentamos en la herramienta anterior

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 9: Pic Simulator IDE Manual

Ademaacutes de los diez puntos de parada anteriores se pueden definir cinco puntos especiales mediante laherramientaSpecial Breakpoints La diferencia entre esta y la anterior herramienta (y lo que la hace tanespecial) es que en este caso los puntos de inspeccioacuten se fijan mediante una condicioacuten (Break Condition)o por el estado de alguacuten registro (Register Address) Los botones SET y DEL permiten habilitar ydeshabilitar individualmente cada una de las condiciones

La herramienta assembler tendraacute su capitulo propio por que es aquiacute donde se escribe el coacutedigo en dicholenguaje para luego compilarlo

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 10: Pic Simulator IDE Manual

Al igual que el editor de assembler el BASIC tendraacute varios capiacutetulos dedicados a el ya que estudiaremoscada una de las instrucciones disponibles Podemos adelantar que se trata de un editor bastante decentecon verificacioacuten de sintaxis y coloreado de palabras reservadas y comentarios y que la sintaxis del BASICes compatible en un 90 con otros BASICs mas populares como PBP o PROTON Desde aquiacute podemoscompilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 11: Pic Simulator IDE Manual

[ Volver al Iacutendice ]

gt Capitulo 04 - Herramientas (Segunda parte)

Las herramientas siguientes son las que podemos usar como perifeacutericos del microcontrolador para simularlas ES o analizar su estado La primera de este grupo es la llamada 8xLED Board que es ni mas ni menosque un grupo de 8 LEDs virtuales a los que podemos asignar un puerto y un bit dentro de el de maneraque se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulacioacuten

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemosconfigurar con total flexibilidad para utilizarlo en nuestros proyectos simulados Se puede elegir el pin decada fila y columna y dinaacutemicamente durante la simulacioacuten el estado de cada tecla En los ejemplos delos capiacutetulos dedicados a la programacioacuten usaremos esta herramienta a menudo

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 12: Pic Simulator IDE Manual

El LCD Module es la versioacuten virtual del tiacutepico display LCD con controlador Hitachi que usamos en todosnuestros proyectos Es posible configurar completamente su funcionamiento mediante el botoacuten Setup Alpresionarlo la ventana aumenta su tamantildeo y aparecen una serie de cuadros de seleccioacuten desde dondepodremos elegir el numero de filas y columnas del display el color del mismo a que puerto estaacutenconectadas las liacuteneas de datos y si son 4 u 8 y donde estaacuten conectadas (puerto y pin) las liacuteneas RS RWy E Tambieacuten se pueden configurar los tiempos de delay del display para que su simulacioacuten sea lo mas fielposible a la realidad

Graphical 128x64 LCD Module es el equivalente de la herramienta anterior pero para simular LCDsgraacuteficos de 128x64 pixeles Las opciones de configuracioacuten tambieacuten se esconden detraacutes del botoacuten Setup yson muy similares a las ya vistas incorporaacutendose la posibilidad de configurar el puerto y pin de las liacuteneasCS1 y CS2

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 13: Pic Simulator IDE Manual

Mediante las herramientas Hardware UART Simulation Interface Software UART SimulationInterface y PCs Serial Port Terminal podremos simular una comunicacioacuten viacutea RS-232 Se trata deherramientas muy completas que tendraacuten su propio capitulo por lo que momentaacuteneamente nos limitamos amencionarlas

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 14: Pic Simulator IDE Manual

Otras dos herramientas sumamente uacutetiles para comprender que esta haciendo en cada momento elmicrocontrolador son el osciloscopio (Oscilloscope) de cuatro canales con posibilidad total deconfiguracioacuten de cada uno de ellos y elSignal Generator (generador de sentildeales) tambieacuten de cuatrocanales y con posibilidad de generar pulsos de periodo y relacioacuten ciacuteclica ajustable Por supuesto habraacutecapiacutetulos en que haremos uso de ellas

No podiacutea 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 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 15: Pic Simulator IDE Manual

proyectos En este caso la herramienta 7-Segment LED Display Panel nos proporciona 4 diacutegitoscompletamente configurables (nuevamente mediante el botoacuten Setup presente en cada uno de ellos) ypodemos elegir el pin al que esta conectada cada uno de los segmentos si son de aacutenodo o caacutetodo comuacutenetc

La ultima herramienta es una uacutetil lista con el valor de cada una de las variables presentes en nuestroprograma Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en unacolumna aparece el nombre de la variable en cuestioacuten y en otra su valor Esta lista se actualizaconstantemente durante la simulacioacuten

[ Volver al Iacutendice ]

gt Capitulo 05 - Sistemas de numeracioacutenExisten muchas maneras de representar un numero De hecho en teoriacutea es posible hacerlo de infinitasmaneras ya que podemos elegir como base cualquier numero entero Generalmente los mas usados en elmundo de la programacioacuten son el sistema decimal que utiliza como base el numero 10 el sistema binarioque utiliza como base el numero 2 y el hexadecimal que utiliza el numero 16 como base

Sistema DecimalComo su nombre lo indica el sistema decimal toma como base para construir los nuacutemeros potencias

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 16: Pic Simulator IDE Manual

sucesivas del numero 10 Se utilizan los siacutembolos del 0 al 9 y el peso de cada cifra esta dado por suposicioacuten dado que se multiplica por 10 elevado a la posicioacuten en que se encuentra el digito menos unoComo en todos los sistemas de numeracioacuten el digito de menos peso es el que esta mas a la derecha y elde 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 el tiempo no nos detenemos a pensar en como se construyecada numero pero cuando leemos el numero 123 en realidad esta construido de la siguiente manera

(1 10^2) + (2 10^1) + (3 10^0) =(1 100) + (2 10) + (3 1) =

100 + 20 + 3 =123

Sistema binarioEl sistema binario el ideal para usar en electroacutenica debido a que solo posee dos siacutembolos el 0 y el 1 quepueden ser codificados como presencia o ausencia de tensioacuten utiliza como base el numero 2 en lugar del10 En todo lo demaacutes es exactamente igual al decimal Si nos parece mas complicado es solamente porque no tenemos la suficiente practica con elUn numero binario esta construido mediante una secuencia de diacutegitos binarios (que para abreviar llamamosbits) Muchas veces se agrupan de diferentes maneras para poder trabajarlos mas coacutemodamente y aesas agrupaciones de les da un nombre siendo los mas utilizados los siguientes

Nombre Tamantildeo (bits) Ejemplo

Bit 1 1

Nibble 4 0101

Byte 8 00000101

Word 16 0000000000000101

Como en cualquier sistema de numeracioacuten los ceros a la izquierda no modifican el valor del numerorepresentado Es muy comuacuten en el sistema binario agregar ceros a la izquierda para completar unagrupacioacuten de las anteriores Por ejemplo si tenemos el numero binario 101 lo podemos escribir dealgunas de las siguientes maneras

Nibble 0101

Byte 00000101

Word 0000000000000101

Dentro de un byte (la agrupacioacuten de bits mas comuacuten) se numeran los bits que lo componen de acuerdo a lasiguiente convencioacuten

1) El bit ubicado mas a la derecha es el bit cero2) 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 lamisma manera al ubicado mas a la izquierda se lo llama MSB (most significant bit o bit mas significativo)Y nos referimos a los demaacutes bits intermedios por su numero de bit correspondiente bit 2 bit 3 etc

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 17: Pic Simulator IDE Manual

De todo esto podemos deducir que el tipo de dato mas pequentildeo que podemos manejar es el bit que solopuede tener dos valores 1 o 0 Estos dos estados representan generalmente encendido o apagadoverdadero o falso si o no etcComo podemos ver en la tabla de mas arriba el nibble es la unioacuten de cuatro bits Dado que 2x2x2x2 = 16este es el numero de valores posibles que puede tomar un nibbleLa estructura mas utilizada es el byte que agrupa 8 bits (o dos nibbles) y que puede tomar valores entre0 y 255 (2^8 valores posibles) Si tomamos dos bytes y los pegamos uno detraacutes del otro obtenemos unapalabra (word) que permite 65536 (2^16) valores diferentes

Sistema hexadecimalSi tomamos 16 siacutembolos para representar los nuacutemeros (en lugar de dos o diez) obtenemos un sistema quese llama hexadecimal A los siacutembolos 09 se agregan las letras A B C D E y F y es un sistema denumeracioacuten muy utilizado en programacioacuten Algunas de sus ventajas son que cada digito de un numerohexadecimal es exactamente un nibble o que cada dos diacutegitos hexadecimales son un byte Estoproporciona 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

[ Volver al Iacutendice ]

gt Capitulo 06 - VariablesVamos a comenzar a ver algo de la programacioacuten en el BASIC incluido en el entorno PIC SIMULATOR IDE alque en adelante nos referiremos como BASIC a secasLa programacioacuten seria praacutecticamente imposible sin el uso de variables Podemos hacernos una imagenmental de las variables consistente en una caja en la que podemos guardar algo Esa caja es una de lasmuchas que disponemos y tiene en su frente pegada una etiqueta con su nombre Estas cajas tienenciertas particularidades que hace que solo se puedan guardar en ellas determinados tipos de objetosEn esta analogiacutea cada caja es una variable su contenido es el valor que adopta y la etiqueta es elnombre de la variable Como su nombre lo indica y como veremos mas adelante el contenido de unavariable puede ser modificado a lo largo del programa

El BASIC tenemos distintos tipos de variable seguacuten el dato que puedan almacenar

- Bit (un bit de longitud almacena 0 o 1 uacutenicamente) - Byte (un byte de longitud almacena nuacutemeros enteros entre 0 y 255) - Word (dos bytes de longitud almacena nuacutemeros enteros entre 0 y 65535) - Long (cuatro dos bytes de longitud almacena nuacutemeros enteros entre 0 y 4294967295)

El tipo Long solo esta disponible mediante un modulo opcional al PIC SIMULATOR IDEA diferencia de otros BASIC la declaracioacuten de variables puede ser hecha en cualquier parte del programa ytodas son consideradas globales es decir su valor es accesible desde todas las subrutinas y zonas delprograma El numero de variables esta loacutegicamente limitado al monto de memoria RAM disponible en cadamicrocontrolador Las variables las declaramos utilizando la instruccioacuten DIM como se muestra en lossiguientes ejemplos

DIM A AS BIT

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 18: Pic Simulator IDE Manual

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

Tambieacuten es posible utilizar vectores que son una matriz de dimensiones 1xN Por ejemplo la sentenciasiguiente

DIM A(10) AS BYTE

declara un vector (al que nos referiremos algunas veces como array) de diez elementos del tipo BYTEque seraacuten accedidos mediante el uso de subiacutendice (entre pareacutentesis) del 0 al 9LA sentencia RESERVE le permite al programador reservar un numero de posiciones de la RAM para su usoen rutinas en assembler o para el In-Circuit Debugger de MPLAB Simplemente si queremos reservar 20bytes de RAM escribimos

RESERVE 20

Las variables tipo Word como vimos estaacuten compuestas por dos bytes el primero de ellos es llamado bytealto y el otro bajo dado que el primero contiene los 8 bits mas significativos En BASIC podemosacceder 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 = BHB A = BLB Esto es lo mismo que A = B BHB = A BLB = A B = A Esto tambieacuten borra el byte alto de la variable B

Los bits individuales de cada variable pueden ser accedidos individualmente tambieacuten simplemente poniendocomo extensioacuten n donde n es el numero de bit (12 3 etc )

DIM A AS BYTE DIM B AS BITB = A1 B = A7 A0 = A5

Todos los registros del microcontrolador esta disponibles para usar en los programas BASIC como si setratase de variables del tipo BYTE con el nombre del registro utilizado en las datasheet (PORTA PORTBTRISA etc) Por supuesto se puede acceder a bits individuales de los registros con la teacutecnica vistapaacuterrafos atraacutes Algunos ejemplos

TRISA1 = 0 TRISB = 0 PORTA1 = 1 PORTB = 255 STATUSRP0 = 1 INTCONINTF = 0

Existe una forma corta de acceder a los bits individuales de cada port simplemente usando las variablesBASIC tipo byte RA RB RC RD RE o bien las tipo bit RA0 RA1 RA2 RE6 RE7

RA = 0xFF RB0 = 1

En BASIC tambieacuten podemos usar punteros En realidad cualquier variable definida como tipo BYTE o WORDpude ser usada como un putero de memoria usaacutendola como argumento de la funcioacuten 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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 19: Pic Simulator IDE Manual

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 faacuteciles de entender es el uso de nombressimboacutelicos o SYMBOL Un symbol es una cadena que contiene coacutedigo asignado a un nombre Al momentode compilar PIC BASIC hace la buacutesqueda y reemplazo de nuestros siacutembolos y luego genera el coacutedigo ASMy el HEX Supongamos que tenemos un LED conectado al bit cero del puerto B Mediante SYMBOL podemoshacer

SYMBOL LED1 = PORTB0

Luego si queremos encender el LED en lugar de

PORTB0 = 1

podemos hacer

LED1 = 1

que es mucho mas claro y faacutecil de leer Por supuesto el coacutedigo que aparece a la derecha del igual nopuede 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 posponiendoH 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 instruccioacuten 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 puederesolver con otras instrucciones o siacutembolos ayudan mucho en la lectura del coacutedigo Se tratan de HIGHLOW 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 elmismo bit en el TRIS correspondiente es puesto en cero y dicho pin queda configurado como salidaAlgunos ejemplos

HIGH PORTB0 LOW ADCON0ADON TOGGLE OPTION_REGINTEDG

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 20: Pic Simulator IDE Manual

[ Volver al Iacutendice ]

gt Capitulo 07 - Operaciones Loacutegicas y MatemaacuteticasPIC SIMULATOR IDE dispone de cinco operaciones matemaacuteticas baacutesicas disponibles para las variables tipoByte y Word Estas son la suma (operador +) la sustraccioacuten (operador -) el producto (operador ) elcociente (operador ) y el moacutedulo (operador MOD) Por supuesto el compilador es capaz de combinarlaspara obtener operaciones matemaacuteticas mas complejas

DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A 234 X = 2 X = (12345 - B X) (A + B)

Es posible calcular raiacuteces cuadradas (aunque el resultado debe ser entero) con la funcioacuten SQR

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

Para las variables de tipo Bit existen siete operaciones loacutegicas disponibles Solo es posible efectuar unaoperacioacuten loacutegica por instruccioacuten (aunque es muy posible que proacuteximas versiones permitan mas flexibilidadEste al tanto de las novedades) Estas operaciones tambieacuten estaacuten disponibles para variables tipo Word oByte 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

[ Volver al Iacutendice ]

gt Capitulo 08 - Mi primer programa Un LED parpadeandoLuego de todos estos capiacutetulos de introduccioacuten puramente teoacutericos vamos a encarar nuestro primerprograma A diferencia de un programa de ordenador donde uno escribe el programa lo compila lo ejecutay ya en el mundo de los microcontroladores hay que previamente definir el tipo de microcontrolador quese va a utilizar cual va a ser su frecuencia de clock como va a ser el circuito en que se va a utilizar elmismo etc

Para estas practicas utilizaremos un PIC16F628A uno de los mas difundidos y que mas o menos viene areemplazar 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 electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 21: Pic Simulator IDE Manual

practicas es el siguiente

Si bien se supone que quien esta leyendo este tutorial tiene una buena idea sobre electroacutenica ymicrocontroladores igualmente vamos a hacer una muy breve descripcioacuten del circuito

En primer lugar vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el xtal ycondensadores asociados El puerto B del micro (pines 6 al 13) esta conectado a 8 LEDs mediante 8resistencias de 220ohms que tienen como funcioacuten limitar la corriente que circula por los LEDS Estos seraacutennuestras salidas Los pines 17 y 18 correspondientes al PORTA0 y PORTA1 estaacuten conectados a sendospulsadores que al ser presionados conducen 5V (un 1) al pin respectivo Cuando estaacuten en reposo lasresistencias R1 y R2 se encargan de mantener el pin en 0 Por ultimo el pin 1 (PORTA2) comanda unparlante 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 fuentepuedes leer algo sobre el tema aquiacute

Volviendo a nuestro programa vamos a escribir el hola mundo de los microcontroladores encender unLED

El primer paso es desde el menuacute Opciones -gt Select Microcontroller elegir el PIC16F628A

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 22: Pic Simulator IDE Manual

Luego debemos configurar los bits correspondientes

Lo destacable por ahora de esta configuracioacuten es que estamos dejando la memoria (FLASH y EEPROM) sinproteccioacuten que el pin RESET se va a comportar como IO y que usaremos como oscilador el osciladorinterno INTRC

Una vez hecho esto arrancamos el edito de BASIC (presionando CTRL-C por ejemplo) y escribimos elsiguiente coacutedigo

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 23: Pic Simulator IDE Manual

Vamos a analizarlo liacutenea por liacutenea para entender su funcionamiento

La liacutenea 001 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de ES Esto

equivale a deshabilitar los comparadores conversores AD y todos los moacutedulos que pudiese tener nuestromicrocontrolador No es la uacutenica manera de hacer esto pero si la mas sencilla desde el punto de vista delprogramador BASIC

Las liacuteneas 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 continuacioacuten esta en

binario Se podriacutea 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 algunospines y como salidas otros haciendo algo parecido a TRISB = 11000111

En la liacutenea 006 encontramos una etiqueta ( loop ) Esta no hace nada solo sirve como referencia para

enviar el flujo del programa a esa liacutenea desde otro lugar mediante la sentencia Goto

La liacutenea 007 pone en 1 el pin correspondiente a PORTB0 de manera que en el pin 6 del microcontroladorhabraacute 5V Esta tensioacuten haraacute que circule una corriente a traveacutes de la resistencia limitadora y el LED1haciendo que este se encienda ya que el caacutetodo se encuentra conectado a 0V

En 008 tenemos la sentencia WaitMs 500 WaitMs se encarga de hacer una pausa en milisegundos La

duracioacuten de la pausa esta dada por el numero que sigue a la instruccioacuten en este caso 500 milisegundos omedio segundo

Luego en 009 otra vez se vuelve a poner en 0 el pin 6 mediante PORTB0 = 0 lo que provoca que ese

pin se ponga a 0V y no haya mas circulacioacuten de corriente a traveacutes de la resistencia y del LED con lo queeste se apaga

En 010 se hace nuevamente una pausa de medio segundo y por ultimo la liacutenea Goto Loop hace que el

programa continuacutee en la liacutenea 006 (que es donde esta la etiqueta Loop)

El programa se repite indefinidamente encendiendo el LED medio segundo apagaacutendolo otro medio segundo

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 24: Pic Simulator IDE Manual

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo siguiente en donde se nos informa entre otras cosas que no han ocurrido errores eltamantildeo 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 -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo quesigue

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 25: Pic Simulator IDE Manual

En la captura se puede apreciar que el pin 6 correspondiente a RB0 esta en ON Si esperamos losuficiente veremos como pasa a OFF y mas tarde vuelve a ON etc Si queremos esperar menostiempo y esto lo debemos tomar como una regla general al correr simulaciones podemos disminuir eltiempo indicado en las instrucciones WaitMS a valores iguales a 1 de esta manera la simulacioacuten seraacute

mucho mas aacutegil Por supuesto al momento de llevar el HEX a nuestro microcontrolador en el circuito realdebemos cambiar a los tiempos originales y volver a compilar Caso contrario el LED permaneceriacuteaencendido solo una mileacutesima de segundo luego apagado el mismo tiempo etc por lo que nuestro ojo lopercibiriacutea como encendido a medias incapaz de discriminar su verdadero estado

Se podriacutea haber utilizado la instruccioacuten 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 peroque resulta mas claro de entender ya que se aproxima algo mas al lenguaje natural

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 26: Pic Simulator IDE Manual

El programa BASIC puede descargarse desde [aquiacute] y el correspondiente archivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 09 - Mi segundo programa Usando un pulsadorEn la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC Utilizaremos el mismoesquema que vimos antes y el programa que mostramos a continuacioacuten

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 27: Pic Simulator IDE Manual

Como resulta evidente a simple vista el programa ejemplo2bas es muy similar al ejemplo1bas que vimosen el capitulo anterior Las diferencias estaacuten dentro del bucle La instruccioacuten de la liacutenea 007 ( PORTB0 =

PORTA0 ) 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 podriacutean haber elegido otros valores

Al ejecutarse el programa cada vez que se accione el pulsador conectado a PORTA0 ese pin se pondraacute aestado alto ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador Ese estadoalto se interpreta dentro del PIC como un 1 y es el valor que se le asigna a PORTB0 con lo que eltambieacuten pasara a estado alto Eso provocara que el led conectado en ese pin se ilumine

Cuando soltamos el pulsador PORTA0 vuelve a estado bajo ya que se pone a masa a traveacutes de laresistencia de 10K y PORTB0 haraacute lo propio apagando el LED

Nuestro sencillo (sencilliacutesimo) programa todo lo que hace es copiar en el LED el estado del pulsador

Si presionamos F9 o vamos al menuacute que vemos a continuacioacuten

PIC SIMULATOR IDE compilara el programa y cargara el HEX resultante en el simulador Apareceraacute elcuadro de dialogo que nos informa que no han ocurrido errores y que el tamantildeo del programa esta vez esde 20 words

Si volvemos a la ventana principal del PIC SIMULATOR IDE y desde Tools -gt MicrocontrollerView abrimos la vista del microntrolador al darle Start a la simulacioacuten tendremos algo parecido a lo que

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 28: Pic Simulator IDE Manual

sigue

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

Recordemos que el botoacuten T significa cambio (Toggle) por lo que el estado del pin 17 permaneceraacute enalto hasta que lo pulsemos otra vez y el estado del microcontrolador volveraacute a ser el inicial Como encualquier curso conviene realizar estas practicas que aunque puedan parecer muy sencillas nos ayudarana conocer las herramientas disponibles y tomar confianza al programa Tambieacuten es interesante el realizarcambios en el programa BASIC recompilar y analizar los resultados

El programa BASIC de este capitulo puede descargarse desde [aquiacute] y el correspondientearchivo HEX desde [aquiacute]

[ Volver al Iacutendice ]

gt Capitulo 10 - IF - THEN - ELSE - ENDIF

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 29: Pic Simulator IDE Manual

En cualquier programa medianamente complejo que queramos realizar seguramente necesitaremos en alguacutenpunto tomar alguna decisioacuten basaacutendonos en el estado de una entrada o en el valor de una variable PICBASIC incorpora instrucciones que nos permiten este tipo de comportamiento siendo la mas sencilla yfrecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF

Existen varias formas de utilizar esta instruccioacuten Comenzaremos con los casos mas sencillos y a lo largo deeste capitulo iremos agregando complejidad hasta ver todas las posibilidades

CASO 1 El caso mas simple es el siguiente

IF condicioacuten THEN instruccioacuten

IF significa SI y THEN significa LUEGO o ENTONCES El caso anterior puede leerse como SI se

cumple lacondicioacuten entonces ejecuto la instruccioacuten

La condicioacuten es una expresioacuten loacutegica que puede ser verdadera o falsa En caso de ser verdadera la

instruccioacuten a continuacioacuten del THEN seraacute ejecutada En caso de la condicioacuten sea falsa el programa seguiraacute

su ejecucioacuten con la instruccioacuten siguiente al IF - THEN

Veamos un ejemplo Supongamos el siguiente programa

ALLDIGITAL Voy a usar todos los pines como ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

IF PORTA4 = 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 aTOTAL se le asigna el valor 0 y a A el valor 2 Hasta aquiacute no hay nada que no hayamos visto

antes

La liacutenea siguiente realiza la siguiente tarea evaluacutea si la condicioacuten PORTA4 = 1 es cierta En caso de que

efectivamente el valor presente en el bit 4 del PORTA sea 1 se ejecuta la instruccioacuten a continuacioacuten

del THEN la variable A toma el valor 4 y se pasa a la instruccioacuten de abajo Si PORTA es igual a 0 se

pasa a la instruccioacuten siguiente sin mas

El valor final de la variable TOTAL depende entonces de cual sea el estado de PORTA4 al momento de

hacer la evaluacioacuten Si es igual a 1 TOTAL tendraacute un valor de 14 (10 + 4) Si PORTA4 = 0 TOTAL

tendraacute un valor de 12 (10 + 2)

Veamos algunos ejemplos validos de este caso

IF A = B THEN PORTA0 = 1IF B gt A THEN A = BIF B = 5 THEN A = 0IF (A = 0) OR (B = 5) THEN C = 2IF PORTA0 THEN PORTB3 = 0

En el ultimo ejemplo la condicioacuten PORTA0 equivale a PORTA0 = 1

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 30: Pic Simulator IDE Manual

CASO 2 Muchas veces luego de evaluar la condicioacuten necesitamos ejecutar mas de una instruccioacuten En losejemplos vistos en el CASO 1 siempre se ejecutaba una sola instruccioacuten cuando la condicioacuten era cierta Lamanera de ejecutar muacuteltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF

IF condicioacuten THEN instruccioacuten 1 instruccioacuten 2 instruccioacuten nENDIF

No varia praacutecticamente nada respecto del primer caso solo que esta vez se van a ejecutar todas lasinstrucciones que se encuentren entre el THEN y el ENDIF cada vez que condicioacuten sea verdadera

Veamos un ejemplo Supongamos el siguiente programa

DIM A AS BYTE Declaro la variable A como BYTEDIM B AS BYTE Declaro la variable B como BYTEDIM C AS BYTE Declaro la variable C como BYTEDIM D AS BYTE Declaro la variable D como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 0 Le asigno el valor 0 a la variable TOTALA = 2 Le asigno el valor 2 a la variable AB = 5 Le asigno el valor 5 a la variable BC = 1 Le asigno el valor 1 a la variable CD = 0 Le asigno el valor 0 a la variable D

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

El ejemplo anterior la condicioacuten 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 ejecutariacutean y TOTAL seguiriacutea valiendo 0 al terminar el programa

CASO 3 Hay veces que de acuerdo a la condicioacuten queremos ejecutar un grupo u otro de instruccionesPara eso utilizamos el ELSE

IF condicioacuten THEN instruccioacutenv 1 instruccioacutenv 2 instruccioacutenv nELSE instruccioacutenf 1 instruccioacutenf 2 instruccioacutenf nENDIF

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 31: Pic Simulator IDE Manual

Es decir si la condicioacuten es verdadera se ejecutan las sentencias entre THEN y ELSE Y si la condicioacuten es

falsa las que esteacuten 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 ES

TRISA = 11111111 Todo el PORTA como entradasDIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS BYTE Declaro la variable TOTAL como BYTE

TOTAL = 10 Le asigno el valor 10 a la variable TOTALA = 2 Le asigno el valor 2 a la variable A

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

El ejemplo anterior la condicioacuten PORTA4 = 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 continuacioacuten delENDIF

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 deesta caracteriacutestica ya que debido a limitaciones en el tamantildeo de la pila y cantidad de memoria disponibledel PIC podemos ocasionar un desborde y el programa colapsara Este seria un ejemplo de un anidamiento

IF PORTB1 = 1 THEN IF A = 2 THEN A = B + (C D) TOTAL = A B ELSE A = 0 ENDIFELSE A = 19ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que estaacuten en azul

a la otra que se encuentra dentro (anidada en) de la primera

[ Volver al Iacutendice ]

gt Capitulo 11 - FOR - TO - STEP - NEXTAsiacute como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestrosprogramas las estructuras que permiten repetir un grupo de instrucciones un numero determinado deveces tambieacuten son indispensables En PIC SIMULATOR IDE hay dos de ellas Veremos en este capitulo laprimera FOR - TO - STEP - NEXT

Esta estructura necesita una variable (tipo Byte o Word) para funcionar En cada iteracioacuten del bucle la

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 32: Pic Simulator IDE Manual

variable va cambiando su valor Cuando el valor de la variable alcanza o supera el valor prefijado el bucletermina La forma del bucle es la siguiente

FOR variable = valor_inicial TO valor_final STEP paso instruccion1 instruccion2 instruccionnNEXT variable

Veamos un ejemplo concreto Supongamos que queremos sumar los nuacutemeros del 1 al 100 El programaquedariacutea como sigue

DIM A AS BYTE Declaro la variable A como BYTEDIM 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 TOTALNEXT A fin del bucle

Hemos declarado la variable A como BYTE ya que su valor va a mantenerse en el rango 0255

Para TOTAL utilizamos una variable tipo WORD ya que la suma va a superar el valor maacuteximo de un BYTE

(Recordemos que WORD permite valores en el rango 065535)

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 continuacioacuten del STEP En los casos

como este en que STEPvale 1 puede omitirse como veremos en ejemplos posteriores

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteracioacuten se le suma el valor

que tenga Aen 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 coacutedigo hace

lo mismo que el anterior pero usa variables

DIM A AS BYTE Declaro la variable A como BYTEDIM INICIO AS BYTE Declaro la variable INICIO como BYTEDIM FINAL AS BYTE Declaro la variable FINAL como BYTEDIM PASO AS BYTE Declaro la variable PASO como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

INICIO = 1 Asigno 1 a la variable INICIOFINAL = 100 Asigno 100 a la variable FINALPASO = 1 Asigno 1 a la variable PASOTOTAL = 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 TOTALNEXT A fin del bucle

Y el mismo ejemplo sin usar STEP

DIM A AS BYTE Declaro la variable A como BYTEDIM TOTAL AS WORD Declaro la variable TOTAL como WORD

TOTAL = 0 Asigno 0 a la variable TOTAL

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

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 33: Pic Simulator IDE Manual

TOTAL = TOTAL + A Sumo A al valor de TOTALNEXT 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 iraumentando 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 instruccionnNEXT A fin del bucle

De la misma manera que ocurriacutea 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 variable2NEXT variable1

La uacutenica condicioacuten es que un bucle este completamente dentro del otro El siguiente anidamiento dariacutea unerror 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 variable1NEXT variable2

Para terminar veamos el siguiente coacutedigo

AllDigitalTRISB = 0

Dim a As Byte

For a = 0 To 15 PORTB = aNext a

compilado y corriendo sobre el simulador Cuenta desde 0 a 15 y muestra el valor sobre el puerto B enbinario

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 34: Pic Simulator IDE Manual

No se ha podido cargar el complemento

[ Volver al Iacutendice ]

gt Capitulo 12 - WHILE - WENDLa segunda estructura de control que proporciona PIC BASIC es WHILE - WEND Su propoacutesito es el mismo

que la que vimos en el capitulo anterior y su estructura es la siguiente

WHILE condicioacuten instruccion1 instruccion2 instruccionnWEND

Mientras que la condicioacuten sea verdadera el grupo de instrucciones dentro del cuerpo del WHILE-WEND se

ejecuta Las caracteriacutesticas de la condicioacuten 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 condicioacuten puede darse el caso de que el

numero de repeticiones del bucle sea infinito y nunca salgamos de el De hecho esta circunstancia seaprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones Tambieacuten hay quetener presente que si la condicioacuten no es cierta al momento de ejecutar la primera vez el WHILE el flujo del

programa pasara directamente a la instruccioacuten 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 condicioacuten del WHILE nunca es falsa por lo que se repite

eternamente

DIM A AS BYTE

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 35: Pic Simulator IDE Manual

A = 0 WHILE A = 0 instruccion1 instruccion2 instruccionnWEND

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 gt 0 instruccion1 instruccion2 instruccionnWEND

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

variable Bcontiene la suma de los nuacutemeros del 0 al 10 naturales

DIM A AS BYTEDIM A AS BYTE A = 0 B = 0

WHILE A lt 10 A = A + 1 Incremento la variable A B = B + A Sumo a B el valor de la variable AWEND

Cuando A = 10 se suma su valor a A y al llegar al WEND el control del programa se transfiere al WHILE

donde se evaluacutea la condicioacuten A lt 10 se determina que es falsa y el programa pasa el control a la liacutenea

que exista despueacutes delWEND

[ Volver al Iacutendice ]

gt Capitulo 13 - LOOKUPLa funcioacuten LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo

tipo de acuerdo al valor de un iacutendice (tambieacuten de tipo Byte) El resultado de la seleccioacuten se almacena(como no) tambieacuten en una variable tipo byte

La forma de la funcioacuten LOOKUP es la siguiente

variable = LOOKUP(byte0 byte1 byteN) indice

Veamos un ejemplo sencillo

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

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb

Page 36: Pic Simulator IDE Manual

variable tendraacute el valor 70 (decimal) al ejecutar este coacutedigo El primer elemento de la lista recordemos

corresponde al valor 0 de indice

Si bien la lista puede contener un maacuteximo de 255 elementos que es el maacuteximo direccionable por unavariable indice de tipo byte hay que asegurarse que el microcontrolador que estamos empleando tenga

memoria suficiente para albergarla

El segundo ejemplo extraiacutedo de la propia ayuda del PIC SIMULATOR IDE nos muestra como manejar undisplay LED de siete segmentos conectado al puerto B

Dim digito As ByteDim mascara As ByteComienzo el bucle principalloop TRISB = 00000000 For digito = 0 To 9 ampnb