Autor Tema: GUIA: PIC SIMULATOR IDE, Cap. 9 y 10 y 12  (Leído 5035 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
GUIA: PIC SIMULATOR IDE, Cap. 9 y 10 y 12
« en: 05 de Marzo de 2007, 18:56:53 »
Hola amigos!
Como siempre, con el acostumbradisimo retraso, un par de capitulos mas de la guia, ya metidos de lleno en la programacion BASIC bajo este entorno que tanto me gusta.

Hoy les dejo dos capitulos:
> Capitulo 11 - FOR-TO-STEP-NEXT
> Capitulo 12 - WHILE - WEND


Hay algunas animaciones FLASH que estoy empezando a hacer y no puedo postear, para verlas puede ir a la guia "original" (y que suele estar un poco adelantada a esta) en www.ucontrol.com.ar

Aqui vamos:


> Capitulo 11 - FOR - TO - STEP - NEXT
Así como la toma de decisiones que vimos en el capitulo anterior esta presente en casi todos nuestros programas, las estructuras que permiten repetir un grupo de instrucciones un numero determinado de veces también son indispensables. En PIC SIMULATOR IDE hay dos de ellas. Veremos en este capitulo la primera, FOR - TO - STEP - NEXT.

Esta estructura necesita una variable (tipo Byte o Word) para funcionar. En cada iteración del bucle, la variable va cambiando su valor. Cuando el valor de la variable alcanza o supera el valor prefijado, el bucle termina. La forma del bucle es la siguiente:

FOR variable = valor_inicial TO valor_final STEP paso
   instruccion1
   instruccion2
   ...
   instruccionn
NEXT variable

Veamos un ejemplo concreto. Supongamos que queremos sumar los números del 1 al 100. El programa quedaría como sigue:

DIM A AS BYTE           'Declaro la variable "A" como BYTE
DIM TOTAL AS WORD   'Declaro la variable "TOTAL" como WORD

TOTAL = 0                 'Asigno "0" a la variable "TOTAL".

FOR A = 1 TO 100 STEP 1   '"A" va de 1 a 100 de 1 en 1
   TOTAL = TOTAL + A        'Sumo "A" al valor de "TOTAL".
NEXT A                            'fin del bucle.

Hemos declarado la variable A como BYTE, ya que su valor va a mantenerse en el rango 0..255. Para TOTAL utilizamos una variable tipo WORD, ya que la suma va a superar el valor máximo de un BYTE. (Recordemos que WORD permite valores en el rango 0..65535)

El bucle se ejecuta 100 veces, la primera de ellas A vale 1, la segunda 2, la tercera 3, hasta la ultima en la que vale 100. Ese incremento (1 por ves) esta dado por el valor a continuación del STEP. En los casos como este en que STEP vale 1, puede omitirse, como veremos en ejemplos posteriores.

TOTAL comienza valiendo 0 (se le asigna ese valor fuera del bucle) y en cada iteración se le suma el valor que tenga A en ese momento. De esa manera, TOTAL va tomando los valores 1, 3, 6, 10, .... 5050.

Tanto valor_inicial como valor_final y paso pueden ser variables. El siguiente trozo de código hace lo mismo que el anterior, pero usa variables:

DIM A AS BYTE           'Declaro la variable "A" como BYTE
DIM INICIO AS BYTE      'Declaro la variable "INICIO" como BYTE
DIM FINAL AS BYTE       'Declaro la variable "FINAL" como BYTE
DIM PASO AS BYTE        'Declaro la variable "PASO" como BYTE
DIM TOTAL AS WORD       'Declaro la variable "TOTAL" como WORD

INICIO = 1              'Asigno "1" a la variable "INICIO".
FINAL = 100             'Asigno "100" a la variable "FINAL".
PASO = 1                'Asigno "1" a la variable "PASO".
TOTAL = 0               'Asigno "0" a la variable "TOTAL".

FOR A = INICIO TO FINAL STEP PASO '"A" va de 1 a 100 de 1 en 1
   TOTAL = TOTAL + A    'Sumo "A" al valor de "TOTAL".
NEXT A                  'fin del bucle.

Y el mismo ejemplo, sin usar STEP:

DIM A AS BYTE           'Declaro la variable "A" como BYTE
DIM TOTAL AS WORD       'Declaro la variable "TOTAL" como WORD

TOTAL = 0               'Asigno "0" a la variable "TOTAL".

FOR A = 1 TO 100        '"A" va de 1 a 100 de 1 en 1
   TOTAL = TOTAL + A    'Sumo "A" al valor de "TOTAL".
NEXT A                  'fin del bucle.

 

Hay casos en que es necesario que el valor de la variable de control del bucle se decremente en lugar de ir aumentando. En ese caso, se puede usar un valor negativo para STEP. El siguiente ejemplo cuenta desde 50 hasta 20, de 5 en 5:

DIM A AS BYTE           'Declaro la variable "A" como BYTE

FOR A = 50 TO 20 STEP -5 '"A" va de 50 a 20 de 5 en 5
   instruccion1
   instruccion2
   ...
   instruccionn
NEXT A                  'fin del bucle.

 

De la misma manera que ocurría con IF-THEN-ELSE-ENDIF, pueden anidarse diferentes bucles FOR-TO-STEP-NEXT , uno dentro de otro:

FOR variable1 = valor_inicial1 TO valor_final1 STEP paso1
   FOR variable2 = valor_inicial2 TO valor_final2 STEP paso2
      instruccion1
      instruccion2
      ...
      instruccionn
   NEXT variable2
NEXT variable1

La única condición es que un bucle este completamente dentro del otro. El siguiente anidamiento daría un error en el compilador:

FOR variable1 = valor_inicial1 TO valor_final1 STEP paso1
   FOR variable2 = valor_inicial2 TO valor_final2 STEP paso2
      instruccion1
      instruccion2
      ...
      instruccionn
   NEXT variable1
NEXT variable2

Para terminar, veamos el siguiente código:

AllDigital
TRISB = 0

Dim a As Byte

For a = 0 To 15
   PORTB = a
Next a

compilado y corriendo sobre el simulador. Cuenta desde 0 a 15 y muestra el valor sobre el puerto B en binario.

 


> Capitulo 12 - WHILE - WEND
La segunda estructura de control que proporciona PIC BASIC es WHILE - WEND. Su propósito es el mismo que la que vimos en el capitulo anterior, y su estructura es la siguiente:

WHILE condición
   instruccion1
   instruccion2
   ...
   instruccionn
WEND

Mientras que la condición sea verdadera, el grupo de instrucciones dentro del cuerpo del WHILE-WEND se ejecuta. Las características de la condición son las mismas que vimos en el capitulo 10 para IF-THEN-ELSE-ENDIF.

Por supuesto, si no somos cuidadosos al momento de elegir la condición, puede darse el caso de que el numero de repeticiones del bucle sea infinito, y nunca salgamos de el. De hecho, esta circunstancia se aprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones. También hay que tener presente que si la condición no es cierta al momento de ejecutar la primera vez el WHILE, el flujo del programa pasara directamente a la instrucción posterior al WEND y las instrucciones dentro del bucle no se ejecutaran ninguna vez.

No hay mucho mas para decir de WHILE-WEND , solo analizar algunos ejemplos:

Ejemplo 1: El siguiente es un bucle infinito. Como dentro del cuerpo del WHILE-WEND no se cambia el valor de la variable A, esta siempre vale "0" y la condición del WHILE nunca es falsa, por lo que se repite eternamente:

DIM A AS BYTE
A = 0
...
WHILE A = 0
   instruccion1
   instruccion2
   ...
   instruccionn
WEND
...

Ejemplo 2: Las instrucciones dentro del siguiente  WHILE-WEND no se ejecutan nunca, dado que la condicion siempre es falsa:

DIM A AS BYTE
A = 0
...
WHILE A > 0
   instruccion1
   instruccion2
   ...
   instruccionn
WEND
...

Ejemplo 3: Las instrucciones dentro del siguiente  WHILE-WEND se ejecutan 10 veces, y al terminar la variable B contiene la suma de los números del 0 al 10 naturales:

DIM A AS BYTE
DIM A AS BYTE
A = 0
B = 0

WHILE A < 10
   A = A + 1 'Incremento la variable A
   B = B + A 'Sumo a B el valor de la variable A
WEND

Cuando A = 10, se suma su valor a A, y al llegar al WEND el control del programa se transfiere al WHILE, donde se evalúa la condición A < 10, se determina que es falsa, y el programa pasa el control a la línea que exista después del WEND.

 
« Última modificación: 05 de Marzo de 2007, 19:04:52 por aitopes »
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert