Autor Tema: GUIA: PIC SIMULATOR IDE, Cap. 9 y 10  (Leído 4082 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
« en: 18 de Febrero de 2007, 09:09:19 »
Hola amigos!
Nuevamente, posteo un par de capitulos de la GUIA de BASIC del PIC SIMULATOR IDE.
Esta vez, veremos el segundo programa (usando un pulsador) y una explicacion de la extructura IF-THEN-ELSE-ENDIF.

Quizas (y esto no pretende ser una "publicidad") resulte mas comodo leer esta guia en mi pagina web, debido a que el codigo lo voy comentando y escribiendo con distintos colores y tipografias, lo que hace mas facil la lectura. Se trata de una custion de gustos, asi que cada uno eligira la forma mas comoda. :)

Un abrazo.

> Capitulo 09 - Mi segundo programa: Usando un pulsador
En la segunda practica del lenguaje BASIC veremos como leer una entrada del PIC. Utilizaremos el mismo esquema que vimos antes, y el programa que mostramos a continuación:


Como resulta evidente a simple vista, el programa ejemplo2.bas es muy similar al ejemplo1.bas que vimos en el capitulo anterior. Las diferencias están dentro del bucle. La instrucción de la línea 007 ( PORTB.0 = PORTA.0 ) hace que el valor del bit 0 del PORTB tome el valor del bit 0 del PORTA. Que ambos bits sean el cero es solo una coincidencia, se podrían haber elegido otros valores.

Al ejecutarse el programa, cada vez que se accione el pulsador conectado a PORTA.0, ese pin se pondrá a estado alto, ya que la corriente circulara desde +V al pin 17 del PIC por medio del pulsador. Ese "estado alto" se interpreta dentro del PIC como un "1", y es el valor que se le asigna a PORTB.0 , con lo que el también pasara a estado alto. Eso provocara que el led conectado en ese pin se ilumine.

Cuando soltamos el pulsador, PORTA.0 vuelve a estado bajo, ya que se pone a masa a través de la resistencia de 10K, y PORTB.0 hará lo propio, apagando el LED.

Nuestro sencillo (sencillísimo!) programa todo lo que hace es "copiar" en el LED el estado del pulsador.

Si presionamos F9 o vamos al menú que vemos a continuación


PIC SIMULATOR IDE compilara el programa, y cargara el HEX resultante en el simulador. Aparecerá el cuadro de dialogo que nos informa que no han ocurrido errores y que el tamaño del programa esta vez es de 20 words.

Si volvemos a la ventana principal del PIC SIMULATOR IDE, y desde "Tools" -> "Microcontroller View" abrimos la vista del microntrolador, al darle "Start" a la simulación tendremos algo parecido a lo que sigue:

El pin 6, correspondiente a RB0 esta en "OFF" por que el pulsador del pin 17 (RA0) esta en OFF. Si con el mouse hacemos un click sobre la "T" que esta al lado del pin 17, la vista del microcontrolador pasara al estado que muestra la imagen siguiente:


Recordemos que el botón "T" significa "cambio" (Toggle) por lo que el estado del pin 17 permanecerá en alto hasta que lo pulsemos otra vez, y el estado del microcontrolador volverá a ser el inicial. Como en cualquier curso, conviene realizar estas practicas, que aunque puedan parecer muy sencillas nos ayudaran a conocer las herramientas disponibles y "tomar confianza" al programa. También es interesante el realizar cambios en el programa BASIC, recompilar y analizar los resultados.

El programa BASIC de este capitulo y el correspondiente archivo HEX puede descargarse desde www.ucontrol.com.ar


 

> Capitulo 10 - IF - THEN - ELSE - ENDIF
En cualquier programa medianamente complejo que queramos realizar, seguramente necesitaremos en algún punto tomar alguna decisión basándonos en el estado de una entrada o en el valor de una variable. PIC BASIC incorpora instrucciones que nos permiten este tipo de comportamiento, siendo la mas sencilla y frecuentemente utilizada la sentencia IF - THEN - ELSE - ENDIF.

Existen varias formas de utilizar esta instrucción. Comenzaremos con los casos mas sencillos y a lo largo de este capitulo iremos agregando complejidad hasta ver todas las posibilidades.

CASO 1: El caso mas simple es el siguiente:

IF condición THEN instrucción

"IF" significa "SI....", y "THEN" significa "LUEGO" o "ENTONCES". El caso anterior puede leerse como "SI se cumple la condición, entonces ejecuto la instrucción"

La "condición" es una expresión lógica que puede ser verdadera o falsa. En caso de ser verdadera, la instrucción a continuación del THEN será ejecutada. En caso de la condición sea falsa, el programa seguirá su ejecución con la instrucción siguiente al "IF - THEN".

Veamos un ejemplo. Supongamos el siguiente programa:

Código: [Seleccionar]
ALLDIGITAL 'Voy a usar todos los pines como E/S.

TRISA = %11111111 'Todo el PORTA como entradas
DIM A AS BYTE 'Declaro la variable "A" como BYTE
DIM TOTAL AS BYTE 'Declaro la variable "TOTAL" como BYTE

TOTAL = 10 'Le asigno el valor 10 a la variable "TOTAL"
A = 2 'Le asigno el valor 2 a la variable "A"

IF PORTA.4 = 1 THEN A = 4

TOTAL = TOTAL + A 'Sumo a "TOTAL" el valor de "A"

Cundo comienza el programa, se declaran dos variables tipo BYTE (que pueden almacenar valores entre 0 y 255), y a TOTAL se le asigna el valor "0" y a "A" el valor "2". Hasta aquí, no hay nada que no hayamos visto antes.

