2010-04-30 27 views

Respuesta

7

Cada una de las interrupciones del 8051s tiene su propio bit en el registro de función especial (SFR) de habilitación de interrupción (IE) y se habilita configurando el bit correspondiente. Los siguientes ejemplos de código están en ensamblaje 8051 y también en C para proporcionar una idea general de lo que está ocurriendo.

Para habilitar la interrupción externa 0 (EX0) necesita establecer el bit 0 de IE.

SETB EX0 o ORL IE,#01 o MOV IE,#01

Para habilitar interrupción externa 1 (EX1) es necesario establecer el bit 3 del IE.

SETB EX1 o ORL IE,#08 o MOV IE,#08

interrupciones a continuación, es necesario permitir a nivel mundial poniendo el bit 7 del IE, que es el interupt mundial activar/desactivar bits (EA). Si es necesario, puede establecer la prioridad de las interrupciones externas en alto a través de la prioridad de interrupción (IP) SFR.

SETB EA o ORL IE,#80

Ejemplo en C:

#define IE (*(volatile unsigned char *)0xA8) 
#define BIT(x) (1 << (x)) 
... 
IE &= ~BIT(7); /* clear bit 7 of IE (EA) to disable interrupts */ 
... 
IE |= BIT(0); /* set bit 0 of IE (EX0) to enable external interrupt 0 */ 
... 
IE |= BIT(1); /* set bit 3 of IE (EX1) to enable external interrupt 1 */ 
... 
IE ^= BIT(7) /* toggle bit 7 of IE (EA) to re-enable interrupts */ 

o

IE = 0x89; /* enable both external interrupts and globally enable interrupts */

Los diversos 8051 vendedores C compilador menudo definen sus propios métodos de creación de funciones de interrupción. Es posible que deba consultar la documentación de su compilador específico.

Para definir una función de interrupción utilizando el compilador Keil C51 (pdf link to application note), se especifica un número de interrupción y un banco de registros donde el número de interrupción corresponde a una dirección de vector de interrupción específica.

void my_external_interrupt_0_routine(void) interrupt 0 using 2 
{ 
/* do something */ 
}

Para definir una función de interrupción usando el 8051 IAR C/C++ Compiler (icc8051) (pdf link to reference guide), la palabra clave __interrupt y la directiva #pragma vector puede ser utilizado.

#pragma vector=0x03 
__interrupt void my_external_interrupt_0_routine(void) 
{ 
/* do something */ 
}

Si usted es nuevo en el 8051, hay una gran cantidad de información disponible en www.8052.com. También recomendaría The 8051/8052 Microcontroller: Architecture, Assembly Language, and Hardware Interfacing escrito por Craig Steiner, el webmaster y autor de 8052.com.