Está en la página 1de 24

Tutorial Mikrobasic Pro for pic

https://sites.google.com/site/cursopicmikrobasic/home

Esta página está dirigida a todos aquellos que deseen


aprender a programar microcontroladores PIC de
Microchip® utilizando el compilador MikroBasic® y el
simulador de circuitos ISIS-PROTEUS®.

A continuación se muestra el listado de páginas que he


hecho hasta el momento, luego iré actualizando el
curso y agregando más páginas.
 Inicio
 1. Introducción a MikroBasic
o 1.1. Crear un Nuevo Proyecto
o 1.2. Compilar el Proyecto
o 1.3. Depurar Código
 2. Programacion Elemental
 3. Funciones y Procedimientos
 3. Sentencias condicionales
 4. Bucles de Programa
 5. Arreglos y Matrices
 6. ISIS-PROTEUS
o 6.1. Crear un Nuevo Circuito
o 6.2. Crear y Editar Buses
 7. Puertos de Entrada y Salida

Introducción
Hoy en día es muy común encontrarnos con una gran cantidad de compiladores de alto nivel para
los Microcontroladores PIC de MICROCHIP. Uno de estos compiladores es MikroBasic de la
empresa Mikroelectronica. Con ayuda de este tutorial el estudiante aprendera a utilizar las
funciones básicas del compilador y depurador que viene integrado en el mismo programa.
MikroBasic
MikroBasic PRO para PIC es un compilador BASIC con todas las características para
microcontroladores PIC de Microchip. Está
diseñado para desarrollar, construir ydepurar aplicaciones
embebidas basadas en PIC. Este entorno de desarrollo cuenta con
una amplia variedad de características tales como: una sintaxis BASIC fácil de
aprender, IDE fácil de usar, un código muy compacto y eficiente, muchos equipos y bibliotecas de
software, la documentación completa, el simulador de software, un depurador de hardware, la
generación de archivos COFF, etc. Además incluye muchos ejemplos prácticos que permiten un
rápido inicio en la programacion demicrocontroladores PIC ®.

CARACTERÍSTICAS PRINCIPALES DEL


LENGUAJE DE PROGRAMACIÓN BASIC
Similar al uso de cualquier lengua que no está limitada a los libros y a las revistas, el lenguaje de
programación Basic no está estrechamente relacionado a un tipo particular de ordenador,
procesador o sistema operativo. Esto puede ser un problema, ya que Basic varía ligeramente
dependiendo de su aplicación (como diferentes dialectos de una lengua). Por consiguiente, en este
libro no vamos a darle una descripción detallada de todas las características de Basic, sino presentar
una aplicación muy concreta de Basic, lenguaje de programación utilizado en el compilador
mikroBasic PRO for PIC.

A continuación está un ejemplo de cómo no se debe escribir un programa.

o Los comentarios no están incluidos


o Nombres de etiquetas no tienen significado
o Secciones del código no están agrupadas o tabuladas...

Este programa funciona correctamente, pero sólo el programador que lo escribió conoce su
propósito y modo de ejecución (como máximo uno o dos días).

En la siguiente figura se muestra la estructura de un programa simple bien escrito en Basic,


destacando las partes en las que consiste.

Mas.

1.1. Crear un Nuevo Proyecto


