| I. Συνεχίζοντας από το προηγούμενο άρθρο Στο προηγούμενο άρθρο, μάθαμε για την υλοποίηση απλών εξωτερικών διακοπών μαζί. Αφού αποκτήσαμε πρακτική εμπειρία με τις διακοπές, θα συζητήσουμε τις διακοπές χρονιστών σε αυτή την ενότητα. ο CC2430 διαθέτει 4 χρονιστές, οι οποίοι μπορούν να χωριστούν σε 3 κατηγορίες: Timer1, Timer2, Timer3/4 (η χρήση των 3 και 4 είναι η ίδια). Δεδομένου ότι ο συγγραφέας αγγίζει επίσης μόλις το CC2430, το έργο που περιλαμβάνει εμπειρία χρονοδιακόπτη είναι ουσιαστικά μηδενική, οπότε δεν σκοπεύω να (και δεν μπορώ να βοηθήσω) σε βάθος ανάλυση του χρονοδιακόπτη. Αυτό το άρθρο μόνο για τη χρήση διακοπής υπερχείλισης του χρονοδιακόπτη 1 μετράει για να κάνει μια απλή πειραματική εξερεύνηση, για τη λειτουργία σύλληψης εισόδου / σύγκρισης εξόδου / PWM παραλείπεται. Ο χρονοδιακόπτης 2 και ο χρονοδιακόπτης 3/4 παρουσιάζονται επίσης μόνο εν συντομία. Περιμένοντας τη δύναμη του συγγραφέα να φτάσει σε ένα ορισμένο επίπεδο φωτιάς και στη συνέχεια να σταθεί στο ύψος της εμπειρίας μάχης Zigbee για τη βελτίωση αυτού του δοκιμίου. Χρονοδιακόπτης 1 Ο χρονοδιακόπτης1 είναι ένας χρονοδιακόπτης 16 bit με λειτουργίες χρονοδιακόπτη/μετρητή/διαμόρφωσης πλάτους παλμού. Διαθέτει τρία ξεχωριστά προγραμματιζόμενα κανάλια σύγκρισης σύλληψης εισόδου/εξόδου, καθένα από τα οποία μπορεί να χρησιμοποιηθεί ως έξοδος PWM ή να χρησιμοποιηθεί για τη σύλληψη του χρόνου ακμής του σήματος εισόδου (για περισσότερες πληροφορίες σχετικά με το τι είναι η σύγκριση σύλληψης εισόδου/εξόδου και πώς να υλοποιηθούν οι έξοδοι PWM, οι αναγνώστες μπορούν να ανατρέξουν μόνοι τους στο κινεζικό εγχειρίδιο του CC2430). Ο χρονοδιακόπτης έχει μια πολύ σημαντική έννοια: τον τρόπο λειτουργίας. Οι τρόποι λειτουργίας περιλαμβάνουν: ελεύθερη λειτουργία, modulo και up-down. Ακολουθεί η εισαγωγή των τριών τρόπων λειτουργίας από το κινεζικό εγχειρίδιο του CC2430:
Συγκρίνοντας τους τρεις τρόπους λειτουργίας, μπορεί να διαπιστωθεί ότι: η τιμή υπερχείλισης του τρόπου λειτουργίας ελεύθερης λειτουργίας είναι 0xFFFF, η οποία δεν μπορεί να αλλάξει, ενώ οι άλλοι δύο τρόποι λειτουργίας μπορούν να ελεγχθούν με ακρίβεια εκχωρώντας μια τιμή στο T1CC0, προκειμένου να ελεγχθεί με ακρίβεια η τιμή υπερχείλισης του χρονοδιακόπτη. Αυτό το πείραμα κάνει χρήση αυτής της δυνατότητας για να κάνει τον χρονοδιακόπτη να ενεργοποιεί μια διακοπή κάθε 1s μέσω του συγκεκριμένου T1CC0, έτσι ώστε να ελέγχεται με ακρίβεια το διάστημα αναβοσβήνει το LED του 1s. (1) Εισαγωγή στο πείραμα Στη λειτουργία modulo του χρονοδιακόπτη, το διάστημα αναβοσβήσματος της λυχνίας LED ελέγχεται με ακρίβεια ώστε να είναι 1s, δηλαδή: φως 0,5s → σκοτάδι 0,5s → φως 0,5s → σκοτάδι 0,5s ...... → φως 0,5s → σκοτάδι 0,5s (δηλ. η στιγμή μετάβασης από το σκοτάδι στο φως είναι 1s). Η αντιστροφή φωτός/σκοταδιού πραγματοποιείται με διακοπή υπερχείλισης. (2) Διάγραμμα ροής προγράμματος (3) Σχετικοί υπολογισμοί Όπως αναφέρθηκε προηγουμένως, η κατάσταση της λυχνίας LED είναι: φωτεινή 0,5s → σκοτεινή 0,5s → φωτεινή 0,5s → σκοτεινή 0,5s ...... → φωτεινή 0,5s → σκοτεινή 0,5s, και πρέπει να επιτευχθεί με τη διακοπή υπερχείλισης, οπότε η περίοδος υπερχείλισης του χρονοδιακόπτη απαιτείται να είναι 0,5s. Για το σκοπό αυτό, πρέπει να υπολογιστεί η αντίστοιχη τιμή υπερχείλισης (που προσωρινά τίθεται στο Ν). Η συχνότητα ρολογιού του συστήματος έχει επιλεγεί ως 32MHz και η συχνότητα ρολογιού που παρέχεται στον χρονοδιακόπτη είναι 16MHz από προεπιλογή (και οι δύο ρυθμίζονται από τον καταχωρητή ειδικής λειτουργίας CLKCON, τον οποίο μπορείτε να βρείτε στο κινεζικό εγχειρίδιο του CC2430). Για τον χρονοδιακόπτη 1, ρυθμίστε τη συχνότητα ρολογιού του σε 128 διαιρέσεις. Συνοψίζοντας, ο τύπος μπορεί να έχει ως εξής:
c
Μάθετε ότι N = 62500, το δεκαεξαδικό του είναι 0xF424, δηλαδή πρέπει να ορίσετε T1CC0H = 0xF4, T1CC0L = 0x24 δηλαδή .
(4) πειραματικός πηγαίος κώδικας και ανάλυση/* Περιγραφή πειράματος: Πείραμα Timer1, υπερχείλιση μετρητή χρονοδιακόπτη, αναβοσβήσιμο LED1 */ #include #define led1 P1_0 # define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
n bsp; /* αρχικοποίηση ρολογιού συστήματος-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // και οι δύο ενεργοποιούνταιwhile (! (SLEEP & 0x40 )); // ο κρυσταλλικός ταλαντωτής είναι ενεργοποιημένος και σταθερός CLKCON &=~0x47; &
nbsp; //επιλογή ταλαντωτή κρυστάλλου 32MHz SLEEP |=0x04; }/*Αρχικοποίηση LED-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 είναι μια κανονική θύρα εισόδου/εξόδου P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 έξοδοι led1 =1; &
nbsp; //Απενεργοποίηση όλων των LED led2 =1; led3 =1; led4 =1; }/*Τ1 αρχικοποίηση---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // ενεργοποίηση της συνολικής διακοπής & nbsp; T1IE=1; // ενεργοποίηση της διακοπής T1OVFIM=1; // ενεργοποίηση της υπερχείλισης T1
διακοπή T1CC0L=0x24; // τιμή υπερχείλισης χαμηλή 8 bits T1CC0H=0xF4; // τιμή υπερχείλισης υψηλή 8 bits &
nbsp; T1CTL =0x0e; //128 διαιρέσεις; λειτουργία modulo (0x0000->T1CC0); έναρξη λειτουργίας;T1IF=0; &
nbsp; // εκκαθάριση της σημαίας διακοπής }/* κύρια λειτουργία-------------------------------------------------------*/void main( void
) { xtal_init(), led_init(), timer1_init(),while ( 1 ), &
nbsp; //αναμονή για διακοπή υπερχείλισης }/*υπορουτίνα εξυπηρέτησης τερματικού Τ1-------------------------------------------------------*/#pragma vector=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //off interrupt led1 = !
led1; //LEDs reversedEA=1; //On interrupt  
; T1CTL &=~0x10; //καθαρισμός σημαίας διακοπής } Εντάξει, μεταγλωττίσετε το πρόγραμμα και online αποσφαλμάτωση, η πλακέτα ανάπτυξης στο LED1 αναβοσβήνει όπως αναμένεται, αισθάνονται το διάστημα αναβοσβήνει περίπου 1s. Αλλά αυτό δεν είναι αρκετό για να αποδείξει την επιτυχία του πειράματος, αν μπορείτε να προσδιορίσετε αυστηρά το διάστημα 1s θα ήταν τέλειο ~ έτσι άνοιξα το ρολόι WIN 7 (κάντε κλικ στη δεξιά πλευρά της γραμμής εργασιών ώρα μπορεί να είναι). Ενώ παρακολουθούσα τον δεύτερο δείκτη, έριξα μια ματιά στο LED1 που αναβόσβηνε από την άκρη του ματιού μου. Το αποτέλεσμα είναι: σε δύο λεπτά, ο ρυθμός των δύο είναι ουσιαστικά πανομοιότυπος (αυτή η ακρίβεια μπορεί να γίνει ανεκτή ~). Σε αυτό το σημείο, το πείραμα μπορεί να ειπωθεί ότι έχει ουσιαστικά ολοκληρωθεί, hehehe~ Τρίτον, χρονοδιακόπτης 2 Ο χρονοδιακόπτης2, γνωστός και ως χρονοδιακόπτης MAC, είναι ειδικά σχεδιασμένος για την υποστήριξη του πρωτοκόλλου παρακολούθησης συμβάντων στο MAC του IEEE 802.15.4. Ο χρονοδιακόπτης διαθέτει έναν μετρητή υπερχείλισης 8-bit που μπορεί να χρησιμοποιηθεί για την καταγραφή του αριθμού των κύκλων που έχουν συμβεί- διαθέτει έναν καταχωρητή σύλληψης 16-bit που χρησιμοποιείται για την καταγραφή του ακριβούς χρόνου λήψης/μετάδοσης ενός οριοθέτη έναρξης πλαισίου ή του ακριβούς χρόνου ολοκλήρωσης μιας μετάδοσης- και περιέχει επίσης έναν καταχωρητή σύγκρισης εξόδου 16-bit που χρησιμοποιείται για τη δημιουργία διαφόρων επιλεκτικών σημάτων επικοινωνίας εντολών προς την ασύρματη μονάδα σε συγκεκριμένη χρονική στιγμή (έναρξη λήψης, έναρξη μετάδοσης κ.λπ.). Χρονοδιακόπτης 3/4 Ο χρονοδιακόπτης 3/4 είναι ένας χρονοδιακόπτης 8-bit με λειτουργίες χρονοδιακόπτη/μετρητή/PWM. Ο t3/t4 διαθέτει δύο κανάλια σύγκρισης εξόδου, καθένα από τα οποία μπορεί να χρησιμοποιηθεί ως έξοδος PWM. V. Συμπέρασμα Σε αυτή την ενότητα, μάθαμε τη μέθοδο καταμέτρησης της διακοπής υπερχείλισης του χρονοδιακόπτη 1, και επιτύχαμε τον ακριβή έλεγχο του διαστήματος αναβοσβήσματος της λυχνίας LED 1 s. Θα αναφερθούμε μόνο συνοπτικά στους άλλους χρονοδιακόπτες και θα επιστρέψουμε για να τους προσθέσουμε αργότερα. Στην επόμενη ενότητα, θα παρουσιάσουμε σχετικά με την επικοινωνία μέσω της σειριακής θύρας του CC2430. |