sábado, 30 de noviembre de 2013
Las declaraciones son usadas para controlar el proceso de ejecución del programa.

WHILE

WHILE se utiliza para repetir sentencias.

while(expresión)
{
sentencia;
}

La expresión se evalúa y la sentencia se ejecuta mientras la expresión es verdadera, cuando es falsa se sale del WHILE.

si se ejecutan la siguiente expresiones se consigue un BUNCLE SIN FIN:

while(1)
{
sentencias;
}

IF - ELSE

Estas declaraciones de control nos ayuda a tomar decisiones. Por ejemplo prender o apagar un led cuando se este pulsando un push button.

if(bit_test(porta,0)= =1){   // se evalúa si esta activado (en 1 lógico) el primer bit del puerto a.
 bit_set(portb,0);               //si esta activado se pone en 1 el portb,0.
}
else{                                //si no esta activado se pone en 0 el portb,0.
bit_clear(portb,0);
}


 Ejemplo 1 encender y apagar un led con un push button.

#include <16f84a.h> //llamado del fichero donde se especifican las características del PIC
#fuses xt,nowdt //tipo de cristal a utilizar
#use delay (clock=4000000)//reloj de 4Mhz
#byte trisa=0x85 //dirección del trisa en la memoria
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06
void main(){     //función principal
trisa=0xff;//se configura el puerto a como entrada
trisb=0x00;//se configura el puerto b como salida
portb=0x00;//se pone en cero el puerto b
while(true){ //se crea un buncle infinito
if(bit_test(porta,0)= =1){   // se evalúa si esta activado (en 1 lógico) el primer bit del puerto a.
 bit_set(portb,0);               //si esta activado se pone en 1 el portb,0.
}
else{                                //si no esta activado se pone en 0 el portb,0.
bit_clear(portb,0);
}
}
}


Se puede anidar los IF-ELSE dando lugar a los ELSE-IF; con esto se pueden tomar decisiones múltiples. Un ejemplo es cuando se tienen varios sensores y cada sensor tiene que activar cierto actuador. Con la instrucción IF se puede ocupar otra herramienta importante para la toma de decisiones como lo son los operadores; los operadores mas utilizados son:
 Lógicos
&& = AND
||   = OR
 De bits
&=AND
 | =OR
Nota: con estos operadores se puede realizar lógica operacional.


Ejemplo: se tienen tres sensores y  cada combinación  activa los puertos RB4, RB5, RB6 y RB7 la secuencia se observa en la siguiente tabla de verdad.


Ejemplo: cada salida activara el giro y activación de dos motores de D.C. RB7=1 motor 2 izquierda, RB6=1 motor 2 derecha, RB5=1 motor 1 izquierda y RB4=1 motor 1 derecha.

Código:

#include <16f84a.h> //llamado del fichero donde se especifican las características del PIC
#fuses xt,nowdt //tipo de cristal a utilizar
#use delay (clock=4000000)//reloj de 4Mhz
#byte trisa=0x85 //dirección del trisa en la memoria
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06
void main(){     //función principal
trisa=0xff;//se configura el puerto a como entrada
trisb=0x00;//se configura el puerto b como salida
portb=0b00000001;//se pone en cero el puerto b
while(true){ //se crea un buncle infinito
if((bit_test(porta,0)==1||bit_test(porta,1)==1)&&(bit_test(portb,0)==0)){  //RA0=1 o RA1=1 y RB0=0
bit_clear(portb,4)&bit_clear(portb,5)&bit_clear(portb,6)&bit_set(portb,7);// entonces RB4=0 y RB5=0 y  
}                                                                                                                // RB6=0 y  RB7=1
else{
if((bit_test(portb,0)==1)&&(bit_test(porta,0)==0)&&(bit_test(porta,1)==0)){
bit_clear(portb,4)&bit_clear(portb,5)&bit_clear(portb,7)&bit_set(portb,6);
}
else{
if((bit_test(portb,0)==1)&&(bit_test(porta,0)==1)&&(bit_test(porta,1)==0)){
bit_clear(portb,5)&bit_clear(portb,6)&bit_clear(portb,7)&bit_set(portb,4);
}
else{
if((bit_test(porta,1)==1)&&(bit_test(portb,0)==1)&&(bit_test(porta,0)==0)){
bit_clear(portb,4)&bit_clear(portb,6)&bit_set(portb,5)&bit_set(portb,7);
}
else{
if((bit_test(porta,0)==1)&&(bit_test(porta,1)==1)&&(bit_test(portb,0)==1)){
bit_clear(portb,5)&bit_clear(portb,6)&bit_set(portb,7)&bit_set(portb,4);
}
else{
portb=0x00; //si no se cumple ningun if se pone en 0 el portb
}
}
}
}
}
}
}

Lo que hace el ELSE- IF es tomar decisiones múltiples es decir si un el primer IF no se cumple  se pasa al siguiente IF hasta que uno de estos se cumpla si no se cumple ninguno se ejecuta el ultimo ELSE.


En la linea if((bit_test(porta,0)==1||bit_test(porta,1)==1)&&(bit_test(portb,0)==0)) significa que si RA0=1 o RA1=1 o ambos son uno y además RB0=0 se ejecuta la sentencia. Si el RB0=1 o si RA0=0 y RA1=0  no se cumple esta condición.

Simulación: 

cambio de giro de un motor con PIC 16f84a y L293D


MATERIAL:

1- PIC 16f84a.
1- Crystal 4Mhz.
2- Capacitores ceramicos 22pf.
1- Led (practica 1).
1- Resistor de 220 (practica 1).
3- Pushbutoon (van en lugar de los logicstate y conectados como en la practica 1).
3- Resistores de 10k (van conectados entre el pushbutton y la tierra como en la practica 1).
1- L293D (practica 2).
2- Motores de DC de 12v (practica 2).

DESCARGAR ARCHIVOS Y SIMULACIÓN:


 

TUTORIAL 1 CCS:


VIDEO DE LAS SIMULACIONES:



  • COMPILADOR C CCS Y SIMULADOR PROTEUS PARA MICROCONTROLADORES PIC.

SIGUEME EN FECEBOOK

MI TWITTER

Translate