Para crear un nuevo programa en MikroBasic es necesario crear proyectos ya que esto le permite al Entorno de Desarrollo Integrado (ID
que utilizaremos con la librería princiapal. A continuación describiremos los pasos para crear un nuevo Proyecto en MikroBasic.
1. Abrir el programa MikroBasic PRO (si utilizas win7: clic derecho>ejecutar como administrador).

2. Ir al menú Project>New Project.

3. Presionar Siguiente

4. Seleccionar el dispositivo que vamos a utilizar en nuestro caso el PIC16F887

5. Configurar la Frecuencia

6. Crear carpeta del Proyecto (Mis Documentos/led_blink). Es recomendable que el nombre de la carpeta debe ser igual al nombre del p

7. Presionar Siguiente>Siguiente>Finalizar.

1.2. Compilar el Proyecto


Una vez que hemos creado un proyecto es necesario compilar el código, con esto comprobaremos si la sint
comprobaremos si no hemos escrito mal alguna función o alguna variable. Cada vez que compilamos un c
inferior de MikroBasic la subventana Messages que nos indicará si el programa se compilo correctamente
de sintaxis.

1. Copiar el código siguiente en el compilador como muestra la figura


program led_blink

main:
TRISD=0 'Configuramos todos los pines de PORTD como salidas
while 1 'Inicio del ciclo infinito...
RD0_bit=0 'Ponemos el bit 0 de PORTD igual a 0
delay_ms(500) 'Retardo de 500ms
RD0_bit=1 'Ponemos el bit 0 de PORTD igual a 1
delay_ms(500) 'Retardo de 500ms
wend 'Fin del ciclo infinito
end.
2. Presionar el menú Project>Build o la combinación de teclas ctrl+F9

3. Iniciar el depurador mediante menú Run>Start Debugger o presionar la tecla F9.

1.3. Depurar Código


La mayoría de estudiantes comete el error de creer que si la sintaxis del programa es correcta al compila
programa es correcto, pero existen muchos casos en los que eso no es suficiente, esto se debe a que much
está en la sintaxis, más bien está en el funcionamiento lógico del programa o algoritmización. Para corre
algoritmización es necesario observar como se modifican las variables en cada una de las líneas del códig
debido. A continuación se describen los pasos necesarios para depurar el código:

1. Si no aparece la ventana de Observacion de Variables debes presionar View>Debug Windows>Watch


es útil para ver como se modifican las variables en cada paso de la depuración.

2. Si la subventana de observación no aparece en la parte derecha del compilador debes moverla de la sig

3. Si no aparece la subventana de Stopwatch debes presionar menú View>Debug Windows>StopWatch.


para ver cuanto tiempo transcurre durante cada instrucción.

4. Agregar los registros TRISD y PORTD en la subventana de observación.

5. Para depurar paso a paso debemos presionar menú Run>Step Over o presionar la tecla F8. Este méto
en una subfunción.

6. Continúa depurando el código y contesta:

o ¿Cuáles son los valores que toma PORTD en cada paso?


o ¿Cuántos ciclos de reloj toma la función delay_ms(500)?
o ¿Qué ocurre despues de la instrucción wend?

o Cambia RD0_bit por RD7_bit y depura de nuevo el código para observar cuáles son los valores qu

o Cambia el formato de PORTD a binario y depura de nuevo el código para observar cuáles son los

2. Programacion Elemental
Contenidos

1. 1 Introducción

2. 2 Comentarios

3. 3 Tipos de Datos en Basic

4. 4 Constantes

5. 5 Variables

6. 6 Operadores Aritméticos
7. 7 Práctica de Laboratorio

Introducción
El Basic es un lenguaje de programación simple y fácil de entender. Para utilizarlo correctamente, basta con conocer sólo unos pocos e
consiste cada programa. Estos son:

o Comentarios
o Operadores
o Constantes
o Variables
o Símbolos
o Directivas
o Etiquetas
o Procedimientos y funciones
o Módulos
o Identificadores
o Expresiones
o Instrucciones

Comentarios
Los comentarios son las partes del programa utilizados para aclarar las instrucciones o para proporcionar más información al respecto.
a un apóstrofe se considera un comentario. El compilador determina dónde comienzan y terminan los comentarios y no los toma en cue
Aunque los comentarios no pueden afectar a la ejecución de un programa, son tan importantes como cualquier otra parte del programa
frecuencia es necesario mejorar, modificar, actualizar o simplificar un programa y es sumamente difícil interpretar incluso los programas
comentarios ya que sin ellos sólo el programador que lo escribió conoce su propósito y modo de ejecución y esto con un máximo de un

Tipos de Datos en Basic


Hay varios tipos de datos que se pueden utilizar en el lenguaje de programación Basic. La siguiente tabla muestra el rango de valores qu
se utilizan en su forma básica.

Tipo de dato Descripción Tamaño (Número de bits) Rango de valores


bit Un bit 1 0o1
sbit Un bit 1 0o1
byte, char Carácter 8 0 ... 255
short Entero corto con signo 8 -127 ... 128
word Entero sin signo 16 0 ... 65535
integer Entero con signo 16 -32768 ... 32767
longword Palabra de 32 bits 32 0 ... 4294967295
longint Palabra de 32 bits asignada 32 -2147483648 ... 2147483647
float Punto flotante 32 ±1.17549435082*10-38 ... ±6.80564774407*1038

Constantes
Las constantes son los números o caracteres cuyo valor no puede ser cambiado durante la ejecución de programa. A diferencia de las var
en la memoria ROM del microcontrolador para guardar el mayor espacio posible de la memoria RAM. El compilador reconoce las con
const. Cada constante se declara bajo un nombre único que debe ser un identificador válido. Las constantes pueden ser en formatos
compilador los distingue por su prefijo. Si una constante no lleva prefijo, se considera decimal por defecto.

const nombre_de_constante [as type] = valor


El tipo de constante se especifica opcionalmente. En la ausencia de tipo, el compilador lo considera “el menor” tipo conveniente al valo

const MAX as longint = 10000


const MIN = 1000 ' Compilador supone el tipo word
const SWITCH = "n" ' Compilador supone el tipo char

Variables
Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado durante la ejecución de programa. Cada
únicoque debe ser un identificador válido. Por ejemplo, para sumar dos números (número1 + número2) en el programa, es necesario
qué es lo que llamamos suma en vida cotidiana. En este caso, número1, número2 y suma son variables. La sintaxis es la siguiente:

dim nombre_de_variable as type

Las variables en Basic son de un tipo, lo que significa que es necesario especificar el tipo de dato que se asignará a la variable. Las var
RAM y el espacio de memoria ocupado (en bytes) depende de su tipo. Aparte de las declaraciones de una sola variable, las variables
en forma de una lista. Aquí, lista de identificadores es una lista de identificadores válidos delimitados por comas, mientras que tipo pue

dim i, j, k as byte 'Definir variables i, j, k


dim counter, temp as word 'Definir variables contador y temp

Operadores Aritméticos
Los operadores aritméticos se utilizan para realizar operaciones aritméticas. Estas operaciones se realizan sobre los operando
los resultados numéricos. Las operaciones binarias se realizan sobre dos operandos, mientras que las operaciones unitarias se rea
operadores aritméticos se asocian de izquierda a derecha.

Operador Operación
+ Adición
- Resta
* Multiplicación
/ División - punto flotante
div División - redondear
mod Residuo

Práctica de Laboratorio
1. Crear un Nuevo Proyecto
2. Copiar el siguiente código
program Prog_elemental

' Declarations section


dim var1,var2,var3 as byte
dim var4 as short
dim var5 as integer
dim var6 as float

main:
var1=135
var2=123
var3=var1+var2
var3=var1-var2
var3=var2-var1
var4=var1+var2
var4=var1-var2
var4=var2-var1
var5=var1+var2
var3=var1*var2
var5=var1*var2
var3=var1+3.16
var6=var1+3.16
end.
4. Compilar el Proyecto
5. Depurar Código y agregar los registros var1, var2, var3, var4 y var5
6. Presione F8 para ir paso a paso y conteste las siguientes preguntas:
a. ¿Cuál es el valor de var3 después de las líneas 12, 13 y 14 y explique por qué es ese resultado?
b. ¿Cuál debería ser el valor de var3 después de las líneas 12, 13 y 14?
c. ¿Cuál es el valor de var4 después de las líneas 15, 16 y 17 y explique por qué es ese resultado?
d. ¿Cuál debería ser el valor de var4 después de las líneas 15, 16 y 17?
e. ¿Cuál es el valor de var5 después de las líneas 18, 19, 20 y 21 y explique por qué es ese resultado?
f. ¿Cuál debería ser el valor de var5 después de las líneas 18, 19, 20 y 21?
g. ¿Cuál es el valor de var3 después de la línea 21 y explique por qué es ese resultado?
h. ¿Cuál debería ser el valor de var3 después de la línea 21?
i. ¿Cuál es el valor de var6 después de la línea 22 y explique por qué es ese resultado? (luego de la línea 22 presione F6)
h. ¿Cuál debería ser el valor de var6 después de la línea 22?
7. Cambia el formato de todas las variables a hexadecimal y binario y contesta de nuevo las preguntas anteriores.

3. Funciones y Procedimientos
Contenidos

1. 1 Introducción

1. 1.1 PROCEDIMIENTOS

2. 1.2 FUNCIONES
2. 2 Práctia de Laboratorio

Introducción
Las funciones y los procedimientos, denominados bajo el nombre común de rutinas, son subprogramas (bloques de sentencia
ciertas tareas a base de un número de los parámetros de entrada. Las funciones devuelven un valor después de la ejecución, m
no devuelven un valor.

PROCEDIMIENTOS
Un procedimiento es un bloque de código nombrado, o sea, una subrutina con algunas características adicionales. Por ejempl
Los procedimientos se declaran de la siguiente manera:

sub procedure ´nombre_de_procedimiento (lista_de_parámetros)


[ declaraciones locales ]
cuerpo de procedimiento
end sub

o El especificador nombre_de_procedimiento representa un nombre de procedimiento y debe ser un indentificador vá


o La lista_ de_parámetros entre paréntesis representa una lista de parámetros formales declarados de manera similar
for PIC, los parámetros se le pasan a un procedimiento por valor. Para pasar los parámetros por dirección, es necesari
principio de la declaración de los parámetros.
o Las declaraciones locales son declaraciones opcionales de variables y constantes que se refieren sólamente al proced
o El cuerpo de procedimiento es una secuencia de sentencias que se ejecutarán después de llamar al procedimiento.

Una llamada a procedimiento se realiza al especificar su nombre seguido por los parámetros actuales colocados en el mismo o
correspondientes. Después de llamar a procedimiento, todos los parámetros formales se crean como los objetos locales ini
argumentos actuales.

'Procedimiento para retardo segundos


sub procedure delay_seg(dim seg as byte) 'Tiene como variable de entrada seg del tipo byte
while seg<>0 'Mientras seg sea distinto de 0
delay_ms(1000) 'Retardo de 1000ms equivalentes a 1seg
seg=seg-1 'decrementar seg en 1
wend 'fin del ciclo
end sub

Ahora, podemos llamar al procedimiento delay_seg para hacer cálculo del peso total de una carga, por ejemplo:

delay_seg(segundos)

FUNCIONES
Las funciones deben estar declaradas apropiadamente para ser interpretadas correctamente durante el proceso de la compilac

sub function nombre_de_función (lista_de_parámetros) as valor_devuelto


[ declaraciones locales ]
cuerpo de función
end sub
Cada declaración contiene los siguientes elementos:

o Nombre_de_función es un identificador utilizado para llamar a función (nombre_de_función en el ejemplo)


o Tipo de resultado (valor devuelto) es un tipo de dato de los datos devueltos (tipo_devuelto en el ejemplo)
o Declaración de los parámetros: cada parámetro consiste en una variable, constante, puntero o matriz precedidos por su
a una declaración de variable regular (lista_de_parámetros en este ejemplo). Se utilizan para pasar la información de
o Declaraciones locales son declaraciones opcionales de variables y constantes que se refieren solamente a la función d
o Cuerpo de función es una secuencia de sentencias que serán ejecutadas después de llamar a la función.

Aquí está un ejemplo de cómo definir y utilizar la función power:

'función que hace cálculo de xn basado en los parámetros de entrada x y n (n > 0)


sub function power(dim x, n as byte) as longint ' x y n son bytes, resultado es longint
dim i as byte ' i es un byte
result = 1 ' resultado = 1 si n = 0
if n > 0 then
for i = 1 to n
result = result*x
next i
end if
end sub

Ahora, podemos llamar a la función power para hacer cálculo de 312 por ejemplo:

tmp = power(3, 12) ' Hacer cálculo de 3*12

Práctia de Laboratorio
1. Crear un Nuevo Proyecto llamado Arreglos
2. Copiar el siguiente código
program Funciones

'Procedimiento para retardo segundos


sub procedure delay_seg(dim seg as byte) 'Tiene como variable de entrada seg del tipo byte
while seg<>0 'Mientras seg sea distinto de 0
delay_ms(1000) 'Retardo de 1000ms equivalentes a 1seg
seg=seg-1 'decrementar seg en 1
wend 'fin del ciclo
end sub

'función que hace cálculo de x^n basado en los parámetros de entrada x y n (n > 0)
sub function power(dim x, n as byte) as longint ' x y n son bytes, resultado es longint
result = 1 ' inicializamos result = 1
while n <> 0 ' Mientras n sea distinto de 0
result=result*x ' el proximo valor de result sera result*x
n=n-1 ' el porximo valor de n sera n-1
wend ' Fin del while
end sub ' Si n=0 entonces result = 1

dim tmp as longint 'Declaracion de la variable tmp como longint

main:
while 1
delay_seg(2) 'Realiza un retardo de 2 segundos
tmp = power(3,2) 'el valor de tmp sera 3^2
delay_seg(5) 'Realiza un retardo de 5 segundos
tmp = power(4,5) 'el valor de tmp sera 4^5
wend
end.

3. Compilar el Proyecto (ctrl+F9)


4. Depurar Código (F9) y agregar los registros tmp, n, x, seg y result.
5. En la línea 24 y 25 presiona F7 para ir paso a paso y observa hacia que linea salta el depurador.
6. Presiona F8 en las líneas 26 y 27 para ir paso a paso y contesta las siguientes preguntas:
a. ¿Según la ventana StopWatch cuánto tardan en ejecutarse la líneas 24 y 26?
b. ¿Cuál es el valor de la variable tmp después de las líneas 25 y 27?
c. ¿Qué ventajas tiene usar funciones y procedimientos?
7. Realiza una función que ejecute la sumatoria de los números pares desde el cero hasta un valor n.
8. Realiza un Procedimiento que ejecute un retardo de n-minutos.

3. Sentencias condicionales
Contenidos

1. 1 Introducción

1. 1.1 Sentencia Condicional IF

1. 1.1.1 Sentencias IF Anidadas

2. 2 Operadores Relacionales

3. 3 Sentencia select case


4. 4 Práctica de Laboratorio

Introducción
Las condiciones son ingredientes comunes de un programa. Las condiciones permiten ejecutar una o varias sentencias depen
En otras palabras, ‘Si se cumple la condición (...), se debe hacer (...). De lo contrario, se debe hacer (...)’. Una sentencia co
sola sentencia o por un bloque de sentencias a ser ejecutadas.
Sentencia Condicional IF
La sintaxis en una forma simple de la sentencia if es:

if expresión then
operaciones
end if

Si el resultado de la expresión es verdadero (distinto de 0), las operaciones se realizan y el programa continúa con la ejecució
falso (0), las operaciones no se realizan y el programa continúa inmediatamente con la ejecución.

El operador if se puede utilizar en combinación con el operador else:

if expresión then
operaciones1
else
other operaciones2
end if

Si el resultado de la expresión es verdadero (distinto de 0), las operaciones1 se realizan. De lo contrario, las operaciones2 se
operaciones, el programa continúa con la ejecución.

Sentencias IF Anidadas
La sentencia if anidada necesita una atención adicional. Es una sentencia utilizada dentro de otra sentencia if. Siguiendo la re
por la sentencia if más anidada, mientras que cada sentencia else se enlaza a la más cercana sentencia if disponible a la izqui

Operadores Relacionales
Los operadores relacionales se utilizan para comparar dos variables y determinar la validez de su relación. En mikroBasi
devuelven 255 si la expresión es evaluada como verdadera (true). Si una expresión es evaluada como falsa (false), el operad
las expresiones tales como ‘si la expresión es evaluada como verdadera, entonces...’

Operador Significado Ejemplo Condición de veracidad


> es mayor que b>a si b es mayor que a
>= es mayor o igual que a >= 5 si a es mayor o igual que 5
< es menor que a<b si a es menor que b
<= es menor o igual que a <= b si a es menor o igual que b
= es igual que a=6 si a es igual que 6
<> no es igual que a <> b si a no es igual que b

Sentencia select case


La sentencia select case es una sentencia condicional de ramificación múltiple. Consiste en una expresión (condición) selecto
de la expresión. La síntaxis de la sentencia select case es la siguiente:

El especificador selector es una expresión evaluada como un valor entero.

Los especificadores value_1...value_n representan los valores posibles del selector. Pueden ser literales, constantes
especificadores statements_1 ...statements_n pueden ser
La cláusula case else es opcional.

Primero se evalúa el valor de la expresión selector. Después se compara con todos los valores disponibles. Si los valores son
se ejecutarán las sentencias que siguen a los valores iguales y termina la sentencia select case. En el caso de que coincidan lo
sentencias que siguen a los primeros valores iguales. Si no coincide ningún valor con el selector, se ejecutarán las sentencias
else (si hay alguna).
select case Variable
case 0
sentencia0
case 1
sentencia1
...
case N
sentenciaN
default
sentencia_default
end select

Práctica de Laboratorio
1. Crear un Nuevo Proyecto
2. Copiar el siguiente código
'El siguiente codigo muestra en un display de 7 segmenteos catodo comun el puerto
'que tenga el valor mayor siempre y cuando este no sea mayor a 9.
program Sent_condicionales

' Declarations section


dim aux as byte

main:
ANSEL=0
ANSELH=0
TRISA=255
TRISB=255
TRISD=0
while 1
if PORTA > PORTB then 'Si PORTA > PORTB
aux=PORTA 'aux sera igual a PORTA
else 'de lo contrario
if PORTA < PORTB then 'SI PORTA < PORTB
aux=PORTB 'aux sera igual a PORTB
else 'de lo contrario
aux=0 'aux sera igual a 0
end if
end if
'Codigo para manejar display de 7 segmentos
select case aux 'seleccionar caso aux
case 0 'si aux=0
PORTD = 0x3F 'Visualizar "0"
case 1 'si aux=
PORTD = 0x06 'Visualizar "1"
case 2 'si aux=
PORTD = 0x5B 'Visualizar "2"
case 3 'si aux=
PORTD = 0x4F 'Visualizar "3"
case 4 'si aux=
PORTD = 0x66 'Visualizar "4"
case 5 'si aux=
PORTD = 0x6D 'Visualizar "5"
case 6 'si aux=
PORTD = 0x7D 'Visualizar "6"
case 7 'si aux=
PORTD = 0x07 'Visualizar "7"
case 8 'si aux=
PORTD = 0x7F 'Visualizar "8"
case 9 'si aux=
PORTD = 0x6F 'Visualizar "9"
case else 'caso contrario si aux>9
PORTD = %00000000 'Apagar Dispaly
end select
wend
end.
4. Compilar el Proyecto (ctrl+F9)
5. Depurar Código (F9) y agregar los registros PORTA, PORTB, PORTD y aux
6. Presiona F8 para ir paso a paso, da doble clic sobre cada registro en la ventana Watch Values para cambiar su valor y cont
a. ¿Cuál es el valor de la variable aux si PORTA es mayor a PORTB despues de la línea 24?
b. ¿Cuál es el valor de la variable aux si PORTA es menor a PORTB despues de la línea 24?
c. ¿Cuál es el valor de la variable aux si PORTA es igual a PORTB despues de la línea 24?
d. ¿Cuál es el valor de PORTD si aux es igual a 5?
7. Crear un Nuevo Circuito similar al siguiente, para ello será necesario buscar mediante la ventana de busqueda LOGICSTA
CATHODE.
Para poner el GROUND es necesario presionar el botón sources de la cinta de opciones izquierda.

8. En mikrobasic abre el Seven Segment Editor.

9. Activa y desactiva cada segmento hasta formar un 9 sin el segmento inferior activo.

10. Copiar el valor de la casilla Common Cathode y pegarlo en el valor de PORTD del caso 9.

11. Compilar y simular el circuito de nuevo.

4. Bucles de Programa
Introducción
Algunas instrucciones (operaciones) deben ejecutarse más de una vez en el programa a esto se le denomina bucle, lazos o c
se ejecutará depende de las condiciones o centinelas de salida del bucle.

Bucle WHILE
El bucle while (mientras en español) se utiliza cuando el número de iteraciones no está especificado. Es necesario compro
de ejecutar un bucle. En otras palabras, el bucle while se ejecuta una vez cumplidas todas las condiciones necesarias para su
la sintaxis del bucle while:

while condicion
...
sentencias
...
wend

El programa se queda en el bucle hasta que la condicón llegue a ser falsa. El valor de la condición se comprueba antes de q
Si el valor de la expresión es falso antes de entrar el bucle, no se ejecuta ninguna iteración, es decir, las sentencias no se ejecu
con la ejecución desde el fin del bucle while (desde las instrucciones que siguen a la instrucción wend).

Un tipo especial del bucle de programa es un bucle infinito. La ejecución es simple en este caso ya que el resultado es s
diferente de 0), lo que significa que el programa se queda en el bucle:

while 1 ' Se puede escribir ‘true’ en vez de ‘1’


... ' Las expresiones se ejecutarán repetidamente (bucle infinito)
...
wend

Bucle DO-LOOP UNTIL


La sentencia do-loop until (Hacer-Lazo hasta que) se utiliza cuando el número de iteraciones no está especificado. El bucle
la condición siga siendo verdadero. La sintaxis del bucle do es la siguiente:

do
...
sentencias
...
loop until condicion

Este bucle es similar al anterior, la diferencia es que las sentencias se ejecutarán hasta que la condición se convierta en verd
bucle se comprueban hasta el final del bucle, así que el bucle se ejecuta al menos una vez, sin comprobar si la condición es

Bucle FOR
El bucle for (Para en español) se utiliza cuando el número de iteraciones está especificado. La sintaxis del bucle for es la si

for contador = valor_inicial to valor_final [step valor_de_paso]


...
sentencias
...
next contador
La variable contador se incrementa por el valor de paso con cada iteración de bucle.

El parámetro valor_de_paso es un valor entero opcional, que es igual a 1 si es omitido. Antes de ejecutar la primera iteración
y se incrementa hasta llegar o exceder al valor_ final. Con cada iteración se ejecutan las sentencias. Las expresiones va
compatibles con el contador. El especificador sentencia puede ser cualquier sentencia que no afecta al valor del contador.
ser negativo, lo que permite contar atrás.

Práctica de Laboratorio
1. Crear un Nuevo Proyecto llamado Bucles
2. Copiar el siguiente código
'*******************************************************************************
'El siguiente código se encarga de realizar la suma de los números desde el 1
'hasta el 5 con los tres tipos de bucles
'*******************************************************************************
program Bucles

dim sum,i as byte

main:
sum=0 'Sum sera igual a 0
i=1 'i sera igual a 1
while i<=5 'mientras i sea menor o igual a 5
sum=sum+i 'sum sera igual al valor anterior mas el valor de i
i=i+1 'i sera igual al valor anterior mas 1
wend

sum=0 'el valor de sum sera 0


i=1 'el valor de i sera 1
do 'hacer
sum=sum+i 'sum sera igual al valor anterior mas el valor de i
i=i+1 'i sera igual al valor anterior mas 1
loop until i>5 'Hasta que i sea mayor o igual a 5

sum=0 'el valor de sum sera 0


for i=0 to 5 'para i desde 0 hasta 5
sum=sum+i 'sum sera igual al valor anterior mas el valor de i
next i 'proximo valor de i (i se incrementa en 1)

end.

3. Compilar el Proyecto (ctrl+F9)


4. Depurar Código (F9) y agregar los registros i y sum.
5. Presiona F8 para ir paso a paso, da doble clic sobre cada registro en la ventana Watch Values para cambiar su valor y con
a. ¿Cuáles valores toman las variables sum e i en las líneas 13, 14, 20, 21, 26 y 27?
b. ¿Cuál es la diferencia entre los tres ciclos?
6. Cambia el valor de i en las líneas 5 y 18 por uno mayor a 5 y observa de nuevo la depuración.
5. Arreglos y Matrices
Una matriz es una lista organizada y limitada de variables del mismo tipo denominadas elementos. Este tipo es denomin
referenciado por un índice único así que los diferentes elementos pueden tener el mismo valor. Para declarar una matriz, es
elementos (denominado tipo de matriz), su nombre y el número de sus elementos encerrados entre corchetes:

dim nombre_de_matriz as tipo_de_componente [número_de_componentes]

Los elementos de una matriz se identifican por su posición. Los índices van desde 0 (el primer elemento de una matriz) a
contenidos en la matriz). El compilador tiene que “saber” cuántas localidades de memoria debe alojar al declarar una matriz
no puede ser variable.

