jueves, 6 de junio de 2013

PRACTICA 4 INTERRUPCIONES PIC16F877A


/*practica 4. un programa que permita mediante sensores y interrupciones en el
microcontrolador, permita contabilizar la entrada/salida de los productos del
refrigerador de una tienda, tres leds indicaran el estado del refrigerador
(capacidad maxima de llenado: 20 productos) y dos display que permitan visualizar
el numero de productos contenidos.
1:cuando se ingrese mercancia el display incrementara su cuenta
2:cuando algun cliente retire mercancia el display decrementara su cuenta
3:los estados de capacidad del refrigerador
led rojo=lleno, led verde=refrigerador vacio, led amarillo=con mercancia adentro
*/
void led(int producto); //funcion para estados del refrigerador
void interrupt();        //interupciones
const unsigned int DIGITO[] = // constantes para display
{
0x3F, //Código del dígito 0
0x06, //Código del dígito 1
0x5B, //Código del dígito 2
0x4F, //Código del dígito 3
0x66, //Código del dígito 4
0x6D, //Código del dígito 5
0x7D, //Código del dígito 6
0x07, //Código del dígito 7
0x7F, //Código del dígito 8
0x6F, //Código del dígito 9
};
void verdisplay(int producto);//funcion para visualizas valores display
int producto,num;
void main() {
     ADCON1=7;   //digital
     TRISB=0b00001111;    //entradas
     TRISC=0;
     TRISD=0;
     INTCON=0b10110000;    //configuracion de interupciones trm0 y rb0
     OPTION_REG=0b1101000; //configuracion de cada interupcion
   
       while(1)
       {
       led(producto);
       verdisplay(producto);
       TMR0=255;
       }
}
void interrupt()      //vector de interupciones
{
     if(INTCON.INTF==1)    //comprebacion si la interupcion es por RB0
     {
     producto=num++;
     INTCON.INTF=0;       //limpiamos la bandera
     if(producto==20)
     {
      producto=20;
      num=20;    }
     }
     else  {               //en este caso si no fue por RB0 la interupcion
     producto=num--;       //es por TMR0
     INTCON.T0IF=0;        //limpiamos la bandera
     if(producto==0)
     producto=0;
     }
}
void led(int producto)     //funcion para visualisar los estados del refrigerador
{
     if(producto>0)   //led amarillo
     PORTB.RB6=1;     //con productos en su interios
     else
     PORTB.RB6=0;
     if(producto==20)
     {PORTB.RB7=1;    //LED ROJO
     PORTB.RB6=0;}    //lleno
     else
     PORTB.RB7=0;
     if(producto==0)   //VACIO
     PORTB.RB5=1;     //LED VERDE
     else
     PORTB.RB5=0;
}
void verdisplay (int producto)
{
int U,D;
D=producto/10; //primer numero
U=(producto-D*10); //segundo numero
PORTC=DIGITO[D]; //valor decenas
PORTD=1;         //ENCENDEMOS
Delay_ms(30);
PORTD=0;
PORTC=DIGITO[U]; //valor unidades
PORTD=2;         //ENCENDEMOS
Delay_ms(30);
PORTD=0;
}

archivos y simulacion
http://www.mediafire.com/?sxqnmw9l40xmzlg

miércoles, 5 de junio de 2013

PRACTICA 3 CALCULADORA CON PIC16F877A

/* PRACTICA 3: programa que permita, a travez de 2 grupos de
4 interuptores(entrada de datos"PORTB")y con 2 pulsadores adicionales(PORTA) seleccionar la operacion aritmeticas fundamentales mostrando en displey el resultado(PORTC)*/





