Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 9371|Risposta: 0

Viaggio Zigbee (9): Diversi importanti esperimenti di base CC2430 - sonno sistematico e veglia interrotta

[Copiato link]
Pubblicato su 30/10/2014 23:24:30 | | | |
1. Collegamento tra i livelli superiori e inferiori

In questo articolo discuteremo la funzione del sonno e il metodo di risveglio di CC2430. Nell'uso reale, il nodo CC2430 è generalmente alimentato da batterie, quindi il controllo del suo consumo energetico è cruciale.

Di seguito è riportato un estratto dal manuale cinese del CC2430 per l'introduzione delle 4 modalità di consumo energetico del CC2430:

Come puoi vedere dalla tabella sopra, il CC2430 ha un totale di 4 modalità di alimentazione:PM0(completamente sveglio),PM1(un po' assonnato),PM2(mezzo sveglio e mezzo addormentato),PM3(Dormo molto profondamente). Più più indietro, più funzioni vengono disattivate e il consumo energetico è sempre più basso. Il rapporto di conversione tra loro è il seguente:

putPM1、PM2SvegliatiPM0, ci sono tre modi: reset, interruzione esterna, interruzione del timer del sonno; Ma mettitiPM3SvegliatiPM0, ci sono solo due modi: reset, interruzione esterna (questo perché inPM3Tutti gli oscillatori si sono fermati e ovviamente il timer di sospensione è stato spento~)

Facciamo un piccolo esperimento per introdurre come entrare in modalità sleep e come svegliarsiPM0Stato.

2. Esperimenti di sonno sistematico e risveglio interrotto(1) Introduzione all'esperimentoinizializzazione di sistema, inPM0
→ entraPM1
→ Svegliarsi dal timer dopo 1 secondoPM0
→ entraPM2
→ veniva svegliato dal timer dopo 2 secondiPM0
→ entraPM3
→ Aspettare che venga premuto il tasto S1, attivando un interrupt esterno e risvegliandosiPM0
(2) Diagramma di flusso del programma

(Nota: La casella arrotondata nell'immagine sopra indica lo stato di salute del sistema)

(3) Codice sorgente sperimentale e analisi (Le seguenti caselle possono essere cliccate~Definizione di file di header e macro[url=] [/url]
/*
    Descrizione sperimentale: Esperimento di sonno sveglio-interrotto, che introduce la veglia in tre modalità di sonno
*/

#include
#define LED_ON 0
#define LED_OFF 1#defineLed1 P1_0         
#defineled2 P1_1         
#defineled3 P1_2         
#defineled4 P1_3   [url=] [/url]

Sottofunzioni[url=] [/url]
/*Inizializzazione dell'orologio di sistema
-------------------------------------------------------
*/
Voidxtal_init(Void)
{
  SONNO &= ~0x04;            //Tutti sono alimentati
  mentre(! (SONNO &0x40));     //L'oscillatore a cristallo è acceso e stabile
  CLKCON &= ~0x47;         //Scegli un oscillatore a cristallo a 32MHz
  SONNO |=0x04;
}


/*Inizializzazione LED
-------------------------------------------------------
*/
Voidled_init(Void)
{
  P1SEL =0x00;         //P1 è la normale porta I/O
  P1DIR |=0x0F;         //Uscita P1.0 P1.1 P1.2 P1.3
  
  condotto1 = LED_OFF;         //Spegni tutti i LED
  condotto2 = LED_OFF;
  condotta 3 = LED_OFF;
  condotta 4 = LED_OFF;
}


/*Inizializzazione di interruzioni esterne
-------------------------------------------------------
*/
Voidio_init(Void)
{
    P0INP &= ~0X02;   //P0.1 ha pull-up e pull-down

    EA =1;           //Interruzione totale consentita
   
    IEN1 |=  0X20;   //P0IE = 1, P0 interrupt abilitati
   
    PICTL |=  0X09;   //P0.1 permette interrupt, trigger a bordo cadente
   
    P0IFG &= ~0x02;   //P0.1 Segno di interruzione chiaro0
}


/*Inizializzazione dell'interruzione del timer di sospensione
-------------------------------------------------------
*/
VoidsleepTimer_init(Void)
{
  STIF=0;   //Il segnale di interruzione del timer di sospensione è chiaro 0
   
  STIE=1;   //Attiva il timer interrotto
   
  EA=1;     //Apri l'interruzione totale
}


/*Imposta l'intervallo programmato per il timer di sonno
-------------------------------------------------------
*/
VoidsetSleepTimer(unsignedintsec)
{
  senza firmaturalungasleepTimer =0;
  
  sleepTimer |= ST0;                     //Ottieni il valore di conteggio del timer attuale
  sleepTimer |= (senza segnolunga)ST1 <<8;
  sleepTimer |= (senza segnolunga)ST2 <<16;
  
  sleepTimer += ((non segnatolunga)sec * (non firmatolunga)32768);   //In più la durata temporale richiesta
  
  ST2 = (senza segnoChar(sleepTimer >>16);   //Imposta il valore di confronto del timer del sonno
  ST1 = (senza segnoChar(sleepTimer >>8);
  ST0 = (senza segnoChar)sleepTimer;
}


/*Seleziona modalità di alimentazione
-------------------------------------------------------
*/
VoidPowerMode(non firmatoCharmode)
{
  se(modalità <4)
  {
    SONNO &=0xfc;      //Cancella SLEEP.MODE a 0
    SLEEP |= modalità;      //Seleziona modalità di alimentazione
    PCON |=0x01;        //Abilita questa modalità di alimentazione
  }
}


/*Funzione di ritardo
-------------------------------------------------------
*/
VoidRitardo (non firmatointn)
{
  senza firmaturainti,j;
  per(i=0; i<n; i++)
    per(j=0; j <1000; j++);
}
[url=] [/url]

Funzione principale[url=] [/url]
/*Funzione principale
-------------------------------------------------------
*/
Voidmain(Void)
{
  xtal_init();         
  led_init();         
  
  //Stato PM0, luce accesa e ritardo
  condotto1 = LED_ON;         //LED1 di luminosità indica che il sistema funziona in modalità PM0
  Ritardo (10);


  //Stato PM1, luci spente
  setSleepTimer(1);      //Imposta l'intervallo di tempo del timer di sonno a 1 secondo
  sleepTimer_init();     //Attiva il timer interrotto
  condotto1 = LED_OFF;
  PowerMode(1);         //Imposta la modalità di alimentazione su PM1
  
  
//Dopo 1s, PM1 entra in PM0, si illumina e ritarda
  condotto1 = LED_ON;
  Ritardo (50);
  
  //PM2, luci spente
  setSleepTimer(2);      //Imposta l'intervallo di tempo per il timer di sonno a 2 secondi
  condotto1 = LED_OFF;
  PowerMode(2);         //Imposta la modalità alimentazione su PM2


  
//Dopo 2 secondi, PM2 entra in PM0, si illumina e ritarda
  guidato1=0;
  Ritardo (50);
  
  //PM3, luci spente  
  io_init();            //Inizializzare le interruzioni esterne
  condotto1 = LED_OFF;
  PowerMode(3);         //Imposta la modalità di alimentazione su PM3
  
  
//Quando si verifica un'interruzione esterna, PM3 entra in PM0 e si illumina
  condotto1 = LED_ON;

  mentre(1);
}
[url=] [/url]

Procedure di servizio di interruzione[url=] [/url]
/*Programma di servizio di interruzione esterno
-------------------------------------------------------
*/
#pragmavettore = P0INT_VECTOR
__interruptVoidP0_ISR(Void)
{
  EA =0;                        //Il cancello viene interrotto
  
  Ritardo (50);

  se((P0IFG &0x02) >0)         //I tasti vengono interrotti
  {
    P0IFG &= ~0x02;               //P0.1 Segno di interruzione chiaro0
  }
  P0IF =0;                       //Segnale di interruzione P0 clear0


  EA =1;                        //Interruzione aperta
}


/*Il timer di sospensione interrompe i programmi di servizio
-------------------------------------------------------
*/
#pragmavettore= ST_VECTOR
__interruptVoidsleepTimer_IRQ(Void)
{
  EA=0;     //Il cancello viene interrotto
   
  STIF=0;   //Il segnale di interruzione del timer di sospensione è chiaro 0
  
  EA=1;     //Interruzione aperta
}
[url=] [/url]

Come utilizzare un timer di sonno per svegliare il sistema può essere riassunto come segue:Apri l'interruzione del timer di sospensione → imposta l'intervallo di tempo del timer → imposta la modalità di alimentazione

(Nota: il passaggio "Imposta l'intervallo del timer di sospensione" deve essere prima di "Imposta modalità di alimentazione", perché il sistema non continuerà a eseguire il programma dopo essere entrato in sospensione)

Poi, concentriamoci sulla sottofunzione che imposta l'intervallo del timer del sonno:setSleepTimer

Prima di tutto, una breve introduzione al timer del sonno: funziona32,768kHzdi24º postoTimer, quando il sistema è in esecuzioneOltre a PM3In tutte le modalità di alimentazione, il timer di sospensione saràFunzionamento ininterrotto

I registri utilizzati dai timer del sonno sono:ST0ST1ST2。 Di seguito è riportata un'introduzione dettagliata alle sue funzioni tratta dal manuale cinese CC2430:

Si può vedere che le loro funzioni includono due aspetti:Leggiscrivi

  Leggi: Utilizzato per leggere il valore di conteggio del timer corrente, l'ordine in cui le letture devono essere seguite:Leggi ST0 → leggi ST1 → leggi ST2

  scrivi: Utilizzato per impostare il valore di confronto del timer (quando il valore del conteggio = valore di confronto, avviene un interrupt), l'ordine di scrittura deve seguire:Scrivi ST2 → scrivi ST1 → scrivi ST0

OK, spieghiamolo in combinazione con il codice sorgente:

(1) Per prima cosa, definire un sleepTimer a variabile lunga non segnata (32 bit) per ricevere il valore attuale del sleep timer:

  senza firmaturalungasleepTimer =0;
  
  sleepTimer |= ST0;                     //Ottieni il valore di conteggio del timer attuale
  sleepTimer |= (senza segnolunga)ST1 <<8;
  sleepTimer |= (senza segnolunga)ST2 <<16;

(2) Poi aggiungi l'intervallo di tempo richiesto:

  sleepTimer += ((non segnatolunga)sec * (non firmatolunga)32768);   //In più la durata temporale richiesta

Ecco una piccola spiegazione:

Perché 1s rappresenta 32768? Poiché il timer funziona sotto i 32,768kHz, impiega 1/32768 s per ogni 1 aggiunto al timer; Aggiungi 32768, e ti servirà 1s;

(3) Infine, il valore di sleepTimer viene usato come valore di confronto del timer:

  ST2 = (senza segnoChar(sleepTimer >>16);   //Imposta il valore di confronto del timer del sonno
  ST1 = (senza segnoChar(sleepTimer >>8);
  ST0 = (senza segnoChar)sleepTimer;

In questo modo, puoi impostare con successo il periodo temporale del timer~

(Nota: Per quanto riguarda le altre parti del codice sorgente, credo che combinate con annotazioni dettagliate si possano facilmente capire, e non lo ripeterò qui)

(4) Risultati sperimentali
Esecuzione, osservando LED1, il fenomeno è:LED1 lampeggia (cioè acceso o > spento 1 volta), lampeggia di nuovo dopo 1 secondo, lampeggia di nuovo dopo 2 secondi, poi rimane spento, e poi preme S1, LED1 si accende.
Il fenomeno sperimentale è completamente coerente con l'aspettativa, Over~

3. Conclusione

Oh~ Dopo aver preso 2 giorni di tempo libero, finalmente ho ricevuto questo registro. Ho davvero scoperto che scrivere un blog, specialmente un post "facile da leggere", è davvero un lavoro fisico: rigore, estetica, logica... È tutta una questione di considerazione.

Ogni volta che pubblico il codice, penso che sia troppo lungo, ma sono riluttante a usare lo strumento pieghevole che viene fornito con il blog garden. Pertanto, in questo post sul blog, l'autore ha aggiunto con cautela alcuni elementi JQuery per ottenere un piegamento fluido del codice, e c'è ancora un piccolo senso di realizzazione, hehe (JQuery rookie, non ridere del master~). Ma non so se questo migliori davvero la leggibilità dell'articolo, e lettori e amici sono benvenuti a commentare :)

Questo mese, l'autrice ha davvero deciso di mettere radici nel giardino del blog, così ho passato molto tempo libero a scrivere post sul blog. Quando ho scritto un blog per la prima volta, anche se c'erano pochi commenti, la maggior parte dei log aveva un tasso di click superiore a 500, il che per me è stato un piccolo incoraggiamento! Ci vuole coraggio per pubblicare contenuti sui microcontrollori nel blog garden, ma io ci rimarrò~

I nove post del blog, dall'inizio a oggi, si concentrano sull'uso di moduli hardware di base sul chip CC2430. Finora, abbiamo praticamente esaminato la maggior parte delle periferiche del CC2430, ma ci sono ancora elementi come l'accesso Flash, il generatore di numeri casuali, il coprocessore AES, la comunicazione RF, ecc., che non sono stati ancora affrontati. Tuttavia, il percorso Zigbee non è ancora finito, e l'autore intende colmare selettivamente queste lacune nel prossimo argomento (implementazione del protocollo Z-Stack).

Nel prossimo post sul blog, ho intenzione di concludere il primo viaggio di Zigbee con un esperimento leggermente più completo e esteso - "sistema di monitoraggio della temperatura", e spiegare come applicare in modo completo i punti di conoscenza appresi in precedenza.

In realtà, non è qualificato per essere chiamato "SpiegazioneCome principiante, l'autore spera solo di incoraggiarsi a vicenda e fare progressi insieme nel processo di scrittura di un dottorato!


</n; i++)




Precedente:Zigbee Journey (8): Diversi importanti esperimenti di base CC2430 - watchdog
Prossimo:Zigbee Journey (10): Esperimento completo - Sistema di monitoraggio della temperatura basato su CC2430
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com