Para explicar con más claridad, una matriz puede ser pensada como una lista más o menos larga o corta de variables del mi
asigna un número ordinal que siempre empieza por cero. A esta matriz se le denomina vector. En la tabla de la derecha s
estante que contiene 100 elementos.

Elementos de la matriz Contenido de elementos

estante[0] 7
estante[1] 23
estante[2] 34
estante[3] 0
estante[4] 0
estante[5] 12
estante[6] 9
... ...
... ...
estante[99] 23

En este caso, el contenido de una variable (elemento) representa un número de productos que contiene el estante. A los elem
medio de la indexación, o sea, al especificar sus índices encerrados entre corchetes:

dim shelf as byte [100] ' Declarar la matriz "estante" con 100 elementos
shelf [4] = 12 ' 12 elementos están ‘colocados’ en el estante [4]
temp = shelf [1] ' Variable estante [1] se copia a la variable temp

En las matrices de constantes, a los elementos se les pueden asignar sus contenidos durante la declaración de matriz. En el s
de matriz denominada CALENDARIO se declara y a cada elemento se le asigna un número específico de días:

const CALENDARIO as byte [12]= (31,28,31,30,31,30,31,31,30,31,30,31)


El número de los valores asignados no debe exceder la longitud de la matriz especificada, solo puede ser menor. En este ca
les asignarán ceros.