const unsigned int DIGITO[] =
{
0x3F, //Código del dígito 0
0x06, //Código del dígito 1
0x5B, //Código del dígito 2
0x4F, //Código del dígito 3
0x66, //Código del dígito 4
0x6D, //Código del dígito 5
0x7D, //Código del dígito 6
0x07, //Código del dígito 7
0x7F, //Código del dígito 8
0x6F, //Código del dígito 9
};
void verdisplay(int numero);//funcion para visualizas valores display
int numero,val1,val2,x,y;
void main(){
ADCON1=7;
TRISA=3;    //ENTRADAS 11
TRISB=255;  //ENTRADAS
TRISC=0;    //salidas
TRISD=0;
PORTC=0;
PORTD=0;
        while(1)
        {
        x=PORTA;      //seleccion de operacion
        val1=PORTB&0b00001111; //filtro
        y=PORTB&0b11110000;
        val2=y>>4;             //filtro valor 2
     
        switch(x)
        {
         case 0: //suma
         numero=val1+val2;
         verdisplay(numero);//llamado de la funcion
         break;
         case 1:  //resta
         numero=val1-val2;
         verdisplay(numero);
         break;
         case 2:   //multiplicacion
         numero=val1*val2;
         verdisplay(numero);
         break;
         case 3:   //divicion
         numero=val1/val2;
         verdisplay(numero);
         break;
        }
        }
}
void verdisplay (int numero)
{
int U,D,C;
C=numero/100; //primer numero
D=(numero-C*100)/10; //segundo numero
U=numero-C*100-D*10; //tercer numero
PORTC=DIGITO[C]; //VALOR CENTENAS
PORTD=1;         //ENCENDEMOS
Delay_ms(50);
PORTD=0;
PORTC=DIGITO[D]; //VALOR DECENAS
PORTD=2;         //ENCENDEMOS
Delay_ms(50);
PORTD=0;
PORTC=DIGITO[U]; //VALOR UNIDADES
PORTD=4;         //ENCENDEMOS
Delay_ms(50);
PORTD=0;

}

SIMULACION Y CODIGO GENERADO EN MIKROC.
http://www.mediafire.com/?ebgf7d575eg1mth

martes, 4 de junio de 2013

PRACTICA_2 SECUENCIAS LUMINOSAS PIC16F877A

un programa que permita por medio de 2 pulsadores conectores a la entrada del puertoA generar 4 secuencias diferentes en 8 leds, verdes conectados a travez del puertoC cada secuencia con 5 pasos distintos, 2 pulsadores adicionales modificaran la velocidad, en multiplos de 300ms, con la que se visualizara cada cambio. los multiplos son 00=1,01=3,10=5,11=10.


void retardo(int i);
int  x,i;
void main()
{
ADCON1=7;
TRISA=15;  //ENTRADAS
TRISC=0;   //SALIDA
PORTC=0;

        while(1)
        {
        x=PORTA&0b0011; //filtro para secuencias
        i=PORTA&0b1100; //filtro para velocidad
     
        switch(x)          //las secuencias pueden modificarse dependiendo del valor
        {                     // asignado
                 case 0:
                 PORTC=1;
                 retardo(i);
                 PORTC=18;
                 retardo(i);
                 PORTC=8;
                 retardo(i);
                 PORTC=50;
                 retardo(i);
                 PORTC=10;
                 retardo(i);
                 break;
               
                 case 1:
                 PORTC=255;
                 retardo(i);
                 PORTC=200;
                 retardo(i);
                 PORTC=100;
                 retardo(i);
                 PORTC=98;
                 retardo(i);
                 PORTC=5;
                 retardo(i);
                 break;

                 case 2:
                 PORTC=10;
                 retardo(i);
                 PORTC=38;
                 retardo(i);
                 PORTC=88;
                 retardo(i);
                 PORTC=155;
                 retardo(i);
                 PORTC=215;
                 retardo(i);
                 break;
               
                 case 3:
                 PORTC=4;
                 retardo(i);
                 PORTC=15;
                 retardo(i);
                 PORTC=107;
                 retardo(i);
                 PORTC=0;
                 retardo(i);
                 PORTC=245;
                 retardo(i);
                 break;
        }
        }
}
void retardo(int i)
{
     if(i==0)
     {
      Delay_ms(300);
     }
     if(i==4)       //filtro para 01
     {
     Delay_ms(900);
     }
     if(i==8)      //filtro para 10
     {
     Delay_ms(1500);
     }
     if(i==12)      //filtro para 11
     {
     Delay_ms(3000);
     }

}

archivos de simulacion y compilacion.
http://www.mediafire.com/?9kn30vekc3id3md

lunes, 3 de junio de 2013

PRACTICA1 CONTADOR BINARIO POR EL PUERTOA PIC16F877A

practica1, contador binario por el puerto a del microcontrolador p16f877a, el conteo se muestra en leds, los cuales reciben un pulso por rb0 para incrementar el conteo.



//CONTADOR BINARIO ATRAVEZ DEL PUERTOA
void main()
{
ADCON1=7;   //SALIDAS DIGITALES
TRISA=0;    //SALIDAS
TRISB=1;    //RB0 COMO ENTRADA
PORTA=0;
        while(1)  //ciclo
        {
        if(RB0_bit==1) //condición
        {
         PORTA++;     //incremento en 1
         Delay_ms(200);
        }
        }
}

simulacion y archivos de mikroc
http://www.mediafire.com/download/r8q4voxej1b1irj/PRACTICA1.rar