Vous êtes sur la page 1sur 64
INDICE 1. E specificaciones de mikrobasic 1.1 Predefiniendo globales y constantes 1.2 Accesando a los bits
INDICE
1.
E specificaciones 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
I
nc
D
ec
C
hr
O rd
S etBit
C
learBit
T estBit
L
o
Hi
H
igher
H
ighest
S
izeOf
S
wap
C
lock_Khz
C
lock_Mhz
R eset
C
lrWdt
1
1.4 O ptimización de código 2. E specificaciones del PIC 2.1. T ipos de Eficiencia 2.2.L
1.4 O ptimización de código
2.
E specificaciones del PIC
2.1. T ipos de Eficiencia
2.2.L imitaciones de Llamadas Anidadas
2.3.E specificaciones familia PIC16
3.
Referencia del Lenguaje mikroBasic.
3.1. Elementos léxicos
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 puntuación o separadores
3.2
O rganización de Programa
3.2.a
O rganización del Programa
3.2.b
A lcance y Visibilidad
3.2.c M ódulos
3.3
V ariables
3.4
C onstantes
3.5
E tiquetas
3.6
S ímbolos
3.7
F unciones y Procedimientos
3.7.a F unciones
3.7.b Pr ocedimientos
3.8
T ipos
3.8.a
T ipos simples
3.8.b A rreglos
3.8.c C adenas
3.8.d Pu nteros
3.8.e E structuras
3.8.f T ipos de conversión
3.8.f.1 C onversión implícita
3.8.f.2 C onversión explicita
3.8.f.3 C onversión aritmética
2
3.9 O peradores 3.9.a Pr ecedencia y asociatividad 3.9.b 3.9.c 3.9.d O peradores aritméticos O peradores
3.9 O peradores
3.9.a
Pr ecedencia y asociatividad
3.9.b
3.9.c
3.9.d
O peradores aritméticos
O peradores relacionales
O peradores inteligentes
3.10
Expresiones
3.11
Declaraciones
3.11.a Declaraciones de asignación
3.11.b declaraciones condicionales
3.11.b.1 Declaraciones IF
3.11.b.2 Declaraciones SELECT CASE
3.11.c Declaraciones de Iteración (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
4
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC ACERCA DE Dedicado: a la
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 traducción –a veces interpretativa, a veces ayudada por
programas traductores­ de la ayuda de mikroBasic. Este documento no persigue
ningún 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 podrán encontrar, como un ejemplo de ello es ver
delante de la traducción los siguientes signos (¿?), esto es que no pude encontrar
la manera correcta de interpretar o traducir el enunciado. También podrán
encontrar diferencias en la traducción, como puede ser la palabra declaración en
lugar de usar la palabra sentencia. De alguna forma trate de hacer una traducción
lo mas cristalina posible, sin usar muchas interpretaciones –aunque a veces fue
necesario­ o modismos de mi país (México).
Creo yo que el documento es entendible y nos puede brindar un poco de ayuda
para hacer mas fácil la interpretación de las reglas, instrucciones y librerías del
mikroBasic. Reitero que no manejo el lenguaje ingles al 100% y menos el lenguaje
técnico en ingles pero por la poca experiencia que tengo usando el mikroBasic
trate de realizar este documento.
La traducción de la ayuda como marca en los encabezados de cada página 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 traducción­ y puede ser
modificada siempre y cuando se respete al autor original de la traducción (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 introducción de un lenguaje en vías
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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
PREDEFINIENDO GLOBALES Y CONSTANTES
Para facilitar la programación, MikroBasic implementa un número predefinido de Variables globales
y constantes
Todos los Registros SFR del PIC están declarados implícitamente como variables globales del tipo
byte, y son visibles en todo el proyecto. Cuando se crea un proyecto, MiKrobasic incluirá el archivo
apropiado con extensión .def, el cual contiene las declaraciones disponibles del SFR y constantes
(como PORTB, TMR1, etc.). Los identificadores están todos en mayúsculas, idénticos 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
instalación de MikroBasic, o pruebe el asistente de código para letras especificas (ctrl.+espacio en
el editor de código).
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 declaración en especial; este tipo de acceso selectivo es una
característica intrínseca de mikrobasic y puede ser usada en cualquier parte del código. Asegúrese
de no exceder el tamaño 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 más información de los nombres de
REGISTROS/BIT.
NOTA: Puede también 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 fácilmente
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
INTERRUPCIONES
Pueden ocuparse interrupciones fácilmente por medio de la palabra reservada interrupt .
mikroBasic implícitamente declara procedimiento interrupt, el cual no puede ser redeclarado.
Escriba su propio procedimiento para ocupar interrupciones en su aplicación. Note que no puede
llamar rutinas dentro de la interrupción 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 rápido 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 están 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 interrupción o desde main.
EJEMPLOS DE INTERRUPCION
Aquí esta un ejemplo simple del manejo de interrupciones desde TMR0 ( si ninguna otra
interrupción es requerida)
sub procedure interrupt
counter = counter + 1
TMR0 = 96
INTCON = $20
end sub
En caso de múltiples interrupciones habilitadas, necesita probar cual de las interrupciones ocurre y
después proceder con el código apropiado (manejo de interrupción):
sub procedure interrupt
if TestBit(INTCON, TMR0IF) = 1 then
counter = counter + 1
TMR0 = 96
ClearBit(INTCON, TMR0F)
' ClearBit se comprende como una función inline
' y debe ser llamada dentro de la interrupción
else
7
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC if TestBit(INTCON, RBIF) = 1
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 están implementadas como inline; por ejemplo: el código se genera en
el lugar de la llamada, para que la llamada no está contra el límite de llamadas anidadas.
RUTINAS
I
nc
D
ec
C
hr
O
rd
Se tBit
C
learBit
T estBit
L
o
H i
H
igher
H
ighest
Si zeOf
Sw ap
C
lock_Khz
8
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC C lock_Mhz R ese t
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
C
lock_Mhz
R
ese t
C
lrWd t
Inc
Prototipo:
sub function Inc(dim byref par as longint) as longint
Regresa:
El valor incrementado del parámetro
Descripción:
Incrementa el parámetro par por 1. Note que la función debe ser llamada como
una declaración auto­contenida.
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que la
llamada no esté contra el límite 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 parámetro
Descripción:
Decrementa el parámetro par por 1. Note que la función debe ser llamada como
una declaración auto­contenida
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que la
llamada no esté contra el límite 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
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 carácter asociado con el carácter
especifico de code
Descripción:
Regresa un carácter asociado con el carácter especifico de code. Números de 0 a
31 son los códigos ASCCI no imprimibles
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que la
llamada no esté contra el límite 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 código ASCII de character
Descripción:
La función regresa el código ASCII del carácter.
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que la
llamada no esté contra el límite 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
Descripción:
La función "setea"(poner en uno o verdadero) el bit rbit del registro. El
parámetro rbit debe ser una variable o una literal cuyo valor sea de
redefiniendo globales y constantes para mayor información de los
0...7.
Vea
identificadores de registros.
Requiere:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que
la llamada no esté contra el límite de llamadas anidadas.
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
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
Descripción:
La funciona limpia el rbit del registro. El parámetro rbit necesita ser una
variable o una literal cuyo valor sea de
0...7.
Vea predefiniendo globales y
constantes para mayor información de los identificadores de registros.
Requiere:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para
que la llamada no esté contra el límite de llamadas anidadas.
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
Descripción:
La función revisa si el rbit del registro esta seteado. Si esta seteado, la función
retorna 1, cualquier otro caso retorna 0. El parámetro rbit necesita ser una
variable o literal cuyo valor sea de
0...7.
Vea predefiniendo globales y
constantes para mayor información de los identificadores de registros.
Requiere:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para
que la llamada no esté contra el límite de llamadas anidadas.
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:
Descripción:
Regresa los 8 bits menores de number, bits 0...7
La función regresa los 8 bits menores de number. La función no interpreta los
patrones bit de number ­ solamente regresa los 8 bits encontrados en el registro.
Requiere:
Ejemplo:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que
la llamada no esté contra el límite de llamadas anidadas.
Nada
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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Hi
Prototipo:
sub function Hi(dim number as
word..longint)
as byte
Regresa:
Descripción:
Regresa el los siguientes 8 bits(byte)de los 8 bits menores de number, bits 8...15
La función regresa el siguiente Byte del menor byte de number. La función no
interpreta los patrones bit de number ­ solamente regresa los siguiente 8 bits
encontrados en el registro.
Requiere:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que la
llamada no esté contra el límite de llamadas anidadas.
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
Descripción:
La función regresa el siguiente byte del byte más alto de number. La función
no interpreta los patrones bit de number ­ solamente regresa los siguiente 8
bits encontrados en el registro.
Requiere:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para
que la llamada no esté contra el límite de llamadas anidadas.
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
Descripción:
La función regresa el Byte mas alto de number, La función no interpreta los
patrones bit de number ­ solamente regresa los siguiente 8 bits encontrados
en el registro.
Requiere:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para
que la llamada no esté contra el límite de llamadas anidadas.
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
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:
Descripción:
Requiere:
Ejemplo:
Regresa el tamaño en bytes de la variable
Esta función da el tamaño en Bytes de cuánto 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:
sub function Swap(dim byref arg as byte) as byte
Regresa:
Regresa el Byte consistente de los nibbles intercambiados
Descripción:
Intercambia los nibbles altos (bits
<7..4>)
y los nibbles bajos (bits
<3..0>)
de el
Requiere:
tamaño del Byte del parámetro arg.
Nada
Ejemplo:
PORTB = 0xF0
PORTA = Swap(PORTB)
' PORTA = PORTB = 0x0F
Clock_Khz
Prototipo:
sub function Clock_Khz as word
Regresa:
Descripción:
El dispositivo reloj in KHZ, es redondeado al entero mas cercano
El dispositivo reloj in KHZ, es redondeado al entero mas cercano.
Requiere
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que la
llamada no esté contra el límite de llamadas anidadas.
Nada
Ejemplo:
clk = Clock_Khz
13
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Clock_Mhz Prototipo: sub function Clock_Mhz
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Clock_Mhz
Prototipo:
sub function Clock_Mhz as byte
Regresa:
La función dispositivo reloj en MHz, es redondeado a el entero mas cercano.
Requiere:
Esta es una rutina inline; el código se genera en el lugar de la llamada, para que la
llamada no esté contra el límite de llamadas anidadas.
Nada
Ejemplo:
clk = Clock_Mhz
Reset
Prototipo:
sub procedure Reset
Regresa:
Nada
Descripción:
Requiere:
Este procedimiento es igual a la instrucción en ensamblador reset. Este
procedimiento funciona solamente para la Familia PIC18.
Nada
Ejemplo:
Reset ' Resetea el PIC
ClrWdt
Prototipo:
Regresa:
sub procedure ClrWdt
Nada
Descripción:
Requiere:
Este procedimiento es igual a la instrucción en ensamblador clrwdt
Nada
Ejemplo:
ClrWdt ' Limpia el WatchDogTimer del PIC
Optimización de código
La optimización ha sido añadida para extender la usabilidad del compilador, bajo la cantidad de
código generado y la velocidad de su ejecución. Las principales características son:
Plegado Constante
Todas las expresiones pueden ser evaluadas al tiempo de la compilación (por ejemplo una
constante) son reemplazados por el resultado. (3+5­­­>8);
La propagación de Constantes
Cuando un valor constante está asignándose a cierta variable, el compilador reconoce esto y
reemplaza el uso de la variable en el código 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
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 código.
Enumeración de Valor
El compilador "reconoce" si dos expresiones rinden el mismo resultado, y por consiguiente puede
eliminar el cómputo entero para uno de ellos.
Eliminación de código Muerto
El código que ya no es usado en ninguna parte del programa, y que no afecta el resultado final de
la aplicación. Es automáticamente removido.
Asignación de la Pila
Los registros temporales ("Pilas") se usan más racionalmente, permitiendo expresiones MUY
complejas para ser evaluadas con el consumo mínimo de la pila.
Optimización de Variables locales
Ninguna variable local se usa si su resultado no afecta algunas de las variables globales o volátiles.
Mejor Generación de código y Optimización local
La Generación de código es más Consistente, y Mucha más atención se ha implementado para
solucionar específicamente la construcción del código, para reducir el tamaño de código 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 código.
Tipos de Eficiencia
Primero que nada, debe saber que la ALU del PIC, quien realiza las operaciones aritméticas, 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 dramáticamente el tiempo necesario para realizar hasta una simple
operación. Un consejo universal es usar el tipo más pequeño posible en cada situación. Esto aplica
en general para toda la programación, y doblemente para los Microcontroladores.
Conozca su herramienta, Cuando haga cálculos, 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
multiplicación trabaja considerablemente más rápido.
15
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Limitaciones de Llamadas Anidadas. Las
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Limitaciones de Llamadas Anidadas.
Las llamadas anidadas representan una llamada a una función dentro del cuerpo de la función. O
así mismo (llamadas recursivas) a otra función. Las llamadas recursivas, son una forma de cruzar
las llamadas, y no están soportadas por mikroBasic debido a la pila del PIC y limitaciones de
memoria.
MikroBasic limita el número 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 implementación inline.
El numero permitido de llamadas anidadas decrece por uno si se usa en el código 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 diseño de su aplicación ­trate de
hacer la rutina en particulares pedazos cortos, etc.
Limites de acercamiento a través del FSR
Punteros con la familia PIC16 están cercanos y solo pueden llevar 8 bits de la dirección. El
compilador automáticamente 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 vía punteros, el usuario deberá poner el IRP
manualmente, y restaurarlo a 0 después de la operación.
Nota: Es muy importante tener cuidado del manejo del IRP, si desea seguir con este acercamiento.
Si cree que este método es inapropiado con demasiadas variables, tal vez deba considerar
actualizarse a la familia PIC18.
Nota: Si tiene muchas variables en el código, 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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Referencia del Lenguaje MikroBasic.
Elementos léxicos
Estos temas proporcionan una definición formal de los elementos léxicos de Mikrobasic. Ellos
describen las diferentes categorías de unidad de tipo de palabra (TOKENS) reconocidas por el
lenguaje.
En la fase de Tokenizacion, el código 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 código fuente, creado por palabras clave usando un editor de texto (como el editor de código de
mikroBasic). El programa básico de mikrobasic es un archivo guardado en la RAM o en un disco
teniendo por extensión .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 léxicamente equivalentes y analizadas idénticamente.
Espacios en Blanco en cadenas
Los caracteres ASCII representando un espacio en blanco pueden darse dentro de las cadenas
literales, en cuyo caso están protegidos por el análisis gramatical normal (permanecen como parte
de la cadena).Por ejemplo: la declaración
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
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
técnicamente otra forma de espacios en blanco. Los comentarios son solamente para el uso del
programador; estos son quitados del código fuente antes de analizar.
Use el apostrofe para crear un comentario:
' Cualquier texto en medio de un apostrofe y el fin de la línea
' constituye un comentario. Puede ser una sola línea.
No hay comentarios multilínea en BASIC.
TOKENS
Un Token es el elemento mas pequeño 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 puntuación (también conocidos como Separadores)
Ejemplo de tokens
Aquí hay un ejemplo de extracción de Tokens. Veamos el siguiente código:
end_flag = 0
El compilador analizara los siguientes 4 tokens:
end_flag ' identificador de la variable
=
' operador de asignacion
0
newline
' literal
' termino de la declaración
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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
LITERALES
Las Literales son tokens que representan un valor numérico o el valor de un carácter.
El tipo de dato de una constante es deducido por el compilador, usando pistas como el valor
numérico y el formato usado en el código fuente.
ENTEROS
Los valores enteros pueden ser representados en formato Decimal, Hexadecimal o en notación
binaria.
En notación Decimal, los numerales son representados como una secuencia de dígitos (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 dólar ($) 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
$11
0x11
%11
' Valor decimal
' Valor Hexadecimal, Igual a 17 decimal
' Valor Hexadecimal, Igual a 17 decimal
' Valor Binario, Igual a 3 decimal
El rango máximo 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 fracción 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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
­1.23
' = ­1.23
23.45e6 ' = 23.45 * 10^6
2e­5
3E+10
.09E34
' = 2.0 * 10^­5
' = 3.0 * 10^10
' = 0.09 * 10^34
CARACTERES
Las literales de caracteres son solamente un carácter del código ASCCI, dentro de comillas(Por
ejemplo, "A"). El carácter puede ser asignado a variables de tipo Byte y Char ( la variable byte
asignara el valor ASCII del carácter). también puede asignar variables carácter a variables tipo
cadena.
CADENAS
Una cadena es una secuencia de 255 caracteres del código 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 sucesión dada de caracteres más un carácter nulo final (el cero del ASCII).
Las cadenas que no tengan nada dentro de las comillas son guardadas como un carácter nulo.
Puede asignar cadenas a variables de cadena o a un arreglo de variables char.
Algunos ejemplos:
"Hello world!"
"Temperature is stable"
" "
"C"
""
' mensaje, 12 caracteres de longitud
' mensaje, 21 caracteres de longitud
' dos espacios, 2 caracteres de longitud
' Letra, un carácter 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 propósitos 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 código para letras especificas o refiérase a
Predefiniedo Globales y Contstantes.
Aquí esta el listado alfabético de las palabras reservadas en MikroBasic:
20
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC absolute abs and array asm
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
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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
then
to
until
wend
while
with
xor
Mikrobasic también incluye un numero predefinido de identificadores usados en las
librerías. Puede remplazar estos por sus propias definiciones usted planea hacer
sus propias librerías. Para mas información vea librerías de Mikrobasic.
Identificadores.
Los identificadores son nombres arbitrarios de cualquier longitud dados a
Funciones, variables, Constantes simbólicas, tipos de datos por definidos por el
usuario y etiquetas. Todos estos elementos de programa son relacionados con
objetos a través de la ayuda. ( no se confunda con el termino objeto de la
programación orientada a objetos).
mayúsculas o Minúsculas
Basic no es sensible a las mayúsculas o a las minúsculas, 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 más de un
identificador dentro del mismo alcance. Simplemente, los nombres dobles son
ilegales dentro del mismo alcance. Para más información, refiérase al Alcance y
Visibilidad.
23
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Ejemplos de Identificadores: temperature_V1 Pressure
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 inválidos:
7temp
%higher
xor
j23.07.04
' NO ­­ No pueden iniciar con un numero
' NO ­­ No pueden iniciar con caracteres especiales
' NO ­­ No pueden ser una palabra reservada
' NO ­­ No pueden contener puntos
Signos de puntuación o separadores
los signos de puntuación de MikroBasic son :
Corchetes
Paréntesis
Comas
Dos puntos
Punto
Corchetes
Los corchetes [] indican un simple o múltiples arreglos:
dim alphabet as byte[30]
' ...
alphabet[2] = "c"
Para mas información vea Arreglos.
Paréntesis
24
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Los paréntesis () son usados
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Los paréntesis () 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)
if (d = z) then ...
func()
' Separar la precedencia normal
' Usado con expresiones condicionales
' llamando una rutina sin argumentos
sub function func2(dim n as word) ' declarando la función con sus parámetros.
Para mas información 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 también separa elementos de inicialización 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 información vea Etiquetas.
25
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Punto El punto (.) indica
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 información Vea Estructuras.
El punto es parte esencial de las literales de punto flotante. Además el punto sirve para acceder a
los bits individuales de los registros en MikroBasic.
Organización del Programa
MikroBasic tiene una estricta organización de programa impuesta, debajo
encontrara modelos para una escritura legible de código. Para mas información de
la inclusión de archivos y alcance vea Módulos y también Alcance y visibilidad.
Organización del Modulo Principal
Básicamente, el código fuente tiene dos secciones: declaraciones y el cuerpo del
programa. Las declaraciones deben ir en la parte apropiada del código,
organizadas de manera ordenada, de otro forma el compilador no será capaz de
comprender el programa correctamente.
Cuando escriba el código, siga el modelo que se presenta de bajo. El modulo
principal deberá lucir de la siguiente manera:
program <nombre del programa>
include <incluir otros módulos>
'********************************************************
'* Declaraciones Globales:
'********************************************************
' Declaraciones simbólicas
symbol ...
' declaración de constantes
const ...
'declaración de Variables
dim ...
' declaración de procedimientos
sub procedure nombre del procedimiento(...)
<Declaraciones locales>
...
end sub
26
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC ' declaración de funciones sub
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
' declaración de funciones
sub function nombre de la función(...)
<declaraciones globales>
...
end sub
'********************************************************
'* Cuerpo del Programa
'********************************************************
main:
' Escriba el código aqui
end.
Organización de otros módulos
Los módulos que no sean el Modulo principal deben empezar con la palabra clave module; la
sección de implementación empieza con la palabra clave implements. Siga el modelo presentado
debajo:
module <nombre del modulo>
include <incluir otros módulos>
'********************************************************
'* Interfase (Globales)
'********************************************************
' declaración de símbolos
symbol ...
' declaración de Constantes
const ...
' declaración de Variables
dim ...
' Prototipos de procedimientos
sub procedure Nombre del procedimiento(...)
' Prototipo de la función
sub function Nombre de la función(...)
'********************************************************
'* implementación
'********************************************************
implements
27
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC ' declaración de constantes const
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
' declaración de constantes
const ...
' declaración de Variables
dim ...
' declaración de procedimientos
sub procedure nombre del procedimiento(...)
<Declaraciones locales>
...
end sub
' declaración de la función
sub function nombre de la función(...)
<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 categorías de alcances y dependen de como y
donde fueron declarados los identificadores:
Lugar de la declaración
El identificador es declarado en la sección de
declaraciones del modulo principal, fuera de
cualquier modulo o procedimiento
Alcance
El identificador es declarado dentro de una
función o de un Procedimiento
El identificador es declarado en la sección 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.
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
símbolos 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.
28
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC VISIBILIDAD La visibilidad de un
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
VISIBILIDAD
La visibilidad de un identificador es la región del programa del código 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.
Técnicamente, 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
módulos. El archivo proyecto con extensión .pbp contiene información acerca del proyecto,
mientras que los módulos con extensión .pbas contienen el código fuente. Vea Organización de
programa para ver detalladamente el arreglo de un programa.
Los módulos permiten:
Separar programas extensos en módulos encapsulados que pueden ser
accesados y editados individualmente.
Crear librerías que pueden ser usadas en diferentes proyectos.
Distribuir librerías a otros programadores sin incluir el código fuente.
Cada modulo es guardado como su propio archivo y compilado por separado, los módulos
compilados son encadenados para crear una aplicación. Para crear un proyecto el compilador
necesita cada archivo fuente o el modulo compilado de cada modulo.
Cláusula INCLUDE
MikroBasic incluye los módulos que tengan la cláusula include, la cual consiste en la palabra
reservada include seguida de el nombre del modulo entrecomillado. La extensión del archivo no
debe ser incluida.
Puede incluir un solo archivo por cada cláusula include . Puede haber cualquier numero de
cláusulas include en cada código fuente, Pero ellos deben declararse inmediatamente después del
nombre del programa.
Por ejemplo:
29
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC program MyProgram include "utils" include
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
program MyProgram
include "utils"
include "strings"
include "MyUnit"
...
Dándole un nombre al modulo, el compilador verificara la presencia de los archivos .mcl y .pbas.
En orden especificado por las rutas de búsqueda.
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 librería
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 código 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.
Después de que haya creado un nuevo proyecto con el asistente de proyecto, el editor de código
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 después del
nombre del programa usted puede incluir opcionalmente las cláusulas 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 declaración
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
NOTA: En mikrobasic, la declaración end. (la declaración de finalización de cualquier programa)
actúa 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. Después de la cláusula module usted puede añadir opcionalmente la cláusula include.
SECION DE INTERFACE
Parte del modulo sobre la palabra clave implements se refiere a la sección de interfase. Aquí puede
poner las declaraciones globales (constantes, variables y etiquetas) para el proyecto.
No puede definir rutinas en la sección de interfase, En cambio declare los prototipos de las rutinas
(de la sección de implementación) que quiera que estén visibles fuera del modulo. El prototipo
debe coincidir con la declaración exactamente.
SECCION DE IMPLEMENTACION
La sección de implementación esconde todas las entrañas irrelevantes de otros módulos,
permitiendo así el encapsulado del código.
Cualquier declaración debajo de la palabra reservada implementes es privada. Es decir tiene un
alcance limitado al archivo. Cuando declare un identificador en la sección de implementación 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 sección de interfase (arriba de la sección de implementación) puede
hacer una rutina publica. Es decir visible fuera del modulo. El prototipo debe coincidir exactamente
con la declaración.
VARIABLES
Una variable es un objeto cuyo valor puede ser cambiado durante el tiempo de ejecución. 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 sección de declaración de cualquier archivo o rutina, cada
variable debe ser declarada antes de ser usada. Las variables Globales (aquellas que no están
31
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC encerradas por ninguna rutina o
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
encerradas por ninguna rutina o procedimiento) son declaradas debajo de las cláusulas 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 información 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 también 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 automáticamente 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 ejecución. Usar
una constante en un programa no consume memoria RAM de un PIC. Una constante puede usarse
en cualquier expresión pero no se le puede asignar otro valor.
Las constantes son declaradas en la sección de declaración de un programa. La sintaxis de
declaración 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
tradición escribir las constantes en mayúsculas. 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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
ausencia del tipo el compilador asume el tipo de dato mas pequeño el cual se ajuste al tamaño 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
const SWITCH = "n"
const MSG = "Hello"
' El compilador asume el tipo de dato como word
' El compilador asume el tipo de dato como char
' 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 función 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 símbolos permiten crear macros sin necesidad de parámetros. Puede reemplazar
cualquier línea de código por un identificador alias. Cuando los símbolos son usados correctamente
pueden incrementar la usabilidad y la legibilidad del código.
Los símbolos necesitan ser declarados inmediatamente después del inicio del modulo, justo des­
pués del nombre del modulo y opcionalmente de las cláusulas incluye. Vea organización de progra­
ma para mas detalles. El alcance de un símbolo esta siempre limitado al archivo en el cual fue de­
clarado.
Un Símbolo es declarado así:
symbol alias = code
33
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Aquí, el alias debe ser
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 código, Este identificador
tiene el alcance del archivo, el código (code )puede ser cualquier línea de código valida.
Usar un símbolo no consume memoria RAM de un PIC, el compilador simplemente reemplaza
cada instancia de cada símbolo por la apropiada declaración de su código.
Aquí algunos ejemplos:
symbol MAXALLOWED = 216
co
symbol PORT = PORTC
symbol MYDELAY = Delay_ms(1000)
' Symbol es el alias de un valor numéri­
' Symbol es el alias de un registro SFR
' 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 símbolos no soportan la expansión 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 parámetros. Una función regresa un parámetro cuando esta es finalizada,
un procedimiento no lo hace.
NOTA: Vea especificaciones PIC para mas información de la limitaciones de las rutinas de los PIC
micros.
FUNCIONES
Las funciones son declaradas así:
sub function nombre de la función(lista de parámetros) as tipo que regre­
sa
[ declaraciones locales]
Cuerpo de la función
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 función y puede ser de tipo simple. Dentro de los paréntesis, la lista
de parámetros, son los parámetros formales similares a la declaración de variables. En mikrobasic,
34
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC los parámetros son siempre pasados
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
los parámetros son siempre pasados de la función por un valor; para pasar argumentos por direc­
ción, añada la palabra reservada byref adelante del identificador.
Las declaraciones locales son declaraciones opcionales sobre variables y/o constantes locales,
para uso de la función. El cuerpo de la función es la secuencia de declaraciones a ser ejecutadas
cuando se llame a la función.
Llamando una función
Una funcion es llamada por su propio nombre, con los argumentos necesarios, ingresados de la
misma manera que los parámetros de la funcion. El compilador es capaz de restringir los argumen­
tos erroneos al tipo de argumento valido usando las reglas de conversión implicita. En la llamada
de la funcion se crean los parámetros 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 expresión compleja y es tratada
como el resultado de una funcion.
Use la variable result (automáticamente 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 expresión. Una llamada de la función 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 parámetros 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
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 paréntesis, la lista de parámetros representa una lista similar a la declaracion de
variables. En mikroBasic, los parámetros 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 parámetros del procedimiento. El compilador es capaz de restringir los argumentos
erroneos al tipo de argumento valido usando las reglas de conversión implicita. Cuando se llama
un proceso, todos los parámetros 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
min
= ((sec and $F0) >> 4)*10 + (sec and $0F)
= ((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
compilación.
36
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Los tipos sirven para: Determinar
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:
T ipos simples
A
rreglos
C
adenas
P
unteros
E structuras (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
Tamaño
Rango
byte
8–bit
char*
8–bit
word
16–bit
short
8–bit
integer
16–bit
longint
32–bit
float
32–bit
0 – 255
0 – 255
0 – 65535
­128 – 127
­32768 – 32767
­2147483648 – 2147483647
±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 conversión explicita. Vea tipos de conversio­
nes para mas información.
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
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 información 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 fácilmente. 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 tamaño 50x20
38
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC La variable m tiene un
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 comúnmente usada para pasar arreglos a parámetros 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]
dim n as byte[4][2][7]
main:
'arreglo de 2 dimensiones 50x20
'arreglo de 3 dimensiones 4x2x7
...
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 tamaño maximo en el cual consistira la cadena. Las ca­
denas son guardadas internamente como una secuencia de caracteres finalizadas por un carácter
nulo, este ultimo no afecta la longitud de la cadena.
Una cadena nula (“”), es guardada como un carácter nulo.
Puede asignar literales u otras cadenas a las variables de cadena, la cadena del lado derecho des­
pués 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] ...
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 violación 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 carácter. 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)
' Obtener el valor del ADC
' Crear una variable para mostrar en forma de
cadena
' Prepare message for output
msg
= "Result is" +
Chr(13)
+
Chr(10)
+
res_txt
+
"."
' Texto "Result is"
' aplicar un enter
' aplicar un linefeed
' 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
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­
rección de memoria.
Para declara un puntero añada 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 añadir el carácter carat (^)
después 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 F’s (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
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
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 conversión explicita e implicita para los tipos
construidos.
Conversión Implícita
El compilador provee automáticamente la conversión implícita en los siguientes casos:
La declaración requiere una expresión de un tipo en particular ( de
acuerdo con la definición del lenguaje), y es usada una expresión
de diferente tipo.
El operador requiere de un operando de un tipo en particular, y
usamos un operando de diferente tipo.
La función requiere de un parámetro 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
función.
Promoción
Cuando los operandos son de diferentes tipos, la conversión 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
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 expresión (esto es, si el resultado cabe dentro del rango del destino).
Si la expresión 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.
Conversión Explicita
La conversión explicita puede ser usada en cualquier punto del programa usando las palabras
reservadas byte, word, short, integer, longint, o float delante de la expresión a
ser convertida. La expresión debera estar encerrada entre paréntesis. La conversión explicita solo
puede ser usada en el operando a la derecha del operador declarado.
Una conversión especial es aquella entre tipos con y sin signo. La conversión explicita entre datos
con signo y sin signo no cambiara la representación 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 conversión 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)
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
c
= word(a + b)
cc = a + b
' igual 369
' igual 369
Conversiones Aritméticas
Cuando usa una expresión aritmetica, como a+b, donde a y b son tipos de datos diferentes,
mikroBasic realiza la conversión 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 carácter (como una variable) a un objeto integral el resultado
automáticamente estara signado. Los objetos de tipo short siempre usan una extensión 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 pequeño 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 expresión es el mismo tipo que la de los 2 operandos.
Aquí unos ejemplos de la conversión implicita:
2
+ 3.1
' → 2. + 3.1 → 5.1
5
/
4
*
3.
3.
*
5
/
4
' → (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
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 expresión.
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 categoría
tienen la misma precedencia uno con otro.
Cada categoría tiene reglas de asociatividad: izquierda a derecha (→), o de derecha a izquierda
(←). En la ausencia de paréntesis, estas reglas resuelven la agrupación con expresión de la
misma categoría.
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 básicamente 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 aritméticos se asocian de izquierda a derecha.
Operador
Operacion
Operandos
Resultado
+
suma
­
resta
*
multiplicacion
/
division, punto­ flo­
byte, short, integer,
word, longint, float
byte, short, integer,
word, longint, float
byte, short, integer,
word, float
byte, short, integer,
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
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
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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Operadores relacionales en expresiones.
El signo igual (=) tambien puede ser un operador de asignación, dependiendo del contexto.
La precedencia de los operadores aritmeticos y relacionales fueron designados para trabajar con
expresiones complejas sin paréntesis 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
Operación
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
not
<<
>>
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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Operaciones lógicas 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
$1234 xor $5678
not $1234
' igual a $567C
' igual a $444C
' 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
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 expresión 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 añadirse al limite de la
memoria.
50
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Las expresiones son evaluadas de
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Las expresiones son evaluadas de acuerdo al tipo de conversión, grupo, asociatividad y las reglas
de precedencia usado por los operadores dentro de ellas, la presencia de paréntesis 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 asignación o en expresiones
aritmeticas o en expresines logicas. Puede usar la conversión 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 carácter (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 selección de declaracines, las declaraciones seran ejecutadas de manera secuencial tal
como estan escritas en el codigo fuente.
Vea:
Declaraciones de asignación
Declaraciones condicionales
Declaraciones de iteración (ciclos)
Declaraciones de saltos
Declaraciones de lenguaje Ensamblador (ASM).
Declaraciones de asignación
Las declaraciones de asignación tiene la siguiente forma:
variable = expresión
la declaracion evalua la expresión y le asigna el valor de la variable. Todas las reglas de la
conversión implicita se aplican. Variable puede ser declarada como una variable o como un arreglo
y expresión puede ser cualquier expresión.
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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Declaraciones condicionales
Las declaraciones condicionales o de selección, 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 expresión, es evaluada si es verdadero las declaraciones se ejecutan. Si la expresión
es falsa se ejecutaran otras declaraciones. La expresión debe ser convertida a tipo bolean, de otra
forma la expresión esta mal formulada. La palabra clave else y las otras declaraciones son
opcionales.
Declaraciones de IF’s anidados
Anidar If’s requiere de atención 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 expresión ( 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,
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Primero el selctor es evaluado, después 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
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
DECLARACIONES DE ITERACION.
Las declaraciones de iteración 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
iteración. La declaración 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 iteración 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 según el valor del paso con cada iteración del ciclo.
El parámetro valor de paso es un valor entero opcional y si este es omitido el valor por defecto es 1,
antes de la primera iteración, el valor del contador es puesto al valor inicial y se incrementa
mientras no exceda o no llegue al valor final, con cada iteración 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 cómo 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 ...
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 iteración. La sintaxis es:
while expresion
declaraciones
wend
Las declaraciones se ejecutaran repetidamente, mientras la expresión sea verdadera, esto es si la
expresión al ser evaluada la primera vez es falsa no se ejecutaran las declaraciones.
Aquí esta un ejemplo de cómo 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 expresión
Las declaraciones son ejecutadas mientras la expresión evaluada sea verdadera. La expresión es
evaluada depuse de cada iteración. Entonces las todas declaraciones se ejecutaran.
55
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC Aquí hay un ejemplo de
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Aquí hay un ejemplo de cómo calcular el producto escalar de 2 vectores, usando la sentencia DO:
= 0
i = 0
...
s
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
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 expresión 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
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
información vea Etiquetas­. La sintaxis de un goto es:
goto nombre de etiqueta
Esto transferira el control a la posición al lugar especifico del nombre de la etiqueta. La palabra
reservada puede estar antes o después 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 aplicación 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 información
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: ...
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 después del gosub.
Un gosub puede ir antes o después 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 atrás (¿?). Es mejor usar funciones y
procedimientos para un programa mas legibles. Generalmente un gosub viene acompañado 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 Añadiendo el siguiente codigo o
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Añadiendo 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 compilación y el rendimiento.
Tiene las siguientes directivas a su disposición:
Directivas de compilación, para una compilación 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 compilación 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 restricción. 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 #IFDEF…THEN.. #ELSE La compilación
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
Directivas
#IFDEF…THEN..
#ELSE
La compilación 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 definición (directorio DEFS). Especificando el hardware para cada pic
correspondiente. El registro SFR es organizado bajo categorías: _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
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 dirección 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 añadida 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 añade 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 intervención 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
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 imágenes, 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)
AD C Library
C AN
Library
C ANSPI Library
C ompact Flash Library
EEPR OM Library
Et hernet Library
SPI Ethernet Library
F lash Memory Library
G raphic LCD Library
T 6963C Graphic LCD Library
I ²C Library
K eypad Library
L CD Library
L CD8 Library
Ma nchester Code Library
Mu lti Media Card Library
O neWire Library
PS/ 2 Library
PW M Library
63
Traducido por: Navaismo Este documento es propiedad de EL FORO TODOPIC R S­485 Library Se cure
Traducido por: Navaismo
Este documento es propiedad de EL FORO TODOPIC
R S­485 Library
Se cure Digital Library
So ftware I²C Library
So ftware SPI Library
So ftware UART Library
So und Library
SPI GLCD Library
SPI Library
U SART Library
U SB HID Library
U til Library
SPI Graphic LCD Library
P ort Expander Library
C onversions Library
D elays Library
Ma th Library
St ring Library
Vea tambien rutinas predefinidas.
64