Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 9371|Odpoveď: 0

Zigbee Journey (9): Niekoľko dôležitých základných experimentov CC2430 – systematický spánok a prerušovaná bdelosť

[Kopírovať odkaz]
Zverejnené 30. 10. 2014 23:24:30 | | | |
1. Prepojenie hornej a dolnej úrovne

V tomto článku sa budeme venovať funkcii spánku a metóde prebúdzania v CC2430. Pri skutočnom používaní je uzol CC2430 zvyčajne napájaný batériami, takže kontrola jeho spotreby energie je kľúčová.

Nasleduje úryvok z čínskeho manuálu CC2430 pre zavedenie 4 režimov spotreby energie CC2430:

Ako vidíte z tabuľky vyššie, CC2430 má celkovo 4 režimy napájania:PM0(úplne prebudený),PM1(trochu ospalý),PM2(polospánku a polospánku),PM3(Veľmi tvrdý spánok). Čím ďalej vzadu, tým viac funkcií sa vypne a spotreba energie je stále nižšia. Konverzný vzťah medzi nimi je nasledovný:

PutPM1、PM2Zobuď saPM0, existujú tri spôsoby: reset, vonkajšie prerušenie, prerušenie spánkového časovača; Ale dajPM3Zobuď saPM0, existujú len dva spôsoby: reset, externé prerušenie (pretože vPM3Všetky oscilátory prestali fungovať a samozrejme časovač spánku bol vypnutý~)

Poďme si prejsť malým experimentom, ktorý vám ukáže, ako vstúpiť do režimu spánku a ako sa zobudiťPM0štátu.

2. Systematický spánok a experimenty s prerušovaným prebúdzaním(1) Úvod do experimentuInicializácia systému, vPM0
→ vstupPM1
→ Zobudiť sa podľa spánkového časovača po 1 sekundePM0
→ vstupPM2
→ prebudil spánkový časovač po 2 sekundáchPM0
→ vstupPM3
→ Počkať, kým sa stlačí kláves S1, spustí sa externé prerušenie a prebudí saPM0
(2) Schéma toku programu

(Poznámka: Zaokrúhlené políčko na obrázku vyššie ukazuje zdravotný stav systému)

