Como se puede Detectar cuando un botón ha sido presionado.
Enviado por Anderson BURGOS CESPEDES • 20 de Noviembre de 2017 • Tarea • 2.152 Palabras (9 Páginas) • 242 Visitas
Taller 2
Interrupciones externas
- Detectar cuando un botón ha sido presionado.
Programa
//definicion de frecuencia
#define _XTAL_FREQ 4000000
//declaracion de variables
#define Button PORTBbits.RB0
#define led PORTDbits.RD1
void interrupt isr(void){ //rutina interrupción
if(INTCONbits.INT0IF==1){ // si el flag está en 1 sucedió la interrupción
INTCONbits.INT0IF=0; //borrar flag
PORTDbits.RD1=~PORTDbits.RD1; //pin salida negada
}
}
void configuracion(void) { //funcion para la configuracion del micro
ADCON1=0x0F; //conifugurar pines analogos a digitales
TRISBbits.TRISB0=1; //Pin de entrada INT0
TRISDbits.TRISD1=0; //Pin de salida
//Configuracion Interrupciones
INTCONbits.GIE=1; //Activacion Interrupciones Globales.
INTCONbits.INT0IE=1; //Activacion de Interrupcion Timer 0. HABILITA LA INTERRUPCION DE TIMER 0
INTCONbits.INT0IF=0; //Flag(Bandera) de Interrupcion en 0.
INTCON2bits.INTEDG0=1; //indica el flanco de subida
}
int main(int argc, char** argv) {
configuracion();
while(1){ //bucle infinito
}
}
Diagrama de flujo
[pic 1]
- Conteo de productos para generar una alarma.
//definicion de frecuencia
#define _XTAL_FREQ 4000000
//declaracion de variables
#define AL PORTDbits.RD2
#define start PORTCbits.RC0
#define S1 PORTCbits.RC2
volatile int fin=0,contador=0,cont3=0,cont1=0;
volatile int boton=0,stop1=0;
void interrupt isr(void){ //rutina interrupcion
//Boton stop
if(INTCONbits.INT0IF==1){// si el flag esta en 1 sucedio la interrupción
INTCONbits.INT0IF=0;//borrar flag
stop1=1; //reinicia el boton de parada
boton=0; //reinicia variable de inicio en 0
}
if(INTCONbits.TMR0IF==1){// si el flag esta en 1 sucedio la interrupción
INTCONbits.TMR0IF=0;//borrar flag
//tiempo 1 segundo alarma
if(fin==1){ //valida la variable de verificacion
contador++; //contador de incremento 1
TMR0H=63582/256; //Valor Real del Timer 255-Valor Formula = Resultado De la Operacion
TMR0L=63582%256;
AL=~AL; //niega el estado de la alarma
cont1=0; //reinicio de conteo
if(contador==2){
AL=0; //desactiva alarma despues de 1 segundo
contador=0; //reinicio de contador
fin=0; //reinicio de variable
cont1=0; //reinicio de conteo en 0
T0CONbits.TMR0ON=0; //desactiva el timer
}
}
}
}
void configuracion(void) { //funcion para la configuracion del micro
ADCON1=0x0F; //conifugurar pines analogos a digitales
TRISBbits.TRISB0=1; //Pin de entrada INT0
TRISDbits.TRISD1=0; //Pin de salida
TRISCbits.TRISC0=1; //boton de start
TRISCbits.TRISC1=1; //boton stop
TRISDbits.TRISD2=0; //alarma
TRISCbits.TRISC2=1; //sesor de conteo
T0CON=0b00000111;//Pre escala de 256, oscilador de 4MHz, Tiempotemp=1ms
//Configuracion Interrupciones
INTCONbits.GIE=1; //Activacion Interrupciones Globales.
INTCONbits.INT0IE=1; //Activacion de Interrupcion INT0.
INTCONbits.INT0IF=0; //Flag(Bandera) de Interrupcion en INT0.
INTCON2bits.INTEDG0=1; //indica el flanco de subida
INTCONbits.TMR0IE=1; //Activacion de Interrupcion Timer 0.
INTCONbits.TMR0IF=0; //Flag(Bandera) de Interrupcion en 0.
TMR0H=63582/256;
TMR0L=63582%256; //Valor Real del Timer 255-Valor Formula = Resultado De la Operacion.
}
int main(int argc, char** argv) {
configuracion();
while(1){ //bucle infinito
if(start==1 && boton==0 ){
boton=1; //variable de inicio inicia en 1
stop1=0; //variable que valida la interrupcion del boton de parada
}
if(boton==1 && start==0 && stop1==0){
cont3=0; //variable de conteo en 0
while(S1==1){ //bucle del conteo de productos(valida si se activo el sensor))
if(cont3==0 && fin==0){ //condicion para validar el inicio de conteo y si la alarma esta apagada
...