Está en la página 1de 8

Programando microcontroladores PIC con Protn

PROGRAMANDO MICROCONTROLADORES
PIC CON PROTN
PARTE 7: BUCLES
BUCLE.- Es una sentencia de control que repite un determinado nmero de veces
(iteracin) una parte de cdigo hasta que se cumpla una condicin establecida. Es muy
utilizado para hacer una accin repetida sin tener que repetir varias veces las mismas
sentencias, ahorrando tiempo y permite entender mejor la estructuracin del
programa, los bucles y condicionales forman la parte principal de la programacin
estructurada.
Existen diferentes bucles en Protn, cada uno con una estructura diferente, pero que
siguen el mismo principio, el de realizar un nmero determinado de iteraciones.

FOR - NEXT
WHILE - WEND
REPEAT - UNTIL

BUCLE FOR.- seguramente el bucle ms conocido, desde los primeros pasos por los
algoritmos conocido como para, este bucle realiza una serie de iteraciones hasta que
se cumpla una condicin determinada.
Sintaxis:
FOR Variable = Inicio del conteo TO Fin del conteo [ STEP { Valor del incremento de la variable } ]
{cuerpo del cdigo}
NEXT

Descripcin.- Un bucle FOR NEXT, es usado para ejecutar un cdigo determinado un cierto
nmero de veces.

Operadores.Variable.- se refiere a un ndice que sirve de referencia para empezar el bucle, esta variable
ndice, puede ser utilizada en el cuerpo del cdigo pero hay que tener mucho cuidado y no
alterar el valor pues puede afectar el nmero de iteraciones del bucle.
Inicio del Conteo.- es el nmero de inicio para el conteo, al que inicialmente se le asignar el
valor de la variable. No es necesario que este valor sea constante, tambin se puede usar el
valor de otra variable.
Fin del Conteo.- Es el nmero que determina cuando terminar el lazo. No es necesario que
este valor sea constante, tambin se puede usar el valor de otra variable.

Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

Programando microcontroladores PIC con Protn


Valor del incremento de la Variable.- es una variable o constante opcional mediante la cul la
variable se incrementa o decrementa con cada iteracin del bucle FOR NEXT. Si el Inicio del
conteo es mayor que el final del conteo, entonces se puede preceder al valor de incremento
de la variable con un signo menos, para que la variable se decremente, caso contrario la
variable se incrementar segn el valor a continuacin del STEP, si ste no se usa, entonces los
incrementos de la variable se da en una unidad por cada iteracin.

EJEMPLO 1:
For i=0 To 255 'inicio del bucle
PORTB=i 'al puerto b se le asigna el valor de i
DelayMS 100 'retardo de 100 milisegundos
Next i 'incrementa en 1 la variable i

El presente ejemplo cumple con un total de 256 repeticiones (a partir de ahora a las
repeticiones nos referiremos con el nombre de iteracin), i es la variable que va a ir
incrementndose, se le asigna un valor constante, cero, del cual va a partir el conteo y
ejecuta las lneas de cdigo hasta que sea 255.
El incremento de la variable lo hace automticamente el NEXT, que significa prximo, como no
se utiliza STEP, los incrementos son de uno en uno haciendo un total de 256 iteraciones
(incluyendo el primer valor de i que es 0), el valor de i, es asignado al puerto B, el retardo es
para que el valor se mantenga en un periodo de tiempo, si se conectan ocho leds a la salida del
puerto B, se puede apreciar como se van prendiendo y apagando, en este caso el programa es
para realizar un contador binario de 8 bits.
El valor que contiene i, se ir apreciando en los pines que se activan para formar el nmero
binario correspondiente al valor decimal que contiene la variable i.
NOTA.- NEXT sirve para incrementar la variable que se est utilizando en el bucle FOR, no se lo
puede utilizar para hacer incrementos de variables fuera del bucle, para ello se debe hacer la
asignacin respectiva: ej. A=A+1 o utilizar la instruccin INC.

Ejemplo 2
For i=255 To 0 Step -1 'inicio del bucle
PORTB=i 'al puerto b se le asigna el valor de i
DelayMS 100 'retardo de 100 milisegundos
Next i 'decrementa en 1 la variable i

Este ejemplo, como el anterior, es un contador binario de 8 bits, la diferencia es que el anterior
cuenta de forma ascendente y este cuenta de forma descendente.
A la variable i se le asigna el valor desde el cual va a empezar a contar, para este ejemplo 255,
STEP 1 indica que se va a decrementar la variable en 1, el proceso es igual que el caso
anterior, el valor de i se asigna al puerto B para realizar el contador binario de 8 bits.

Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

