Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 7368|Απάντηση: 0

Ταξίδι με Zigbee (3): Αρκετά σημαντικά βασικά πειράματα CC2430 - εξωτερική διακοπή

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 30/10/2014 11:16:46 μ.μ. | | | |
1. Σύνδεση του ανώτερου και του κατώτερου επιπέδου

Στην προηγούμενη διάλεξη, εξοικειωθήκαμε με τη βασική διαδικασία ανάπτυξης του προγράμματος CC2430 μέσω ενός απλού πειράματος που αναβοσβήνει LED. Το μαχαίρι έχει ακονιστεί ούτως ή άλλως (αν και η πέτρα μου δεν είναι καλή) και τώρα θα αρχίσω να σφάζω έντομα :). Στη συνέχεια, ας μάθουμε μερικά βασικά πειράματα του CC2430. Κάθε μικρό πείραμα χωρίζεται σε τρία μέρη: «Εισαγωγή πειράματος», «Διάγραμμα ροής προγράμματος» και «Πειραματικός πηγαίος κώδικας και ανάλυση».

Αυτό το άρθρο εξηγεί τις εξωτερικές διακοπές.

2. Εξωτερική διακοπή(1) Εισαγωγή στο πείραμα

Οι διακοπές είναι ένας εσωτερικός μηχανισμός για τους μικροελεγκτές να επεξεργάζονται εσωτερικά ή εξωτερικά συμβάντα σε πραγματικό χρόνο. Όταν συμβεί ένα εσωτερικό ή εξωτερικό συμβάν, το σύστημα διακοπής του μικροελεγκτή θα αναγκάσει την CPU να διακόψει το πρόγραμμα εκτέλεσης και αντ' αυτού να επεξεργαστεί το συμβάν διακοπής.

