ENTORNO DE DESARROLLO Y PROGRAMACIÓN EN
PIC BASIC PARA MICROCONTROLADORES
PIC SIMULATOR IDE
> Pagina 2 - > Pagina 3
|
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 01 - La interfaz:
Debido a que se trata de un software concebido desde el vamos como un entorno, la integración entre los diferentes módulos que lo componen es completa y sin problemas.
Una vez instalado el programa, el icono que lo representa aparecerá en nuestro escritorio, y haciendo doble clic sobre el se abrirá la pantalla principal del programa, que al menos hasta la versión sobre la que se desarrolla este tutorial (la 5.91) esta en ingles:

Antes de ver en que consiste cada opción del menú principal, vamos a analizar rápidamente cada sección de esta pantalla:
En la parte superior, y justo debajo de la barra de menú tenemos tres cuadros de texto que nos muestran la ruta completa hacia el programa que tenemos cargado en el simulador (Program Location), el microcontrolador que hemos seleccionado para nuestro proyecto (Microcontroller) y la frecuencia de clock elegida (Clock Frequency).

Todos estos valores pueden ser cambiados, como veremos en el segundo capitulo, desde la barra de menú.
El recuadro que esta inmediatamente debajo del anterior nos muestra (cuando estamos corriendo una simulación de nuestro programa) cual es la instrucción assembler en curso (Last Instruction) y cual será la siguiente a ejecutar (Next Instruction):

Luego tenemos un cuadro con información relativa a la ejecución del programa, en la que vemos instrucción a instrucción durante todo el tiempo en que estemos corriendo la simulación, el valor que va tomando el contador de programa (PC o Program Counter), el registro de trabajo (W Register, por "working") y sobre la derecha la cantidad de instrucciones simuladas (Instructions Counter), la cantidad de ciclos de reloj transcurridos (Clock Cycles Counter) y el tiempo de ejecución que llevaría en realidad dicho programa (Real Time Duration). Cabe aclarar, que como en todo simulador, la relación entre el tiempo real y el tiempo de simulación varia dependiendo de los recursos de nuestro ordenador, y en general los programas simulados demoran mucho mas tiempo que el real en ejecutarse.

A continuación, sobre la izquierda, vemos una lista de desplazamiento que contiene el valor de todos los registros especiales con los que cuenta el microcontrolador elegido. Esta lista varia, por supuesto, con cada microcontrolador, y en el momento de correr la simulación va reflejando instrucción a instrucción el valor de cada timer, puerto, registro de estado, interrupciones, etc. Los valores se muestran en hexadecimal (Hex Value) y en binario (Binary Value). Cada registro se identifica mediante su dirección (Address) y también por el nombre con el que figura en la hoja de datos (Name).

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

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

Como es costumbre en toda aplicación de windows, la opción File es la primera del menú. Contiene solo dos comandos: Clear Memory (Limpiar memoria) que se encarga de eliminar de la memoria del simulador el programa que estuviese cargado, que puede ser invocada mediante las teclas CTRL+R; y Load Program (Cargar Programa), que nos lleva a un cuadro de dialogo típico que nos permite seleccionar el archivo HEX que queremos simular. Esta función puede invocarse con CTRL+L.
Dentro de la segunda opción, Simulation, tenemos tres opciones que se encargan de manejar la simulación en curso: Start, Step y Stop. La primera de ellas arranca la simulación, la segunda se encarga de avanzar una instrucción (solo esta habilitada cuando en Rate hemos seleccionado el modo paso a paso) y la tercera detiene la simulación. Es muy practico utilizar F1, F2 y F3 para invocar estas opciones.
Rate es el submenú que determina el modo de ejecución de la simulación, brindando 6 posibilidades:

Estas son: Step By Step (paso a paso), Slow (Lenta), Normal (Normal), Fast (Rápida), Extremely Fast (muy rápida) y Ultimate (No Refresh) que es la mas rápida de todas, pero que no actualiza la pantalla principal del simulador. Esta opción resulta muy útil para "adelantar" partes del programa que sabemos que no tienen problemas. Todas pueden ser invocadas con CTRL+F1 a CTRL+F6, tal como se ve en la figura anterior.
Tools es el submenú encargado de invocar a cada uno de los módulos que integran el simulador, y que veremos en detalle en capítulos siguientes. Tal como se ve en la figura, la mayoría de ellos se pueden activar mediante la combinación de la tecla CTRL y alguna mas.

Desde Options (Opciones) tenemos acceso a un conjunto de alternativas de configuración. Dedicaremos bastante espacio a cada una de ellas en los capítulos correspondientes, pero podemos adelantar que las mas importantes y que debemos revisar en cada proyecto son Select Microcontroler (seleccionar microcontrolador) que nos permite elegir el modelo concreto de PIC a utilizar; Change Clock Frecuency (cambiar frecuencia de clock) y Configuration Bits (bits de configuración) desde la que se puede elegir la función de algunos pines (Reset o I/O, etc), el tipo de oscilador a usar, etc. La ultima opción de este submenú permite cambiar los colores de la interfaz (Change Color Theme).

> Capitulo 03 - Herramientas (primera parte):
PIC SIMULATOR IDE posee una nutrida caja de herramientas. Estas se encuentran agrupadas en la opción Tools del menú principal, y a continuación veremos en que consiste cada una de ellas.
La primera es el visor de la memoria de programa (Program Memory Viewer), modulo que podemos invocar presionando CTRL-M en cualquier momento. Se lista la memoria completa, cuya extensión dependerá del microcontrolador que tengamos seleccionado, y se pueden ver tres columnas: dirección (Address), valor en hexadecimal de esa dirección (Hex. Value) y el valor en binario (Binary Value). Al igual que las demás herramientas, existe un check box que permite poner la ventana correspondiente siempre al frente (Always On Top).

La segunde herramienta disponible recibe el nombre de EEPROM Memory Editor, y como su nombre indica, nos permite modificar los valores almacenados en la memoria EEPROM del microcontrolador. El contenido de la EEPROM se lista en 16 columnas numeradas del 0 al 15, y por supuesto, su extensión depende del micro seleccionado. Haciendo click sobre cualquiera de los valores se puede cambiar su contenido, que se encuentra en formato hexadecimal.

Hardware Stack Viewer nos permite conocer el valor de cada uno de los niveles del stack (generalmente llamado pila en español). Esto puede resultar útil para depurar los programas que tienen muchas subrutinas anidadas o cuando sospechamos que hay desbordamientos del stack. Además de ver el nivel de stack (Stack Level), el contenido en hexadecimal (Hex Value) y en binario (Binary Value), en la parte inferior de la ventana una etiqueta nos informa de cual es el nivel apuntado en cada paso de la simulación.

La herramienta Microcontroller View es una de las mas útiles, ya que en una ventana separada (y que como las demás se puede poner en frente de todas) nos muestra un esquema del micro elegido, con el rotulo correspondiente a cada pin, y lo mas importante, el estado en cada momento de la simulación de cada uno. En caso de ser un pin E/S nos muestra el estado (ON/OFF) que presenta, y si se trata de una referencia de voltaje muestra el valor asignado. Además, en cada pin hay un botón que permite cambiar el estado presente en el (T, supongo que por "toggle", que significa "cambiar"), y los resultados se toman como entradas para la simulación.

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

PIC Disassembler es ni mas ni menos que un desensamblador, que nos brinda un texto con el contenido en assembler del programa cargado en la memoria del PIC SIMULATOR IDE. Este listado se genera independientemente del origen del programa, es decir, podemos obtener el código a partir de un archivo ya compilado con cualquier compilador (con extensión .HEX) o a partir de un .HEX generado con el compilador BASIC incluido en el paquete. Se muestra, por cada instrucción, la dirección (Address), el opcode y la instrucción (instruction). Ideal para aprender assembler a partir de instrucciones BASIC, por ejemplo.

