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

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

Ταξίδι με Zigbee (9): Αρκετά σημαντικά βασικά πειράματα CC2430 - συστηματικός ύπνος και διακοπτόμενη εγρήγορση

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

Σε αυτό το άρθρο, θα συζητήσουμε τη λειτουργία ύπνου και τη μέθοδο αφύπνισης του CC2430. Στην πραγματική χρήση, ο κόμβος CC2430 τροφοδοτείται γενικά από μπαταρίες, επομένως ο έλεγχος της κατανάλωσης ενέργειας είναι ζωτικής σημασίας.

Ακολουθεί ένα απόσπασμα από το κινεζικό εγχειρίδιο CC2430 για την εισαγωγή των 4 τρόπων κατανάλωσης ενέργειας του CC2430:

Όπως μπορείτε να δείτε από τον παραπάνω πίνακα, το CC2430 έχει συνολικά 4 λειτουργίες ισχύος:ΑΣ0(πλήρως ξύπνιος),ΑΣ1(λίγο νυσταγμένος),ΑΣ2(μισός ξύπνιος και μισοκοιμισμένος),ΑΣ3(Κοιμάται πολύ σκληρά). Όσο πιο πίσω, τόσο περισσότερες λειτουργίες απενεργοποιούνται και η κατανάλωση ενέργειας είναι όλο και χαμηλότερη. Η σχέση μετατροπής μεταξύ τους έχει ως εξής:

βάλεΑΣ1, ΜΡ2ΞύπναΑΣ0, υπάρχουν τρεις τρόποι: επαναφορά, εξωτερική διακοπή, διακοπή χρονοδιακόπτη ύπνου. Αλλά βάλτεΑΣ3ΞύπναΑΣ0, υπάρχουν μόνο δύο τρόποι: επαναφορά, εξωτερική διακοπή (αυτό συμβαίνει επειδή στοΑΣ3Όλοι οι ταλαντωτές σταμάτησαν να λειτουργούν και φυσικά ο χρονοδιακόπτης ύπνου απενεργοποιήθηκε~)

Ας περάσουμε από ένα μικρό πείραμα για να παρουσιάσουμε πώς να μπείτε σε κατάσταση ύπνου και πώς να ξυπνήσετεΑΣ0κράτος.

2. Συστηματικά πειράματα ύπνου και διακοπτόμενης αφύπνισης(1) Εισαγωγή στο πείραμααρχικοποίηση συστήματος, σεΑΣ0
→ μπείτεΑΣ1
→ Ξυπνήστε με το χρονόμετρο ύπνου μετά από 1 δευτερόλεπτοΑΣ0
→ μπείτεΑΣ2
→ ξύπνησε από το χρονόμετρο ύπνου μετά από 2 δευτερόλεπταΑΣ0
→ μπείτεΑΣ3
→ Περιμένετε να πατηθεί το πλήκτρο S1, ενεργοποιώντας μια εξωτερική διακοπή και ξυπνώνταςΑΣ0
(2) Διάγραμμα ροής προγράμματος

(Σημείωση: Το στρογγυλεμένο πλαίσιο στην παραπάνω εικόνα υποδεικνύει την κατάσταση υγείας του συστήματος)

(3) Πειραματικός πηγαίος κώδικας και ανάλυση (Μπορείτε να κάνετε κλικ στα ακόλουθα πλαίσια~Αρχείο κεφαλίδας και ορισμός μακροεντολής[url=] [/url]
/*
    Πειραματική περιγραφή: Πείραμα διακοπτόμενου ύπνου αφύπνισης, το οποίο εισάγει την εγρήγορση σε τρεις λειτουργίες ύπνου
*/

#include
#define LED_ON 0
#define LED_OFF 1#defineLED1 P1_0         
#defineLED2 P1_1         
#defineLED3 P1_2         
#defineLED4 P1_3   [url=] [/url]

Δευτερεύουσες λειτουργίες[url=] [/url]
/*Αρχικοποίηση ρολογιού συστήματος
-------------------------------------------------------
*/
άκυρο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 = LED_OFF;         //Απενεργοποιήστε όλες τις λυχνίες LED
  LED2 = LED_OFF;
  LED3 = LED_OFF;
  LED4 = LED_OFF;
}


