4.3 Interrupciones con prioridades baja y alta Ejemplo 4

Anuncio
Interrupciones
45
4.3 Interrupciones con prioridades baja y alta
La familia PIC18 posee 2 modelos de mecanismo de interrupción, los ejemplos
anteriores usaron el modelo de compatibilidad de los PIC16. Ahora veremos como
programar interrupciones con distintas prioridades.
Este modelo de interrupciones se habilita activando el bit IPEN (RCON<7>).
Además cada fuente de interrupción tiene un bit utilizado para indicar si la interrupción
es de alta o de baja prioridad. Este bit tiene terminación IP (INT1IP, INT2IP, etc).
Cuando se activa el modo de interrupción con prioridades, el vector de alta prioridad
es la dirección 0x08 y el vector de baja prioridad es la dirección 0x18.
El siguiente ejemplo ilustra el uso de las interrupciones INT1 e INT2 con distintas
prioridades.
Ejemplo 4-3. Uso de interrupciones con prioridades
/*
*
*
*
*
*/
Interrupciones RBI e INT1
Rutina de desplazamiento en PORTA
Cuando recibe un flanco descendente en INT1 aumenta contador
con un flanco descendente en INT2 disminuye contador
#include <p18cxxx.h>
#include <portb.h>
// Prototipos de funciones
void low_isr(void);
//Prototipo de RSI de baja prioridad
void high_isr(void);
//Prototipo de RSI de alta prioridad
// Sección de variables globales no inicializadas
#pragma udata
char contador;
//Código para bootloader
extern void _startup (void);
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset (void)
{
_asm goto _startup _endasm
}
// Sección de código
#pragma code
Ing. Juan Ramon Terven Salinas
Interrupciones
46
// FUNCION PRINCIPAL
void main()
{
// PORTA como salida
TRISA = 0;
// Configura todo PORTB como entrada
TRISB = 0xFF;
// Configura pines como digitales
ADCON1 |= 0x0f;
//Habilita prioridad en interrupciones
RCONbits.IPEN = 1;
// Configura interrupción externa del pin RB1
OpenRB1INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT &
PORTB_PULLUPS_ON);
INTCON3bits.INT1IP = 1; // Interrupción de alta prioridad
// Configura interrupción externa del pin RB2
OpenRB2INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT &
PORTB_PULLUPS_ON);
INTCON3bits.INT2IP = 0; // Interrupción de baja prioridad
// Habilitación
INTCONbits.GIEH
// Habilitación
INTCONbits.GIEL
interrupciones de alta prioridad
= 1;
interrupciones de baja prioridad
= 1;
// Inicia contador de pulsos
contador = 0;
LATA = contador;
// Ciclo principal
while(1)
{
}
}
// VECTOR DE ALTA PRIORIDAD
// Interrupción externa INT1
#pragma code high_vector=0x1008
void high_interrupt (void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
contador++;
LATA = contador;
INTCON3bits.INT1IF = 0; // Limpia la bandera de interrupción
}
Ing. Juan Ramon Terven Salinas
Interrupciones
47
//VECTOR DE BAJA PRIORIDAD
// Interrupción externa INT2
#pragma code low_vector=0x1018
void low_interrupt (void)
{
_asm GOTO low_isr _endasm
}
#pragma code
#pragma interrupt low_isr
void low_isr(void)
{
contador--;
LATA = contador;
// Limpia la bandera de interrupción
INTCON3bits.INT2IF = 0;
}
Programa 4-3. Interrupciones INT1 e RBI
Ing. Juan Ramon Terven Salinas
Descargar