La línea siguiente realiza la siguiente tarea: evalúa si la condición PORTA.4 = 1 es cierta. En caso de que efectivamente el valor presente en el bit 4 del PORTA sea "1", se ejecuta la instrucción a continuación del THEN,  la variable "A" toma el valor "4", y se pasa a la instrucción de abajo. Si PORTA es igual a "0", se pasa a la instrucción siguiente sin mas.

El valor final de la variable "TOTAL" depende entonces de cual sea el estado de PORTA.4 al momento de hacer la evaluación. Si es igual a "1", "TOTAL" tendrá un valor de 14 (10 + 4). Si PORTA.4 = 0, "TOTAL" tendrá un valor de 12 (10 + 2).

Veamos algunos ejemplos validos de este caso:

Código: [Seleccionar]
IF A = B THEN PORTA.0 = 1
IF B > A THEN A = B
IF B = 5 THEN A = 0
IF (A = 0) OR (B = 5) THEN C = 2
IF PORTA.0 THEN PORTB.3 = 0

En el ultimo ejemplo la condición PORTA.0 equivale a PORTA.0 = 1.

 

CASO 2: Muchas veces, luego de evaluar la condición necesitamos ejecutar mas de una instrucción. En los ejemplos vistos en el CASO 1 siempre se ejecutaba una sola instrucción cuando la condición era cierta. La manera de ejecutar múltiples sentencias dentro de una estructura IF-THEN implica emplear el ENDIF:

IF condición THEN
    instrucción 1
    instrucción 2
    ...
    instrucción n
ENDIF

No varia prácticamente nada respecto del primer caso, solo que esta vez se van a ejecutar todas las instrucciones que se encuentren entre el THEN y el ENDIF cada vez que condición sea verdadera.

Veamos un ejemplo. Supongamos el siguiente programa:

Código: [Seleccionar]
DIM A AS BYTE 'Declaro la variable "A" como BYTE
DIM B AS BYTE 'Declaro la variable "B" como BYTE
DIM C AS BYTE 'Declaro la variable "C" como BYTE
DIM D AS BYTE 'Declaro la variable "D" como BYTE
DIM TOTAL AS BYTE 'Declaro la variable "TOTAL" como BYTE

TOTAL = 0 'Le asigno el valor 0 a la variable "TOTAL"
A = 2 'Le asigno el valor 2 a la variable "A"
B = 5 'Le asigno el valor 5 a la variable "B"
C = 1 'Le asigno el valor 1 a la variable "C"
D = 0 'Le asigno el valor 0 a la variable "D"

IF A = 2 THEN
    A = B + (C * D)
    TOTAL = A * B
ENDIF

El ejemplo anterior, la condición A = 2 es verdadera (puesto que ese es el valor que le asignamos a "A" mas arriba), por lo que las dos instrucciones dentro del THEN-ENDIF se ejecutaran. Esto hace que TOTAL tome el valor de 10 (hagan las cuentitas!). Si "A" hubiese tenido otro valor, esas dos sentencias no se ejecutarían y TOTAL seguiría valiendo "0" al terminar el programa.

 

CASO 3: Hay veces que de acuerdo a la condición, queremos ejecutar un grupo u otro de instrucciones. Para eso, utilizamos el ELSE:

IF condición THEN
    instrucciónv 1
    instrucciónv 2
    ...
    instrucciónv n
ELSE
    instrucciónf 1
    instrucciónf 2
    ...
    instrucciónf n
ENDIF

Es decir, si la condición es verdadera, se ejecutan las sentencias entre THEN y ELSE. Y si la condición es falsa, las que estén entre ELSE y ENDIF. "ELSE" puede ser traducido como "en otro caso" o "si no...".

Veamos un ejemplo. Supongamos el siguiente programa:

Código: [Seleccionar]
ALLDIGITAL 'Voy a usar todos los pines como E/S.

TRISA = %11111111 'Todo el PORTA como entradas
DIM A AS BYTE 'Declaro la variable "A" como BYTE
DIM TOTAL AS BYTE 'Declaro la variable "TOTAL" como BYTE

TOTAL = 10 'Le asigno el valor 10 a la variable "TOTAL"
A = 2 'Le asigno el valor 2 a la variable "A"

IF PORTA.4 = 1 THEN
    A = 4
    TOTAL = TOTAL + 5
ELSE
    A = 0
    TOTAL = TOTAL + 15
ENDIF

El ejemplo anterior, la condición PORTA.4 = 1 determina que bloque de instrucciones se ejecutan. Si es verdadera, A = 4 y TOTAL = TOTAL + 5 son usadas. Caso contrario se ejecutan A = 0 y TOTAL = TOTAL + 15. Luego, independientemente de cual haya sido el caso, el programa sigue con la sentencia que se encuentre a continuación del ENDIF.

Por ultimo, tenemos que saber que es posible "anidar" instrucciones IF-THEN-ELSE-ENDIF, con lo que se pueden tomar decisiones verdaderamente complejas. Por supuesto, tenemos que ser cautos en el uso de esta característica ya que debido a limitaciones en el tamaño de la pila y cantidad de memoria disponible del PIC podemos ocasionar un desborde y el programa colapsara. Este seria un ejemplo de un anidamiento:

IF PORTB.1 = 1 THEN
    IF A = 2 THEN
        A = B + (C * D)
        TOTAL = A * B
    ELSE
        A = 0
    ENDIF
ELSE
    A = 19
ENDIF

Las sentencias en color rojo corresponden a una estructura IF-THEN-ELSE-ENDIF y las que están en azul a la otra, que se encuentra dentro ("anidada" en) de la primera.
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


 

anything