/*Προετοιμασία εξωτερικής διακοπής
-------------------------------------------------------
*/
άκυροio_init(άκυρο)
{
    P0INP &= ~0X02;   //Το P0.1 έχει pull-up και pull-down

    ΕΑ =1;           //Επιτρέπεται η συνολική διακοπή
   
    IEN1 |=  0X20;   //P0IE = 1, οι διακοπές P0 ενεργοποιούνται
   
    PICTL |=  0X09;   //Το P0.1 επιτρέπει διακοπές, ενεργοποιήσεις πτώσης άκρων
   
    P0IFG &= ~0x02;   //P0.1 Διαγραφή σημείου διακοπής0
}


/*Αρχικοποίηση διακοπής χρονοδιακόπτη ύπνου
-------------------------------------------------------
*/
άκυροsleepTimer_init(άκυρο)
{
  STIF=0;   //Η ένδειξη διακοπής του χρονοδιακόπτη ύπνου είναι καθαρή 0
   
  STIE=1;   //Η ενεργοποίηση του χρονοδιακόπτη ύπνου διακόπηκε
   
  ΕΑ=1;     //Ανοίξτε την ολική διακοπή
}


/*Ορίστε το προγραμματισμένο διάστημα για το χρονόμετρο ύπνου
-------------------------------------------------------
*/
άκυροsetSleepTimer(ανυπόγραφοΔιεθνέςδευτ.)
{
  ανυπόγραφομακρύςχρονοδιακόπτης ύπνου =0;
  
  χρονοδιακόπτης ύπνου |= ST0;                     //Λάβετε την τιμή μέτρησης του τρέχοντος χρονοδιακόπτη ύπνου
  sleepTimer |= (ανυπόγραφομακρύς)ST1 <<8;
  sleepTimer |= (ανυπόγραφομακρύς)ST2 <<16;
  
  sleepTimer += ((ανυπόγραφομακρύς)sec * (ανυπόγραφομακρύς)32768);   //Συν την απαιτούμενη χρονική διάρκεια
  
  ST2 = (ανυπόγραφοκάρβουνο)(sleepTimer >>16);   //Ορίστε την τιμή σύγκρισης του χρονοδιακόπτη ύπνου
  ST1 = (ανυπόγραφοκάρβουνο)(sleepTimer >>8);
  ST0 = (ανυπόγραφοκάρβουνο)χρονοδιακόπτης ύπνου;
}


/*Επιλέξτε Power Mode (Λειτουργία τροφοδοσίας)
-------------------------------------------------------
*/
άκυροPowerMode (χωρίς υπογραφήκάρβουνοτρόπος)
{
  αν(τρόπος <4)
  {
    ΥΠΝΟΣ &=0xfc;      //Διαγράψτε το SLEEP.MODE στο 0
    SLEEP |= κατάσταση·      //Επιλέξτε Power Mode (Λειτουργία τροφοδοσίας)
    ΠΚΟΝ |=0x01;        //Ενεργοποιήστε αυτήν τη λειτουργία τροφοδοσίας
  }
}


/*Λειτουργία καθυστέρησης
-------------------------------------------------------
*/
άκυροΚαθυστέρηση (χωρίς υπογραφήΔιεθνέςn)
{
  ανυπόγραφοΔιεθνέςi,j;
  Για(i=0; i<n; i++)
    Για(ι=0; j <1000; j++);
}
[url=] [/url]