Οι διακοπές χωρίζονται σε εξωτερικές και εσωτερικές διακοπές και το CC2430 περιέχει συνολικά 18 πηγές διακοπών (για συγκεκριμένες περιγραφές διακοπών και ορισμούς διανυσμάτων διακοπών, ανατρέξτε στο "CC2430 Κινεζικό εγχειρίδιο》)。

Τώρα ας ρίξουμε μια ματιά στο διάγραμμα κυκλώματος αυτής της πλακέτας ανάπτυξης:

Το κουμπί S1 έχει συνδεθεί στο P0.1 στην πλακέτα ανάπτυξης και το αποτέλεσμα αυτού του πειράματος είναι να ενεργοποιήσει τη διακοπή του P0.1 μέσω του κουμπιού S1 και, στη συνέχεια, να ελέγξει την ενεργοποίηση/απενεργοποίηση του LED1 στο υποπρόγραμμα υπηρεσίας διακοπής.

(2) Πειραματική αρχή και διάγραμμα ροής

Το πειραματικό διάγραμμα ροής έχει ως εξής:


(3) Πειραματικός πηγαίος κώδικας//头文件
#include

//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3

άκυροΚαθυστέρηση(ανυπόγραφοn)   
{
  ανυπόγραφοττ;
  Για(tt =0; tt<n; tt++);
  Για(tt =0; tt<n; tt++);
  Για(tt =0; tt<n; tt++);
  Για(tt =0; tt<n; tt++);
  Για(tt =0; tt<n; tt++);
}

//32M晶振初始化
άκυροxtal_init(άκυρο)
{
  ΥΠΝΟΣ &= ~0x04;            //都上电
  ενώ(! (ΥΠΝΟΣ &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //Επιλέξτε έναν κρυσταλλικό ταλαντωτή 32 MHz
  ΥΠΝΟΣ |=0x04;
}

//LED灯初始化
άκυροled_init(άκυρο)
{
  Ρ1ΣΕΛ =0x00;         Το P1 είναι η κανονική θύρα εισόδου/εξόδου
  P1DIR |=0x0F;         Έξοδος P1.0 P1.1 P1.2 P1.3
  
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
  LED4 = 0;
}

//io及外部中断初始化
άκυροio_init(άκυρο)
{
    P0INP &= ~0Χ02;   //P0.1有上拉、下拉

    ΕΑ =1;           //总中断使能
   
    P0IE =1;   //P0中断使能
   
    PICTL |=  0Χ09;   //P0.1口中断使能,下降沿触发
   
    P0IFG &= ~0x02;   //P0.1中断标志清0
};

//主函数
άκυροmain(άκυρο)   
{
  xtal_init();
  led_init();  
  io_init();

  ενώ(1);   //等待中断
}

//中断服务子程序
#pragma διάνυσμα = P0INT_VECTOR
__interrupt άκυροP0_ISR(άκυρο)
{
  ΕΑ =0;                        Η πύλη διακόπτεται  

  Καθυστέρηση(10000);  
  Καθυστέρηση(10000);
  Καθυστέρηση(10000);
  Καθυστέρηση(10000);
  Καθυστέρηση(10000);

  αν((P0IFG &0x02) >0)         //按键中断
  {
    P0IFG &= ~0x02;               //P0.1中断标志清0
    led1 = !led1;
  }
  Ρ0ΑΝ =0;                       //P0中断标志清0

  ΕΑ =1;                        //开中断
}

Αρχικά, αρχικοποιήστε το ρολόι του συστήματος: επιλέξτε έναν κρυσταλλικό ταλαντωτή 32 MHz.

Στη συνέχεια, αρχικοποιήστε τα LED: ορίστε το P1 ως τη γενική θύρα I/O, ορίστε την κατεύθυνση P1.0 ~ P1.3 ως έξοδο και, στη συνέχεια, σβήστε τις 4 λυχνίες LED.

Στη συνέχεια, διαμορφώστε τους σχετικούς καταχωρητές SFR για εξωτερικές διακοπές για να ενεργοποιήσετε διακοπές σε όλα τα επίπεδα, που περιλαμβάνουν 3 SFR:ΕΑΙΕΝ1PICTL(Για λεπτομέρειες σχετικά με κάθε SFR, ανατρέξτε στοCC2430 Κινεζικό εγχειρίδιο》):

ΕΑ- Ενεργοποίηση ολικής διακοπής.

    ΙΕΝ1.5- Ενεργοποίηση διακοπής P0.

    ΕΙΚΟΝΑ.3—— Ενεργοποίηση διακοπής θύρας P0.1.

    ΕΙΚ.0—— Ρυθμίστε το άκρο πτώσης εισόδου θύρας P0.1 για να προκαλέσει ενεργοποίηση διακοπής.

Στη συνέχεια, χρησιμοποιήστε το while(1) στην κύρια λειτουργία και περιμένετε τη διακοπή.

Συμβουλές CC2430
(1) Περίληψη της σύνταξης εκχώρησης bit
Πολλές φορές, χρειάζεται να αντιστοιχίσουμε ένα bit (0 ή 1) σε ένα μόνο byte SFR για να ελέγξουμε με ακρίβεια τη συσκευή υλικού.
Υπάρχει SFRΥποστήριξη διευθυνσιοδότησης bitΓια παράδειγμα, TCON, P0, κ.λπ., αυτή τη στιγμή, η εκχώρηση αντιστίξεων είναι πολύ απλή, απλώς ζητήστε τον ορισμό bit στην ενότητα SFR Bit Access του αρχείου κεφαλίδας ioCC2430.h:
P0_0 = 0; // εκχωρήστε 0 στο πρώτο ψηφίο του P0
P0_0 = 1; // εκχωρήστε μια τιμή 1 στο πρώτο ψηφίο του P0  

Αλλά ορισμένα SFR δεν υπάρχουνΗ διευθυνσιοδότηση bit δεν υποστηρίζεται, όπως σε αυτό το πείραμαPICTL, αυτή τη στιγμή, θέλετε να εκχωρήσετε μια τιμή σε ένα από αυτά, η σύνταξη είναι η εξής:
PICTL &= ~0x01;   Εκχωρήστε μια τιμή 0 στο πρώτο ψηφίο
PICTL |= 0x01;     Εκχωρήστε μια τιμή 1 στο πρώτο ψηφίο

Μπορείς να θυμηθείς&= ~|=Αυτά τα δύο χρησιμοποιούνται συνήθως σύνταξη ανάθεσης bit.
(2) Περίληψη της ενεργοποίησης διακοπής
Όταν εμπλέκεται μια διακοπή στο πρόγραμμα, πρέπει να ενεργοποιηθεί πριν ενεργοποιηθεί η διακοπή.
Η ιεραρχία του συστήματος ενεργοποίησης διακοπής C51 είναι πολύ προφανής:
Διακοπή αφεντικού: EAείναι το αφεντικό, υπεύθυνοΓενικάΕνεργοποίηση διακοπής:
ΕΑ = 1;

  Κάθε αρχηγός ομάδας που διακόπτεται: Το επόμενο είναι για κάθε έναΛειτουργικά μέρη(όπως P0, χρονόμετρο 1, κ.λπ.), τέτοια SFR είναι γενικά με δυνατότητα διεύθυνσης bit και το όνομα περιέχει γενικά IE (Interrupt Enable):
P0IE = 1;

  Κάθε μέλος της ομάδας διακόπηκε: Ομάδα Αλλά επειδή κάθε χαρακτηριστικό περιέχει επίσης πολλαπλές διακοπές μέσα σε αυτό, το τελευταίο επίπεδο είναι για αυτόΚάθε διακοπήΑυτός ο τύπος SFR είναι γενικά χωρίς bit και χωρίς διεύθυνση και συνήθως περιέχει IE (Interrupt Enable) ή IM (Interrupt Mask) στο όνομα:
PICTL |=0x01;

Δεν χρειάζεται να διακόψετε το SFR, απλώς κατανοήστε την ιεραρχία του και, στη συνέχεια, αφιερώστε χρόνο για να αναζητήσετε το εγχειρίδιο ή το αρχείο κεφαλίδας.
(3) Διακοπή της συγγραφής προγραμμάτων
Η χρήση των διακοπών σε ένα πρόγραμμα περιλαμβάνει γενικά δύο μέρη: τη σύνταξη του υποπρογράμματος υπηρεσίας διακοπής και το άνοιγμα της ενεργοποίησης της διακοπής. Η συνάρτηση διακοπής εισήχθη παραπάνω και ακολουθεί μια σύντομη εισαγωγή στη σύνταξη του υποπρογράμματος υπηρεσίας διακοπής:
Προσδιορίστε πρώταΔιάνυσμα διακοπής, για το οποίο μπορείτε να υποβάλετε ερώτημα στην ενότητα Διανύσματα διακοπής του αρχείου κεφαλίδας ioCC2430.h, με την ακόλουθη σύνταξη:
#pragma διάνυσμα = διάνυσμα διακοπής

Στη συνέχεια, γράψτε αμέσως μετά τον χειριστή διακοπών, ο οποίος είναι δομημένος ως εξής:
__interrupt void όνομα συνάρτησης (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Συμπέρασμα

Αυτό το άρθρο εισάγει τη μέθοδο υλοποίησης απλών εξωτερικών διακοπών με βάση το CC2430 και μετά τη βάση των διακοπών, θα παρουσιάσουμε μια άλλη πολύ σημαντική ενότητα - τα χρονόμετρα. Το CC2430 έχει συνολικά 4 χρονόμετρα, τα οποία μπορούν να χωριστούν σε τρεις κατηγορίες: χρονόμετρο 1, χρονόμετρο 2, χρονόμετρο 3/4 (το 3 και το 4 είναι βασικά η ίδια χρήση).


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




Προηγούμενος:Zigbee Journey (2): Το πρώτο πρόγραμμα CC2430 - Πείραμα LED που αναβοσβήνει
Επόμενος:Zigbee Journey (4): Αρκετά σημαντικά βασικά πειράματα CC2430 - διακοπή χρονοδιακόπτη
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com