架构师_程序员_码农网

Όνομα χρήστη Ανάκτηση κωδικού πρόσβασης
Εγγραφή

QQ登录

Μόνο ένα βήμα για να ξεκινήσετε

Αναζήτηση
Προβολή:4624|Απάντηση: 0
打印 上一主题 下一主题

[转]Zigbee之旅(三):几个重要的CC2430基础实验--Εξωτερική διακοπή

[Αντιγραφή συνδέσμου]
Ανελκυστήρας απευθείας στο 跳转到指定楼层
τον ιδιοκτήτη του κτιρίου
发表于 2014-10-30 23:16:46|只看该作者回帖奖励|Αναδρομικήπεριήγηση|Λειτουργία ανάγνωσης
I. Συνεχίζοντας από το προηγούμενο στο επόμενο

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

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

Δεύτερον, η εξωτερική διακοπή(1) Εισαγωγή στο πείραμα

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

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

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

2011021811145691.jpg

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

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

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

2011021811430713.png
c













(
3) Πειραματικός πηγαίος κώδικας// αρχείο κεφαλίδας#include // υπολειτουργία καθυστέρησης#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++); }//32M crystal initializationvoid xtal_init( void ) { SLEEP &=~0x04; &
nbsp; //όλη η τροφοδοσίαwhile (!
(SLEEP & 0x40 )); //ταλαντωτής κρυστάλλου ενεργοποιημένος και σταθερός CLKCON &=~0x47; &






nbsp; //επιλογή ταλαντωτή κρυστάλλου 32MHz SLEEP |=0x04; }// αρχικοποίηση LEDvoid led_init( void ) { P1SEL =0x00; &nbsp


; //P1 είναι μια κανονική θύρα εισόδου/εξόδου P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Έξοδος








led1 = 0- led2 = 0- led3 = 0- led4 = 0- }//αρχικοποίηση της δίοδο και της εξωτερικής διακοπήςvoid io_init( void ) { P0INP &=~0X02,



/ /P0.1 έχει pull-up και pull-down EA =1; //Ολική ενεργοποίηση διακοπής P0IE =1; &



nbsp; //Ενεργοποίηση διακοπής P0 PICTL |=0X09; //Ενεργοποίηση διακοπής θύρας P0.1, σκανδαλισμός πτώσης P0IFG &=~0x02







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








io_init();while ( 1 ); //αναμονή για διακοπή }//υπορουτίνα εξυπηρέτησης διακοπών#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0,

/ / απενεργοποίηση της διακοπής Καθυστέρηση





( 10000 ), Delay(10000 ), Delay(10000 ), Delay(10000 ), Delay( 10000 ), Delay(10000 ), &

nbsp; if ((P0IFG & 0x02 ) >0 ) //διακοπή με πλήκτρο { P0IFG &=~0x02; &


nbsp; //P0.1 interrupt flag clear 0 led1 = !led1; } P0IF =0; &

nbsp; //P0 interrupt flag clear 0 EA =1; &
nbsp; // ενεργοποίηση της διακοπής }

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

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

  Στη συνέχεια, διαμορφώστε τους σχετικούς καταχωρητές SFR για εξωτερικές διακοπές και ενεργοποιήστε την ενεργοποίηση διακοπής σε όλα τα επίπεδα, που αφορούν 3 SFR: EA, IEN1, PICTL (για λεπτομερή περιγραφή κάθε SFR, ανατρέξτε στο " CC2430 Chinese Manual "):

     EA -- συνολική ενεργοποίηση διακοπής,

     IEN1.5 -- ενεργοποίηση διακοπής P0,

     PICTL.3 -- Ενεργοποίηση διακοπής θύρας P0.1,

     PICTL.0 -- θέτει την πτωτική ακμή εισόδου θύρας P0.1 για να προκαλέσει ενεργοποίηση διακοπής.

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

Συμβουλές για το CC2430
(1) Σύνταξη ανάθεσης bit
Πολύ συχνά, πρέπει να αναθέσουμε μια τιμή (0 ή 1) σε ένα bit σε ένα SFR ενός byte για να ελέγξουμε με ακρίβεια μια συσκευή υλικού.
  