κύρια λειτουργία[url=] [/url]
/*κύρια λειτουργία
-------------------------------------------------------
*/
άκυροmain(άκυρο)
{
  xtal_init();         
  led_init();         
  
  //Κατάσταση PM0, αναμμένο φως και καθυστέρηση
  led1 = LED_ON;         //Η λυχνία LED1 φωτεινότητας υποδεικνύει ότι το σύστημα λειτουργεί σε λειτουργία PM0
  Καθυστέρηση(10);


  //Κατάσταση PM1, σβηστά φώτα
  setSleepTimer(1);      //Ρυθμίστε το χρονικό διάστημα του χρονοδιακόπτη ύπνου σε 1 δευτερόλεπτο
  sleepTimer_init();     //Η ενεργοποίηση του χρονοδιακόπτη ύπνου διακόπηκε
  led1 = LED_OFF;
  PowerMode(1);         //Ρυθμίστε τη λειτουργία τροφοδοσίας σε PM1
  
  
//Μετά από 1 δευτερόλεπτο, το PM1 εισέρχεται σε PM0, ανάβει και καθυστερεί
  led1 = LED_ON;
  Καθυστέρηση(50);
  
  //PM2, σβηστά φώτα
  setSleepTimer(2);      //Ρυθμίστε το χρονικό διάστημα για το χρονόμετρο ύπνου σε 2 δευτερόλεπτα
  led1 = LED_OFF;
  PowerMode(2);         //Ρυθμίστε τη λειτουργία τροφοδοσίας σε PM2


  
//Μετά από 2 δευτερόλεπτα, το PM2 εισέρχεται σε PM0, ανάβει και καθυστερεί
  led1=0;
  Καθυστέρηση(50);
  
  //PM3, σβηστά φώτα  
  io_init();            //Αρχικοποίηση εξωτερικών διακοπών
  led1 = LED_OFF;
  PowerMode(3);         //Ρυθμίστε τη λειτουργία τροφοδοσίας σε PM3
  
  
//Όταν συμβαίνει μια εξωτερική διακοπή, τα PM3 εισέρχονται σε PM0 και ανάβουν
  led1 = LED_ON;

  ενώ(1);
}
[url=] [/url]

Διαδικασίες διακοπής υπηρεσίας[url=] [/url]
/*Πρόγραμμα εξωτερικής υπηρεσίας διακοπής
-------------------------------------------------------
*/
#pragmaδιάνυσμα = P0INT_VECTOR
__interruptάκυροP0_ISR(άκυρο)
{
  ΕΑ =0;                        //Η πύλη διακόπτεται
  
  Καθυστέρηση(50);

  αν((P0IFG &0x02) >0)         //Τα πλήκτρα διακόπτονται
  {
    P0IFG &= ~0x02;               //P0.1 Διαγραφή σημείου διακοπής0
  }
  Ρ0ΑΝ =0;                       //Διαγραφή σημείου διακοπής P00


  ΕΑ =1;                        //Ανοιχτή διακοπή
}


/*Ο χρονοδιακόπτης ύπνου διακόπτει τα προγράμματα σέρβις
-------------------------------------------------------
*/
#pragmaδιάνυσμα= ST_VECTOR
__interruptάκυροsleepTimer_IRQ(άκυρο)
{
  ΕΑ=0;     //Η πύλη διακόπτεται
   
  STIF=0;   //Η ένδειξη διακοπής του χρονοδιακόπτη ύπνου είναι καθαρή 0
  
  ΕΑ=1;     //Ανοιχτή διακοπή
}
[url=] [/url]

Ο τρόπος χρήσης ενός χρονοδιακόπτη ύπνου για την αφύπνιση του συστήματος μπορεί να συνοψιστεί ως εξής:Ανοίξτε τη Διακοπή χρονοδιακόπτη ύπνου → ρυθμίστε το χρονικό διάστημα του χρονοδιακόπτη ύπνου → ρυθμίστε τη λειτουργία τροφοδοσίας

(Σημείωση: Το βήμα "Ρύθμιση του διαστήματος χρονοδιακόπτη ύπνου" πρέπει να είναι πριν από το "Set Power Mode", επειδή το σύστημα δεν θα συνεχίσει να εκτελεί το πρόγραμμα μετά την είσοδο σε κατάσταση αναστολής λειτουργίας)

Στη συνέχεια, ας εστιάσουμε στην υπολειτουργία που ορίζει το διάστημα του χρονοδιακόπτη ύπνου:setSleepTimer

Πρώτα απ 'όλα, μια σύντομη εισαγωγή στο χρονόμετρο ύπνου: λειτουργεί32.768 kHzτης24η θέσηΧρονοδιακόπτης, όταν το σύστημα λειτουργείΕκτός από τα PM3Σε όλες τις λειτουργίες τροφοδοσίας, ο χρονοδιακόπτης ύπνου θα είναιΑδιάλειπτη λειτουργία