Programando microcontroladores PIC con Protn


EJEMPLO 3
For i=0 To 255 Step 2 'inicio del bucle
PORTB=i 'al puerto b se le asigna el valor de i
DelayMS 100 'retardo de 100 milisegundos
Next i 'decrementa en 1 la variable i

En este ejemplo, como los anteriores, se trata de un contador binario, la diferencia es que el
conteo se lo va a realizar solo para nmeros pares, ya que la variable i parte de 0 y los
incrementos se dan de a dos valores tal como se indica con STEP 2
Ejemplo 4
j=100 'se a signa a j un valor 100
For i=0 To j+155 'inicio del bucle
PORTB=i 'al puerto b se le asigna el valor de i
DelayMS 100 'retardo de 100 milisegundos
Next i 'decrementa en 1 la variable i

Recuerde, el conteo del bucle puede partir desde cualquier valor constante o variable, hasta
un valor tambin constante o variable, eso es lo que se muestra en este ejemplo, el bucle
tambin cumplir con un total de 256 iteraciones, hay dos variables, j e i, a la primera
variable, se le asigna un valor de 100 antes de empezar el bucle, el conteo parte desde i=0
hasta j+155 que sera en total 100 + 155 iteraciones, lo cual permite realizar un conteo de 8
bits de forma ascendente como el ejemplo 1.
BUCLE WHILE.- Este bucle realiza una serie de iteraciones cuando la condicin es verdadera, su
traduccin es: haga mientras; si la condicin establecida en el WHILE se cumple, se seguirn
ejecutando las lneas de cdigo dentro de ese bucle.

Sintaxis
WHILE Condicin
Instrucciones
Instrucciones
WEND
WHILE Condicin { Instrucciones : } WEND

Descripcin.- Este bucle ejecuta instrucciones mientras la condicin sea verdadera. Cuando la
condicin es verdadera, se contina ejecutando el cdigo hasta el correspondiente WEND. La
condicin puede ser cualquier expresin de comparacin.
Ejemplo 1
VAR1 = 1
While VAR1 <= 10
Print @VAR1 , " "
VAR1 = VAR1 + 1
Wend

En el presente ejemplo se visualiza el valor de la variable var1 en un LCD, se realizarn las


iteraciones siempre y cuando el valor de var1 sea menor o igual a 10, el bucle terminar
Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

Programando microcontroladores PIC con Protn


cuando var1 sea un valor mayor a 10, antes del bucle la variable toma un valor de 1 y luego de
visualizar su valor en el LCD se incrementa en 1, cuando la variable es mayor a 10, el bucle
termina y se deben ejecutar las lneas de cdigo siguiente, el bucle no terminar hasta que la
condicin sea falsa, por eso hay que tener cuidado cuando se estructura un bucle de este tipo,
pues si se da algn tipo de error, puede que el ciclo sea infinito provocando que el
microcontrolador se cuelgue.
Prueba de escritorio.- para una mejor comprensin de este ejemplo, se adjunta a continuacin
la prueba de escritorio del ejemplo 1:
var1
1
2
3
4
5
6
7
8
9
10
11

Condicin
var1<=10
var1<=10
var1<=10
var1<=10
var1<=10
var1<=10
var1<=10
var1<=10
var1<=10
var1<=10
var1<=10

Estado
VERDADERO
VERDADERO
VERDADERO
VERDADERO
VERDADERO
VERDADERO
VERDADERO
VERDADERO
VERDADERO
VERDADERO
FALSO

Resultado
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Cdigo ejecutado dentro del WHILE WEND
Termina el bucle

Ejemplo 2
While PORTA.0 = 1: Wend ' Espera por un cambio en el pin del puerto A

En el presente ejemplo, se muestra una lnea de cdigo que espera hasta que un bit de un
puerto determinado no cambie de estado, esto es muy utilizado en los anti rebotes de tecla,
tanto para pulsantes simples como para teclados matriciales, permitiendo ingresar datos
solamente cuando se presione una tecla.
El bucle se repetir una y otra ves hasta que el valor de PORTA.0 sea 0.
BUCLE REPEAT.- es muy similar al bucle WHILE, en este caso el cdigo es ejecutado hasta que
se cumpla una condicin, su traduccin es REPITA HASTA.

Sintaxis.REPEAT Condicin
Instrucciones
Instrucciones
UNTIL Condicin
REPEAT { Instrucciones: } UNTIL Condicin

