You are on page 1of 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
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 Variables
3.4 Constantes
3.5 Etiquetas
3.6 Smbolos
3.7 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
2
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

3
4
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
5
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.
6
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
7
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
8
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Clock_Mhz
Reset
ClrWdt
Inc
Prototipo:
sub function Inc(dim byref par as longint) as longint
Regresa: El valor incrementado del parmetro
Descripcin: 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: Nada
Ejemplo a=4
b= Inc(a) 'a y b ahora son igual a 5
DEC
Prototipo:
sub function Dec(dim byref par as longint) as longint
Regresa: El valor decrementado del parmetro
Descripcin: 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: nada
Ejemplo : b= Dec(a) 'a y b ahora son igual a 3
9
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Chr
Prototipo:
sub function Chr(dim code as byte) as char
Regresa: Regresa un carcter asociado con el carcter
especifico de code
Descripcin: 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: Nada
Ejemplo: c = Chr(13) ' regresa un retorno de carro (enter)
Ord
Prototipo:
sub function Ord(dim character as char) as byte
Regresa: El cdigo ASCII de character
Descripcin: 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: Nada
Ejemplo: c = Ord("A") ' C ahora es 65
SetBit
Prototipo:
sub procedure SetBit(dim byref register as byte, dim rbit as
byte)
Regresa: Nada
Descripcin: 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.
Requiere: Nada
Ejemplo: SetBit(PORTB,2) 'setea RB2
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)
Regresa: Nada
Descripcin: 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.
Requiere: Nada
Ejemplo: ClearBit(PORTC,7) 'Limpia RC7 (Limpiar o poner a 0 o falso)
TestBit
Prototipo:
sub function TestBit(dim register, rbit as byte) as byte
Regesa: Si el bit esta seteado(verdadero), regresa 1, en otro caso regresa 0
Descripcin: 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.
Requiere: Nada
Ejemplo: flag = TestBit(PORTE,2) ' 1 si RE2 esta seteado, 0 si no lo esta.
Lo
Prototipo:
sub function Lo(dim number as byte..longint) as byte
Regresa: Regresa los 8 bits menores de number, bits 0...7
Descripcin: 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.
Requiere: Nada
Ejemplo: a = Lo(0x1AC30F4) ' a ser igual a 0xF4
11
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Hi
Prototipo:
sub function Hi(dim number as word..longint) as byte
Regresa: Regresa el los siguientes 8 bits(byte)de los 8 bits menores de number, bits 8...15
Descripcin: 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.
Requiere: Nada
Ejemplo: a = Hi(0x1AC30F4) ' a es igual a 0x30
Higher
Prototipo:
sub function Higher(dim number as longint) as byte
Regresa: Regresa el siguiente byte del byte mas alto de number, bits 16...23
Descripcin: 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.
Requiere: Nada
Ejemplo: a = Higher(0x1AC30F4) ' a es igual a 0xAC
Highest
Prototipo:
sub function Highest(dim number as longint) as byte
Regresa: Regresa el Byte mas alto de number, bits 24...31
Descripcin: 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.
Requiere: Nada
Ejemplo: a = Highest(0x1AC30F4) ' a es igual a 0x01
12
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
SizeOf
Prototipo:
sub function SizeOf(dim variable_name as string[100]) as word
Regresa: Regresa el tamao en bytes de la variable
Descripcin: Esta funcin da el tamao en Bytes de cunto espacio de memoria es usado
por el operando.
Requiere: Nada
Ejemplo: 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:
sub function Swap(dim byref arg as byte) as byte
Regresa: Regresa el Byte consistente de los nibbles intercambiados
Descripcin: Intercambia los nibbles altos (bits <7..4>) y los nibbles bajos (bits <3..0>) de el
tamao del Byte del parmetro arg.
Requiere: Nada
Ejemplo: PORTB = 0xF0
PORTA = Swap(PORTB) ' PORTA = PORTB = 0x0F
Clock_Khz
Prototipo:
sub function Clock_Khz as word
Regresa: El dispositivo reloj in KHZ, es redondeado al entero mas cercano
Descripcin: 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.
Requiere Nada
Ejemplo: clk = Clock_Khz
13
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Clock_Mhz
Prototipo:
sub function Clock_Mhz as byte
Regresa: 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.
Requiere: Nada
Ejemplo: clk = Clock_Mhz
Reset
Prototipo:
sub procedure Reset
Regresa: Nada
Descripcin: Este procedimiento es igual a la instruccin en ensamblador reset. Este
procedimiento funciona solamente para la Familia PIC18.
Requiere: Nada
Ejemplo: Reset ' Resetea el PIC
ClrWdt
Prototipo: sub procedure ClrWdt
Regresa: Nada
Descripcin: Este procedimiento es igual a la instruccin en ensamblador clrwdt
Requiere: Nada
Ejemplo: ClrWdt ' Limpia el WatchDogTimer del PIC
Optimizacin de cdigo
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 propagacin 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 Propagacin
El compilador reconoce dos variables que tienen el mismo valor y elimina una de ellas en el cdigo.
Enumeracin de Valor
El compilador "reconoce" si dos expresiones rinden el mismo resultado, y por consiguiente puede
eliminar el cmputo entero para uno de ellos.
Eliminacin de cdigo 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.
Asignacin 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.
Optimizacin de Variables locales
Ninguna variable local se usa si su resultado no afecta algunas de las variables globales o voltiles.
Mejor Generacin de cdigo y Optimizacin 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).
maysculas o Minsculas
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 puntuacin 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.
Organizacin 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.
Organizacin 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.
Organizacin de otros mdulos
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 Alcance
El identificador es declarado en la seccin de
declaraciones del modulo principal, fuera de
cualquier modulo o procedimiento
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 identificador es declarado dentro de una
funcin o de un Procedimiento
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 identificador es declarado en la seccin de
interfase de un Modulo
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 excepcin son los
smbolos que tienen alcance limitado en el
archivo en el cual fueron declarados.
El Identificador fue declarado en la seccin
de implementacin de un modulo, pero no
dentro de una funcin o procedimiento.
El alcance se extiende del punto donde fue
declarado hasta el fin del modulo. El
identificador esta disponible para cualquier
funcin o procedimiento que este dentro del
modulo.
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 MAX as longint = 10000
const MIN = 1000 ' El compilador asume el tipo de dato como word
const SWITCH = "n" ' El compilador asume el tipo de dato como char
const MSG = "Hello" ' El compilador asume el tipo de dato como cadena
const 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 ' Symbol es el alias de un valor numri
co
symbol PORT = PORTC ' Symbol es el alias de un registro SFR
symbol MYDELAY = Delay_ms(1000) ' Symbol es el alias de un procedimiento
dim cnt as byte ' alguna variable
'...
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
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 funcin
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 x
n
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 3
12
:
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, hr as byte)
sec = ((sec and $F0) >> 4)*10 + (sec and $0F)
min = ((min and $F0) >> 4)*10 + (min and $0F)
hr = ((hr and $F0) >> 4)*10 + (hr and $0F)
end sub
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 Tamao Rango
byte 8bit 0 255
char* 8bit 0 255
word 16bit 0 65535
short 8bit -128 127
integer 16bit -32768 32767
longint 32bit -2147483648 2147483647
float 32bit 1.17549435082 * 10
-38
..
6.80564774407 * 10
38
*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]) podemos omitir la
primera dimension
...
inc(m[1][1])
end sub
dim m as byte[50][20] 'arreglo de 2 dimensiones 50x20
dim n as byte[4][2][7] 'arreglo de 3 dimensiones 4x2x7
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"
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) ' Obtener el valor del ADC
WordToStr(res, res_txt) ' Crear una variable para mostrar en forma de
cadena
' 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.
Conversin 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.
Promocin
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 word
short integer
short longint
integer longint
integral 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 a as byte
dim b as word
...
a = $FF
b = 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 i as byte
dim j as word
...
j = $FF0F
i = j ' i se vuelve $0F, los bytes mas altos $FF se perderan.
Conversin 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 a as byte
dim b as short
...
b = -1
a = 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 a, b, c as byte
dim cc as word
...
a = 241
b = 128
c = a + b ' igual 113
44
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
c = word(a + b) ' igual 369
cc = a + b ' 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. byte se convierte a integer
2. short se convierte a integer, con el mismo valor
3. short se convierte a integer, con el mismo valor, con signo extendido
4. 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 ' 2. + 3.1 5.1
5 / 4 * 3. ' (5/4)*3. 1*3. 1.*3. 3.
3. * 5 / 4 ' (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 Operandos Operadores Asociatividad
4 1 @ not + -
3 2 * / div mod and << >>
2 2 + - or xor
1 2 = <> < > <= >=
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 Operandos Resultado
+ suma byte, short, integer,
word, longint, float
byte, short, integer,
word, longint, float
- resta byte, short, integer,
word, longint, float
byte, short, integer,
word, longint, float
* multiplicacion byte, short, integer,
word, float
integer, word, lon
gint, float
/ division, punto- flo byte, short, integer, byte, short, integer,
46
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
tante word, float word, float
div division, redondeo al
entero mas cercano
byte, short, integer,
word, longint, float
byte, short, integer,
word, longint
mod modulo, regresa el
resto de la division
de un entero(no pue
de ser usada con va
lores flotantes.)
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 Operation
= Igual
<> Diferente
> Mayor que
< Menor que
>= Mayor igual
<= Menor igual
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 Operacin
and AND inteligente; compara pares de bits y genera 1
si ambos son uno de otro modo genera un 0
or OR (inclusiva) inteligente; compara pares de bits y
genera un 1 si el resultado es 1, de otra forma genera
0
xor OR exclusiva (XOR); compara pares de bits y gene
ra un 1 si el resulatdo de ambos es complementario,
de otra forma regresa 0
not 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 lgicas a nivel bit
and 0 1
0 0 0
1 0 1
or 0 1
0 0 1
1 1 1
xor 0 1
0 0 1
1 1 0
not 0 1
1 0
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 ' igual a $567C
$1234 xor $5678 ' igual a $444C
not $1234 ' igual a $EDCB

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 a as byte
dim b as word
...
a = $AA
b = $F0F0
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 a as byte
dim b as word
...
a = -12
b = $70FF
b = 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 2
n
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 2
n
.
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 asignacin
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.
Declaracin 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 compilacin 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 multi-
byte, 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 conexin 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

You might also like