Οι καταχωρητές που χρησιμοποιούνται από τους χρονοδιακόπτες ύπνου είναι:ΣΤ0ΣΤ1ΣΤ2。 Ακολουθεί μια λεπτομερής εισαγωγή στις λειτουργίες του από το κινεζικό εγχειρίδιο CC2430:

Μπορεί να φανεί ότι οι λειτουργίες τους περιλαμβάνουν δύο πτυχές:ΔιαβάστεΕγγραφή

  Διαβάστε: Χρησιμοποιείται για την ανάγνωση της τιμής μέτρησης του τρέχοντος χρονοδιακόπτη, τη σειρά με την οποία πρέπει να ακολουθούνται οι μετρήσεις:Διαβάστε το ST0 → Διαβάστε το ST1 → Διαβάστε το ST2

  Εγγραφή: Χρησιμοποιείται για τον ορισμό της τιμής σύγκρισης του χρονοδιακόπτη (όταν η τιμή μέτρησης του χρονοδιακόπτη = τιμή σύγκρισης, εμφανίζεται μια διακοπή), η σειρά γραφής πρέπει να ακολουθεί:Γράψτε ST2 → γράψτε ST1 → γράψτε ST0

Εντάξει, ας το εξηγήσουμε σε συνδυασμό με τον πηγαίο κώδικα:

(1) Αρχικά, ορίστε μια ανυπόγραφη μεταβλητή μεγάλου μήκους (32-bit) sleepTimer για να λάβετε την τρέχουσα τιμή μέτρησης του χρονοδιακόπτη ύπνου:

  ανυπόγραφομακρύςχρονοδιακόπτης ύπνου =0;
  
  χρονοδιακόπτης ύπνου |= ST0;                     //Λάβετε την τιμή μέτρησης του τρέχοντος χρονοδιακόπτη ύπνου
  sleepTimer |= (ανυπόγραφομακρύς)ST1 <<8;
  sleepTimer |= (ανυπόγραφομακρύς)ST2 <<16;

(2) Στη συνέχεια, προσθέστε το απαιτούμενο χρονικό διάστημα:

  sleepTimer += ((ανυπόγραφομακρύς)sec * (ανυπόγραφομακρύς)32768);   //Συν την απαιτούμενη χρονική διάρκεια

Εδώ είναι μια μικρή εξήγηση:

Γιατί το 1s αντιπροσωπεύει το 32768; Επειδή ο χρονοδιακόπτης λειτουργεί κάτω από τα 32.768 kHz, χρειάζεται 1/32768 s για κάθε 1 που προστίθεται στο χρονόμετρο. Προσθέστε 32768 και θα χρειαστείτε 1.

(3) Τέλος, η τιμή του sleepTimer χρησιμοποιείται ως τιμή σύγκρισης του χρονοδιακόπτη:

  ST2 = (ανυπόγραφοκάρβουνο)(sleepTimer >>16);   //Ορίστε την τιμή σύγκρισης του χρονοδιακόπτη ύπνου
  ST1 = (ανυπόγραφοκάρβουνο)(sleepTimer >>8);
  ST0 = (ανυπόγραφοκάρβουνο)χρονοδιακόπτης ύπνου;

Με αυτόν τον τρόπο, μπορείτε να ρυθμίσετε με επιτυχία τη χρονική περίοδο του χρονοδιακόπτη~

(Σημείωση: Όσο για τα άλλα μέρη του πηγαίου κώδικα, πιστεύω ότι σε συνδυασμό με λεπτομερείς σχολιασμούς, μπορείτε εύκολα να καταλάβετε και δεν θα το επαναλάβω εδώ)

(4) Πειραματικά αποτελέσματα
Εκτέλεση προγράμματος, παρατηρώντας LED1, το φαινόμενο είναι:Το LED1 αναβοσβήνει (δηλαδή, on-> off 1 φορά), αναβοσβήνει ξανά μετά από 1 δευτερόλεπτο, αναβοσβήνει ξανά μετά από 2 δευτερόλεπτα, μετά παραμένει σβηστό και, στη συνέχεια, πατάει το S1, το LED1 ανάβει.
Το πειραματικό φαινόμενο είναι απόλυτα συνεπές με την προσδοκία, Over~

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

