click para descargar

Anuncio
PIC 18F45XX
La Interrupción externa
1. Características generales sobre interrupciones (I)
La familia 18F45XX incorpora múltiples fuentes de interrupción.
Cuando se produce una interrupción se produce un salto hacia la dirección que indica
el vector de interrupción.
Cada fuente de interrupción puede configurarse como:
ALTA prioridad (vector: 000008h)
BAJA prioridad (vector: 000018h)
Si no se utilizan las prioridades (RCON.SPEN=0) todas las interrupciones son
consideradas de alta prioridad.
Cada fuente de interrupción tiene tres bits que configuran su funcionamiento:
Bit de habilitación (Enable bit), permite/impide el “salto” al vector de interrupción.
Bit de prioridad (Priority bit), configura el vector de salto ALTA o BAJA.
Bit de bandera (Flag bit), se pone a uno cuando se produce la interrupción.
La interrupción externa está implementada en los pines RB0, RB1 y RB2.
Para habilitar la int. Externa en RB0 sin prioridad hay que poner a uno los bits GIE, y
INT0IE del registro INTCON.
1. Características generales sobre interrupciones (II)
Las rutinas de atención a las interrupciones tienen las siguientes limitaciones:
No devuelven ni aceptan parámetros
No pueden invocarse desde otros puntos del programa
Las variables globales que se utilicen se deben declarar como volatile
La directiva :
#pragma interruptlow nombre_interrupcion
Define la rutina de servicio a la interrupción como de baja prioridad
La directiva:
#pragma interrupt nombre_interrupcion
Define la interrupción como alta prioridad
Ejemplos de programación:
#pragma interrupt UserHighPriorityISRCode
void UserHighPriorityISRCode(){ }
#pragma interruptlow UserLowPriorityISRCode
void UserLowPriorityISRCode() {}
2. Hardware de interrupciones
3. Registro de configuración INTCON
Para deshabilitar el control de
prioridades poner a cero el bit
IPEN del registro RCON:
RCONbits.IPEN=0;
Todas las interrupciones
“saltan” al vector: 000008
Cuando se produce la int.
Externa se pone a uno su
bandera de interrupcion:
INTCONbits.INT0IF=1
Para habilitar la int. Externa:
INTCONbit.INT0IE=1;
INTCONbits.GIE=1;
4. Registro de configuración INTCON2
La int. Externa en RB0 puede
configurarse para activarse
con flanco de subida o de
bajada.
Para configurar con cada
flanco de bajada:
INTCON2bits.INTEDG0=0;
Para configurar con cada
flanco de subida:
INTCON2bits.INTEDGE=1;
5. Interrupciones en la placa de periféricos
Para poder generar una interrupción por
flanco de bajada:
a) Poner el jumper J2 en posición (B0-E)
b) Pulsar RB0
6. Programación en C18
Para configurar la interrupción externa RB0 sin prioridades se puede seguir el
siguiente procedimiento:
En la función main()
• Deshabilitar prioridades. RCONbits.IPEN=0;
• Hablilitar todas las interrupciones. INTCONbits.GIE=1;
• Habilitar interrupción en RB0. INTCONbits.INT0IE=1;
• Configurar el tipo de flanco (subida/bajada). INTCON2bits.INTEDG0=1/0;
• Poner a cero la bandera de control. INTCONbits.INT0IF=0;
En la función de interrupción
• Deshabilitar todas las interrupciones. INTCONbits.GIE=0;
• Guardar el estado del programa principal (si procede)
• Programar la función según necesidades.
• Recuperar el estado del programa principal (si procede)
• Poner a cero la bandera de control. INTCONbits.INT0IF=0;
• Habilitar todas las interrupciones. INTCONbits.GIE=1;
7. Programa de ejemplo
Diseñar un programa que presente un segmento girando en la parte baja del display
de la placa de periféricos a intervalos de 300ms. Configurar la interrupción externa
en RB0, generada por flanco de bajada, para que cuando se produzca parpadee la
parte baja del display tres veces a intervalos de 200ms. Cuando termine la
interrupción el segmento debe seguir girando en la misma posición donde se
encontraba.
Solución (programa principal)
Solución (función de interrupción)
Simulación
Descargar