Práctica de Laboratorio
1. Crear un Nuevo Proyecto llamado Arreglos
2. Copiar el siguiente código
'El siguiente muestra en un display de 7 segmentos conectado al PORTD el valor
'correspondiente al codigo BCD ingresado por el PORTB
program Arreglos
'Declaracion de los valores del display 7seg.
const mask as byte [16]= (0x3F,0x06,0x5B,0x4F, '0,1,2,3,
0x66,0x6D,0x7D,0x07, '4,5,6,7,
0x7F,0x67,0x77,0x7C, '8,9,A,b,
0x39,0x5E,0x79,0x71) 'C,d,E,F.
dim i as byte

main:
ANSEL=0
ANSELH=0
TRISB=255 'Todos los pines como salidas
TRISD=0 'Todos los pines como Salidas
while 1 'Inicio del ciclo infinito
i=PORTB and 0x0F 'Tomamos los 4 bits inferiores de PORTB
PORTD=mask[i] 'PORTD sera igual al i-esimo valor de mask
wend

end.

3. Compilar el Proyecto (ctrl+F9)


4. Depurar Código (F9) y agregar los registros i, PORTB y PORTD.
5. Presiona F8 para ir paso a paso, da doble clic sobre cada registro en la ventana Watch Values para cambiar su valor y con
a. Si el valor de PORTB es 5 décimal cuál es el valor de PORTD y la variable i después de la línea 18
b. Si el valor de PORTB es 35 décimal cuál es el valor de PORTD y la variable i después de la línea 18 (Convierte 35 a He
6. Crear un Nuevo Circuito similar al siguiente, para ello será necesario buscar mediante la ventana de busqueda LOGICST
CATHODE.
7. Inicia la simulación (F12) y luego cambia los valores de los LOGICSTATES conectados a PORTB y observa el resultad
conectados a PORTD.

6. ISIS-PROTEUS
El entorno de diseño electrónico PROTEUS VSM de LABCENTER ELECTRONICS (www.labcenter.co.uk) ofrece la pos
(lenguaje C) y bajo nivel (lenguaje ensamblador) para los microcontroladores y, simultáneamente, con la simulación en mo
el diseño tanto a nivel de hardware como software y realizar la simulación en un mismo y único entorno. Para ello se sumin
son el ISIS para el diseño gráfico, VSM (Virtual System Modelling) para la simulación y el ARES para el diseño de circuit

6.1. Crear un Nuevo Circuito


1. Abrir el simulador ISIS-PROTEUS

2. Listar los dispositivos que vamos a utilizar para crear el circuito, para ello debemos presionar el botó
teclado para abrir la subventana Pick Devices.

3. Buscar los dispositivos mediante la caja de busqueda Keyword. En esta podemos ingresar palabras cl
los dispositivos, por ejemplo si queremos buscar una resistencia escribimos RES. En nuestro caso busca
LOGICPROBE, una vez encontrados hay que darle doble clic para que aparesca en la lista Devices.
4. Cierra la subventana Pick Devices y ubica cada dispositivo en el lugar que consideres necesario, para
clic sobre nombre del dispositivo en la lista y luego ubicarlo en la ventana de trabajo.

o Si deseas girar hacia la derecha un dispositivo presiona la tecla "+" del teclado numérico.
o Si deseas girar hacia la izquierda un dispositivo presiona la tecla "-" del teclado numérico.
o Si deseas rotar en espejo un dispositivo presiona la combinación de teclas "ctrl+M".

6. Unir los dispositivos con cables dando clic en el primer pin, luego mover el cursor y finalmente dar c

7. Abrir las propiedades del PIC dandole doble clic.

8. Seleccionar el archivo *.hex que se cargará en el PIC ubicado en la carpeta del proyecto (Mis Docum

9. Configurar la frecuencia con la que se realizará la simulación y presionar el botón OK para finalizar

10. Presionar el botón Play para iniciar la simulación

11. Observar lo que ocurre durante la simulación para comprobar el funcionamiento del circuito.

12. Detener la simulación una vez que compruebes que el circuito funciona correctamente o para modif

Si observas en el ejmplo anterior no es necesario ubicar el cristal de cuarzo y los capacitores ceramicos
debe a que el simulador solo utiliza la frecuencia configurada en las propiedades del PIC y no el cristal.
Otra cosa importante es que puedes utilizar un LED y una resistencia conectados en serie en vez del LO

7. Puertos de Entrada y Salida


Contenidos

1. 1 Introducción

2. 2 Puertos de Entradas/Salidas.

1. 2.1 Configuración de los Puertos.


2. 2.2 Lectura de los Puertos.

3. 2.3 Escritura de Puertos


3. 3 Práctica de Laboratorio

Introducción
En casi todos los proyectos es necesario leer alguna entrada de tipo digital conectada a pulsadores, interruptores, sensores d
necesario escribir datos por medio de una salida de tipo digital conectada a LED, pantallas LCD, display de siete segmento
de explicar cómo realizar la configuración de los puertos del PIC para utilizarlos como entradas o salidas digitales.

Puertos de Entradas/Salidas.
Los Microcontroladores PIC tienen terminales de entrada/salida (I/O, Input/Output) divididos en puertos, que se encuentras
C, D, etc. Cada puerto puede tener hasta 8 terminales que se pueden comportar como una I/O digital. El PIC16F887 tiene h
general, y en dependencia de la configuración de sus periféricos pueden estar disponibles como I/O de propósito general. P
USART (Transmisión Serial) los pines correspondientes a este periférico serán utilizados para atender las operaciones del m
como I/O de propósito general.

Configuración de los Puertos.


Los puertos pueden ser configurados como entradas o como salidas, es decir, dependen del programador si un pin servirá co
que momento ocurrirá esto. Para realizar esto es necesario modificar el valor de los registros TRISx.

Por ejemplo:
TRISA=%00000000 'Todos los pines de PORTA son salidas
TRISB=%11111111 'Todos los pines de PORTB son entradas
TRISC=%00001111 'Los pines de PORTC 0 al 3 son entradas y los pines 4 al 7 son salidas
TRISD.3=0 'El pin 3 de PORTD se configura como salida sin afectar los demas pines.
TRISD.5=1 'El pin 5 de PORTD se configura como entrada sin afectar los demas pines.

Una forma fácil de recordar como configurar un pin como entrada o como salida es que el 1 se parece a la "I" de Input y el
así todos los bits de los registros TRIS que tengan 1 seran entradas y los bits que tengan 0 serán salidas.

Muchas veces deseamos configurar una gran cantidad de pines sin modificar el resto para ello se utilizan las operaciones bi
llamadas operaciones mascara.
TRISD=TRISD or %00001111 'Los pines PORTC<0..3> se configuran como entradas sin modificar los demas pines.
TRISD=TRISD and %10100110 'Los pines PORTD<0,3,4,6> se configruan como entradas sin modificar el resto.

Lectura de los Puertos.


Cuando configuramos un puerto o un pin como entrada podemos leerlo utilizando los registros PORTx, esto no significa qu
configuramos como salida y deseamos saber su último valor para realizar modificaciones en dependencia de este. Por ejem
TRISA=%11111111 'Configuramos todos los PINES de PORTA como entrada
TRISB=%10101010 'Configuramos los pines PORTB<0,2,4,6> como salida el resto como entrada.
VAR1=PORTA 'El valor de PORTA se almacenara en la variable VAR1
VAR2=PORTB 'El valor de PORTB, incluyendo los pines de salida, se almacenan en la variable VAR2

Escritura de Puertos
Cuando configuramos un puerto o pin como salida podemos escribirlo utilizando los registros PORTx, pero si algún pin de
salida no se producirá ningún cambio al momento de escribirlo. Por ejemplo:
TRISA=%00000000 'Configuramos todos los pines de PORTA como salida
TRISB=%01010101 'Configuramos los pines PORTB<1,3,5,7> como salida el resto como entrada.
...
PORTA=%11110000 'A PORTA se le asignara el valor $11110000
PORTB=%11111111 'Solo los pines PORTB<1,3,5,7> sufriran cambio

Práctica de Laboratorio
1. Crear un Nuevo Proyecto
2. Copiar el siguiente código
program Puertos

DIM VAR1,VAR2 AS BYTE

main:
TRISA=%00000000 'Todos los pines de PORTA son salidas
TRISB=%11111111 'Todos los pines de PORTB son entradas
TRISC=%00001111 'Los pines de PORTC 0 al 3 son entradas y los pines 4 al 7 son salidas
' TRISA=0 'Todos los pines de PORTA son salidas
' TRISB=255 'Todos los pines de PORTB son entradas
' TRISC=$0F 'Los pines de PORTC 0 al 3 son entradas y los pines 4 al 7 son salidas
TRISD.3=0 'El pin 3 de PORTD se configura como salida sin afectar los demas pines.
TRISD.5=1 'El pin 5 de PORTD se configura como entrada sin afectar los demas pines.
TRISD=TRISD or %00001111 'Los pines PORTC<0..3> se configuran como entradas sin modificar los demas pines
while 1 'Inicio del Ciclo Infinito
PORTB=PORTA 'El valor de PORTA se asignara al Valor de PORTB
VAR1=PORTC 'El valor de PORTC se asignara al Valor de VAR1
VAR2=PORTD 'El valor de PORTD se asignara al Valor de VAR1
PORTD=VAR1+VAR2 'La suma de VAR1 y VAR2 se asignara al valor de PORTD (solo se modifican los pines de
Delay_ms(500) 'Retardo de 500ms para observar cambios
wend 'Fin del Ciclo infinito.
end.
4. Compilar el Proyecto
5. Depurar Código y agregar los registros TRISA, TRISB, TRISC, TRISD, VAR1, VAR2, PORTA, PORTB, PORTC y PO
6. Conteste las siguientes preguntas:
a. ¿Qué valor se le asigna a TRISA, TRISB, TRISC y TRISD despues de la línea 8.
b. Si a PORTA se le asigna el valor %101010101 que valor tendrá PORTB despues de la línea 16.
c. Si a PORTC se le asigna el valor %111001111 que valor tendrá VAR1 despues de la línea 17 y que valor tendrá PORT
7. Comentar las líneas 6, 7 y 8 y descomentar las líneas 9, 10 y 11 y contesde la prengunta a.
8. Crear y simular un Nuevo Circuito como muestra la siguiente figura.

También podría gustarte