lunes, 31 de octubre de 2011

Guía sobre condicionales parte 2

  En esta ocasión hablaremos de otros dos condicionales que son muy utilizados y en especial permiten realizar cosas bastante útiles durante un programa.

Condicional WHILE
  El condicional WHILE viene a ser una especie de supervisor de campo, si todo fluye bien entonces sigue dirigiendo las ordenes, si algo esta fuera de lo común entonces las interrumpe. Si lo llevamos a la lógica de programación, el WHILE lo que hace es realizar las ordenes asociadas a el mientras la condición o condiciones se cumplan, en el momento en que esas condiciones dejen de ser ciertas entonces interrumpe la ejecución de estas ordenes sin importar en que segmento se encuentren.

 La principal diferencia con el IF es que al contrario de este, el WHILE chequea en tiempo real que las condiciones sean ciertas, solo sigue ejecutando mientras sean ciertas, el IF solo realiza esta comprobación cuando se llega al segmento de código que lo solicita y ejecuta todos los comandos asociados a este sin importar si la o las condiciones siguen siendo ciertas. Muy útil si queremos supervisar múltiples controladores (switches) y realizar acciones en base a su estado actual por ejemplo.


Sintaxis en PIC BASIC

While condiciones
        ordenes
Wend

Sintaxis en C

Do{
       ordenes
}
while(condiciones);


 
  La lógica para las condiciones es la misma que para el IF, puede ser una o mas condiciones (mediante el uso de los OR y AND).

Ejemplos


Supongamos que queremos controlar un set de switches y mostrar en ellos un conteo de acuerdo a lo que se encuentre en ellos.
  Si los switches marcan 00 en binario parpadear el último numero contado, si marcan 01 realizar un conteo ascendente del 1 al 15 y si marcan 11 realizar un conteo descendente del 1 al 15. Se debe interrumpir el conteo y realizar la acción requerida si cambia el estado de los switches, es decir que si se encontraba en 01 y se colocan los switches en 00 deberá parpadear el ultimo conteo que se realizo, si estaba en 00 y luego se pone en 11 deberá empezar a realizar un conteo descendente. 

Esta tabla define que debería de suceder:

Switches
Acción
00
Parpadear ultimo digito contado
01
Conteo ascendente 1 - 15
11
Conteo descendente 15 - 1


Código 

Device 16F877A
Xtal 20
All_Digital true
Output PORTC
Input PORTB
Dim x As Byte
x = 0
Dim y As Byte
y = 15
Dim last As Byte
last = 0

inicio:
If x > 15 Then
    x = 0
    End If

If y < 0 Then
    y = 15
    End If

While PORTB = 000011 'chequea el estado del puerto
    PORTC = y
    DelayMS 1000
    last = y
    y = y - 1
Wend

While PORTB = 000001 'chequea el estado del puerto
    PORTC = x
    DelayMS 1000
    last = x
    Inc x 'incrementa en 1 la variable x
Wend

While PORTB = 000000 'chequea el estado del puerto
    PORTC = last
    DelayMS 250
    Low PORTC
    DelayMS 250
    PORTC = last
Wend
GoTo inicio
End    


 En C basta con seguir la sintaxis que les escribí previamente y colocar las ordenes dentro de las llaves. 

como por ejemplo:

Do{
    x = x+1;
    y = y +1;
}
While(y<100);

  En el caso anterior va a seguir incrementando "x" una y otra vez mientras "y" sea menor que 1, en el preciso momento en que y deje de ser menor que uno interrumpe la ejecución. 

Condicional FOR

    Este condicional es muy útil para realizar contadores, el condicional FOR lo que hace es realizar un numero X de veces la sucesión de ordenes que se tienen. Ese numero de veces dependerá de una variable de control que realiza el conteo y que puede ser modificada incluso dentro de las ordenes (esta variable debe existir para poder utilizar el FOR y debe ser de tipo entero). Utilizado para leer arreglos en sucesión en C, o sencillamente para realizar un conteo o un chequeo de algo un numero de veces dado. 


Sintaxis en PIC BASIC
For variable = inicio To variable = final Step numero_de pasos
     Ordenes
Next


  Recuerden que deben inicializar una variable para el conteo, inicio representa desde donde, final hasta donde y pasos representa de cuanto en cuanto se debe contar. 

 Programa simple para realizar un conteo con LEDs del 1 al 15. 

Device = 16F877A
Xtal 20
All_Digital true
Output PORTC
Dim x As Byte 'variable que utilizare para el conteo
inicio:
For x = 0 To x = 15 Step 1 'x desde 0 hasta el 15 de uno en uno, 0, 1, 2, 3... etc
    PORTC = x 'le digo que tome el valor de x
    DelayMS 500
Next
GoTo inicio
End


  Noten que no le digo que incremente de 1 en 1 la variable x, esto es porque el For lo realiza de forma automática, si quisiera por ejemplo que el conteo fuera de 3 en 3 bastaría con colocar un 3 en lugar de 1 al lado del Step. Si se quisiera un conteo descentende entonces bastaria con colocarle un menos (-) al lado del numero del Step y logicamente iniciarlizar la variable en la parte mas alta y finalizarla en la parte mas baja.

For x = 15 To x = 0 Step -1 <- Realiza un conteo descendente de 1 en 1 desde el 15 hasta el 0. 

La primera vez x vale 0 y se muestra un 0 en binario en el puerto C, se le suma 1 y entonces se muestra un uno binario en el puerto C, asi seguira hasta el 15 donde terminara el conteo y terminara el ciclo. 

Sintaxis en C
For(var=inicio;var=final;var++){               
         Ordenes
}

 Mismas consideraciones, se debe inicializar la variable primero y si se desea un conteo descendente basta con colocar dos signos menos al lado de la variable (--), suponiendo que la variable fuera Z por ejemplo, un conteo ascendente hasta el 100 desde el 20 seria:

For(Z=20;Z=100;Z++){
   Ordenes
}

Un conteo descendente seria:

For(Z=100;Z=20;Z--){
   Ordenes
}

 Espero que esto les sirva para aclarar dudas. 

No hay comentarios:

Publicar un comentario