Está en la página 1de 64

INDICE

1. Especificaciones de mikrobasic 1.1 Predefiniendo globales y constantes 1.2 Accesando a los bits individuales 1.3 Interrupciones 1.3a Llamando rutinas desde interrupciones 1.4 Rutinas construidas o predefinidas (built-in routines) 1.4a Rutinas Inc Dec Chr Ord SetBit ClearBit TestBit Lo Hi Higher Highest SizeOf Swap Clock_Khz Clock_Mhz Reset ClrWdt

1.4 Optimizacin de cdigo

2. Especificaciones del PIC 2.1. Tipos de Eficiencia 2.2.Limitaciones de Llamadas Anidadas 2.3.Especificaciones familia PIC16
3.

Referencia del Lenguaje mikroBasic. 3.1. Elementos lxicos 3.1a espacios en blanco 3.1b comentarios 3.1c tokens 3.1c.1 literales 3.1c.2 palabras clave 3.1c.3 identificadores. 3.1c.4 signos de puntuacin o separadores 3.2 Organizacin de Programa 3.2.a Organizacin del Programa 3.2.b Alcance y Visibilidad 3.2.c Mdulos 3.3 3.4 3.5 3.6 3.7 Variables Constantes Etiquetas Smbolos Funciones y Procedimientos 3.7.a Funciones 3.7.b Procedimientos

3.8 Tipos 3.8.a Tipos simples 3.8.b Arreglos 3.8.c Cadenas 3.8.d Punteros 3.8.e Estructuras 3.8.f Tipos de conversin 3.8.f.1 Conversin implcita 3.8.f.2 Conversin explicita 3.8.f.3 Conversin aritmtica

3.9 Operadores 3.9.a Precedencia y asociatividad 3.9.b Operadores aritmticos 3.9.c Operadores relacionales 3.9.d Operadores inteligentes 3.10 Expresiones 3.11 Declaraciones 3.11.a Declaraciones de asignacin 3.11.b declaraciones condicionales 3.11.b.1 Declaraciones IF 3.11.b.2 Declaraciones SELECT CASE 3.11.c Declaraciones de Iteracin (ciclos) 3.11.c.1 Declaracion FOR 3.11.c.2 Declaracion WHILE 3.11.c.3 Decalaracion DO 3.11.d Declaraciones de Saltos 3.11.d.1 Declaraciones BREAK y CONTINUE 3.11.d.2 Declaracion EXIT 3.11.d.3 Declaracion GOTO 3.11.d.4 Declaracion GOSUB 3.11.e Declaraciones ASM 3.12 Directivas 3.12.a Directivas del compilador 3.12.b Directivas del Linker

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

ACERCA DE
Dedicado: a la luz de mi vida Izzy y a mi futuro Bebe Motores de mi existencia

Este documento es la traduccin a veces interpretativa, a veces ayudada por programas traductores- de la ayuda de mikroBasic. Este documento no persigue ningn otro fin que no sea ayudar a los Aficionados al mundo de los PICS de habla hispana y del lenguaje tan prometedor como lo es mikroBasic. Este documento es gratuito y no tiene copyright solo los que mikroelektronika disponga en sus documentos-. Algunos errores interpretativos podrn encontrar, como un ejemplo de ello es ver delante de la traduccin los siguientes signos (?), esto es que no pude encontrar la manera correcta de interpretar o traducir el enunciado. Tambin podrn encontrar diferencias en la traduccin, como puede ser la palabra declaracin en lugar de usar la palabra sentencia. De alguna forma trate de hacer una traduccin lo mas cristalina posible, sin usar muchas interpretaciones aunque a veces fue necesario- o modismos de mi pas (Mxico). Creo yo que el documento es entendible y nos puede brindar un poco de ayuda para hacer mas fcil la interpretacin de las reglas, instrucciones y libreras del mikroBasic. Reitero que no manejo el lenguaje ingles al 100% y menos el lenguaje tcnico en ingles pero por la poca experiencia que tengo usando el mikroBasic trate de realizar este documento. La traduccin de la ayuda como marca en los encabezados de cada pgina la hice como un tributo al mejor foro de Microcontroladores de habla hispana: TODOPIC. Por lo tanto este documento pertenece al foro y a todos sus usuarios. Por mi parte este documento tiene licencia GPL al menos la traduccin- y puede ser modificada siempre y cuando se respete al autor original de la traduccin (en este caso navaismo) y se haga referencia al foro TODOPIC. Pues sin nada mas que decir, solo me resta desearles suerte en este viaje interminable hacia al mundo de los PICS y a la introduccin de un lenguaje en vas de desarrollo como lo es el BASIC para PICmicros. Gracias a TOD@S y en especial a mikroelektronika por su Software demo: mikroBasic

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


PREDEFINIENDO GLOBALES Y CONSTANTES Para facilitar la programacin, MikroBasic implementa un nmero predefinido de Variables globales y constantes Todos los Registros SFR del PIC estn declarados implcitamente como variables globales del tipo byte, y son visibles en todo el proyecto. Cuando se crea un proyecto, MiKrobasic incluir el archivo apropiado con extensin .def, el cual contiene las declaraciones disponibles del SFR y constantes (como PORTB, TMR1, etc.). Los identificadores estn todos en maysculas, idnticos a las nomenclaturas de las hojas de datos de MICROCHIP. Para el set completo de constantes y globales predefinidas, Busque "DEFS" en el directorio de instalacin de MikroBasic, o pruebe el asistente de cdigo para letras especificas (ctrl.+espacio en el editor de cdigo). ACCESANDO A LOS BITS INDIVIDUALES Mikrobasic permite acceder de forma individual a cada Bit de una variable. Simplemente use un punto (.) con la variable, seguido de un numero. Por Ejemplo: Dim myvar as longint ' rango de los bits de myvar es de myvar.0...myvar.31 '... ' si RB0 es 1, pon 1 en el 28vo. bit de myvar: if PORTB.0 = 1 then myvar.27 = 1 endif No hay necesidad por una declaracin en especial; este tipo de acceso selectivo es una caracterstica intrnseca de mikrobasic y puede ser usada en cualquier parte del cdigo. Asegrese de no exceder el tamao del tipo apropiado.(P.E. PORTB.12 retornara un error ya que el PORTB es una variable de 8 bits). Si esta familiarizado con un Chip en particular, puede acceder a sus bits por su nombre: ' Limpiar TMR0F INTCON.TMR0F = 0 Vea Predefiniendo Globales y Constantes para ms informacin de los nombres de REGISTROS/BIT. NOTA: Puede tambin acceder a los bits individuales de una variable flotante de esta forma, pero necesita estar familiarizado con el almacenamiento interno de tipo flotante.

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


INTERRUPCIONES Pueden ocuparse interrupciones fcilmente por medio de la palabra reservada interrupt . mikroBasic implcitamente declara procedimiento interrupt, el cual no puede ser redeclarado. Escriba su propio procedimiento para ocupar interrupciones en su aplicacin. Note que no puede llamar rutinas dentro de la interrupcin debido a las limitaciones de la pila(stack). Mikrobasic salva los siguientes SFR dentro de la pila y los elimina cuando retorna: Familia PIC12 : W, STATUS, FSR,PCLATH Familia PIC16 : W, STATUS, FSR,PCLATH Familia PIC18 : FSR (El contexto rpido es usado para salvar WREG BSR, STATUS ) NOTA: MikroBasic no soporta interrupciones de baja prioridad; para la Familia PIC18, las interrupciones deben ser en alta prioridad. LLAMANDO RUTINAS DESDE INTERRUPCIONES Llamar funciones y procedimientos dentro de una rutina es ahora posible. El compilador se encarga de los registros que estn siendo usados, ambos en interrupt y en main. Y realiza un switcheo inteligente entre ambos contextos, salvando solo los registros que ambos hilos pueden usar. Las Funciones y procedimientos que no tengan su propio marco ( sin argumentos o variables locales) pueden ser llamados desde la interrupcin o desde main. EJEMPLOS DE INTERRUPCION Aqu esta un ejemplo simple del manejo de interrupciones desde TMR0 ( si ninguna otra interrupcin es requerida) sub procedure interrupt counter = counter + 1 TMR0 = 96 INTCON = $20 end sub En caso de mltiples interrupciones habilitadas, necesita probar cual de las interrupciones ocurre y despus proceder con el cdigo apropiado (manejo de interrupcin): sub procedure interrupt if TestBit(INTCON, TMR0IF) = 1 then counter = counter + 1 TMR0 = 96 ClearBit(INTCON, TMR0F) ' ClearBit se comprende como una funcin inline ' y debe ser llamada dentro de la interrupcin else

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


if TestBit(INTCON, RBIF) = 1 then counter = counter + 1 TMR0 = 96 ClearBit(INTCON,RBIF) end if end if end sub

RUTINAS CONSTRUIDAS O PREDEFINIDAS (BUILT-IN ROUTINES) El compilador mikroBasic esta provisto de una serie til de rutinas predefinidas. Las rutinas predefinidas no requieren de nada especial; puede hacer uso de ellas en cualquier parte del proyecto. Algunas rutinas predefinidas estn implementadas como inline; por ejemplo: el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas.

RUTINAS
Inc Dec Chr Ord SetBit ClearBit TestBit Lo Hi Higher Highest SizeOf Swap Clock_Khz

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

Clock_Mhz Reset ClrWdt


Inc Prototipo: Regresa: Descripci n:

sub function Inc(dim byref par as longint) as longint


El valor incrementado del parmetro Incrementa el parmetro par por 1. Note que la funcin debe ser llamada como una declaracin auto-contenida. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas

Requiere: Ejemplo

Nada a=4 b= Inc(a) 'a y b ahora son igual a 5

DEC Prototipo: Regresa: Descripci n:

sub function Dec(dim byref par as longint) as longint


El valor decrementado del parmetro Decrementa el parmetro par por 1. Note que la funcin debe ser llamada como una declaracin auto-contenida Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas.

Requiere: Ejemplo :

nada b= Dec(a) 'a y b ahora son igual a 3

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Chr Prototipo: Regresa: Descripci n:

sub function Chr(dim code as byte) as char


Regresa un carcter asociado con el carcter especifico de code Regresa un carcter asociado con el carcter especifico de code. Nmeros de 0 a 31 son los cdigos ASCCI no imprimibles Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas.

Requiere: Ejemplo:

Nada c = Chr(13) ' regresa un retorno de carro (enter)

Ord Prototipo: Regresa: Descripci n:

sub function Ord(dim character as char) as byte


El cdigo ASCII de character La funcin regresa el cdigo ASCII del carcter. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas.

Requiere: Ejemplo:

Nada c = Ord("A") ' C ahora es 65

SetBit Prototipo: Regresa: Descripci n:

sub procedure SetBit(dim byref register as byte, dim rbit as byte)