Ω~ Αφού αφιέρωσα 2 ημέρες ελεύθερου χρόνου, τελικά πήρα αυτό το αρχείο καταγραφής. Πραγματικά διαπίστωσα ότι η συγγραφή ενός ιστολογίου, ειδικά μιας «φιλικής προς τον αναγνώστη» ανάρτησης ιστολογίου, είναι πράγματι μια φυσική δουλειά: αυστηρότητα, αισθητική, λογική... Όλα είναι θέμα εξέτασης.

Κάθε φορά που δημοσιεύω τον κωδικό, νομίζω ότι είναι πολύ μεγάλος, αλλά διστάζω να χρησιμοποιήσω το αναδιπλούμενο εργαλείο που συνοδεύει τον κήπο του ιστολογίου. Ως εκ τούτου, σε αυτήν την ανάρτηση ιστολογίου, ο συγγραφέας πρόσθεσε δοκιμαστικά ορισμένα στοιχεία JQuery για να επιτύχει ομαλή αναδίπλωση του κώδικα και εξακολουθεί να υπάρχει μια μικρή αίσθηση ολοκλήρωσης, χεχε (JQuery rookie, μην γελάτε με τον κύριο~). Αλλά δεν ξέρω αν αυτό ενισχύει πραγματικά την αναγνωσιμότητα του άρθρου και οι αναγνώστες και οι φίλοι είναι ευπρόσδεκτοι να σχολιάσουν:)

Αυτόν τον μήνα, ο συγγραφέας αποφάσισε πραγματικά να ριζώσει στον κήπο του ιστολογίου, οπότε πέρασα πολύ ελεύθερο χρόνο γράφοντας αναρτήσεις ιστολογίου. Όταν έγραψα ένα blog για πρώτη φορά, αν και υπήρχαν λίγα σχόλια, τα περισσότερα από τα αρχεία καταγραφής είχαν αναλογία κλικ προς αριθμό εμφανίσεων άνω των 500, κάτι που ήταν μια μικρή ενθάρρυνση για μένα! Χρειάζεται θάρρος για να δημοσιεύσετε περιεχόμενο σχετικά με μικροελεγκτές στον κήπο του ιστολογίου, αλλά θα επιμείνω σε αυτό~

Οι εννέα αναρτήσεις ιστολογίου από την αρχή έως σήμερα επικεντρώνονται στη χρήση βασικών μονάδων υλικού στο τσιπ CC2430. Μέχρι στιγμής, έχουμε βασικά περάσει από τα περισσότερα περιφερειακά στο CC2430, αλλά εξακολουθούν να υπάρχουν πράγματα όπως η πρόσβαση Flash, η γεννήτρια τυχαίων αριθμών, ο συνεπεξεργαστής AES, η επικοινωνία RF κ.λπ., τα οποία δεν έχουν θιγεί. Ωστόσο, το ταξίδι του Zigbee δεν έχει τελειώσει και ο συγγραφέας σκοπεύει να συμπληρώσει επιλεκτικά αυτές τις παραλείψεις στο επόμενο θέμα (εφαρμογή του πρωτοκόλλου Z-Stack).

Στην επόμενη ανάρτηση ιστολογίου, σκοπεύω να τελειώσω το πρώτο ταξίδι του Zigbee με ένα ελαφρώς πιο ολοκληρωμένο και εκτεταμένο πείραμα - "σύστημα παρακολούθησης θερμοκρασίας", και να εξηγήσω πώς να εφαρμόσω ολοκληρωμένα τα σημεία γνώσης που έμαθα νωρίτερα.

Στην πραγματικότητα, δεν έχει τα προσόντα να ονομάζεται "εξήγησηΩς αρχάριος, ο συγγραφέας ελπίζει μόνο να ενθαρρύνει ο ένας τον άλλον και να σημειώσουν πρόοδο μαζί στη διαδικασία συγγραφής διδακτορικού!


</n; i++)




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

Mail To:help@itsvse.com