Descripcin.- Ejecuta un bloque de instrucciones hasta que una condicin sea verdadera.
El bucle REPEAT-UNTIL difiere del WHILE-WEND, en que el primero realizar al menos una ves
las instrucciones dentro del lazo y luego lo har de forma continua hasta que la condicin sea
Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

Programando microcontroladores PIC con Protn


verdadera, el bucle While nicamente ejecuta las sentencias si la condicin es correcta. El
bucle REPEAT-UNTIL es ideal para remplazarlo por un bucle FOR-NEXT que actualmente ocupa
menos cantidad de cdigo y realiza el lazo de forma ms rpida.
Dos comandos han sido agregados especficamente para el bucle REPEAT, estos son INC y DEC.
INC decrementa una variable. Ejemplo: VAR = VAR + 1
DEC decrementa una variable. Ejemplo: VAR = VAR 1
Ejemplo 1:
VAR1 = 1
Repeat
Print At 1,1,Dec VAR1
DelayMS 200
Inc VAR1
Until VAR1 > 10

Este ejemplo es equivalente a un bucle FOR que llevara la siguiente estructura:


For VAR1 = 1 To 10
Print At 1,1,Dec VAR1
DelayMS 200
Next VAR1

Los dos bucles realizan un total de 10 iteraciones, y visualizan en un LCD el valor de la variable
VAR1.
Ejemplo 2:
Repeat High LED : Until PORTA.0 = 1 ' espera un cambio de estado en el BIT A0 del Puerto A

Ejecuta una sentencia hasta que se cumpla una condicin, en este caso est dada por el estado
lgico del BIT RA0 del Puerto A, las condiciones no solo estarn dadas por variables sino por
registros del microcontrolador.
EJERCICIO.- El siguiente ejercicio trata sobre una secuencia de luces, ocho leds conectados al
puerto B del PIC16F84A, se irn encendiendo una a una, para que se asemejen al ya conocido
auto fantstico, la tabla de valores para la secuencia de luces se muestra en la siguiente tabla:
128
2

64

32

16

Val. Dec. RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

16

32

64

128

Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

Programando microcontroladores PIC con Protn


Los bits estn ordenados de mas significativo a menos significativo, de izquierda a derecha
respectivamente, los valores desde 27 a 20 corresponden a los valores de laca uno de los bits,
para poder convertirlos a valores decimales, as tenemos los nmeros: 128, 64, 32, 16, 8, 4, 2,
1, que son los mismos valores que tenemos a lado izquierdo, esos valores se obtienen de
convertir los valores de binario a decimal, son ocho valores que hay que asignar al puerto B
para que los leds se enciendan de acuerdo a la tabla mostrada anteriormente.
Lo ms fcil sera ir asignando cada uno de los valores como esto:
PORTB=1 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led
PORTB=2 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led
PORTB=4 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led
PORTB=8 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led
PORTB=16 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led
PORTB=32 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led
PORTB=64 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led
PORTB=128 'valor asignado al puerto para activar el primer led
DelayMS 100 'retardo para ver encendido el led

Sera lo que se quiere hacer, pero veamos como podemos hacerlo con bucles, la idea es poder
generar los siguientes valores que son los que se deben asignar al puerto:
128 - 64 - 32 - 16 - 8 - 4 - 2 - 1
Ntese que los valores de derecha a izquierda son siempre el doble, es decir, 2 es el doble de
1, 4 es el doble de dos, 8 es el doble de 4 i as sucesivamente, por lo tanto, necesitamos una
variable para poder hacer una multiplicacin simple, por ejemplo:
Valor=1
Esta variable, ya contiene el primer valor que hay que asignar al puerto, luego solamente
tenemos que multiplicarla por dos y asignar en la misma variable el resultado y luego
nuevamente se tiene que asignar el nuevo valor al puerto B:
Valor = Valor * 2
De esta forma podemos generar los valores necesarios para la secuencia de luces.
El mismo ejercicio lo realizaremos con los tres bucles, FOR NEXT, WHILE WEND y REPEAT
UNTIL, en todos los tres casos, la idea es la misma, siempre multiplicar el primer valor por 2 y
luego almacenarlo en la misma variable, lo nico que cambia es la estructura del bucle,
recuerde, en el FOR, la variable que indica el nmero de iteraciones se incrementa con el
NEXT, ste ltimo sirve solo para el FOR, no se lo puede usar en un WHILE ni en un REPEAT,
para estos otros, se puede usar INC, que sirve para incrementar una variable, o tambin DEC
que sirve para decrementar una variable.

Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