El manejador de "puntos de inspección" o Breakpoint Manager es una herramienta que permite definir hasta 10 puntos en los que la simulación se interrumpirá (luego podremos reanudar la ejecución desde ese punto) para analizar con tranquilidad el estado de los registros, los puertos, etc. Hay un par de opciones adicionales, como el botón que permite eliminar todos los breakpoints definidos (Clear All Breakpoints) o mantener siempre en foco el contador de programa (PC o Program Counter). El contenido de la ventana es el código assembler en el mismo formato que comentamos en la herramienta anterior.

Además de los diez puntos de parada anteriores, se pueden definir cinco puntos especiales, mediante la herramienta Special Breakpoints. La diferencia entre esta y la anterior herramienta (y lo que la hace tan especial) es que en este caso los puntos de inspección se fijan mediante una condición (Break Condition) o por el estado de algún registro (Register Address). Los botones SET y DEL permiten habilitar y deshabilitar individualmente cada una de las condiciones.

La herramienta assembler tendrá su capitulo propio, por que es aquí donde se escribe el código en dicho lenguaje para luego compilarlo.

Al igual que el editor de assembler, el BASIC tendrá varios capítulos dedicados a el, ya que estudiaremos cada una de las instrucciones disponibles. Podemos adelantar que se trata de un editor bastante decente, con verificación de sintaxis y coloreado de palabras reservadas y comentarios, y que la sintaxis del BASIC es compatible en un 90% con otros BASICs mas populares, como PBP o PROTON. Desde aquí podemos compilar y cargar en la memoria del simulador el archivo HEX resultante en un solo paso.


> Capitulo 04 - Herramientas (Segunda parte):
Las herramientas siguientes son las que podemos usar como "periféricos" del microcontrolador, para simular las E/S, o analizar su estado. La primera de este grupo es la llamada 8xLED Board que es ni mas ni menos que un grupo de 8 LEDs virtuales, a los que podemos asignar un puerto y un bit dentro de el, de manera que se enciendan o apaguen en tiempo real de acuerdo al estado de dichos pines al ejecutar la simulación.

El Keypad Matrix es ni mas ni menos que un teclado matricial de 4 filas y cuatro columnas que podemos configurar con total flexibilidad para utilizarlo en nuestros proyectos simulados. Se puede elegir el pin de cada fila y columna, y dinámicamente, durante la simulación, el estado de cada tecla. En los ejemplos de los capítulos dedicados a la programación usaremos esta herramienta a menudo.

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

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

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


Otras dos herramientas sumamente útiles para comprender que esta haciendo en cada momento el microcontrolador son el osciloscopio (Oscilloscope) de cuatro canales, con posibilidad total de configuración de cada uno de ellos, y el Signal Generator (generador de señales) también de cuatro canales y con posibilidad de generar pulsos de periodo y relación cíclica ajustable. Por supuesto, habrá capítulos en que haremos uso de ellas.

No podía faltar el modulo con los displays LED de 7 segmentos, presentes en una gran cantidad de proyectos. En este caso, la herramienta 7-Segment LED Display Panel nos proporciona 4 dígitos completamente configurables (nuevamente mediante el botón Setup presente en cada uno de ellos), y podemos elegir el pin al que esta conectada cada uno de los segmentos, si son de ánodo o cátodo común, etc.

La ultima herramienta es una útil lista con el valor de cada una de las variables presentes en nuestro programa. Recibe el nombre de Watch Variables (ver variables) y es una lista de texto donde en una columna aparece el nombre de la variable en cuestión y en otra su valor. Esta lista se actualiza constantemente durante la simulación.