Ορισμένα SFRs
υποστηρίζουν τη διευθυνσιοδότηση bit, όπως TCON, P0 κ.λπ., αυτή τη στιγμή, η ανάθεση του bit είναι πολύ απλή, απλά ρωτήστε το αρχείο κεφαλίδας ioCC2430.h στο SFR Bit Access μέρος του ορισμού bit μπορεί να είναι:
P0_0 = 0; // P0 το πρώτο bit της ανάθεσης της τιμής του 0
P0_0 = 1; / / / / P0 το πρώτο bit της ανάθεσης της τιμής του 1
Ωστόσο, υπάρχουν SFRs δεν
υποστηρίζουν τη διευθυνσιοδότηση bit, όπως στην περίπτωση
του
πρώτου bit της ανάθεσης της τιμής του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του πρώτου bit του
δεύτερου
bit
.
Ωστόσο, υπάρχουν SFRs
που δεν υποστηρίζουν διευθυνσιοδότηση bit, όπως το PICTL σε αυτό το πείραμα, όταν θέλετε να αναθέσετε μια τιμή σε ένα από αυτά, η σύνταξη έχει ως εξής:
PICTL &= ~0x01; //αναθέστε μια τιμή 0 στο πρώτο bit
PICTL |= 0x01; //αναθέστε μια τιμή 1 στο πρώτο bit
Μπορείτε
να θυμάστε ότι &
amp;= ~, |= ~, |= ~, |= ~,
|= P0_0
=
1; //αναθέστε μια τιμή 1 στο πρώτο bit του P0
. amp;= ~, |= αυτά είναι δύο συνηθισμένα συντακτικά στοιχεία ανάθεσης bit.
(2) Σύνοψη ενεργοποίησης διακοπής
Όταν μια διακοπή εμπλέκεται σε ένα πρόγραμμα, πρέπει να ενεργοποιηθεί πριν από την ενεργοποίηση της διακοπής.
  

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

κάθε μέλος της ομάδας διακοπής
: ομάδα, αλλά επειδή κάθε λειτουργικό στοιχείο περιέχει επίσης πολλαπλές διακοπές, οπότε το τελευταίο επίπεδο είναι για κάθε έλεγχο ενεργοποίησης διακοπής, το εν λόγω SFR δεν είναι γενικά διευθύνσιμο με bit, η ονομασία περιέχει γενικά IE (Interrupt Enable) ή IM (Interrupt Mask):
PICTL | = 0x01-
δεν χρειάζεται να απομνημονεύσετε τα SFR διακοπής. Δεν χρειάζεται να απομνημονεύσετε τα interrupt SFRs, αρκεί να κατανοήσετε την ιεραρχία και στη συνέχεια να συμβουλευτείτε το εγχειρίδιο ή τα αρχεία κεφαλίδων όταν τα χρησιμοποιείτε.
(3) Συγγραφή προγραμμάτων διακοπών
Η χρήση των διακοπών σε ένα πρόγραμμα αποτελείται γενικά από δύο μέρη: τη συγγραφή της υπορουτίνας εξυπηρέτησης διακοπών και το άνοιγμα της ενεργοποίησης διακοπών.

Η ενεργοποίηση διακοπής έχει εισαχθεί παραπάνω, τα παρακάτω είναι μια σύντομη εισαγωγή στην προετοιμασία της υπορουτίνας εξυπηρέτησης διακοπής:
Πρώτα απ' όλα, καθορίστε το διάνυσμα διακοπής, μπορεί να βρίσκεται στο αρχείο κεφαλίδας ioCC2430.h στο τμήμα Interrupt Vectors της ερώτησης, η σύνταξη έχει ως εξής:
# pragma vector = Interrupt Vectors
και στη συνέχεια ακολουθεί η προετοιμασία του χειριστή διακοπής, η δομή έχει ως εξής:
___
interrupt void Function Name (___)


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

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

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


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




Προηγούμενο: [Re-]Ταξίδι Zigbee (II): το πρώτο πρόγραμμα CC2430 - πείραμα αναβοσβήνει LED
Επόμενο: [Re-]Zigbee Journey (4): Μερικά σημαντικά βασικά πειράματα του CC2430 - Διακοπές χρονοδιακόπτη
收藏转播分享Σελιδοδείκτης ΕκπομπήTaobao
Το δίκτυο αγροτών κώδικα, δημοσιεύεται μόνο κατά τη διαδικασία της πρακτικής, αντιμετώπισε τεχνικές δυσκολίες, μην παραπλανάτε άλλους.
Πρέπει να συνδεθείτε πριν να μπορέσετε να γράψετε ξανά Σύνδεση | Εγγραφή

Αυτή η έκδοση των ολοκληρωμένων κανόνων


ΑΠΟΠΟΙΗΣΗ ΕΥΘΥΝΗΣ: Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από την Code Farmer περιορίζονται να χρησιμοποιούνται μόνο για σκοπούς μάθησης και έρευνας- τα παραπάνω περιεχόμενα δεν πρέπει να χρησιμοποιούνται για εμπορικούς ή παράνομους σκοπούς, διαφορετικά, όλες οι συνέπειες θα βαρύνουν τους ίδιους τους χρήστες. Αυτές οι πληροφορίες του ιστότοπου από το δίκτυο, η διαμάχη για τα πνευματικά δικαιώματα δεν έχει καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να αφαιρέσετε πλήρως το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, παρακαλούμε να υποστηρίξετε το γνήσιο λογισμικό, να αγοράσετε την εγγραφή και να λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, παρακαλούμε επικοινωνήστε μαζί μας μέσω ηλεκτρονικού ταχυδρομείου για να το αντιμετωπίσουμε.

Ταχυδρομείο To:help@itsvse.com

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

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

Γρήγορη απάντησηΕπιστροφή στην κορυφήΕπιστροφή στη λίστα