Nada La funcin "setea"(poner en uno o verdadero) el bit rbit del registro. El parmetro rbit debe ser una variable o una literal cuyo valor sea de 0...7. Vea redefiniendo globales y constantes para mayor informacin de los identificadores de registros. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada SetBit(PORTB,2) 'setea RB2

Requiere: Ejemplo:

10

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

ClearBit Prototipo:

sub procedure ClearBit(dim byref register as byte, dim rbit as byte)


Nada La funciona limpia el rbit del registro. El parmetro rbit necesita ser una variable o una literal cuyo valor sea de 0...7. Vea predefiniendo globales y constantes para mayor informacin de los identificadores de registros. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada ClearBit(PORTC,7) 'Limpia RC7 (Limpiar o poner a 0 o falso)

Regresa: Descripci n:

Requiere: Ejemplo:

TestBit Prototipo: Regesa: Descripci n:

sub function TestBit(dim register, rbit as byte) as byte


Si el bit esta seteado(verdadero), regresa 1, en otro caso regresa 0 La funcin revisa si el rbit del registro esta seteado. Si esta seteado, la funcin retorna 1, cualquier otro caso retorna 0. El parmetro rbit necesita ser una variable o literal cuyo valor sea de 0...7. Vea predefiniendo globales y constantes para mayor informacin de los identificadores de registros. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada flag = TestBit(PORTE,2) ' 1 si RE2 esta seteado, 0 si no lo esta.

Requiere: Ejemplo:

Lo Prototipo: Regresa: Descripci n:

sub function Lo(dim number as byte..longint) as byte


Regresa los 8 bits menores de number, bits 0...7 La funcin regresa los 8 bits menores de number. La funcin no interpreta los patrones bit de number - solamente regresa los 8 bits encontrados en el registro. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada a = Lo(0x1AC30F4) ' a ser igual a 0xF4

Requiere: Ejemplo:

11

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Hi Prototipo: Regresa: Descripci n:

sub function Hi(dim number as word..longint) as byte


Regresa el los siguientes 8 bits(byte)de los 8 bits menores de number, bits 8...15 La funcin regresa el siguiente Byte del menor byte de number. La funcin no interpreta los patrones bit de number - solamente regresa los siguiente 8 bits encontrados en el registro. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada a = Hi(0x1AC30F4) ' a es igual a 0x30

Requiere: Ejemplo: Higher Prototipo: Regresa: Descripci n:

sub function Higher(dim number as longint) as byte


Regresa el siguiente byte del byte mas alto de number, bits 16...23 La funcin regresa el siguiente byte del byte ms alto de number. La funcin no interpreta los patrones bit de number - solamente regresa los siguiente 8 bits encontrados en el registro. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada a = Higher(0x1AC30F4) ' a es igual a 0xAC

Requiere: Ejemplo:

Highest Prototipo: Regresa: Descripci n:

sub function Highest(dim number as longint) as byte


Regresa el Byte mas alto de number, bits 24...31 La funcin regresa el Byte mas alto de number, La funcin no interpreta los patrones bit de number - solamente regresa los siguiente 8 bits encontrados en el registro. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada a = Highest(0x1AC30F4) ' a es igual a 0x01

Requiere: Ejemplo:

12

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


SizeOf Prototipo: Regresa: Descripci n: Requiere: Ejemplo:

sub function SizeOf(dim variable_name as string[100]) as word


Regresa el tamao en bytes de la variable Esta funcin da el tamao en Bytes de cunto espacio de memoria es usado por el operando. Nada structure TStruct dim FieldA as byte ' 1 byte dim FieldB as word ' 2 bytes end structure ' total 3 bytes dim SomeVar as TStruct dim SomeOtherVar as word main: someOtherVar = SizeOf(SomeVar) ' SomeOtherVar = 3 end.

Swap Prototipo: Regresa: Descripci n: Requiere: Ejemplo:

sub function Swap(dim byref arg as byte) as byte


Regresa el Byte consistente de los nibbles intercambiados Intercambia los nibbles altos (bits <7..4>) y los nibbles bajos (bits <3..0>) de el tamao del Byte del parmetro arg. Nada PORTB = 0xF0 PORTA = Swap(PORTB)

' PORTA = PORTB = 0x0F

Clock_Khz Prototipo: Regresa: Descripci n:

sub function Clock_Khz as word


El dispositivo reloj in KHZ, es redondeado al entero mas cercano El dispositivo reloj in KHZ, es redondeado al entero mas cercano. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada clk = Clock_Khz

Requiere Ejemplo:

13

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Clock_Mhz Prototipo: Regresa:

sub function Clock_Mhz as byte


La funcin dispositivo reloj en MHz, es redondeado a el entero mas cercano. Esta es una rutina inline; el cdigo se genera en el lugar de la llamada, para que la llamada no est contra el lmite de llamadas anidadas. Nada clk = Clock_Mhz

Requiere: Ejemplo:

Reset Prototipo: Regresa: Descripci n: Requiere: Ejemplo:

sub procedure Reset


Nada Este procedimiento es igual a la instruccin en ensamblador reset. Este procedimiento funciona solamente para la Familia PIC18. Nada Reset ' Resetea el PIC

ClrWdt Prototipo: Regresa: Descripci n: Requiere: Ejemplo:

sub procedure ClrWdt Nada Este procedimiento es igual a la instruccin en ensamblador clrwdt Nada ClrWdt ' Limpia el WatchDogTimer del PIC

Optimizaci n de c digo La optimizacin ha sido aadida para extender la usabilidad del compilador, bajo la cantidad de cdigo generado y la velocidad de su ejecucin. Las principales caractersticas son: Plegado Constante Todas las expresiones pueden ser evaluadas al tiempo de la compilacin (por ejemplo una constante) son reemplazados por el resultado. (3+5--->8); La propagaci n de Constantes Cuando un valor constante est asignndose a cierta variable, el compilador reconoce esto y reemplaza el uso de la variable en el cdigo que sigue por la constante, con tal de que el valor de variable permanezca inalterado.

14

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Copia de Propagaci n El compilador reconoce dos variables que tienen el mismo valor y elimina una de ellas en el cdigo.

Enumeraci n de Valor El compilador "reconoce" si dos expresiones rinden el mismo resultado, y por consiguiente puede eliminar el cmputo entero para uno de ellos. Eliminaci n de c digo Muerto El cdigo que ya no es usado en ninguna parte del programa, y que no afecta el resultado final de la aplicacin. Es automticamente removido. Asignaci n de la Pila Los registros temporales ("Pilas") se usan ms racionalmente, permitiendo expresiones MUY complejas para ser evaluadas con el consumo mnimo de la pila. Optimizaci n de Variables locales Ninguna variable local se usa si su resultado no afecta algunas de las variables globales o voltiles. Mejor Generaci n de c digo y Optimizaci n local La Generacin de cdigo es ms Consistente, y Mucha ms atencin se ha implementado para solucionar especficamente la construccin del cdigo, para reducir el tamao de cdigo generado. Especificaciones del PIC Para conseguir el mejor rendimiento del compilador MikroBasic, usted debe estar familiarizado con ciertos aspectos del PICmicro. Estos conocimientos no son esenciales, pero pueden ayudar a entender mejor las posibilidades y limitaciones del PIC, y su impacto en el la escritura del cdigo. Tipos de Eficiencia Primero que nada, debe saber que la ALU del PIC, quien realiza las operaciones aritmticas, esta optimizada para trabajar con Bytes. Aunque MikroBasic es capaz de trabajar con tipos de datos muy complejos, el PIC puede chocar con estos, especialmente si esta trabajando con modelos muy viejos. Esto puede aumentar dramticamente el tiempo necesario para realizar hasta una simple operacin. Un consejo universal es usar el tipo ms pequeo posible en cada situacin. Esto aplica en general para toda la programacin, y doblemente para los Microcontroladores. Conozca su herramienta, Cuando haga clculos, no todos los PIC tienen el mismo rendimiento. Por ejemplo, la Familia PIC16 no tiene Hardware para multiplicar 2 bytes, pero se compensa con un algoritmo por software. Por otro lado, la familia PIC18 tiene un hardware multiplicador, y por ende la multiplicacin trabaja considerablemente ms rpido.

