架构师_程序员_码农网

N Récupérer le mot de passe
S'inscrire

QQ登录

Une seule étape pour commencer

Recherche
Vue :4624|Réponse : 0
打印 上一主题 下一主题

[转]Zigbee之旅(三):几个重要的CC2430基础实验--Interruption externe

[Copier le lien]
A 跳转到指定楼层
le propriétaire du bâtiment
发表于 2014-10-30 23:16:46|只看该作者回帖奖励 | Mode lecture
I. Passer du précédent au suivant

  Dans le cours précédent, nous nous sommes familiarisés avec le processus de base du développement de programmes CC2430 dans IAR à travers une petite expérience avec la plus simple LED clignotante. Le couteau a au moins été aiguisé (bien que je ne sois pas très doué avec cette pierre à aiguiser), et il est maintenant temps de commencer à dépecer des insectes :). Ensuite, nous allons apprendre quelques expériences de base sur le CC2430. Chaque petite expérience est divisée en trois parties : "introduction expérimentale", "organigramme du programme", "code source expérimental et analyse".

  Cet article explique l'interruption externe.

Deuxièmement, l'interruption externe(1) Introduction à l'expérience

  L'interruption est un microcontrôleur en temps réel qui traite les événements internes ou externes, un mécanisme interne. Lorsqu'un événement interne ou externe se produit, le système d'interruption du microcontrôleur oblige l'unité centrale à mettre en pause le programme en cours d'exécution, mais pour aller au traitement de l'événement d'interruption, le traitement de l'interruption est terminé, puis revient pour être interrompu par le programme et continuer à s'exécuter.

  Les interruptions sont divisées en interruptions externes et interruptions internes, le CC2430 contient un total de 18 sources d'interruption (description spécifique des interruptions et définition du vecteur d'interruption, vous pouvez vous référer au " Manuel chinois du CC2430 ").

  Voyons maintenant le schéma de circuit de cette carte de développement :

  La carte de développement a été connectée au bouton S1 et à P0.1. L'effet recherché par cette expérience est de déclencher l'interruption de P0.1 en appuyant sur la touche S1, puis de contrôler l'allumage et l'extinction de la LED1 dans la sous-routine de service d'interruption.

(2) Principe expérimental et organigramme

  L'organigramme de l'expérience est le suivant :

2011021811430713.png
c













(
3) Code source expérimental// fichier d'en-tête#include // sous-fonction delay#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &



nbsp; unsigned tt ;for (tt = 0;tt<n;tt++) ;for (tt = 0;tt<n;tt++) ;for (tt = 0;tt<n;tt++) ; &






nbsp ; for (tt = 0;tt<n;tt++) ;for (tt = 0;tt<n;tt++) ; }//initialisation du cristal 32Mvoid xtal_init( void ) { SLEEP &=~0x04; &
nbsp ; //tout mettre sous tensionwhile ( !
(SLEEP & 0x40 )) ; //oscillateur à cristal activé et stable CLKCON &=~0x47; &






nbsp ; //Sélectionner l'oscillateur à cristal 32MHz SLEEP |=0x04; }//Initialisation des LEDvoid led_init( void ) { P1SEL =0x00; &nbsp


; //P1 est un port E/S normal P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Sortie








led1 = 0 ; led2 = 0 ; led3 = 0 ; led4 = 0 ; }//initialisation de l'E/S et des interruptions externesvoid io_init( void ) { P0INP &=~0X02;



/ /P0.1 a un pull-up et un pull-down EA =1; //Total interrupt enable P0IE =1; &



nbsp ; //Activation de l'interruption PICTL |=0X09; //Activation de l'interruption du port P0.1, déclenchement sur front descendant P0IFG &=~0x02







; //P0.1 interrupt flag clear 0 } ;//main functionvoid main( void ) { xtal_init() ; led_init() ;








io_init() ;while ( 1 ) ; //attend l'interruption }//sous-routine de service d'interruption#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;

/ / Désactive l'interruption Delay





( 10000 ) ; Delay(10000 ) ; Delay(10000 ) ; Delay(10000 ) ; Delay(10000) ; Delay(10000 ) ; &

nbsp; if ((P0IFG & 0x02 ) >0 ) //interruption de la clé { P0IFG &=~0x02; &


nbsp ; //P0.1 drapeau d'interruption clear 0 led1 = !led1 ; } P0IF =0; &

nbsp ; //P0 drapeau d'interruption clair 0 EA =1; &
nbsp ; // activation de l'interruption }

  Initialiser d'abord l'horloge d'unité : choisir un oscillateur à cristal de 32MHz.

  Initialisez ensuite les LEDs : définissez P1 comme port d'E/S à usage général, définissez les directions P1.0 ~ P1.3 comme sortie, puis éteignez les 4 LEDs.

  Configurez ensuite les registres SFR appropriés pour les interruptions externes et activez l'activation d'interruption à tous les niveaux, impliquant 3 SFR : EA, IEN1, PICTL (pour une description détaillée de chaque SFR, veuillez vous référer au " Manuel chinois du CC2430 ") :

     EA -- validation totale de l'interruption ;

     IEN1.5 -- activation de l'interruption P0 ;

     PICTL.3 -- activation de l'interruption du port P0.1 ;

     PICTL.0 -- définir le front descendant de l'entrée du port P0.1 pour provoquer le déclenchement de l'interruption.

  Utilisez ensuite while(1) dans la fonction principale pour attendre l'interruption.

CC2430 Tips
(1) Bit Assignment Syntax Summary
Très souvent, nous avons besoin d'assigner une valeur (0 ou 1) à un bit dans un SFR d'un octet pour contrôler précisément un dispositif matériel.
  

C
ertains SFR supportent l'adressage de bits, tels que TCON, P0, etc., à ce moment, l'assignation du bit est très simple, il suffit d'interroger le fichier d'en-tête ioCC2430.h dans la partie SFR Bit Access de la définition du bit peut être :
P0_0 = 0 ; // P0 le premier bit de l'assignation de la valeur de 0
P0_0 = 1 ; / / / P0 le premier bit de l'assignation de la valeur de 1
Cependant, il y a des SFR qui ne
supportent
pas
l'adressage de bits, comme dans le cas du
premier bit de l'assignation de la valeur du premier bit du premier bit du premier bit du premier bit du premier bit du
deuxième
bit
.
Cependant, certains SFR
ne supportent pas l'adressage par bit, comme le PICTL dans cette expérience, lorsque l'on veut assigner une valeur à l'un d'entre eux, la syntaxe est la suivante :
PICTL &= ~0x01 ; //assigne une valeur de 0 au premier bit
PICTL |= 0x01 ; //assigne une valeur de 1 au premier bit
On peut retenir que &
amp;= ~, |= ~, |= ~,
|= P0_0
=
1 ; //assigne une valeur de 1 au premier bit de P0
. amp;= ~, |= ces deux syntaxes courantes d'affectation de bits.
(2) Activation des interruptions Résumé
Lorsqu'une interruption est impliquée dans un programme, elle doit être activée avant que l'interruption ne soit déclenchée.
  

L
a structure hiérarchique du système de validation des interruptions du C51 est très évidente :
le chef des interruptions : EA est le chef, responsable de la validation totale des interruptions :
EA = 1 ; le
capitaine de détachement des
interruptions: le suivant est pour chaque composant fonctionnel (tel que P0, timer 1, etc.) le contrôle de la validation, tel que SFR généralement adressable par bit, la dénomination contient généralement IE (Interrupt Enable) :
P0IE = 1 ; les
membres de l'
équipe des interruptions
: détachement, mais en raison de l'
interruption duprogramme
, l
' interruption
doit être validée avant le déclenchement de l'interruption.

c
haque membre de l'équipe d'interruption: équipe, mais parce que chaque composant fonctionnel contient également plusieurs interruptions, le dernier niveau est pour chaque contrôle d'activation d'interruption, un tel SFR n'est généralement pas adressable par bit, nommé généralement IE (Interrupt Enable) ou IM (Interrupt Mask) :
PICTL | = 0x01 ;
i
l
n'est pas nécessaire de mémoriser les SFR d'interruption. Il n'est pas nécessaire de mémoriser les SFR d'interruption, à condition de comprendre la hiérarchie, puis de consulter le manuel ou les fichiers d'en-tête lorsque vous les utilisez.
(3) Écriture de programmes d'interruption
L'utilisation d'interruptions dans un programme consiste généralement en deux parties : l'écriture de la sous-routine de service d'interruption et l'ouverture de la validation d'interruption.

L
a validation d'interruption a été présentée ci-dessus, voici une brève introduction à la préparation de la sous-routine de service d'interruption :
Tout d'abord, spécifiez le vecteur d'interruption, qui peut se trouver dans le fichier d'en-tête ioCC2430.h dans la partie Interrupt Vectors de la requête, la syntaxe est la suivante :
# pragma vector = Interrupt Vectors
et ensuite, la préparation du gestionnaire d'interruption, la structure est la suivante :
___ interrupt void Function Name (___)


i
nterrupt void function name(void)
{
//on interrupt
//interrupt handling //interrupt
flag clear 0
//off interrupt
}

III. conclusion

  Cet article présente une méthode simple de mise en oeuvre d'une interruption externe basée sur le CC2430, avec la base de l'interruption, puis nous présentons un autre module très important - le timer. Le CC2430 a un total de quatre timers, qui peuvent être divisés en trois catégories : timer 1, timer 2, timer 3/4 (3 et 4 de l'utilisation de la même base). la même).


</n;tt++).
</n;tt++) ;.
</n;tt++).
</n;tt++) ; </n;tt++) ; </n;tt++) ; </n;tt++).
</n;tt++).




Previous :[Re-]Zigbee Journey (II) : le premier programme CC2430 - expérience de clignotement des LEDs
Next :[Re-]Zigbee Journey (4) : Quelques expériences de base importantes sur le CC2430 - interruptions de la minuterie
Le code farmer network, seulement publié dans le processus de pratique, a rencontré des difficultés techniques, ne pas induire les autres en erreur.
Vous devez vous connecter avant de pouvoir poster Log in | Register

C ette version des règles intégralesR


AVERTISSEMENT : Tous les logiciels, matériels de programmation ou articles publiés par Code Farmer sont destinés à être utilisés uniquement à des fins d'apprentissage et de recherche ; le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon, toutes les conséquences seront supportées par les utilisateurs eux-mêmes. Les informations de ce site proviennent du réseau, le litige sur les droits d'auteur n'a rien à voir avec ce site. Vous devez supprimer complètement le contenu susmentionné de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, soutenez le logiciel authentique, achetez l'enregistrement et obtenez un meilleur service authentique. En cas d'infraction, veuillez nous contacter par courrier électronique pour régler le problème.

Courrier To:help@itsvse.com

QQ | ( 鲁ICP备14021824号-2)|Sitemap

GMT+8, 2024-9-17 14:49

Réponse rapideRetour au débutRetour à la liste