(3) Experimentálny zdrojový kód a analýza (Nasledujúce políčka je možné kliknúť~Hlavičkový súbor a definícia makier[url=] [/url]
/*
    Experimentálny popis: Experiment prerušovaného prebúdzacieho spánku, ktorý zavádza bdelosť v troch režimoch spánku
*/

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

Podfunkcie[url=] [/url]
/*Inicializácia systémových hodín
-------------------------------------------------------
*/
prázdnotaxtal_init(prázdnota)
{
  SPAJ &= ~0x04;            //Všetky sú napájané
  zatiaľ čo(! (SLEEP &0x40));     //Kryštálový oscilátor je zapnutý a stabilný
  CLKCON &= ~0x47;         //Vyberte 32MHz kryštálový oscilátor
  SPAK |=0x04;
}


/*Inicializácia LED
-------------------------------------------------------
*/
prázdnotaled_init(prázdnota)
{
  P1SEL =0x00;         //P1 je bežný I/O port
  P1DIR |=0x0F;         //P1.0 P1.1 P1.2 P1.3 výstup
  
  led1 = LED_OFF;         //Vypnite všetky LED diódy
  LED2 = LED_OFF;
  led3 = LED_OFF;
  led4 = LED_OFF;
}


/*Inicializácia externého prerušenia
-------------------------------------------------------
*/
prázdnotaio_init(prázdnota)
{
    P0INP &= ~0X02;   //P0.1 má pull-up a pull-down

    EA =1;           //Úplné prerušenie povolené
   
    IEN1 |=  0X20;   //P0IE = 1, P0 prerušení je povolené
   
    PICTL |=  0X09;   //P0.1 povoľuje prerušenia, drop edge triggery
   
    P0IFG &= ~0x02;   //P0.1 Značka prerušenia clear00
}


/*Inicializácia prerušenia spánkového časovača
-------------------------------------------------------
*/
prázdnotasleepTimer_init(prázdnota)
{
  STIF=0;   //Značka prerušenia spánkového časovača je čistá 0
   
  STIE=1;   //Zapnite časovač spánku prerušený
   
  EA=1;     //Otvorte úplné prerušenie
}


/*Nastavte si plánovaný interval pre časovač spánku
-------------------------------------------------------
*/
prázdnotasetSleepTimer (nepodpísanéintsec)
{
  nepodpísanédlhýsleepTimer =0;
  
  sleepTimer |= ST0;                     //Získajte hodnotu aktuálneho spánkového časovača
  sleepTimer |= (nepodpísanédlhý)ST1 <<8;
  sleepTimer |= (nepodpísanédlhý)ST2 <<16;
  
  sleepTimer += ((unsigneddlhý)sec * (nepodpísanédlhý)32768);   //Plus požadovaná časová dĺžka
  
  ST2 = (neoznačenéchar(SleepTimer >>16);   //Nastavte porovnávaciu hodnotu spánkového časovača
  ST1 = (neoznačenéchar(SleepTimer >>8);
  ST0 = (nepodpísanéchar)sleepTimer;
}


/*Vyberte režim napájania
-------------------------------------------------------
*/
prázdnotaPowerMode(nepodpísanýcharrežim)
{
  ak(mód <4)
  {
    SPAŤ &=0xfc;      //Vyčisti režim spánku na 0
    SLEEP |= režim;      //Vyberte režim napájania
    PCON |=0x01;        //Zapnite tento režim napájania
  }
}


/*Oneskorujúca funkcia
-------------------------------------------------------
*/
prázdnotaOneskorenie (nepodpísanéintn)
{
  nepodpísanéinti,j;
  pre(i=0; i<n; i++)
    pre(j=0; j <1000; j++);
}
[url=] [/url]

Hlavná funkcia[url=] [/url]
/*Hlavná funkcia
-------------------------------------------------------
*/
prázdnotamain(prázdnota)
{
  xtal_init();         
  led_init();         
  
  //Stav PM0, svetlo svieti a oneskorenie
  led1 = LED_ON;         //Jas LED1 indikuje, že systém funguje v režime PM0
  Oneskorenie(10);


  //PM1 štát, svetlá zhasnuté
  setSleepTimer(1);      //Nastavte časový interval spánkového časovača na 1s
  sleepTimer_init();     //Zapnite časovač spánku prerušený
  led1 = LED_OFF;
  PowerMode(1);         //Nastavte režim napájania na PM1
  
  
//Po jednotkách PM1 vstupuje do PM0, rozsvieti sa a oneskorí
  led1 = LED_ON;
  Oneskorenie(50);
  
  //PM2, svetlá zhasnuté
  setSleepTimer(2);      //Nastavte časový interval pre časovač spánku na 2 sekundy
  led1 = LED_OFF;
  PowerMode(2);         //Nastavte režim napájania na PM2


  
//Po 2 sekundách PM2 vstúpi do PM0, rozsvieti sa a oneskorí
  led1=0;
  Oneskorenie(50);
  
  //PM3, zhasnuté svetlá  
  io_init();            //Inicializácia externých prerušení
  led1 = LED_OFF;
  PowerMode(3);         //Nastavte režim napájania na PM3
  
  
//Keď dôjde k vonkajšiemu prerušeniu, PM3 vstúpi do PM0 a rozsvieti sa
  led1 = LED_ON;

  zatiaľ čo(1);
}
[url=] [/url]

Postupy služby prerušení[url=] [/url]
/*Program služby externých prerušení
-------------------------------------------------------
*/
#pragmavektor = P0INT_VECTOR
__interruptprázdnotaP0_ISR(prázdnota)
{
  EA =0;                        //Brána je prerušená
  
  Oneskorenie(50);

  ak((P0IFG &0x02) >0)         //Klávesy sú prerušené
  {
    P0IFG &= ~0x02;               //P0.1 Značka prerušenia clear00
  }
  P0IF =0;                       //P0 prerušovací znak clear0


  EA =1;                        //Otvorené prerušenie
}


/*Časovač spánku prerušuje servisné programy
-------------------------------------------------------
*/
#pragmavektor= ST_VECTOR
__interruptprázdnotasleepTimer_IRQ(prázdnota)
{
  EA=0;     //Brána je prerušená
   
  STIF=0;   //Značka prerušenia spánkového časovača je čistá 0
  
  EA=1;     //Otvorené prerušenie
}
[url=] [/url]

Ako použiť časovač spánku na prebudenie systému možno zhrnúť nasledovne:Otvorte prerušenie spánkového časovača → nastavte časový interval spánkového časovača → nastavte režim napájania

(Poznámka: Krok "Nastaviť interval časovača spánku" musí byť pred "Nastaviť režim napájania", pretože systém nebude pokračovať v spustení programu po prechode do spánku)

Ďalej sa zamerajme na podfunkciu, ktorá nastavuje interval spánkového časovača:setSleepTimer

Najprv krátke predstavenie o časovači spánku: beží ďalej32,768 kHzz24. miestoČasovač, keď systém bežíOkrem PM3Vo všetkých režimoch napájania bude časovač spánkuNepretržitá prevádzka

Registre používané časovačmi spánku sú:ST0ST1ST2。 Nasleduje podrobný úvod do jeho funkcií z čínskeho manuálu CC2430:

Je zrejmé, že ich funkcie zahŕňajú dva aspekty:Prečítajte sipíš

  Prečítajte si: Používa sa na čítanie hodnoty aktuálneho časovača, poradia, v akom sa musia merania dodržiavať:Čítaj ST0 → čítaj ST1 → čítaj ST2

  píš: Používa sa na nastavenie hodnoty porovnávania časovača (keď hodnota počítania = hodnota porovnania, nastane prerušenie), poradie zápisu musí nasledovať:Zapíš ST2 → zapíš ST1 → zapíš ST0

Dobre, vysvetlíme to v kombinácii so zdrojovým kódom:

(1) Najprv definujte neznamienkovú dlhú premennú (32-bitovú) sleepTimer na prijatie aktuálnej hodnoty počtu sleepTimerov:

  nepodpísanédlhýsleepTimer =0;
  
  sleepTimer |= ST0;                     //Získajte hodnotu aktuálneho spánkového časovača
  sleepTimer |= (nepodpísanédlhý)ST1 <<8;
  sleepTimer |= (nepodpísanédlhý)ST2 <<16;

(2) Potom pridajte požadovaný časový interval:

  sleepTimer += ((unsigneddlhý)sec * (nepodpísanédlhý)32768);   //Plus požadovaná časová dĺžka

Tu je malé vysvetlenie:

Prečo 1 predstavuje 32768? Keďže časovač pracuje pod 32,768 kHz, trvá 1/32768 s za každú pridanú 1 sekundu k časovaču; Pridajte 32768 a budete potrebovať jednotky;

(3) Nakoniec sa hodnota sleepTimer používa ako porovnacia hodnota časovača:

  ST2 = (neoznačenéchar(SleepTimer >>16);   //Nastavte porovnávaciu hodnotu spánkového časovača
  ST1 = (neoznačenéchar(SleepTimer >>8);
  ST0 = (nepodpísanéchar)sleepTimer;

Týmto spôsobom môžete úspešne nastaviť časové obdobie časovača~

(Poznámka: Čo sa týka ostatných častí zdrojového kódu, verím, že v kombinácii s podrobnými poznámkami to ľahko pochopíte, a nebudem to tu opakovať)

(4) Experimentálne výsledky
Pri spustení programu, pozorovaní LED1, je jav:LED1 bliká (t.j. zapnuté-> vypnuté raz), opäť bliká po 1 sekunde, opäť bliká po 2 sekundách, potom zostane vypnuté a potom stlačí S1, LED1 sa rozsvieti.
Experimentálny jav je úplne v súlade s očakávaním, Over~

3. Záver

Och~ Po dvoch dňoch voľného času som konečne získal tento záznam. Naozaj som zistil, že písanie blogu, najmä "čitateľsky priateľského" blogového príspevku, je naozaj fyzická práca: prísnosť, estetika, logika... Všetko je to o ohľaduplnosti.

Vždy, keď kód zverejním, myslím, že je príliš dlhý, ale nerada používam skladací nástroj, ktorý je súčasťou blogovej záhrady. Preto autor v tomto blogovom príspevku opatrne pridal niektoré prvky JQuery, aby dosiahol plynulé skladanie kódu, a stále zostáva malý pocit úspechu, hehe (JQuery nováčik, nesmej sa majstrovi~). Ale neviem, či to naozaj zlepšuje čitateľnosť článku, a čitatelia a priatelia sú vítaní komentovať :)

Tento mesiac sa autor naozaj rozhodol zakoreniť v blogovej záhrade, takže som trávil veľa voľného času písaním blogových príspevkov. Keď som prvýkrát písal blog, hoci bolo málo komentárov, väčšina záznamov mala mieru preklikov viac ako 500, čo pre mňa bolo malým povzbudením! Vyžaduje si to odvahu publikovať obsah o mikrokontroléroch v blogovej záhrade, ale ja pri tom zostanem~

Deväť blogových príspevkov od začiatku až po súčasnosť sa zameriava na použitie základných hardvérových modulov na čipe CC2430. Doteraz sme v podstate prešli väčšinu periférií na CC2430, ale stále sú tu veci ako prístup k Flashu, generátor náhodných čísel, AES koprocesor, RF komunikácia a podobne, ktoré sme zatiaľ neriešili. Avšak cesta so Zigbee ešte neskončila a autor plánuje tieto vynechania selektívne doplniť v ďalšej téme (implementácia protokolu Z-Stack).

V ďalšom blogovom príspevku plánujem ukončiť prvú cestu Zigbee o niečo komplexnejším a rozšírenejším experimentom – "systémom monitorovania teploty" a vysvetliť, ako komplexne aplikovať poznatky získané predtým.

V skutočnosti nie je kvalifikovaná na to, aby sa mohla nazývať "VysvetlenieAko začiatočník autor dúfa, že sa navzájom povzbudia a spoločne posúvajú pokroky v procese písania doktorátu!


</n; i++)




Predchádzajúci:Zigbee Journey (8): Niekoľko dôležitých základných experimentov CC2430 – strážne psy
Budúci:Zigbee Journey (10): Komplexný experiment – systém monitorovania teploty založený na CC2430
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com