2010-04-30 34 views

Répondre

7

Chacune des interruptions 8051s possède son propre bit dans le registre de fonction spéciale (SFR) de validation d'interruption (IE) et est activée en définissant le bit correspondant. Les exemples de code ci-dessous sont dans l'assemblage 8051 ainsi que C pour donner une idée générale de ce qui se passe.

Pour activer l'interruption externe 0 (EX0), vous devez définir le bit 0 de IE.

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

Pour activer interruption externe 1 (EX1) vous devez définir le bit 3 de IE.

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

Interruptions doivent alors être globalement activé par le bit 7 de IE, qui est la interupt globale activer/désactiver le bit (EA). Si nécessaire, vous pouvez définir la priorité des interruptions externes à l'aide de la priorité d'interruption (IP) SFR.

SETB EA ou ORL IE,#80

Exemple 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 */ 

ou

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

Les différents fournisseurs de compilateur 8051 C définissent souvent leurs propres méthodes de mise en place des fonctions d'interruption. Vous devrez peut-être consulter la documentation de votre compilateur spécifique.

Pour définir une fonction d'interruption à l'aide du compilateur Keil C51 (pdf link to application note), un numéro d'interruption et une banque de registres sont spécifiés lorsque le numéro d'interruption correspond à une adresse de vecteur d'interruption spécifique.

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

Pour définir une fonction d'interruption en utilisant la 8051 IAR C/C++ (icc8051) (pdf link to reference guide), le mot-clé __interrupt et la directive #pragma vector peut être utilisé.

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

Si vous êtes nouveau dans le 8051, il y a une multitude d'informations disponibles à www.8052.com. Je recommanderais également The 8051/8052 Microcontroller: Architecture, Assembly Language, and Hardware Interfacing écrit par Craig Steiner, le webmaster et auteur de 8052.com.