Programando microcontroladores PIC con Protn


El siguiente circuito se necesita para realizar la siguiente prctica:

Figura #7: Secuencia de luces.

El primer cdigo es para el bucle FOR NEXT:

Device 16F84A 'Declaracin del microcontrolador a usar


XTAL 4 'declaracin de la frecuencia de proceso
TRISB=%00000000 'Configura el Puerto A como salida
'declaracin de variables para el programa
Dim i As Byte 'variable para el bucle FOR
Dim valor As Byte 'Variable para poder activar cada bit del Puerto B
inicio: 'etiqueta de inicio del programa
valor = 1 'Antes del bucle toma el valor 1
For i = 1 To 8 'ejecutar un total de ocho iteraciones
PORTB = valor 'asignamos el valor al puerto para encender los leds
DelayMS 100 'retardo de tiempo para ver el led encendido
valor = valor * 2 'operacin para obtener los valores: 2,4,8,16,32,64,128
Next i 'incrementa la variable i del bucle for
GoTo inicio ' salta a la etiqueta de inicio y repite constantemente
Cdigo #11

El cdigo siguiente es para el bucle WHILE WEND, la diferencia es la siguiente, en el FOR, a la


variable que sirve para contar las iteraciones, se le asigna un valor directamente en la misma
sentencia, en el WHILE, hay que asignar fuera del bucle un valor de inicio:
i=1 'valor inicial de i para realizar los incrementos en el bucle

Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

Programando microcontroladores PIC con Protn


Luego hay que tener en cuenta, cuantas iteraciones se quieren realizar, ya que este bucle
ejecuta instrucciones mientras la condicin sea verdadera, por lo tanto seria la siguiente
condicin:
While i < 9 'mientras sea menor a 9, en total 8 iteraciones

La obtencin de los valores para asignar al puerto, sigue siendo igual, pero para que i se
incremente debemos hacerlo manualmente, en el FOR es automtico al final cuando se usa
NEXT, para el caso del WHILE sera algo as:
Inc i 'incrementa el valor de i, i=i+1

Finalmente, el programa completo se muestra a continuacin:


Device 16F84A 'Declaracin del microcontrolador a usar
XTAL 4 'declaracin de la frecuencia de proceso
TRISB=%00000000 'Configura el Puerto A como salida
'declaracin de variables para el programa
Dim i As Byte 'variable para el bucle FOR
Dim valor As Byte 'Variable para poder activar cada bit del Puerto B
inicio: 'etiqueta de inicio del programa
valor = 1 'Antes del bucle toma el valor 1
i=1 'valor inicial de i para realizar los incrementos en el bucle
While i < 9 'mientras sea menor a 9, en total 8 iteraciones
PORTB = valor 'asignamos el valor al puerto para encender los leds
DelayMS 100 'retardo de tiempo para ver el led encendido
valor = valor * 2 'operacin para obtener los valores: 2,4,8,16,32,64,128
Inc i 'incrementa el valor de i, i=i+1
Wend ' final del while
GoTo inicio ' salta a la etiqueta de inicio y repite constantemente
Cdigo #11

El Bucle REPEAT es muy similar al anterior, la diferencia solamente es en la estructura, pues el


REPEAT ejecuta un bloque de instrucciones hasta que una condicin sea verdadera, por lo
tanto el cdigo es muy similar y finalmente queda como se muestra a continuacin:
Device 16F84A 'Declaracin del microcontrolador a usar
XTAL 4 'declaracin de la frecuencia de proceso
TRISB=%00000000 'Configura el Puerto A como salida
'declaracin de variables para el programa
Dim i As Byte 'variable para el bucle FOR
Dim valor As Byte 'Variable para poder activar cada bit del Puerto B
inicio: 'etiqueta de inicio del programa
valor = 1 'Antes del bucle toma el valor 1
i=0 'valor inicial de i para realizar los incrementos en el bucle
Repeat 'empieza el bucle repetir
PORTB = valor 'asignamos el valor al puerto para encender los leds
DelayMS 100 'retardo de tiempo para ver el led encendido
valor = valor * 2 'operacin para obtener los valores: 2,4,8,16,32,64,128
Inc i 'incrementa el valor de i, i=i+1
Until i=8 'hasta que i sea igual a 9, en total 8 iteraciones
GoTo inicio ' salta a la etiqueta de inicio y repite constantemente
Cdigo #12

Ing. Giovanni Lafebre J. (Cel: 084278683; Fono 4036038) Cuenca Ecuador

M&M

También podría gustarte