File: main.c
Author: JUKINCH
Created on 31 de mayo de 2013, 14:49
PRUEBA DE INTERRUPCIONES en baja y alta prioridad
EN INT0 (RB0) INT1 (RB1) E INT2 (RB2)
pic: 18f4550
crystal: NO
CPU: 8Mhz (valor establecido dentro de main cambiando los bits IRCF2, IRCF1 e IRCF0 del registro OSCCON)
en RA6 sale la frecuencia de Fosc/4 -------> 8Mhz/4 = 2Mhz
FUSES: los bits de configuración se establecen en el archivo "configuracion_de_fuses.c"
CONEXIONES entrenadora FELIXLS:
1 módulo conectado en IDC(RB0) en modo botón
1 módulo conectado en IDC(RA0) en modo leds
los cambios se pueden hacer en el archivo configuracion_hard.c
*/
/*Includes globales*/
#include <xc.h>
#include <delays.h> /* Para utilizar demoras en nuestro código*/
/*Includes locales*/
#include "configuracion_de_fuses.c"
#include "configuracion_hard.c"
volatile int myVolatileVariable=0;//variable para utilizar con las interrupciones
//******************************************************//
// Rutina de Interrupcion de Alta Prioridad
//******************************************************//
//
void interrupt interrupcionDeAlta(void)//prototipo de la interrupción de alta prioridad
{
if(INTCONbits.INT0IF) //pregunta por bandera de interrupción en rb0
{
LED0 = ~LED0; // invierto estado del led
myVolatileVariable++;
INTCONbits.INT0IF = 0; //limpia bandera y salimos
}
}
//
//******************************************************//
// Rutina de Interrupcion de baja prioridad
//******************************************************//
//
void interrupt low_priority interrupcionDeBaja(void)//prototipo de la interrupción de baja prioridad
{
if(INTCON3bits.INT1IF) //pregunta por bandera de interrupción
{
LED1 = ~LED1; // invierto estado del led
myVolatileVariable++;
INTCON3bits.INT1IF = 0; //limpia bandera y salimos
}
if(INTCON3bits.INT2IF) //pregunta por bandera de interrupción
{
LED2 = ~LED2; // invierto estado del led
myVolatileVariable++;
INTCON3bits.INT2IF = 0; //limpia bandera y salimos
}
}
//******************************************************//
// Programa Principal
//******************************************************//
void main(void)
{
ADCON0 = 0X00,ADCON1 = 0X0F,CMCON = 0X07; //puerto A con todos los pines digitales
PINLED0=0; // Configuración de pines como salida para los leds
PINLED1=0;
PINLED2=0;
PINBOTON0=1; // Configuración de pines como entrada para los botones
PINBOTON1=1;
PINBOTON2=1;
LATA = 0X00; // todo el puerto A a cero.
RCONbits.IPEN = 1; // Activa modo alta y baja prioridad
INTCONbits.GIEL = 1;// permitimos interrupciones de baja prioridad (Global Interrupt Enable Low)
INTCONbits.GIEH = 1;// permitimos interrupciones de alta prioridad (Global Interrupt Enable High)
INTCON2bits.INTEDG0 = 1;//configura interrupcion por flanco de subida para la interrupcion en RB0
INTCON2bits.INTEDG1 = 1;//configura interrupcion por flanco de subida para la interrupcion en RB1
INTCON2bits.INTEDG2 = 1;//configura interrupcion por flanco de subida para la interrupcion en RB2
INTCONbits.INT0IE=1; // activa la interrupción externa por flanco del pin RB0
// La Int0 es siempre de alta prioridad. No se puede setear como de baja prioridad
INTCON3bits.INT1IE=1; // activa la interrupción externa por flanco del pin RB1
INTCON3bits.INT1IP=0; // selecciona la interrupción de baja prioridad del pin RB1
INTCON3bits.INT2IE=1; // activa la interrupción externa por flanco del pin RB2
INTCON3bits.INT2IP=0; // selecciona la interrupción de baja prioridad del pin RB2
//*******************************************************
//*******************************************************
while (1);
}
//*******************************************************
//*******************************************************