> Capitulo 05 - Sistemas de numeración:
Existen muchas maneras de representar un numero. De hecho, en teoría es posible hacerlo de infinitas maneras, ya que podemos elegir como base cualquier numero entero. Generalmente, los mas usados en el mundo de la programación son el sistema decimal, que utiliza como base el numero 10; el sistema binario, que utiliza como base el numero 2; y el hexadecimal, que utiliza el numero 16 como base.
Sistema Decimal:
Como su nombre lo indica, el sistema decimal toma como base para construir los números potencias sucesivas del numero 10. Se utilizan los símbolos del "0" al "9", y el peso de cada cifra esta dado por su posición, dado que se multiplica por 10 elevado a la posición en que se encuentra el digito menos uno. Como en todos los sistemas de numeración, el digito de menos "peso" es el que esta mas a la derecha, y el de mas "peso" el que se encuentra mas a la izquierda.
|
Potencia de 10:
|
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 construye cada numero, pero cuando leemos el numero "123" en realidad esta "construido" de la siguiente manera:
(1 * 10^2) + (2 * 10^1) + (3 * 10^0) =
(1 * 100) + (2 * 10) + (3 * 1) =
100 + 20 + 3 =
123
Sistema binario:
El sistema binario, el ideal para usar en electrónica debido a que solo posee dos símbolos, el 0 y el 1, que pueden ser codificados como presencia o ausencia de tensión, utiliza como base el numero 2 en lugar del 10. En todo lo demás, es exactamente igual al decimal. Si nos parece mas complicado, es solamente por que no tenemos la suficiente practica con el.
Un numero binario esta construido mediante una secuencia de dígitos binarios (que para abreviar llamamos "bits"). Muchas veces, se agrupan de diferentes maneras para poder trabajarlos mas cómodamente, y a esas agrupaciones de les da un nombre, siendo los mas utilizados los siguientes:
|
Nombre
|
Tamaño (bits)
|
Ejemplo
|
|
Bit
|
1
|
1
|
|
Nibble
|
4
|
0101
|
|
Byte
|
8
|
00000101
|
|
Word
|
16
|
0000000000000101
|
Como en cualquier sistema de numeración, los ceros a la izquierda no modifican el valor del numero representado. Es muy común en el sistema binario agregar ceros a la izquierda para completar un agrupación de las anteriores. Por ejemplo, si tenemos el numero binario "101" lo podemos escribir de algunas de las siguientes maneras:
|
Nibble
|
0101
|
|
Byte
|
00000101
|
|
Word
|
0000000000000101
|
Dentro de un byte (la agrupación de bits mas común) se numeran los bits que lo componen de acuerdo a la siguiente convención:
1) El bit ubicado mas a la derecha es el bit "cero".
2) Cada bit ubicado a su izquierda recibe el numero siguiente
El bit cero recibe generalmente el nombre de LSB (least significant bit o "bit menos significativo"). De la misma manera, al ubicado mas a la izquierda se lo llama MSB (most significant bit o "bit mas significativo"). Y nos referimos a los demás bits intermedios por su numero de bit correspondiente: bit 2, bit 3, etc.
De todo esto podemos deducir que el tipo de dato mas pequeño que podemos manejar es el bit, que solo puede tener dos valores: 1 o 0. Estos dos estados representan generalmente "encendido" o "apagado", "verdadero" o "falso", "si" o "no", etc.
Como podemos ver en la tabla de mas arriba, el nibble es la unión de cuatro bits. Dado que 2x2x2x2 = 16, este es el numero de valores posibles que puede tomar un nibble.
La estructura mas utilizada es el byte, que agrupa 8 bits (o dos nibbles), y que puede tomar valores entre 0 y 255 (2^8 valores posibles). Si tomamos dos bytes y los "pegamos" uno detrás del otro, obtenemos una palabra (word), que permite 65536 (2^16) valores diferentes.
Sistema hexadecimal:
Si tomamos 16 símbolos para representar los números (en lugar de dos o diez), obtenemos un sistema que se llama hexadecimal. A los símbolos 0..9 se agregan las letras A, B, C, D, E y F, y es un sistema de numeración muy utilizado en programación. Algunas de sus ventajas son que cada digito de un numero hexadecimal es exactamente un nibble, o que cada dos dígitos hexadecimales son un byte. Esto proporciona una forma muy compacta de representar valores.
|
Decimal
|
Binario
|
Hexadecinal
|
|
1
|
0000 0001
|
1
|
|
10
|
0000 1010
|
A
|
|
233
|
11101001
|
E9
|
|
255
|
1111 1111
|
FF
|
| 15280 |
0011 1011 1011 0000
|
3BB0
|
Algunos ejemplos.