viernes, 3 de agosto de 2012

Interrupcion en RB0

En la pantalla para crear nuestro proyecto configuramos tal cual nuestro PIC como en los ejemplos anteriores. En el ejemplo usare el oscilador RC del PIC16F628A de 4MHz, desactivare las comunicaciones por RS232(ya hablaremos de eso mas adelante), y setearé la interrupcion de RB0.
Luego le damos a aceptar y nos generará el siguiente codigo. Recuerden el truco de los FUSES para que no tengan problemas al compilar en otros computadores.

-----------------------------------------------------------------------------------------
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)

#int_EXT
void  EXT_isr(void) 
{
//Aqui va el codigo cuando se genere una pulsacion en RB0
}



void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!

}

--------------------------------------------------------------------------------

En este ejemplo pondremos un pulsador en RB0 y al pulsarlo sumara +1 al conteo, cuando llegue a 5 cambiará de estado un led conectado en RA0.

Aqui ocuparemos la condicion if la cual es igual que en C.

if(condicion){

}else{

}

Y la instrucción output_toggle(pin_xy) para cambiar el estado de algun pin y del puerto x.
Con esto completamos nuestro codigo así.

-----------------------------------------------------------------------------------------
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)

int conteo=0; //se declara conteo como variable entera
#int_EXT
void  EXT_isr(void) 
{
conteo++; //sumamos +1 a la variable conteo
delay_ms(200); //tiempo para que el operador suelte el pulsador
}



void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

while(true){
if(conteo==5){  //preguntamos si conteo es 5
output_toggle(pin_a0); //cambiamos de estado el pin a0 si conteo es 5
conteo=0; //reseteamos la cuenta
}
}

}

--------------------------------------------------------------------------------

La implementacion en Proteus quedará asi:





1 comentario:

  1. yo quisiera hacer un contador que cada 5 pulsacione cuete 1, como hago?

    ResponderEliminar