Tutorial Mikrobasic y Basic
Short Description
Download Tutorial Mikrobasic y Basic...
Description
La electrónica ha evolucionado mucho. Casi todo lo que hasta hace unos años se hacia mediante un grupo (a veces muy numeroso) de circuitos integrados conectados entre si, hoy se puede realizar utilizando un microcontrolador microcontrolador y unos u nos pocos componentes adicionales. De todos los fabricantes de microcontroladores que existen, los más elegidos por los hobbystas suelen ser los modelos de Microchip Microchip,, en gran parte debido a la excelente documentación documentación gratuita que proporciona la empresa para cada modelo. El lenguaje nativo de estos microcontroladores microcontroladores es el ASM, y en el caso de la familia “16F” solo posee 35 instrucciones. Pero el ASM es un lenguaje que esta mucho más cerca del hardware que del programador, y gracias a la miniaturización que permite incorporar cada vez más memoria dentro de un microcontrolador sin aumentar prácticamente su costo, han surgido compiladores compiladores de lenguajes de alto nivel. Entre ellos se encuentran varios dialectos BASIC y C. El BASIC resulta bastante más simple de aprender. Antes de comenzar comenzar a ver los temas temas programación programación en si mismos, mismos, debemos aclarar aclarar algunos conceptos básicos sobre los microcontroladores para poder entender lo que hace cada instrucción BASIC. Eso será muy útil para los que vayan a comenzar a programar a partir de este artículo. Lo más interesante de trabajar con microcontroladores es que se necesitan conocimientos tanto de electrónica (hardware) como de programación (software) así que a lo largo de estos tutoriales iremos viendo temas de ambas disciplinas, ya que íntimamente vinculadas. Un microcontrolador es como un ordenador en pequeño: dispone de una memoria donde se guardan los programas, una memoria para almacenar datos, dispone de puertos de entrada y salida, etc. A menudo se incluyen puertos seriales (RS-232), conversores analógico/digital, generadores de pulsos PWM para el control de motores, bus I2C, y muchas cosas más. Por supuesto, no tienen ni teclado ni monitor, aunque podemos ver el estado e stado de teclas individuales o utilizar pantallas LCD o LED para mostrar información. información. En general, por cada cuatro ciclos de reloj del microcontrolador se ejecuta una instrucción ASM (una instrucción instrucción BASIC consta consta generalmente generalmente de mas de una instrucción instrucción ASM). ASM). Esto significa que un PIC funcionando a 20MHz puede ejecutar 5 millones de instrucciones instrucciones por segundo. Los pines del PIC se dedican casi en su totalidad a los puertos que mencionábamos mencionábamos anteriormente. anteriormente. El resto (2 o mas) son los encargados de proporcionar la alimentación al chip, y a veces, un sistema de RESET. Desde BASIC es posible saber si un pin esta en “estado alto” (conectado a 5V o a un “1” lógico) o en “estado bajo” (puesto a 0V o a un “0” lógico”). También se puede poner un pin de un u n puerto a “1” o “0”. De esta manera, y mediante un rele, por ejemplo, se puede encender o apagar una luz, motor, maquina, etc. Uno de los microcontroladores más famosos de todos los tiempos ha sido, sin duda, el 16F84A, que ya es considerado considerado obsoleto. Un buen reemplazo es el 16F628A, y es el que utilizaremos en la mayoría de los ejemplos y proyectos que veamos. La disposición de sus pines es la siguiente:
Función de los pines del 16F628A
Como podemos ver, los pines 1, 2, 3, 4, 15, 16, 17 y 18 tienen el nombre de RAx. Esos pines conforman el puerto A, “PORTA” de ahora en más. Los pines 6 al 13 forman parte del puerto B (“PORTB”). El pin 5 es el que se conectara al negativo de la fuente de alimentación. El 14 irá conectado a 5V. Como habrán notado, muchos de los pines tienen más de una descripción. Esto se debe a que pueden utilizarse de varias maneras diferentes, seleccionables por programa. Por ejemplo, el pin 4 sirve como parte del PORTA, como RESET (MCLR = Master Clear) y como tensión de programación (Vpp) No es mala idea descargar desde la web de Microchip la hoja de datos de este microcontrolador (esta en inglés) para tenerla siempre a mano. Ahora bien ¿Cómo colocamos el programa dentro del PIC? Para ello necesitamos algunas herramientas. Por un lado, es necesario un “quemador” de PICs, como el que publicamos en NeoTeo, o alguno de los varios disponibles comercialmente. Uno que me gusta particularmente es el GTP-USB+, ya que al funcionar conectado al puerto USB es muy veloz. Además, necesitaremos un software que envíe el programa al PIC. Para ello usaremos el WinPIC800, que es un excelente soft gratuito. Y también vamos a necesitar un compilador, para “traducir” nuestro programa en BASIC al ASM que es capaz de entender el PIC. Después de mirar varios candidatos, en este momento parece una buena elección el PIC SIMULATOR IDE, que no solo es un excelente compilador de BASIC, si no que además (y por solo 29 euros) ofrece un entorno de simulación de nuestros circuitos. Existe una versión de prueba que se puede bajar gratuitamente desde aquí.
El GTP USB+, un excelente programador de micros y memorias.
El WinPic800 enviara el programa al PIC.
El PIC SIMULATOR IDE, entorno de programacion BASIC.
Para comenzar, usaremos un PIC 16F628A.
El primer ejemplo que veremos, equivalente al “hola mundo” de cualquier otro entorno de programación, consiste en encender y apagar continuamente un LED conectado a uno de los pines del micro. Utilizaremos el circuito siguiente:
Nuestro primer ejemplo.
A diferencia de un programa de ordenador, donde uno escribe el programa, lo compila, lo ejecuta y ya, en el mundo de los microcontroladores hay que, previamente, definir el tipo de microcontrolador que se va a utilizar, cual va a ser su frecuencia de clock, como va a ser el circuito en que se va a utilizar el mismo, etc. En primer lugar, vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el cristal y condensadores asociados. El puerto B del micro tiene su pin 9 conectado a un LED mediante una resistencia de 220ohms, que tienen como función limitar la corriente que circula por el LED. Esta será nuestra "salida". El circuito debe alimentarse con 5v bien filtrados y regulados. Volviendo a nuestro programa, vamos a escribir el "hola mundo" de los microcontroladores: encender un LED. El primer paso es elegir en PIC SIMULATOR IDE, desde el menú "Opciones" -> "Select Microcontroller", el microcontrolador PIC16F628A. Luego, debemos configurar los bits correspondientes, como se ve en las figuras de más abajo. Lo destacable por ahora de esta configuración es que estamos dejando la memoria (FLASH y EEPROM) sin protección, que el pin RESET se va a comportar como I/O y que usaremos como oscilador el oscilador interno INTRC.
"Opciones" -> "Select Microcontroller"
"Opciones" -> "Configuration Bits"
Una vez hecho esto, arrancamos el editor de BASIC (presionando CTRL-C, por ejemplo), y escribimos el siguiente código: AllDigital TRISA = %11111111 TRISB = %00000000 loop: PORTB.3 = 1 WaitMs 500 PORTB.3 = 0 WaitMs 500 Goto loop
Vamos a analizarlo línea por línea para entender su funcionamiento: La línea 1 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de E/S. Esto equivale a deshabilitar los comparadores, conversores A/D y todos los módulos que pudiese tener nuestro microcontrolador. No es la única manera de hacer esto, pero si la mas sencilla. Las líneas 3 y 4 convierten todos los pines del puerto A en entradas ( TRISA = %11111111 ) y los del puerto B en salidas ( TRISB = %00000000 ). El "%" indica que el numero que viene a continuación esta en binario. Se podría haber escrito, por ejemplo TRISB = 0 y hubiera sido lo mismo. Personalmente me gusta esta manera, ya que "veo" el estado de cada pin. Por supuesto, es valido activar como entrada algunos pines, y como salidas otros, haciendo algo parecido a TRISB = %11000111. En la línea 6 encontramos una "etiqueta" ( loop: ). Esta no hace nada, solo sirve como referencia para enviar el flujo del programa a esa línea desde otro lugar, mediante la sentencia "Goto".
La línea 7 pone en "1" el pin correspondiente a PORTB.3, de manera que en el pin 9 del microcontrolador habrá 5V. Esta tensión hará que circule una corriente a través de la resistencia limitadora y el LED1, haciendo que este se encienda, ya que el cátodo se encuentra conectado a 0V. En 8 tenemos la sentencia WaitMs 500. WaitMs se encarga de hacer una pausa en milisegundos. La duración de la pausa esta dada por el número que sigue a la instrucción, en este caso 500 milisegundos, o medio segundo. Luego, en 9, otra vez se vuelve a poner en 0 el pin 9, mediante PORTB.3 = 0 , lo que provoca que ese pin se ponga a 0V, y no haya mas circulación de corriente a través de la resistencia y del LED, con lo que este se apaga. En la línea 10 se hace nuevamente una pausa de medio segundo, y por ultimo, la línea Goto Loop hace que el programa continúe en la línea 6 (que es donde esta la etiqueta Loop). El programa se repite indefinidamente, encendiendo el LED medio segundo, apagándolo otro medio segundo. Con esto, terminamos la primera entrega de este tutorial. Solamente hemos arañado la superficie de un mundo apasionante. No te pierdas la segunda entrega la próxima semana.
MikroBasic - Primera Parte Por: Ariel Palazzesi @ miércoles, 13 de septiembre de 2006 Nota vista 44983 veces
| Uno de los compiladores de lenguaje BASIC para microcontroladores PIC que esta atrayendo legiones de usuarios es MikroBasic. Si bien ya lleva un tiempo en el mercado, a partir de la versión 5.00 se ha masificado. Ads By Google
PIC16F628A-IPR Buy this component NOW - Price: £7.99 - $12.38 - EUR 9.99
www.littlediode.com
Automatización y Control Armado de tableros para equipos electricos industriales
mci-automation.com Afortunadamente, el hobbysta no necesita aprender el lenguaje Assembler o conocer a fondo oscuras herramientas de programación para dotar de software a sus proyectos con microcontroladores. La empresa mikroElectrónica distribuye una serie de compiladores para microcontroladores, entre los que se destacan el mikroC y mikroBasic. La características mas destacadas de estos compiladores, y en particular del que nos ocupara en esta serie de artículos es la inclusión de un IDE (entorno de desarrollo integrado o en inglés Integrated Development Environment) que hace muy cómoda la programación, ya que resalta la sintaxis del lenguaje, proporciona acceso muy rápido a la excelente ayuda incluida, estadísticas sobre el uso de recursos del microcontrolador, y muchas ventajas mas. Además, mikroElectrónica nos permite descargar una versión gratuita del compilador, que a pesar de estar limitado en la generación de código a 2Kb., es más que suficiente para muchos proyectos, y sobre todo, sirve perfectamente para que podamos aprender el lenguaje. Probablemente mikroBasic sea el entorno que soporta mas modelos de micros y además dispone de un enorme grupo de librerías, divididas en comunicaciones RS-232, RS-485 e I2C; teclados PS/2, conexiones USB, interfaz para LCD, y un largísimo etc. Nos proponemos a lo largo de estos artículos a profundizar en el set de instrucciones de mikroBasic.
IDE de mikroBasic, uno de sus puntos fuertes.
Respecto de la organización interna del programa, debemos saber que es necesario que las partes que componen el programa (funciones, rutinas, etc.) sigan ciertas reglas en su escritura. No es necesario que todas estén presentes. Las secciones que son obligatorias son “program” y el bloque “main-end”. Las demás, opcionales, solo las usaremos si las necesitamos. program i nclude '******************************************************** Declaraciones (globales, disponibles en todo el programa): '******************************************************** 'Constantes const ... 'variables dim ... ' Simbolos symbol ... ' Procedimientos sub procedure nombre_del_procedimiento(...) ... end sub ' Funciones sub function Nombre_de_la_funcion(...)
< declaraciones locales> ... end sub '******************************************************** '* Programa principal: '******************************************************** main: ' Aquí escribimos nuestro código end. Ahora, empecemos a ver sus instrucciones más elementales: Comentarios: se puede (y debe!) comentar el código usando el apostrofe “'”. Los comentarios pueden ir solos en una línea, o a continuación de una instrucción cualquiera. No se permiten comentarios de más de una línea: ' Esto es un comentario A = 10 ' y esto también…. Estos comentarios son los que nos permitirán realizar modificaciones o mejoras en nuestro código sin necesidad de perder horas intentando comprender lo que escribimos tiempo atrás. Identificadores: Los llamados “identificadores” son en realidad los nombres de nuestras variables, procedimientos, funciones, constantes, etc. En mikroBasic los nombres de identificadores pueden contener letras desde la “a” hasta “z” y desde la “A” hasta “Z”, el guión bajo (“_”) y los dígitos del “0” al “9”. El primer carácter no puede ser un digito. Además, los nombres de los identificadores no son “case-sensitive”, es decir que “Total”, “total” y “TOTAL” son nombres de la misma variable, y podemos usar cualquiera de ellos por igual. Correctos: Temperatura aux_12 rele_activado Incorrectos: 3boton 'Comienza con un digito Aux.12 'Contiene un punto _salto 'Comienza con un guión bajo Humedad% 'Contiene un carácter invalido (%) Variables: Al igual que en otros dialectos Basic, las variables son objetos cuyo valor puede cambiar con la ejecución del programa. Cada variable tiene un nombre único, que se ajuste a las reglas definidas mas arriba para los identificadores. Deben declararse con dim antes de ser usadas, y su ámbito de validez varía de acuerdo a la sección en que se declaran (ver la ayuda para más datos sobre esto). La sintaxis de dim es: dim lista de variables as tipo La lista de tipos disponibles incluyen Byte (8 bits, con valores de 0 a 255), Word (2 bytes, o 16 bits, con valores de 0 a 65535) y Longint (con valores desde -2147483648 a 2147483647). No son los únicos, la lista completa de tipos se puede consultar en la documentación del
compilador. Algunos ejemplos validos de dim son: dim i, j, k as byte dim contar, temp as word dim cadena as longint[100]
La opción "code explorer" permite analizar nuestro programa.
Bucles: Tenemos 3 formas de lograr que un grupo de instrucciones se repitan: 1) FOR – NEXT : Se repite mientras variable sea menor que valor_final. En cada ciclo variable se incrementa en incremento o en 1 si step no esta presente. for variable = valor_inicial to valor_final [step incremento] Instrucciones a repetir next variable Ejemplo: s=0 for i = 0 to n s = s + a[i] * b[i] next i 2) WHILE – END: Mientras que la expresión sea verdadera, las instrucciones a repetir se ejecutaran. Si dentro de esas instrucciones no existe alguna que modifique el resultado de expresión, el ciclo se repetirá eternamente. Como la expresión se evalúa al comenzar el ciclo, puede ocurrir que si al comenzar el programa la expresión sea falsa las instrucciones a repetir
no se ejecuten nunca. while expresión Instrucciones a repetir wend Ejemplo 1: s=0 i=0 while i < n s = s + a[i] * b[i] i=i+1 wend Ejemplo 2: Un ciclo sin fin. while TRUE Instrucciones a repetir wend 3) DO – LOOP: En este caso, las instrucciones a repetir se repiten mientras la expresión sea verdadera. Al evaluarse al final del ciclo, el grupo de instrucciones a repetir se ejecutaran al menos una vez. do Instrucciones a repetir s loop until expresión Ejemplo: Producto escalar entre dos vectores. s=0 i=0 ... do s = s + a[i] * b[i] i=i+1 loop until i = n Cualquiera es estas tres formas de crear un bucle puede ser interrumpida si dentro de las instrucciones a repetir se coloca la instrucción break. Al ejecutarla, el control del programa salta a la sentencia escrita inmediatamente a continuación de next, wend o loop until, según el caso. Toma de decisiones: Existen dos instrucciones para la toma de decisiones dentro de un programa escrito en Mikrobasic: 1) IF – THEN – ELSE – ENDIF: Las instrucciones a continuación del then se ejecutan si la expresión es verdadera, y las que después del else si es falsa. if expresión then instrucciones
[else instrucciones] end if 2) SELECT – CASE: Se utiliza para transferir el control a una rama del programa, basándose en una determinada condición. Consiste en una expresión y una lista de sus posibles valores. Las instrucciones a continuación del case else, si existen, se ejecutan en caso de que selector tome un valor para el que no exista una rama case disponible. select case selector case valor_1 instrucciones_1 ... case valor_n instrucciones_n [case else Instrucciones por defecto] end select Saltos: También tenemos dos instrucciones que permiten saltos incondicionales: 1) GOTO: Generalmente desaconsejada, esta instrucción nos permite transferir el control a cualquier punto dentro del programa. A pesar de estar demostrado que es posible construir cualquier programa sin utilizar nunca esta instrucción, se utiliza con cierta frecuencia. El control del programa se transfiere a la línea que tenga la etiqueta utilizada en el goto: for i = 0 to n for j = 0 to m ... if desastre goto Error end if ... next j next i . . . Error: ' código para manejar el error. . . 2) GOSUB – RETURN: Funciona de manera similar a GOTO, pero con la ventaja de que el control del programa regresa a la instrucción posterior a GOSUB luego de ser ejecutado el return. Esto la hace ideal para crear subrutinas que pueden ser llamadas varias veces y/o desde distintos puntos del programa gosub mi_rutina instrucciones ... mi_rutina: ´código de la subrutina
... Return
Display de LEDs programado en mikroBasic.
Es muy recomendable por cuestiones de claridad del código y sobre todo para facilitar su mantenimiento, que aquellos grupos de instrucciones que se utilicen mas de una vez dentro del programa, se escriban como funciones o procedimientos. MikroBasic permite el uso de ambas, y esta es la sintaxis que se debe respetar: Funciones: sub function nombre_de_la_funcion(lista_de_parametros) as tipo [ declaraciones locales ] Cuerpo de la funcion end sub Procedimientos: sub procedure nombre_del_procedimiento(lista_de_parametros [ declaraciones locales ] Cuerpo del procedimiento end sub Ejemplo: Una función para elevar un numero x a una potencia n cualquiera. sub function potencia(dim x, n as byte) as longint dim i as byte i=0 resultado = 1 if n > 0 then for i = 1 to n resultado = resultado*x next i end if end sub Desde el programa principal, si queremos calcular 25, debemos escribir algo como e sto: A = potencia (2,5)
Y A tomara el valor de 32 (25).
Permite colorear el código para facilitar la lectura.
Cada uno de estos puertos recibe un nombre, generalmente “puertoA”, “puertoB”, etc. En los microcontroladores PICs mas pequeños, de 8 pines en total, solo se dispone de un puerto que tiene hasta 6 E/S (los otros dos pines del PIC se destinan a la alimentación del mismo). En los de 16 pines disponemos de dos puertos, el portA que tiene entre 5 y 8 E/S (dependiendo del modelo de PIC) y el portB que tiene 8 E/S. Desde MikroBasic es posible leer cada uno de los 8 bits que componen cada puerto, o escribir en ellos un “1” o un “0”, además de elegir individualmente el comportamiento de cada pin, es decir, si va a ser un pin de entrada o de salida. En los PICs mas complejos también se puede seleccionar si un pin determinado de un puerto va a ser una entrada analógica (que el PIC va a convertir internamente en un valor digital), etc. Veamos cuales son estas instrucciones mediante un caso práctico: supongamos que estamos usando un PIC 16F84A, que no posee conversores A/D, solo tiene dos puertos de E/S digitales, el puertoA con E/S y el puertoB con 8. Vamos a configurar todo el puertoA como entradas (supongamos que en ellas tendremos conectados pulsadores que al operarlos conecten el pin correspondiente a 5V) y el puertoB tendra los primeros cinco pines (del 0 al 4) como salidas, conectados a LEDs que encenderán cuando escribamos un “1” en ellas y los demás (del 5 al 7) como entradas. El circuito eléctrico seria el de la figura que vemos al final de la página. La instrucción TRISn es la que nos permite configurar los pines del puerto “n” como entradas y salidas. Podemos configurarlos individualmente, o bien configurar todo el puerto a la vez. Los pines que TRIS defina como “0” serán de salida, y los definidos como “1” se comportaran como entradas. Veamos algunos ejemplos:
TRISB = 0 : Configura TODOS los pines del puertoB como salidas. TRISB = %11110000 : Configura los pines del 4 al 7 como entradas y los demás como salidas. El “%” indica que el numero a continuación esta en binario. TRISB = 240 : Hace lo mismo que la anterior: 240 en decimal es lo mismo que 11110000 en binario. (128 + 64 + 32 + 16 + 0 + 0 + 0 + 0 = 240) TRISA = 255 : Configura todo el puertoA como entradas. Si el puerto solo tiene 5 bits conectados a pines físicos, los otros 3 bits se ignoran. Para el caso de nuestro ejemplo, el programa quedaría así: program Ejemplo1 main: 'Este es el cuerpo del programa TRISA = 255 ' Todos los pines del puertoA como entradas… TRISB = %11100000 ' PuertoB tiene 3 pines como entradas y 5 como salidas end. 'Fin del programa Obviamente, si compilamos este programa y lo cargamos en el microcontrolador, no veremos que encienda ningún LED ni ninguna otra cosa, puesto que lo único que hemos hecho es configurar los puertos, pero no hemos escrito nada en ellos. Ahora, veamos como hacer para que los LEDs enciendan a medida que accionemos los pulsadores. Al conectar el circuito a la alimentación, los 5 LEDs estarán apagados. Al ir presionando los pulsadores, el LED correspondiente se encenderá, y quedara en ese estado. Si se pulsa cualquiera de los tres pulsadores conectados a los pines del puertoB, todos los LEDs que estén encendidos se apagaran. Veamos el programa: program Ejemplo2 main: 'Este es el cuerpo del programa TRISA = 255 ' Todos los pines del puertoA como entradas… TRISB = %11100000 ' PuertoB tiene 3 pines como entradas y 5 como salidas PORTB = %00000000 ' Apago los LEDs conectados al puertoB while TRUE ' Comienzo un bucle infinito if PORTA.0 = 1 then ' Si se presiona el pulsador 1 PORTB.0 = 1 ' Enciendo el LED 1 End if if PORTA.1 = 1 then ' Si se presiona el pulsador 2 PORTB.1 = 1 ' Enciendo el LED 1 End if if PORTA.2 = 1 then ' Si se presiona el pulsador 3 PORTB.2 = 1 ' Enciendo el LED 1 End if
if PORTA.3 = 1 then ' Si se presiona el pulsador 4 PORTB.3 = 1 ' Enciendo el LED 1 End if if PORTA.4 = 1 then ' Si se presiona el pulsador 5 PORTB.4 = 1 ' Enciendo el LED 1 End if if PORTB.5 = 1 OR PORTB.6 = 1 OR PORTB.7 = 1 then ' Si se presiona algun pulsador del puertoB PORTB = %00000000 ' Apago los LEDs conectados al puertoB End if
delay_ms(100) ' Espero 100 milisegundos antes de wend ' repetir el bucle. end. 'Fin del programa El programa anterior se puede compilar y cargar en un 16F84A mediante el programador visto oportunamente. Los que hayan armado el entrenador visto en Power User también pueden aprovecharlo y montar sobre el circuito correspondiente para probar el programa. Es importante recalcar que el uso de comentarios, tal como se ve en el código anterior, permite la fácil comprensión del programa por terceros (¡e incluso por uno mismo!).
Circuito para probar el codigo de control de puertos.
Esta fuente es necesaria para alimentar al PIC.
Los ejemplos visto, si bien muy simples ya que justamente esa era la idea al escribirlos, nos permiten vislumbrar el potencial de este lenguaje. Es evidente que teniendo una idea acabada de la tarea que debe realizar nuestro circuito y construyendo un algoritmo adecuado, esta en nuestras manos el poder realizar prácticamente cualquier aparato usando un PIC. A lo largo de sucesivas notas veremos como controlar motores, displays LCD y todo lo imaginable mediante un PIC, y como no, mikroBasic. Enlaces
Descarga de mikroBasic. Ads By Google
Api Google Descubra el Centro de Agencias Oficial de Google AdWords, Aquí!
Google.com/WebExpert
View more...
Comments