15

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Limitaciones de Llamadas Anidadas. Las llamadas anidadas representan una llamada a una funcin dentro del cuerpo de la funcin. O as mismo (llamadas recursivas) a otra funcin. Las llamadas recursivas, son una forma de cruzar las llamadas, y no estn soportadas por mikroBasic debido a la pila del PIC y limitaciones de memoria. MikroBasic limita el nmero de llamadas anidadas no recursivas a: 8 llamadas para la familia PIC12 8 llamadas para la familia PIC16 31 llamadas para la familia PIC18 Note que las rutinas predefinidas no cuentan encontra del limite, debido a su implementacin inline. El numero permitido de llamadas anidadas decrece por uno si se usa en el cdigo cualquiera de los siguientes operadores: * / %, Y decrece por uno si usa interrupciones en el programa. Si el numero permitido de llamadas anidadas es excedido, el compilador reportara un error de desbordamiento de la pila. Especificaciones PIC16 Saltando entre paginas En aplicaciones que usen los PIC16, ninguna rutina sola debe exceder una pagina (2000 instrucciones. Si la rutina no encaja dentro de una pagina, el linker reportara un error. Cuando confronte este problema, talvez deba pensar como replantear el diseo de su aplicacin -trate de hacer la rutina en particulares pedazos cortos, etc. Limites de acercamiento a travs del FSR Punteros con la familia PIC16 estn cercanos y solo pueden llevar 8 bits de la direccin. El compilador automticamente limpiara el 9no. bit al inicio. Para que los punteros se refieran al banco 0 y 1, para acceder a los objetos en el banco 3 o 4 va punteros, el usuario deber poner el IRP manualmente, y restaurarlo a 0 despus de la operacin. Nota: Es muy importante tener cuidado del manejo del IRP, si desea seguir con este acercamiento. Si cree que este mtodo es inapropiado con demasiadas variables, tal vez deba considerar actualizarse a la familia PIC18. Nota: Si tiene muchas variables en el cdigo, trate reestructurarlas con la directiva absolute del linker. Las variables que se aproximen solo directamente deben ser movidas a los bancos 3 y 4 para incrementar la eficiencia.

16

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Referencia del Lenguaje MikroBasic. Elementos lxicos Estos temas proporcionan una definicin formal de los elementos lxicos de Mikrobasic. Ellos describen las diferentes categoras de unidad de tipo de palabra (TOKENS) reconocidas por el lenguaje. En la fase de Tokenizacion, el cdigo fuente es analizado (es decir, despedazado)en tokens y espacios en blanco. Los tokens en mikrobasic son derivados de una serie de operaciones realizadas en su programa por el compilador. Un programa de MikroBasic comienza como una secuencia de caracteres ASCII, que representan el cdigo fuente, creado por palabras clave usando un editor de texto (como el editor de cdigo de mikroBasic). El programa bsico de mikrobasic es un archivo guardado en la RAM o en un disco teniendo por extensin .pbas. Espacios en Blanco Los espacios en blanco es el nombre dado a los espacios (blancos), horizontales o verticales y comentarios. Los espacios en blanco sirven para indicar donde empiezan los Tokens y donde terminan. Mas all de esto cualquier espacio en blanco es descartado. Por ejemplo estas 2 secuencias: dim tmp as byte dim j as word y dim tmp as byte dim j as word Son lxicamente equivalentes y analizadas idnticamente. Espacios en Blanco en cadenas Los caracteres ASCII representando un espacio en blanco pueden darse dentro de las cadenas literales, en cuyo caso estn protegidos por el anlisis gramatical normal (permanecen como parte de la cadena).Por ejemplo: la declaracin

some_string = "mikro foo" analiza 4 tokens, incluyendo la cadena simple del token:
some_string = "mikro foo" newline character

17

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Comentarios Los comentarios son pedazos de texto usados para hacer anotaciones en el programa, y son tcnicamente otra forma de espacios en blanco. Los comentarios son solamente para el uso del programador; estos son quitados del cdigo fuente antes de analizar. Use el apostrofe para crear un comentario: ' Cualquier texto en medio de un apostrofe y el fin de la lnea ' constituye un comentario. Puede ser una sola lnea. No hay comentarios multilnea en BASIC.

TOKENS Un Token es el elemento mas pequeo en BASIC que es significativo para el compilador, El analizador separa los Tokens de la entrada creando un Token mas largo usando los caracteres de izquierda a derecha. MikroBasic reconoce los siguientes tipos de Tokens: Palabras Clave Identificadores Constantes Operadores Signos de puntuacin (tambin conocidos como Separadores) Ejemplo de tokens Aqu hay un ejemplo de extraccin de Tokens. Veamos el siguiente cdigo: end_flag = 0 El compilador analizara los siguientes 4 tokens: end_flag ' identificador de la variable = ' operador de asignacion 0 ' literal newline ' termino de la declaracin Note que end_flag ser analizado como un identificador, no como la palabra clave end seguida de _flag.

18

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


LITERALES Las Literales son tokens que representan un valor numrico o el valor de un carcter. El tipo de dato de una constante es deducido por el compilador, usando pistas como el valor numrico y el formato usado en el cdigo fuente. ENTEROS Los valores enteros pueden ser representados en formato Decimal, Hexadecimal o en notacin binaria. En notacin Decimal, los numerales son representados como una secuencia de dgitos (sin comas, espacios, o puntos), con los prefijos opcionales + o - para indicar el signo. Por default los valores son positivos (6258 es equivalente a +6258). El prefijo signo de pesos o dlar ($) o el prefijo 0x indica un numero hexadecimal ( por ejemplo, $8F o 0x8F). El prefijo signo de porcentaje (%) indica un numero binario (por ejemplo %0101). Aqu hay algunos ejemplos: 11 ' Valor decimal $11 ' Valor Hexadecimal, Igual a 17 decimal 0x11 ' Valor Hexadecimal, Igual a 17 decimal %11 ' Valor Binario, Igual a 3 decimal El rango mximo permitido de un valor es impuesto por la longitud del tipo de dato en mikrobasic longint. El compilador reportara un error si la literal excede el valor 2147483647 ($7FFFFFFF). PUNTO FLOTANTE Un Valor de punto Flotante consiste en: Un entero Decimal El Punto Decimal La fraccin decimal e o E y el entero con signo del exponente(opcional) Las constantes negativas flotantes son tomadas como constantes positivas con el operador unario menos (-) como prefijo. MikroBasic limita las constantes de punto flotante a un rango de +- 1.17549435082*10e-18...+6.80564774407*10e38 Aqu algunos ejemplos: 0. ' = 0.0

19

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


-1.23 ' = -1.23 23.45e6 ' = 23.45 * 10^6 2e-5 ' = 2.0 * 10^-5 3E+10 ' = 3.0 * 10^10 .09E34 ' = 0.09 * 10^34 CARACTERES Las literales de caracteres son solamente un carcter del cdigo ASCCI, dentro de comillas(Por ejemplo, "A"). El carcter puede ser asignado a variables de tipo Byte y Char ( la variable byte asignara el valor ASCII del carcter). tambin puede asignar variables carcter a variables tipo cadena. CADENAS Una cadena es una secuencia de 255 caracteres del cdigo ASCII, dentro de comillas. Los espacios en blanco son preservados dentro de las cadenas. Por ejemplo el analizador ve la siguiente cadena: "IR A" como un simple token. La longitud de las cadenas depende del numero del que consisten. Las cadenas se guardan internamente como la sucesin dada de caracteres ms un carcter nulo final (el cero del ASCII). Las cadenas que no tengan nada dentro de las comillas son guardadas como un carcter nulo. Puede asignar cadenas a variables de cadena o a un arreglo de variables char. Algunos ejemplos: "Hello world!" ' mensaje, 12 caracteres de longitud "Temperature is stable" ' mensaje, 21 caracteres de longitud " " ' dos espacios, 2 caracteres de longitud "C" ' Letra, un carcter de longitud "" ' cadena vacia, 0 caracteres Las comillas por si mismas no pueden ser parte de las cadenas, si desea usar comillas tendr por ejemplo que usar la rutina construida Chr para imprimir las comillas: Chr(34). Palabras Clave Las palabras clave son palabras reservadas para propsitos especiales y no pueden ser usadas como un nombre de un identificador. Las palabras clave de Basic y las relevantes del registro SFR son definidas como variables globales y representan palabras reservadas que no pueden ser redefinidas como por ejemplo: PORTB, TIMER0, T1CON, etc. Pruebe el asistente de cdigo para letras especificas o refirase a Predefiniedo Globales y Contstantes. Aqu esta el listado alfabtico de las palabras reservadas en MikroBasic:

20

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

absolute abs and array asm begin boolean case char chr clear const dim div do double else end exit float for function goto gosub

21

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

if include in int integer interrupt is loop label mod module new next not or org print procedure program read select sub step string switch 22

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

then to until wend while with xor

Mikrobasic tambin incluye un numero predefinido de identificadores usados en las libreras. Puede remplazar estos por sus propias definiciones usted planea hacer sus propias libreras. Para mas informacin vea libreras de Mikrobasic.

Identificadores.

Los identificadores son nombres arbitrarios de cualquier longitud dados a Funciones, variables, Constantes simblicas, tipos de datos por definidos por el usuario y etiquetas. Todos estos elementos de programa son relacionados con objetos a travs de la ayuda. ( no se confunda con el termino objeto de la programacin orientada a objetos). may sculas o Min sculas Basic no es sensible a las maysculas o a las minsculas, por lo tanto Sum, sum y suM son identificadores equivalentes. Singularidad y Alcance Aunque los nombres del identificador son arbitrarios (dentro de las reglas declaradas), los errores resultan si el mismo nombre se usa para ms de un identificador dentro del mismo alcance. Simplemente, los nombres dobles son ilegales dentro del mismo alcance. Para ms informacin, refirase al Alcance y Visibilidad.

23

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

Ejemplos de Identificadores:
temperature_V1 Pressure no_hit dat2string SUM3 _vtext

Y aqui unos identificadores invlidos:


7temp ' NO -- No pueden iniciar con un numero %higher ' NO -- No pueden iniciar con caracteres especiales xor ' NO -- No pueden ser una palabra reservada j23.07.04 ' NO -- No pueden contener puntos

Signos de puntuaci n o separadores los signos de puntuacin de MikroBasic son :

Corchetes Parntesis Comas Dos puntos Punto

Corchetes Los corchetes [] indican un simple o mltiples arreglos:


dim alphabet as byte[30] ' ... alphabet[2] = "c" Para mas informacin vea Arreglos. Parntesis

24

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Los parntesis () son usados para un grupo de expresiones, aislar expresiones condicionales, indicar la llamada de una rutina y las declaraciones de la rutina: d = c * (a + b) ' Separar la precedencia normal if (d = z) then ... ' Usado con expresiones condicionales func() ' llamando una rutina sin argumentos sub function func2(dim n as word) ' declarando la funcin con sus parmetros. Para mas informacin vea Precedencia de operadores y asociatividad de expresiones o Funciones y Procedimientos. Coma La coma (,) separa los argumentos en las llamadas a rutinas: Lcd_Out(1, 1, txt) Sirve para separar identificadores en las declaraciones: dim i, j, k as word La coma tambin separa elementos de inicializacin en las listas de los arreglos: const MONTHS as byte[12] = (31,28,31,30,31,30,31,31,30,31,30,31)

Dos Puntos Los dos puntos (:) son usados para declara una Etiqueta:

start: nop ... goto start


Para mas informacin vea Etiquetas.

25

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Punto El punto (.) indica el acceso a un miembro de una estructura. Por ejemplo: person.surname = "Smith" Para mas informacin Vea Estructuras. El punto es parte esencial de las literales de punto flotante. Adems el punto sirve para acceder a los bits individuales de los registros en MikroBasic.

Organizaci n del Programa MikroBasic tiene una estricta organizacin de programa impuesta, debajo encontrara modelos para una escritura legible de cdigo. Para mas informacin de la inclusin de archivos y alcance vea Mdulos y tambin Alcance y visibilidad. Organizaci n del Modulo Principal Bsicamente, el cdigo fuente tiene dos secciones: declaraciones y el cuerpo del programa. Las declaraciones deben ir en la parte apropiada del cdigo, organizadas de manera ordenada, de otro forma el compilador no ser capaz de comprender el programa correctamente. Cuando escriba el cdigo, siga el modelo que se presenta de bajo. El modulo principal deber lucir de la siguiente manera:
program <nombre del programa> include <incluir otros mdulos> '******************************************************** '* Declaraciones Globales: '******************************************************** ' Declaraciones simblicas symbol ... ' declaracin de constantes const ... 'declaracin de Variables dim ... ' declaracin de procedimientos sub procedure nombre del procedimiento(...) <Declaraciones locales> ... end sub

26

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


' declaracin de funciones sub function nombre de la funcin(...) <declaraciones globales> ... end sub '******************************************************** '* Cuerpo del Programa '******************************************************** main: ' Escriba el cdigo aqui end. Organizaci n de otros m dulos Los mdulos que no sean el Modulo principal deben empezar con la palabra clave module; la seccin de implementacin empieza con la palabra clave implements. Siga el modelo presentado debajo: module <nombre del modulo> include <incluir otros mdulos> '******************************************************** '* Interfase (Globales) '******************************************************** ' declaracin de smbolos symbol ... ' declaracin de Constantes const ... ' declaracin de Variables dim ... ' Prototipos de procedimientos sub procedure Nombre del procedimiento(...) ' Prototipo de la funcin sub function Nombre de la funcin(...) '******************************************************** '* implementacin '******************************************************** implements

27

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


' declaracin de constantes const ... ' declaracin de Variables dim ... ' declaracin de procedimientos sub procedure nombre del procedimiento(...) <Declaraciones locales> ... end sub ' declaracin de la funcin sub function nombre de la funcin(...) <Declaraciones locales> ... end sub end. Alcance y Visibilidad Alcance El alcance de los identificadores es la parte del programa donde los identificadores pueden ser usados para acceder un objeto. Hay diferentes categoras de alcances y dependen de como y donde fueron declarados los identificadores: Lugar de la declaracin El identificador es declarado en la seccin de declaraciones del modulo principal, fuera de cualquier modulo o procedimiento Alcance El alcance se extiende desde el punto donde fue declarado hasta el final del archivo, incluyendo todas las rutinas dentro del alcance del archivo. Este identificador tiene un archivo de alcance y es referido como GLOBAL El alcance se extiende desde el punto donde fue declarado hasta el fin de la rutina en uso. Este identificador es referido como LOCAL El alcance se extiende del punto donde fue declarado hasta el fin del modulo y hasta cualquier otro programa que use ese modulo. La nica excepci n son los smbolos que tienen alcance limitado en el archivo en el cual fueron declarados. El alcance se extiende del punto donde fue declarado hasta el fin del modulo. El identificador esta disponible para cualquier funci n o procedimiento que este dentro del modulo.

El identificador es declarado dentro de una funcin o de un Procedimiento El identificador es declarado en la seccin de interfase de un Modulo

El Identificador fue declarado en la secci n de implementaci n de un modulo, pero no dentro de una funci n o procedimiento.

28

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

VISIBILIDAD La visibilidad de un identificador es la regin del programa del cdigo fuente donde puede hacerse el acceso legal al objeto asociado al identificador. El alcance y la visibilidad generalmente coinciden, aunque hay circunstancias en la que un objeto se vuelve oculto temporalmente por el aparente duplicado del identificador. El objeto aun existe pero el identificador no puede ser usado para ser accesado hasta que el alcance del identificador duplicado termine. Tcnicamente, la visibilidad no puede exceder al alcance, pero el alcance puede exceder la visibilidad. MODULOS En mikroBasic cada proyecto consiste en un nico archivo de proyecto, y uno o mas archivos de mdulos. El archivo proyecto con extensin .pbp contiene informacin acerca del proyecto, mientras que los mdulos con extensin .pbas contienen el cdigo fuente. Vea Organizacin de programa para ver detalladamente el arreglo de un programa.

Los mdulos permiten: Separar programas extensos en mdulos encapsulados que pueden ser accesados y editados individualmente. Crear libreras que pueden ser usadas en diferentes proyectos. Distribuir libreras a otros programadores sin incluir el cdigo fuente. Cada modulo es guardado como su propio archivo y compilado por separado, los mdulos compilados son encadenados para crear una aplicacin. Para crear un proyecto el compilador necesita cada archivo fuente o el modulo compilado de cada modulo. Clusula INCLUDE MikroBasic incluye los mdulos que tengan la clusula include, la cual consiste en la palabra reservada include seguida de el nombre del modulo entrecomillado. La extensin del archivo no debe ser incluida. Puede incluir un solo archivo por cada clusula include . Puede haber cualquier numero de clusulas include en cada cdigo fuente, Pero ellos deben declararse inmediatamente despus del nombre del programa. Por ejemplo:

29

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


program MyProgram include "utils" include "strings" include "MyUnit" ... Dndole un nombre al modulo, el compilador verificara la presencia de los archivos .mcl y .pbas. En orden especificado por las rutas de bsqueda.

Si ambos .mcl y .pbas son encontrados, el compilador verificara las fechas e incluir el mas reciente en el proyecto. Si el archivo .pbas es mas nuevo que el archivo .mcl, la nueva librera sobrescribir la vieja Si solo el archivo .pbas es encontrado, el compilador generara el archivo .mcl y lo incluir en el proyecto. Si solo se encuentra el archivo .mcl y no hay cdigo fuente, el archivo .mcl se incluir en el proyecto tal como se encuentra. Si ninguno es encontrado, el compilador emitir file not found (Archivo no encontrado) como una advertencia. MODULO PRINCIPAL (MAIN) Cada proyecto en mikrobasic requiere de un nico modulo principal (main) el modulo principal es identificado por la palabra reservada program al inicio; esto sirve para que el compilador sepa por donde empezar. Despus de que haya creado un nuevo proyecto con el asistente de proyecto, el editor de cdigo desplegara un nuevo modulo principal, el cual contiene partes de un programa. program MyProject ' main procedure main: ' Place program code here end. Nada que no sea un comentario debe ir precedido por la palabra reservada program despus del nombre del programa usted puede incluir opcionalmente las clusulas include Ponga todas las declaraciones globales (constantes, variables, etiquetas, rutinas) antes de la etiqueta main

30

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


NOTA: En mikrobasic, la declaracin end. (la declaracin de finalizacin de cualquier programa) acta como un ciclo infinito. OTROS MODULOS Cualquier otro modulo que no sea el principal deber comenzar con la palabra reservada module . Nuevamente creara un espacio en blanco del modulo el cual puede lucir as: module MyModule implements end. Cualquier otra cosa que no sea un comentario no debe ir precedida de la palabra reservada module. Despus de la clusula module usted puede aadir opcionalmente la clusula include. SECION DE INTERFACE Parte del modulo sobre la palabra clave implements se refiere a la seccin de interfase. Aqu puede poner las declaraciones globales (constantes, variables y etiquetas) para el proyecto. No puede definir rutinas en la seccin de interfase, En cambio declare los prototipos de las rutinas (de la seccin de implementacin) que quiera que estn visibles fuera del modulo. El prototipo debe coincidir con la declaracin exactamente.

SECCION DE IMPLEMENTACION La seccin de implementacin esconde todas las entraas irrelevantes de otros mdulos, permitiendo as el encapsulado del cdigo. Cualquier declaracin debajo de la palabra reservada implementes es privada. Es decir tiene un alcance limitado al archivo. Cuando declare un identificador en la seccin de implementacin de un modulo, no podr usarlo fuera de ese modulo, pero puede usarlo en cualquier rutina o bloque definido dentro del modulo. Poniendo el prototipo en la seccin de interfase (arriba de la seccin de implementacin) puede hacer una rutina publica. Es decir visible fuera del modulo. El prototipo debe coincidir exactamente con la declaracin.

VARIABLES Una variable es un objeto cuyo valor puede ser cambiado durante el tiempo de ejecucin. Cada variable debe ser declarada bajo un nico nombre de identificador valido. Este nombre es usado para acceder al lugar de la memoria que ocupa la variable. Cada variable es declarada en la seccin de declaracin de cualquier archivo o rutina, cada variable debe ser declarada antes de ser usada. Las variables Globales (aquellas que no estn

31

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


encerradas por ninguna rutina o procedimiento) son declaradas debajo de las clusulas include y arriba de la etiqueta main. Es imperativo especificar el tipo de variables en mikrobasic. La sintaxis para declara una variable en MikroBasic es: dim nombre_de_identificador as type Donde nombre del identificador puede estar delimitado por una coma para separar diferentes nombres de identificadores y type es el tipo de dato soportado por MikroBasic. Para mas detalles vea Tipos y Tipos de conversiones, Para mas informacin del alcance de las variables vea Alcance y Visibilidad. Aqu algunos ejemplos: dim i, j, k as byte dim counter, temp as word

dim samples as longint[100]


VARIABLES Y EL PIC Cada variable declarada consume una parte de la memoria RAM del PIC. El tipo de dato de la variable no solo delimita el rango de la variable sino tambin determina el espacio usado en la memoria RAM del PIC. Tenga en mente que realizar operaciones con diferentes tipos de variables toma diferentes tiempos en ser completadas. mikroBasic recicla el espacio de variables locales las variables locales declaradas en diferentes rutinas y procedimientos comparten el mismo espacio de memoria si es posible. No es necesario declarar el tipo de variables del registro SFR, mikroBasic automticamente declara los registros relevantes como variables globales del tipo byte por ejemplo: T0IE, INTF, etc. CONSTANTES Una constante es un dato cuyo valor no puede ser cambiado durante el tiempo de ejecucin. Usar una constante en un programa no consume memoria RAM de un PIC. Una constante puede usarse en cualquier expresin pero no se le puede asignar otro valor. Las constantes son declaradas en la seccin de declaracin de un programa. La sintaxis de declaracin de una constante deber ser as: const constant_name [as type] = value Cada constante es declarada bajo un nico nombre, el cual debe ser un identificador valido. Es una tradicin escribir las constantes en maysculas. Una constante necesita que se especifique su va lor (value) que es una literal apropiada para el tipo de dato usado. El tipo (type) es opcional; en la

32

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


ausencia del tipo el compilador asume el tipo de dato mas pequeo el cual se ajuste al tamao del valor. NOTA: No puede omitir el tipo de constante si esta se trata de un arreglo. Aqu algunos ejemplos: const const const const const MAX as longint = 10000 MIN = 1000 ' El compilador asume el tipo de dato como word SWITCH = "n" ' El compilador asume el tipo de dato como char MSG = "Hello" ' El compilador asume el tipo de dato como cadena MONTHS as byte[12] = (31,28,31,30,31,30,31,31,30,31,30,31)

ETIQUETAS Las etiquetas sirven como objetivos para las declaraciones goto y gosub. Marque las etiquetas de seadas con el nombre que desee y dos puntos, as: Nombre_de_etiqueta: declaraciones No se necesitan declaraciones especiales para las etiquetas en mikroBasic. El nombre de la etiqueta necesita ser un nombre de identificador valido, las declaraciones etiqueta das y las declaraciones goto, gosub deben estar en el mismo bloque. No es posible saltar hacia una funcin o un procedimiento, No establezca una misma etiqueta para dos identificadores dife rentes. Aqu hay un ejemplo de un ciclo infinito que llama al procedimiento beep repetidamente: loop: Beep goto loop SIMBOLOS En Basic los smbolos permiten crear macros sin necesidad de parmetros. Puede reemplazar cualquier lnea de cdigo por un identificador alias. Cuando los smbolos son usados correctamente pueden incrementar la usabilidad y la legibilidad del cdigo. Los smbolos necesitan ser declarados inmediatamente despus del inicio del modulo, justo des pus del nombre del modulo y opcionalmente de las clusulas incluye. Vea organizacin de progra ma para mas detalles. El alcance de un smbolo esta siempre limitado al archivo en el cual fue de clarado. Un Smbolo es declarado as: symbol alias = code

33

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Aqu, el alias debe ser un identificador valido el cual usara a lo largo del cdigo, Este identificador tiene el alcance del archivo, el cdigo (code )puede ser cualquier lnea de cdigo valida. Usar un smbolo no consume memoria RAM de un PIC, el compilador simplemente reemplaza cada instancia de cada smbolo por la apropiada declaracin de su cdigo. Aqu algunos ejemplos: symbol MAXALLOWED = 216 co symbol PORT = PORTC symbol MYDELAY = Delay_ms(1000) dim cnt as byte '... main: if cnt > MAXALLOWED then cnt = 0 PORT.1 = 0 MYDELAY end if NOTA: Los smbolos no soportan la expansin de macros como lo hace el preprocesador de C ' Symbol es el alias de un valor numri ' Symbol es el alias de un registro SFR ' Symbol es el alias de un procedimiento

' alguna variable

FUNCIONES Y PROCEDIMIENTOS Las funciones y los procedimientos, colectivamente se refieren a las rutinas, son subprogramas (auto-contenidos en bloques de declaraciones) los cuales realizan una tarea especifica de acuerdo al numero de entradas y parmetros. Una funcin regresa un parmetro cuando esta es finalizada, un procedimiento no lo hace. NOTA: Vea especificaciones PIC para mas informacin de la limitaciones de las rutinas de los PIC micros. FUNCIONES Las funciones son declaradas as: sub function nombre de la funcin(lista de parmetros) as tipo que regre sa [ declaraciones locales] Cuerpo de la funcin end sub El nombre de la function representa el nombre de un identificador valido. El tipo que regresa, es el tipo del valor regresado por la funcin y puede ser de tipo simple. Dentro de los parntesis, la lista de parmetros, son los parmetros formales similares a la declaracin de variables. En mikrobasic,

34

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


los parmetros son siempre pasados de la funcin por un valor; para pasar argumentos por direc cin, aada la palabra reservada byref adelante del identificador. Las declaraciones locales son declaraciones opcionales sobre variables y/o constantes locales, para uso de la funcin. El cuerpo de la funcin es la secuencia de declaraciones a ser ejecutadas cuando se llame a la funcin. Llamando una funci n Una funcion es llamada por su propio nombre, con los argumentos necesarios, ingresados de la misma manera que los parmetros de la funcion. El compilador es capaz de restringir los argumen tos erroneos al tipo de argumento valido usando las reglas de conversin implicita. En la llamada de la funcion se crean los parmetros formales como objetos locales inicializados por valores de ar gumentos reales. En el retorno de la funcion, un objeto temporal es creado en lugar de la llamada, y es inicializado por la declaracion de la palabra reservada return. Esto significa que la llamda de la funcion es un operando en una expresin compleja y es tratada como el resultado de una funcion. Use la variable result (automticamente es puesta como local) para asignar un valor de retorno de la funcion. Las llamadas de la funcion son consideradas como expresiones primarias, y pueden ser usadas en situaciones donde se espera una expresin. Una llamada de la funcin tambien puede ser una de claracion autocontenida, en cuyo caso el valor de regreso es descartado. Ejemplo: Aqu hay un ejemplo de una funcion que calcula el numero xn basado en dos parmetros de entra da: x y n donde n tiene que ser mayor que cero (n>0): sub function power(dim x, n as byte) as longint dim i as byte i = 0 result = 1 if n > 0 then for i = 1 to n result = result*x next i end if end sub Ahora aqu se realiza la llamda de la funcion para calcular el numero 312 :

tmp = power(3, 12)

35

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


PROCEDIMIENTOS Un procedimiento es declarado de la siguiente manera: sub procedure nombre_del_procedimiento (lista de parametros) [ declaraciones locales ] Cuerpo del procedimiento end sub El nombre del procedimiento representa el nombre de identificador valido para el procedimieto ac tual. Dentro de los parntesis, la lista de parmetros representa una lista similar a la declaracion de variables. En mikroBasic, los parmetros siempre son pasados de procedimiento por valor; para pasar argumento por direccion use la palabra clave byref delante del identificador. Las declaraciones locales, son declaraciones opcionales de variables y/o constantes locales usa das por el procedimiento. El cuerpo del procedimiento son las secuencias de declaraciones a ser ejecutadas cuando se llame al proceso. Llamando un Proceso Un proceso es llamado por su nombre, con los argumentos necesarios, ingresados de la misma manera que los parmetros del procedimiento. El compilador es capaz de restringir los argumentos erroneos al tipo de argumento valido usando las reglas de conversin implicita. Cuando se llama un proceso, todos los parmetros formales son creados como objetos locales inicializados por los valores de los argumentos. La llamada de un proceso es una declaracion auto-contenida. Ejemplo: Aqu hay un ejemplo donde se utiliza un procedimiento el cual prepara las entradas de tiempo para ser visualizadas por un LCD. sub procedure time_prep(dim byref sec, min, sec = ((sec and $F0) >> 4)*10 + (sec and min = ((min and $F0) >> 4)*10 + (min and hr = ((hr and $F0) >> 4)*10 + (hr and end sub hr as byte) $0F) $0F) $0F)

TIPOS Basic es un lenguaje estrictamente tipificado(se refiere a los tipos de datos), lo que significa que cada variable o constante necesita tener un tipo estricto de dato conocido para el momento de la compilacin.

36

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Los tipos sirven para: Determinar el correcto espacio de memoria que sera usado Para interpretar de manera correcta los patrones de los bits encon trados en el objeto durante el subsecuente acceso Muchas veces para determinar los tipos de dato erroneos, usdados en las declaraciones. TIPOS DE CATEGORIA Los tipos pueden ser divididos en: Tipos simples Arreglos Cadenas Punteros Estructuras (tipos definidos por el usuario) TIPOS SIMPLES Los tipos simples representan los tipos que no pueden ser divididos en mas elementos basicos, y son el modelo para representar los tipos de dato elementales en el lenguaje maquina. Aqu esta una tabla de los tipos simples en mikroBasic:

Tipo byte char* word short integer longint float 8bit 8bit 16bit 8bit 16bit 32bit 32bit

Tama o

Rango 0 255 0 255 0 65535 -128 127 -32768 32767 -2147483648 2147483647 1.17549435082 * 10-38 .. 6.80564774407 * 1038

*El tipo de dato char puede ser tratado com una variable byte en cualquier aspecto. Puede asignar signos a los tipos de datos usando la conversin explicita. Vea tipos de conversio nes para mas informacin. ARREGLOS Un arreglo representa una serie de electos indexados del mismo tipo (llamados tipo de base). Como cada elemento contiene su propio indice, los arreglos pueden contener significativamente mas de una vez el mismo valor.

37

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Declaracion de arreglos El tipo de arreglos es denotado por la siguiente manera de construccion:

tipo[longitud del arreglo]


Cada elemento del arreglo es numerado desde 0 hasta la longitud del arreglo. Cada elemento del arreglo es de un tipo y puede ser accesado especificando su nombre seguido del numero de indice dentro de corchetes. Aqu unos ejemplos de declaraciones de arreglos: dim weekdays as byte[7] dim samples as word[50] main: ' Ahora podemos acceder a los indices del arreglo samples[0] = 1 if samples[37] = 0 then ... Arreglo de constantes La inicializacion del arreglo de constantes, es asignada por una delimitacion de comas de los valo res de cada indice. Por ejemplo: ' declaramos un arreglo de constants el cual contiene los dias de cada mes const MONTHS as byte[12] = (31,28,31,30,31,30,31,31,30,31,30,31) Note que la indexacion esta basada desde el cero, por lo tanto Enero es el MONTHS[0] y Diciem bre seria el MONTHS[11] El numero de los valores asignados no debera exceder el limte del tipo de dato, si esto llegara a su ceder el valor asigando sera 0. Para informacin de arreglo de datos Char vea Cadenas.

Arreglos Multidimensionales Los arreglos de una dimension son del tipo escalable, muchas veces un arreglo de una dimension es conocido tambien como un vector. Un arreglo multidimensional es construido por un arreglo de arreglos de una dimension. Y son alo jados en un espacio de memoria donde puedan ser accesados fcilmente. Es decir los arreglos son alojados en filas. Aqu hay un ejemplo de un arreglo bidimensional: dim m as byte[50][20] arreglo bidimensional de tamao 50x20

38

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


La variable m tiene un arreglo de 50 elementos y cada uno tiene un arreglo de un byte, tenemos entonces una matriz de 50x20 donde el primer elemento es m[0][0], el ultimo sera m[49][19] y el pri mer elemento de la 5ta fila sera m[0][5]. Si no ha inicializado el arreglo en la declaracion, puede omitir l aprimera dimension del arreglo mul tidimensional en este caso el arreglo es guardado en cualquier parte, por ejemplo en otro archivo. Esta es una tecnica comnmente usada para pasar arreglos a parmetros de una funcion. sub procedure example(dim byref m as byte[50][20]) primera dimension ... inc(m[1][1]) end sub dim m as byte[50][20] dim n as byte[4][2][7] main: ... func(m) end. CADENAS Una cadena representa una secuencia de caracteres y es equivalente a un arreglo construido con tipo de dato Char. Su decalaracion es asi: string[longitud de cadena] Donde la longitud de cadena se refiere al tamao maximo en el cual consistira la cadena. Las ca denas son guardadas internamente como una secuencia de caracteres finalizadas por un carcter nulo, este ultimo no afecta la longitud de la cadena. Una cadena nula (), es guardada como un carcter nulo. Puede asignar literales u otras cadenas a las variables de cadena, la cadena del lado derecho des pus del operador deber ser menor o igual a la cadena o literal del lado izquierdo. Por ejemplo: dim msg1 as string[20] dim msg2 as string[19] main: msg1 = "This is some message" msg2 = "Yet another message" podemos omitir la

'arreglo de 2 dimensiones 50x20 'arreglo de 3 dimensiones 4x2x7

msg1 = msg2 ' esto esta bien, pero viceversa seria un error
Alternativamente puede manejar elemento por elemento de la cadena, por ejemplo:

39

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


dim s as string[5] ... s = "mik" ' s[0] es el caracter "m" ' s[1] es el caracter "i" ' s[2] es el caracter l "k" ' s[3] es cero ' s[4] no esta definido ' s[5] no esta definido Tenga cuidado cuando use las cadenas de esa manera, sobrescribir el fin de la cadena puede oca sionar una violacin de acceso. Empalmado de cadenas mikroBasic permite empalmar cadenas mediante del signo mas (+). Este encadenamiento es apli cable a variables/literales de cadena y variables/literales de carcter. Para el control de caracteres use la rutina construida Chr El resultado de empalmar cadenas es una cadena. Vea la funcion Strcat Aqu un ejemplo: dim msg as string[100] dim res_txt as string[5] dim res, channel as word main: res = Adc_Read(channel) WordToStr(res, res_txt) cadena ' Obtener el valor del ADC ' Crear una variable para mostrar en forma de

' Prepare message for output msg = "Result is" + ' Texto "Result is" Chr(13) + ' aplicar un enter Chr(10) + ' aplicar un linefeed res_txt + ' resultado del adc "." ' aplicar un punto '... NOTA: mikroBasic incluye la libreria String la cual automatiza las tareas arriba realizadas.

40

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


PUNTEROS Un puntero es un tipo de dato que almacena una direccion de memoria. Mientras que una variable accesa a esa direccion directamente. Un puntero puede describirse como una referencia a una di reccin de memoria. Para declara un puntero aada el prefijo carat (^) antes del tipo. Por ejemplo si esta creando un puntero para un entero seria asi: ^integer Para ingresar el dato al puntero de la direccion de memoria, tendra que aadir el carcter carat (^) despus del nombre. Por ejemplo si declara p cuyo puntero es Word y para asignar el valor 5 a esa direccion tendra que ser de la siguiente forma: dim p as ^word ... p^ = 5 Un puntero puede ser asignado a otro puntero, de cualquier forma solo se apunta la direccion no el valor. Una vez modificado el dato de un puntero, el otro puntero diferenciara y tambien modificara sus datos.(dato es la direccion a la que apunta). Operador @ El operador @ regresa la direccion de la variable o la rutina; esto es, @ constituye un operador para un puntero. Las siguientes reglas se aplican para @: Si x es una variable, @x devolvera la direccion de la variable x Si F es una rutina (un procedimiento o funcion), @F devolvera el punto entero de Fs (el resultado es de tipo longint) ESTRUCTURAS Las estructuras representan una serie de elementos heterogeneos. Cada elemento es llamada un miembro; la declaracion de la estructura define el tipo de cada miembro. La sintaxis de declaracion de estructuras es la siguiente: structure nombre de estructura dim miembro1 as tipo1 ... dim miembron as tipon end structure Donde el nombre de la estructura es un identificador valido, cada tipo denota un tipo y cada miem bro es un identificador valido para cada tipo. El alcance del identificador del miembro, esta limitado al alcance de la estructura. Asi que no debe preocuparse por duplicar el nombre de un identificador entre miembros y variables.

41

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

Por ejemplo, las siguientes declaraciones forman una estructura llamada Dot: structure Dot dim x as float dim y as float end structure Cada Dot contiene 2 miembros: coordenadas x y y; el espacio de memoria es alojado cuando usa la estructura. Asi por ejemplo: dim m, n as Dot La declaracion de las variables crea dos instancias de la estructura DOT, llamadas m y n. Un miembro puede estar previamente definido en una estructura, por ejemplo: ' estructura definiendo un circulo: structure Circle dim radius as float dim center as Dot end structure Acceso a los miembros de las estructuras Puede acceder a los miembros de las estructuras usando un punto (.) y el nombre del selector del miembro; Si hemos declarado circle1 y circle2 de una estructura circle: dim circle1, circle2 as Circle Podemos acceder a sus miembros de forma individual de la siguiente manera: circle1.radius = 3.7 circle1.center.x = 0 circle1.center.y = 0 Tambien puede hacer asignaciones entre variables complejas, siempre y cuando las variables sean del mismo tipo. circle2 = circle1 ' esto copiara todos los valores de todos los miembros

42

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


TIPOS DE CONVERSINES La conversion de un tipo de objeto, es el cambio de un mismo objeto a otro tipo (es decir, aplicar el cambio de tipo de un objeto). mikroBasic soporta la conversin explicita e implicita para los tipos construidos. Conversi n Implcita El compilador provee automticamente la conversin implcita en los siguientes casos: La declaracin requiere una expresin de un tipo en particular ( de acuerdo con la definicin del lenguaje), y es usada una expresin de diferente tipo. El operador requiere de un operando de un tipo en particular, y usamos un operando de diferente tipo. La funcin requiere de un parmetro formal de un tipo en particular, y nosotros lo pasamos a un objeto de diferente tipo. Result no concuerda con el tipo de dato declarado al regreso de la funcin. Promoci n Cuando los operandos son de diferentes tipos, la conversin implicita promueve el cambio del menos complejo al mas complejo tipo de datos llevada acabo por los siguientes pasos: byte/char short short integer integral word integer longint longint float

Los bytes mas altos de un operando sin signo son llenados con ceros. Los bytes mas altos de un operando con signo son llenados con signos bit (si el numero es negativo, llenara los bytes mas altos con uno(1), cualquier otra forma los llenara con ceros (0) ). Por ejemplo: dim dim ... a = b = a as byte b as word $FF a ' a es promovido a word, b se vuelve $00FF

43

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Sujetando En asignaciones y declaraciones que requieran de una edxpresion de un tipo en particular, el destino debe ser guardado en el valor correcto solo si este puede representar apropiadamente el resultado de la expresin (esto es, si el resultado cabe dentro del rango del destino). Si la expresin sobrepasa el limite esperado del tipo evaluado, el exceso de datos sera simplemente sujetado (los bytes mas altos se perderan). dim dim ... j = i = i as byte j as word $FF0F j ' i se vuelve $0F, los bytes mas altos $FF se perderan.

Conversi n Explicita La conversin explicita puede ser usada en cualquier punto del programa usando las palabras reservadas byte, word, short, integer, longint, o float delante de la expresin a ser convertida. La expresin debera estar encerrada entre parntesis. La conversin explicita solo puede ser usada en el operando a la derecha del operador declarado. Una conversin especial es aquella entre tipos con y sin signo. La conversin explicita entre datos con signo y sin signo no cambiara la representacin binaria del dato solamente se copia al destino. Por ejemplo: dim dim ... b = a = a as byte b as short -1 byte(b) ' a es 255, no 1

' esto es porque la representacion binaria es ' 11111111; Simplemente es interpretado de otra manera ahora No puede ejecutar la conversin explicita con el operando a la izquierda del operador declarado. word(b) = a ' Compiler will report an error

Ejemplos de conversions dim dim ... a = b = c a, b, c as byte cc as word 241 128 = a + b ' igual 113

44

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


c = word(a + b) cc = a + b ' igual 369 ' igual 369

Conversiones Aritmticas Cuando usa una expresin aritmetica, como a+b, donde a y b son tipos de datos diferentes, mikroBasic realiza la conversin implicita de los tipos antes de ser evaluados. Estas conversiones incluyen la promocion o cambio de los tipos mas bajoa a los tipos mas altos, con interes en la exactitud y la consistencia. Asignando un objeto con signo tipo carcter (como una variable) a un objeto integral el resultado automticamente estara signado. Los objetos de tipo short siempre usan una extensin signada; los objetos de tipo byte siempre ponen en cero el byte mas alto cuando son convertidos a int. Convertir un entero largo (long int) a un tipo corto (short) siempre se truncan los bits mas altos, dejando intactos los bits mas bajos. Conviertiendo un tipo corto a un tipo largo con el signo extendido o llenando con ceros los bits extras del nuevo valor. Dependiendo si el dato corto esta signado o no, respectivamente. NOTA: la conversin de datos de tipo flotante a un valor entero (en asignaciones via tipo de dato explicito) produce los resultados correctos si el valor del tipo flotante no excede el alcance del tipo de dato del destino. A detalle: Aqu estan los pasos que mikrobasic usa para convertir los operandos en expresiones aritmeticas: Primero, cualquier dato pequeo es convertido de acuerdo a las siguientes reglas: 1. 2. 3. 4. byte se convierte a integer short se convierte a integer, con el mismo valor short se convierte a integer, con el mismo valor, con signo extendido byte se convierte a integer, con el mismo valor, rellenado con ceros

El resultado de la expresin es el mismo tipo que la de los 2 operandos. Aqu unos ejemplos de la conversin implicita: 2 + 3.1 5 / 4 * 3. 3. * 5 / 4 ' 2. + 3.1 5.1 ' (5/4)*3. 1*3. 1.*3. 3. ' (3.*5)/4 (3.*5.)/4 15./4 15./4. 3.75

45

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


OPERADORES Los operadores son tokens que activan algun computo cuando son aplicados a una variable o a un objeto en alguna expresin. Existen cuatro tipos de operandos en mikroBasic: Operadores aritmeticos Operadores Inteligentes Operadores relacionales

Operadores, Precedencia y Asociatividad. Hay 4 categorias de precedencia en mikroBasic. Los operadores que estan en la misma categora tienen la misma precedencia uno con otro. Cada categora tiene reglas de asociatividad: izquierda a derecha (), o de derecha a izquierda (). En la ausencia de parntesis, estas reglas resuelven la agrupacin con expresin de la misma categora.

Precedencia 4 3 2 1

Operandos 1 2 2 2

Operadores @ * + = not + / div mod and << >> - or xor <> < > <= >=

Asociatividad

OPERADORES ARITMETICOS Los operadores aritmeticos son usados para realizar computos matematicos, estos tienen operadores numericos y regresan un valor numerico. Como los operadores char bsicamente son operadores byte pueden ser usados como operadores aritmeticos sin signo. Los operadores necesitan ser ambos con signo o ambos sin signo. Todos los operadores aritmticos se asocian de izquierda a derecha.

Operador + * /

Operacion suma resta multiplicacion division, punto- flo

Operandos byte, short, integer, word, longint, float byte, short, integer, word, longint, float byte, short, integer, word, float byte, short, integer,

Resultado byte, short, integer, word, longint, float byte, short, integer, word, longint, float integer, word, lon gint, float byte, short, integer, 46

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

div mod

tante division, redondeo al entero mas cercano modulo, regresa el resto de la division de un entero(no pue de ser usada con va lores flotantes.)

word, float byte, short, integer, word, longint, float byte, short, integer, word, longint

word, float byte, short, integer, word, longint byte, short, integer, word, longint

Division por cero Si 0 (cero) es usado como el segundo operando (por ejemplo, x div 0) el compilador generara un error y no generara el codigo. Pero en el caso de una division implicita por ejemplo x div y donde y es igual a 0 el resultado sera el maximo valor para el tipo de dato apropiado. (por ejemplo si x y y son tipo Word el resultado sera $FFFF). Operadores aritmeticos unarios. El operador (menos) puede ser uado como el prefijo unario de un operando, para cambiar el signo de un valor. El operador unario mas (+) tambien puede ser usado pero no afecta al dato. Por ejemplo: b := -a; OPERADORES RELACIONALES Use los operadores relacionales para probar igualdades o desigualdades de las expresiones. Todos los operadores regresan TRUE (verdadero) o FALSE (falso).

Operator = <> > < >= <= Igual Diferente Mayor que Menor que Mayor igual Menor igual

Operation

Todos los operadores se relacionan de izquierda a derecha.

47

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Operadores relacionales en expresiones. El signo igual (=) tambien puede ser un operador de asignacin, dependiendo del contexto. La precedencia de los operadores aritmeticos y relacionales fueron designados para trabajar con expresiones complejas sin parntesis lo que quiere decir que: a + 5 >= c - 1.0 / e ' (a + 5) >= (c - (1.0 / e))

OPERADORES INTELIGENTES Use los operadores inteligentes para cambiar los bits individuales de los operandos numericos. Los operandos necesitan ser signados o sin signo, ambos. Los operadores inteligentes se relacionan de izquierda a derecha. La unica excepcion se aplica al operador inteligente not, que se relaciona de derecha a izquierda. Resumen de los operadores inteligentes.

Operador and or xor not << >>

Operacin AND inteligente; compara pares de bits y genera 1 si ambos son uno de otro modo genera un 0 OR (inclusiva) inteligente; compara pares de bits y genera un 1 si el resultado es 1, de otra forma genera 0 OR exclusiva (XOR); compara pares de bits y gene ra un 1 si el resulatdo de ambos es complementario, de otra forma regresa 0 Complemento (unario); invierte cada bit Corrimiento a la izquierda; mueve los bits a la iz quierda, descarta el bit izquierda mas lejano y asig na 0 al bit de la derecha. Corrimiento a la derecha; mueve los bits hacia la de recha, descarta el bit de la derecha mas lejano y si no tiene signo lo asigna con 0 al bit de la izquierda, de otro modo el signo se extiende

48

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Operaciones l gicas a nivel bit

and 0 1 or 0 1 xor 0 1 not

0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1

Los operadores inteligentes and, or y xor realizan operaciones logicas con los respectivos pares de bits de los operandos. El operador not complemente cada bit del operando. Por ejemplo: $1234 and $5678 ' igual a $1230 ' porque .. ' $1234 : 0001 0010 0011 0100 ' $5678 : 0101 0110 0111 1000 ' ---------------------------' and : 0001 0010 0011 0000 ' .. esto es, $1230 ' similarmente: $1234 or $5678 $1234 xor $5678 not $1234 Conversiones sin signo Si un numero es convertido de un tipo menos complejo a uno mas complejo, los bits mas altos seran rellenados con ceros. Si un numero es convertido de un tipo masa complejo a uno menos complejo los bits mas altos se perderan. Por ejemplo: dim dim ... a b a as byte b as word = $AA = $F0F0 ' igual a $567C ' igual a $444C ' igual a $EDCB

49

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


b = b and a ' a es extendido con ceros; b se vuelve $00A0

Conversiones con signo Si un numero es convertido de un tipo menos complejo a uno mas complejo. Los bits mas altos son llenados con unos si el bit de signo es 1 ( si es negativo); los bits mas altos son llenados con ceros si el bit de signo es 0 (si es positivo). Si un numero es convertido de un tipo masa complejo a uno menos complejo, los bits mas altos se perderan. Por ejemplo: dim dim ... a b b a as byte b as word = -12 = $70FF = b and a

' a se extiende con signo, los bytes mas altos seran $FF; ' b se vuelve $70F4 Operadores de corrimiento Los operadores binarios << y >> mueven los bits del operando izquierdo, especificados por un numero en el operando derecho, ya sea a la izquierda o a la derecha. El operando derecho debe ser positivo y menor que 255. Con el corrimiento a la izquierda (<<) los bits mas izquierdos son descartados, y los nuevos bits son llenados con ceros. Hacer el corrimiento a la izquierda de un operando sin signo n posiciones es equivalente a multiplicarlo por 2n si todos los bits descartados son cero. Esto tambien es verdadero para los operandos con signo, si todos los bits descartados son iguales el bit de signo. Con el corrimiento a la derecha (>>) los bits mas derechos son descartados, y los bits de la izquierda son rellenados con ceros (en caso de que sea un operando sin signo) o el valor del bit de signo (en caso de que este sea un valor con signo). Hacer el corrimiento a la derecha n posiciones es equivalente a dividirlo por 2n. EXPRESIONES Una expresin son una serie de declaraciones, operandos, operadores y puntuaciones que retornan un valor. Las expresiones primarias incluyen: literales, constantes, variables y llamadas a funciones. Apartir de esto, usando operadores se pueden crear expresiones mas complejas. Formalmente las expresiones son definidas recursivamente: las subexpresiones pueden aadirse al limite de la memoria.

50

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Las expresiones son evaluadas de acuerdo al tipo de conversin, grupo, asociatividad y las reglas de precedencia usado por los operadores dentro de ellas, la presencia de parntesis y el tipo de dato de los operandos. La manera en que las expresiones son agrupadas no necesariamente especifican el orden actual en que son evaluadas por mikroBasic. No puede mezclar tipos de dato con o sin signo en expresiones de asignacin o en expresiones aritmeticas o en expresines logicas. Puede usar la conversin explicita para ello.

DECLARACIONES Las declaraciones definien la manera en que actuan los algoritmos dentro de un programa. Cada declaracion necesita estar determinada por una nueva linea de carcter (enter). La declaracion mas simple incluye asignacines, llamadas de rutinas y saltos a otras declaraciones. Esto puede ser usado para crear ciclos, saltos, y otras declaraciones estructuradas. En la ausencia de saltos y seleccin de declaracines, las declaraciones seran ejecutadas de manera secuencial tal como estan escritas en el codigo fuente. Vea: Declaraciones de asignacin Declaraciones condicionales Declaraciones de iteracin (ciclos) Declaraciones de saltos Declaraciones de lenguaje Ensamblador (ASM).

Declaraciones de asignaci n Las declaraciones de asignacin tiene la siguiente forma: variable = expresin la declaracion evalua la expresin y le asigna el valor de la variable. Todas las reglas de la conversin implicita se aplican. Variable puede ser declarada como una variable o como un arreglo y expresin puede ser cualquier expresin. No confunda el asignamiento con el operador relacional igual (=), que prueba una igualdad. Mikrobasic interpretara el signo igual (=) dentro de su contexto.

51

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Declaraciones condicionales Las declaraciones condicionales o de seleccin, escogen diferentes tipos de acciones dependiendo de los valores o expresiones evaluadas. Hay 2 tipos de declaraciones condicionales: If Select Case Declaraciones IF Use declaraciones if para implementar una declaracion condicional. La sintaxis de las declaraciones IF es la siguiente: if expresion then declaraciones [else Otras declaraciones] end if Donde la expresin, es evaluada si es verdadero las declaraciones se ejecutan. Si la expresin es falsa se ejecutaran otras declaraciones. La expresin debe ser convertida a tipo bolean, de otra forma la expresin esta mal formulada. La palabra clave else y las otras declaraciones son opcionales. Declaraciones de IFs anidados Anidar Ifs requiere de atencin especial, la regla general es que la condicion anidada se analiza desde la condicion mas profunda, con cada else limitando al if mas cercano de la izquierda. Declaraciones Select Case Use la declaracion select case para pasar el control o saltar a una rutina de programa, basado en una condicion certera. La palabra clave select case consiste en un selector de una expresin ( una condicion) y una lista de posibles valores. La sintaxis de select case es la siguiente:

select case selector case valor_1 declaraciones_1 ... case valor_n declaraciones_n [case else Declaraciones _default] end select

52

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

Primero el selctor es evaluado, despus se compara con la lista de valores disponibles case valor, si un valor es encontrado, el programa seguira en las declaraciones del valor encontrado. En le caso de multiples valores encontrados el programa hara uno a uno empezando por el primer valor encontrado. Si ningun valor es encontrado seguira en las declaraciones default. Aqu un ejemplo simple: select case operator case "*" res = n1 * n2 case "/" res = n1 / n2 case "+" res = n1 + n2 case "-" res = n1 - n2 case else res = 0 cnt = cnt + 1

end select
Tambien puede agrupar valores para un caso. Simplemente separe los valores por comas: select case reg case 0 opmode = 0 case 1,2,3,4 opmode = 1 case 5,6,7 opmode = 2 end select Declaraciones case anidadas Note que las declaraciones case pueden ser anidadas, los valores son asignados al mas profundo select case .

53

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


DECLARACIONES DE ITERACION. Las declaraciones de iteracin le permiten crear ciclos de un set de declaraciones. Hay tres formas de hacer iteraciones con mikroBasic: For While Do Puede usar las palabras reservada break y continue para regular el control de flujo de una iteracin. La declaracin break termina las declaraciones cuando este se presenta. Mientras que continue comienza el siguiente ciclo de iteraron de la secuencia. Declaraciones FOR La declaracion de un FOR determina un ciclo de iteracin y requiere que se especifique el numero de iteraciones. La sintaxis de una sentencia For es: for contador = valor inicial to valor final [step valor de paso] declaraciones

next contador
El contador es una variable que se incrementa segn el valor del paso con cada iteracin del ciclo. El parmetro valor de paso es un valor entero opcional y si este es omitido el valor por defecto es 1, antes de la primera iteracin, el valor del contador es puesto al valor inicial y se incrementa mientras no exceda o no llegue al valor final, con cada iteracin las declaraciones son ejecutadas. Los valores iniciales y finales deben ser valores compatibles con el contador; las declaraciones pueden ser cualquier tipo de declaraciones siempre y cuando no afecten el valor del contador. Note que el valor de paso puede ser un valor negativo, permitiendole hacer cuentas regresivas. Aqu un ejemplo de cmo calcular el producto escalar de 2 vectores a y b, de longitud n usando la sentencia FOR: S = 0 for i = 0 to n s = s + a[i] * b[i]

next i
Ciclo infinito La sentencia for puede resultar un ciclo infinito si el valor final es igual o excede el rango del tipo de dato del contador Por ejemplo, esto resultara un ciclo infinito ya que el contador nunca alcanzara el valor 300:

54

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


dim counter as byte ... for counter = 0 to 300 nop next counter para hacer un cilo infinito mas legible en mikroBasic puede usar la sentencia while true. Declaraciones WHILE Use la sentencia while para condicionar una declaracion de iteracin. La sintaxis es: while expresion declaraciones wend Las declaraciones se ejecutaran repetidamente, mientras la expresin sea verdadera, esto es si la expresin al ser evaluada la primera vez es falsa no se ejecutaran las declaraciones. Aqu esta un ejemplo de cmo calcular el producto escalar de 2 vectores usando la sentencia While: s = 0 i = 0 while i < n s = s + a[i] * b[i] i = i + 1 wend Problamente la manera mas facil de hacer un ciclo infinito sea esta: while TRUE ... wend Declaraciones DO La sentencia do ejecuta un ciclo mientras la condicion sea verdadera. La sintaxis es: do declaraciones loop until expresin Las declaraciones son ejecutadas mientras la expresin evaluada sea verdadera. La expresin es evaluada depuse de cada iteracin. Entonces las todas declaraciones se ejecutaran.

55

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Aqu hay un ejemplo de cmo calcular el producto escalar de 2 vectores, usando la sentencia DO: s = 0 i = 0 ... do s = s + a[i] * b[i] i = i + 1 loop until i = n DECLARACIONES DE SALTOS Cuando una declaracion de saltos es ejecutada, transfiere un control incondicionalmente. Hay cico tipos de sentencias de saltos en mikroBasic: Break Continue Exit Goto Gosub Declaraciones Break, Continue. BREAK Algunas veces es necesario hacer una pausa desde dentro del cuerpo del codigo. Use la sentencia break dentro de los ciclos para pasar el mando a la primera declaracion seguido del mas profundo ciclo (for while o do). Por ejemplo: 'esperar que la tarjeta_CF sea conectada; actualizar cada segundo while true Lcd_Out(1, 1, "No card inserted") if Cf_Detect() = 1 then break end if Delay_ms(1000) wend ' ahora podemos trabajar con la tarjeta CF. Lcd_Out(1, 1, "Card detected ")

56

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Declaracion Continue Puede usar la sentencia continue dentro de los cilcos para saltarse el ciclo: La sentencia continue en ciclos For, mueve el programa a la linea for, esto no cambia el contador del cilco ' continue salta aqui for i = ... ... continue ...

next i
La sentencia continue en ciclos while mueve el programa a la primer linea de la condicion (arriba) continue salta aqui while condition ... continue ...

wend
La sentencia continue en ciclos Do, mueve el programa a la linea de la condicion (abajo) do ... continue ... ' continue salta aqui

loop until condition

Declaraciones EXIT La sentencia exit le permite romper una rutina ( una funcion o un procedimiento). Pasa el control a la siguiente expresin de la llamada de la rutina. Aqu un simple ejemplo: sub procedure Proc1() dim error as byte ... ' Aqui se hace algo if error = TRUE then exit

57

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


end if ... ' algun codigo que no sera ejecutado si se encuentra un error end sub NOTA: si rompio una funcion, el valor regresado sera el valor de la variable local result al momento de la salida. Declaraci n GOTO Use la sentencia goto para un salto sin condiciones a cualquier etiqueta local para mas informacin vea Etiquetas-. La sintaxis de un goto es: goto nombre de etiqueta Esto transferira el control a la posicin al lugar especifico del nombre de la etiqueta. La palabra reservada puede estar antes o despus de la etiqueta, no es posible saltar dentro o fuera de una rutina. Puede usar la sentencia goto para salir de cualquier estructura de control anidada, nunca salte a una estructura de un ciclo o a expresiones estructuradas, porque esto puede tener efectos impredecibles. Usar un goto puede ser usado en cualquier algoritmo, resultando asi un codigo mas legible. Una posible aplicacin posibe de un goto puede ser romper un ciclo profundo anidado de una estructura: for i = 0 to n for j = 0 to m ... if disaster goto Error end if ... next j next i . . . Error: ' manejo del codigo.

Declaracion GOSUB Use la sentencia gosub para un salto sin condiciones a cualquier etiqueta para mas informacin vea Etiquetas-. La sintaxis de un gosub es: gosub nombre de la etiqueta ...

58

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Nombre de la etiqueta: ... return Esto transferira el control a el nombre de la etiqueta, tambien el punto del llamado es recordado, por eso la sentencia return, el programa regresara y ejecuta la siguiente linea despus del gosub. Un gosub puede ir antes o despus de una etiqueta. No es posible dar un salto dentro de una funcion o un procedimiento, ya que no se saben los efectos que esto podria tener. NOTA: usar un gosub es como usar un goto. El uso del gosub es indiferente. Mikrobasic solo soporta el gosub por la causa compartida hacia atrs (?). Es mejor usar funciones y procedimientos para un programa mas legibles. Generalmente un gosub viene acompaado de un Return.

Declaraciones ASM mikroBasic permite el codigo embebido ASM, usando la sentencia asm. Note que no puede usar numeros ni direcciones en codigo ensamblador. Puede usar nombres simbolicos en lugar de eso (la lista desplegara los nombres en lugar de las direcciones). Puede agrupar instrucciones en ensamblador usando la sentecia asm: asm bloque de declaraciones en ensamblador end asm Los comentarios de Basic no son permitodas en las sentencias de bloques asm, en lugar de eso tendra que usar los comentarios del ensamblador usando punto y coma (;) Si planea usar una variable de Basic en su codigo asm, asegurese de que tenga un valor inicial, de otro modo el compilador reportara un error y no compilara el programa. Esto no aplica para las globlales predefinidas como PORTB. Por ejemplo el compilador reportara un error, ya que el linker no es capaz de reconocer la variable myvar: program test dim myvar as word main: asm MOVLW 10 MOVLW test_main_global_myvar_1 end asm end.

59

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Aadiendo el siguiente codigo o uno similar el linker podra reconocer la variable myvar myvar = 0 NOTA: mikrobasic no verificara si el banco apropiado esta seteado para la variable. Necesita setear el banco apropiado en el codigo ensamblador.

DIRECTIVAS

Las directivas son palabras de especial importancia que proporcionan funcinalidad adicional con respecto a la compilacin y el rendimiento. Tiene las siguientes directivas a su disposicin: Directivas de compilacin, para una compilacin condicional Directivas del Linker, para distribuir objetos en la memoria. Directivas de compilaci n o del compilador Toda linea en el codigo que comienze con el numeral (#) es tomada como una directiva del compilador el numeral inicial puede ser precedido o seguido de espacios en blanco, pero no nuevas lineas. Las directivas del compilador no diferencian entre mayusculas o minusculas Puede usar las directivas de compilacin para ejecutar ciertas partes del codigo y excluir otras. Todas las directivas deben ser completadas en el archivo donde se empezaron. Directivas #DEFINE y #UNDEFINE Use la directiva #DEFINE para definir una constante condicional del compilador (una bandera o flag). Puede usar un identificador para esa bandera, sin ninguna restriccin. No hay conflictos con el programa y sus identificadores, cuando las directivas tienen un nombre espaciado. Solo una bandera puede ser registrada por directiva. Por ejemplo: #DEFINE extended_format

60

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Directivas #IFDEFTHEN.. #ELSE La compilacin condicional es llevada acabo por la directiva #IFDEF..THEN. La directiva #IFDEF verifica que banderas estan definidas y cuales no, esto es cuando una directiva #DEFINE fue definida y si sigue activa o no. La directiva #IFDEF..THEN es terminada por la directiva #ENDIF y la clausula #ELSE es opcional: #IFDEF bandera THEN Bloque de codigo ... #IFDEF bandera_n THEN Bloque de codigo n ] [ #ELSE Bloque de codigo alternativo ] #ENDIF Primero #IFDEF verifica que la bandera este definida por #DEFINE, si es asi el bloque de codigo es compilado, si no verifica las siguientes banderas_n y ejecuta el bloque de codigo apropiado, si ninguna esta definida, entonces compilara el codigo del bloque alternativo dentro del #ELSE. La directiva #ENDIF finaliza la secuencia condicional. El resultado del posible escenario es solo un bloque de codigo compilado (posiblemente vacio)y es pasado para un uso futuro. La seccion de codigo procesado puede tener clausalas condicionales, anidamientos de cualquier profundidad; cada #IFDEF debe ser enmarcado por su #ENDIF correspondiente. Aqu un ejemplo: '#DEFINE resolution8 #IFDEF resolution8 THEN ... ' codigo especifico 8 bits de resolucion #ELSE ... ' codigo por defecto. #ENDIF La directiva #I es usada para insertar el volumen del archivo dado, donde esta es llamada: #I filename.txt Predefiniendo Banderas Mikrobasic tiene banderas predefinidas para el uso del hardware. Estas pueden ser encontradas en los archivos de definicin (directorio DEFS). Especificando el hardware para cada pic correspondiente. El registro SFR es organizado bajo categoras: _SFR (sombrilla para todos los registros), _CONFIG_OSC(oscilador), _CONFIG_WDT(match dog timer) y _CONFIG_BORPOR (brown-out reset y power on timer).

61

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


Directivas del Linker Mikrobasic usa un algoritmo interno para distribuir objetos dentro de la memoria. Si tiene algun objeto o rutina que especifique una direccion especifica use las directivas del linker absolute y org. Directiva ABSOLUTE La directiv absolute especifica una direccin RAM especifia de una variable, si la variable es multibyte, los bytes mas altos se guardaran en las direcciones consecutivas. La directiva absolute es aadida a una declaracion de variable: dim x as byte absolute $22 ' Variable x will occupy 1 byte at address $22 dim y as word absolute $23 ' Variable y will occupy 2 bytes at addresses $23 and $24 Tenga cuidado cuando use la directiva absolute, ya que puede sobrescribir dos variables por accidente. Por ejemplo: dim i as byte absolute $33 ' la variable I ocupara un byte de la direccion $33 dim jjjj as longint absolute $30 ' la variable jjjj ocupara bytes de $30, $31, $32, $33; Esto, ' cambia I, cambia jjjj por los valores de los bytes mas altos y vicever sa. Directiva ORG La directiva org especifica la direccion de comeizo de una rutina en la ROM. Esto se aade a la declaracion de la rutina. Por ejemplo: sub procedure proc(dim par as byte) org $200 el procedimiento proc empezara en la direccion $200 ... end sub NOTA: la directiva org puede usarse a cualquier rutina, excepto a un procedmieto interrupt. Interrupt siempre es guardado en la direccion $4 u $8 para la familia PIC18, en la pagina 0. Directiva VOLATILE La directiva volatile le da la posibilidad a una variable de cambiar sin intervencin del codigo. Las variables volatiles tipicas son: STATUS, TIMER0,TIMER1 PORTA, PORTB, etc. dim MyVar as byte absolute $123 register volatile

62

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC


LIBRERIAS DE MIKROBASIC mikroBasic esta provisto de una serie de librerias que facilitan el uso de los PIC y sus modulos: Es importante hacer notar que una buena parte de la conexi n de hardware en las librerias tiene errores al igual que el codigo ejemplo de las mismas. Por tratar de respetar el trabajo de la ayuda no se realizaron modificaciones, ni a las imgenes, ni al codigo. (uno de los errores mas comunes es que el boton de reset esta conectado al cristal, debiendo estar conectado al pin MCLR)

ADC Library CAN Library CANSPI Library Compact Flash Library EEPROM Library Ethernet Library SPI Ethernet Library Flash Memory Library Graphic LCD Library T6963C Graphic LCD Library IC Library Keypad Library LCD Library LCD8 Library Manchester Code Library Multi Media Card Library OneWire Library PS/2 Library PWM Library

63

Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC

RS-485 Library Secure Digital Library Software IC Library Software SPI Library Software UART Library Sound Library SPI GLCD Library SPI Library USART Library USB HID Library Util Library SPI Graphic LCD Library Port Expander Library Conversions Library Delays Library Math Library String Library
Vea tambien rutinas predefinidas.

64

También podría gustarte