See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 9371|Vastuse: 0

Zigbee teekond (9): Mitmed olulised põhilised CC2430 eksperimendid – süsteemne uni ja katkestatud ärkvelolek

[Kopeeri link]
Postitatud 30.10.2014 23:24:30 | | | |
1. Ülemiste ja alumiste korruste ühendamine

Selles artiklis käsitleme CC2430 unefunktsiooni ja äratusmeetodit. Tegelikus kasutuses töötab CC2430 sõlm tavaliselt patareidega, seega on selle energiatarbimise kontroll ülioluline.

Järgnevalt on väljavõte CC2430 Hiina käsiraamatust CC2430 nelja energiatarbimise režiimi tutvustamiseks:

Nagu ülaltoodud tabelist näha, on CC2430-l kokku 4 võimsusrežiimi:PM0(täielikult ärkvel),PM1(veidi uimane),PM2(poolunes ja poolunes),PM3(Magas väga sügavalt). Mida kaugemale tahapoole, seda rohkem funktsioone on välja lülitatud ja energiatarve väheneb järjest. Nende konversioonisuhe on järgmine:

putPM1、PM2Ärka ülesPM0, on kolm võimalust: lähtestamine, väline katkestus, une taimeri katkestus; Aga panePM3Ärka ülesPM0, on ainult kaks võimalust: lähtestamine, väline katkestus (sest seesPM3Kõik ostsillaatorid lakkasid töötamast ja muidugi lülitati une taimer välja~)

Teeme väikese eksperimendi, et tutvustada, kuidas siseneda unerežiimi ja kuidas ärgataPM0osariik.

2. Süsteemne uni ja katkestatud ärkamise katsed(1) Sissejuhatus eksperimendilesüsteemi initsialiseeriminePM0
→ siseneminePM1
→ Ärka unetaimeri järgi pärast 1 sekunditPM0
→ siseneminePM2
→ äratati une taimeriga pärast kahte sekunditPM0
→ siseneminePM3
→ Oota, kuni vajutatakse klahvi S1, mis käivitab välise katkestuse ja ärkab ülesPM0
(2) Programmi vooskeem

(Märkus: ülaloleval pildil olev ümardatud kast näitab süsteemi tervislikku seisundit)

(3) Eksperimentaalne lähtekood ja analüüs (Järgmistele kastidele saab klõpsata~Päise fail ja makro definitsioon[url=] [/url]
/*
    Eksperimentaalne kirjeldus: katkestatud ärkveloleku katse, mis tutvustab ärkvelolekut kolmes unerežiimis
*/

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

Alamfunktsioonid[url=] [/url]
/*Süsteemi kella initsialiseerimine
-------------------------------------------------------
*/
tühixtal_init(tühi)
{
  UNI &= ~0x04;            //Kõik on elektrilised
  samal ajal(! (UNI &0x40));     //Kristallostsillaator on sisse lülitatud ja stabiilne
  CLKCON &= ~0x47;         //Vali 32MHz kristall-ostsillaator
  UNI |=0x04;
}


/*LED-i initsialiseerimine
-------------------------------------------------------
*/
tühiled_init(tühi)
{
  P1SEL =0x00;         //P1 on tavaline I/O port
  P1DIR |=0x0F;         //P1.0 P1.1 P1.2 P1.3 väljund
  
  led1 = LED_OFF;         //Lülita kõik LED-id välja
  led2 = LED_OFF;
  led3 = LED_OFF;
  led4 = LED_OFF;
}


/*Välise katkestuste initsialiseerimine
-------------------------------------------------------
*/
tühiio_init(tühi)
{
    P0INP &= ~0X02;   //P0.1-l on tõukamine ja tõmbamine

    EA =1;           //Täielik katkestus lubatud
   
    IEN1 |=  0X20;   //P0IE = 1, P0 katkestused lubatakse
   
    PICTL |=  0X09;   //P0.1 võimaldab katkestusi, drop edge triggereid
   
    P0IFG &= ~0x02;   //P0.1 Katkestusmärgi clear0
}


/*Unetaimeri katkestuste initsialiseerimine
-------------------------------------------------------
*/
tühisleepTimer_init(tühi)
{
  STIF=0;   //Une taimeri katkestusmärk on puhas 0
   
  STIE=1;   //Lülita sisse une taimer katkestatud
   
  EA=1;     //Ava täielik katkestus
}


/*Sea une taimeri ajavahemik
-------------------------------------------------------
*/
tühisetSleepTimer(allkirjastamataintsec)
{
  AllkirjastamatapikksleepTimer =0;
  
  sleepTimer |= ST0;                     //Hangi praeguse unetaimeri loendusväärtus
  sleepTimer |= (allkirjastamatapikk)ST1 <<8;
  sleepTimer |= (allkirjastamatapikk)ST2 <<16;
  
  sleepTimer += ((allkirjastamatapikk)sec * (allkirjastamatapikk)32768);   //Lisaks nõutav ajastuse kestus
  
  ST2 = (allkirjastamatachar)(sleepTimer >>16);   //Määra une taimeri võrdlusväärtus
  ST1 = (allkirjastamatachar)(sleepTimer >>8);
  ST0 = (allkirjastamatachar)sleepTimer;
}


/*Vali toiterežiim
-------------------------------------------------------
*/
tühiPowerMode(märgistamata)charrežiimi)
{
  kui(režiim <4)
  {
    UNI &=0xfc;      //Tühjenda SLEEP.MODE 0-le
    SLEEP |= režiim;      //Vali toiterežiim
    PCON |=0x01;        //Lülita see toiterežiim sisse
  }
}


/*Viivitusfunktsioon
-------------------------------------------------------
*/
tühiViivitus(allkirjastamata)intn)
{
  Allkirjastamatainti,j;
  for(i=0; i<n; i++)
    for(j=0; j <1000; j++);
}
[url=] [/url]

Peamine funktsioon[url=] [/url]
/*Peamine funktsioon
-------------------------------------------------------
*/
tühipea(tühi)
{
  xtal_init();         
  led_init();         
  
  //PM0 staatus, tuli põleb ja viivitus
  led1 = LED_ON;         //Heleduse LED1 näitab, et süsteem töötab PM0 režiimis
  Viivitus(10);


  //PM1 olek, tuled kustunud
  setSleepTimer(1);      //Sea une taimeri ajavahemik 1s peale
  sleepTimer_init();     //Lülita sisse une taimer katkestatud
  led1 = LED_OFF;
  PowerMode(1);         //Sea toiterežiim PM1-le
  
  
//Pärast 1 sekundit siseneb PM1 PM0-sse, süttib valgus ja viivitused
  led1 = LED_ON;
  Viivitus(50);
  
  //PM2, tuled kustuvad
  setSleepTimer(2);      //Sea une taimeri ajavahemik 2 sekundiks
  led1 = LED_OFF;
  PowerMode(2);         //Sea toiterežiim PM2-le


  
//Pärast kahte sekundit siseneb PM2 PM0-sse, süttib ja viivitub
  led1=0;
  Viivitus(50);
  
  //PM3, tuled kustuvad  
  io_init();            //Väliste katkestuste initsialiseerimine
  led1 = LED_OFF;
  PowerMode(3);         //Sea toiterežiim PM3-le
  
  
//Kui tekib väline katkestus, siseneb PM3 PM0-sse ja süttib
  led1 = LED_ON;

  samal ajal(1);
}
[url=] [/url]

Katkestusteenuse protseduurid[url=] [/url]
/*Välise katkestusteenuse programm
-------------------------------------------------------
*/
#pragmavektor = P0INT_VECTOR
__interrupttühiP0_ISR(tühi)
{
  EA =0;                        //Värav on katkestatud
  
  Viivitus(50);

  kui((P0IFG &0x02) >0)         //Klahvid on katkestatud
  {
    P0IFG &= ~0x02;               //P0.1 Katkestusmärgi clear0
  }
  P0IF =0;                       //P0 katkestusmärk clear0


  EA =1;                        //Avatud katkestus
}


/*Unetaimer katkestab teenuseprogramme
-------------------------------------------------------
*/
#pragmavektor= ST_VECTOR
__interrupttühisleepTimer_IRQ(tühi)
{
  EA=0;     //Värav on katkestatud
   
  STIF=0;   //Une taimeri katkestusmärk on puhas 0
  
  EA=1;     //Avatud katkestus
}
[url=] [/url]

Kuidas kasutada unetaimerit süsteemi äratamiseks, võib kokku võtta järgmiselt:Ava unetaimeri katkestus → seadista unetaimeri ajavahemik → seadista toiterežiim

(Märkus: "Sea the Sleep Timer Interval" samm peab olema enne "Set Power Mode", sest süsteem ei jätka programmi käivitamist pärast unerežiimi sisenemist)

Järgmisena keskendume alamfunktsioonile, mis seab unetaimeri intervalli:setSleepTimer

Esiteks, lühike sissejuhatus une taimerisse: see töötab edasi32.768kHzof24. kohtTaimer, kui süsteem töötabLisaks PM3-leKõigis toiterežiimides on unerežiimi taimerKatkematu töö

Unetaimerite kasutatavad registrid on:ST0ST1ST2。 Järgnevalt on üksikasjalik sissejuhatus selle funktsioonidesse CC2430 hiina käsiraamatust:

On näha, et nende funktsioonid hõlmavad kahte aspekti:Loekirjuta

  Loe: Kasutatakse praeguse taimeri loendusväärtuse lugemiseks, mis on järjekord, milles mõõtmisi tuleb järgida:Loe ST0 → Loe ST1 → Loe ST2

  kirjuta: Taimeri võrdlusväärtuse määramiseks (kui taimeri loend = võrdlusväärtus, tekib katkestus), peab kirjutamisjärjekord järgima:Kirjuta ST2 → kirjuta ST1 → kirjuta ST0

Olgu, selgitame seda koos lähtekoodiga:

(1) Esmalt määratle allkirjastamata pikk muutuja (32-bitine) uneTaimer, mis saab unetaimeri praeguse loenduse väärtuse:

  AllkirjastamatapikksleepTimer =0;
  
  sleepTimer |= ST0;                     //Hangi praeguse unetaimeri loendusväärtus
  sleepTimer |= (allkirjastamatapikk)ST1 <<8;
  sleepTimer |= (allkirjastamatapikk)ST2 <<16;

(2) Seejärel lisatakse vajalik ajavahemik:

  sleepTimer += ((allkirjastamatapikk)sec * (allkirjastamatapikk)32768);   //Lisaks nõutav ajastuse kestus

Siin on väike selgitus:

Miks tähistavad 1-d 32768? Kuna taimer töötab alla 32,768kHz, võtab iga lisatud taimeri kohta 1/32768 s; Lisa 32768 ja sul on vaja 1-sid;

(3) Lõpuks kasutatakse sleepTimer väärtust taimeri võrdlusväärtusena:

  ST2 = (allkirjastamatachar)(sleepTimer >>16);   //Määra une taimeri võrdlusväärtus
  ST1 = (allkirjastamatachar)(sleepTimer >>8);
  ST0 = (allkirjastamatachar)sleepTimer;

Nii saad edukalt määrata taimeri ajastuse~

(Märkus: Mis puudutab teisi lähtekoodi osi, siis usun, et koos detailsete märkustega on lihtne mõista ja ma ei hakka seda siin kordama)

(4) Eksperimentaalsed tulemused
Programmi käivitades, LED1 vaatlemisel on nähtus järgmine:LED1 vilgub (ehk üks kord sisse > välja), vilgub uuesti pärast 1 sekundit, vilgub uuesti pärast 2 sekundit, siis jääb välja ja vajutab S1, LED1 süttib.
Eksperimentaalne nähtus on täielikult kooskõlas ootusega, Üle~

3. Kokkuvõte

Oh~ Pärast kahepäevast vaba aega sain lõpuks selle logi kätte. Leidsin tõesti, et blogi kirjutamine, eriti "lugejasõbraliku" blogipostituse kirjutamine, on tõepoolest füüsiline töö: rangus, esteetika, loogika... Kõik sõltub kaalutlemisest.

Iga kord, kui koodi postitan, tundub see liiga pikk, aga ma kõhklen kasutada blogiaia kaasas olevat voltimistööriista. Seetõttu lisas autor selles blogipostituses ettevaatlikult mõned JQuery elemendid, et saavutada koodi sujuv voltimine, ja siiski on väike saavutustunne, hehe (JQuery algaja, ära naera meistri üle~). Aga ma ei tea, kas see tõesti parandab artikli loetavust ning lugejad ja sõbrad on teretulnud kommenteerima :)

Sel kuul otsustas autor tõesti blogiaeda juurduda, nii et veetsin palju vaba aega blogipostituste kirjutamisele. Kui ma esimest korda blogi kirjutasin, kuigi kommentaare oli vähe, oli enamikul logidel üle 500 klikkimise määr, mis oli mulle väike julgustus! Mikrokontrollerite sisu avaldamine blogiaias nõuab julgust, aga ma jään selle juurde~

Üheksa blogipostitust algusest tänapäevani keskenduvad põhiliste riistvaramoodulite kasutamisele CC2430 kiibil. Siiani oleme põhimõtteliselt läbi vaadanud enamik CC2430 lisaseadmeid, kuid on veel asju nagu Flashi ligipääs, juhuslike arvude generaator, AES kaasprotsessor, raadiosagedusside jne, millest pole veel räägitud. Kuid Zigbee teekond pole veel lõppenud ning autor kavatseb järgmises teemas (Z-Stack protokolli rakendamine) need puudujäägid valikuliselt täita.

Järgmises blogipostituses plaanin lõpetada Zigbee esimese reisi veidi põhjalikuma ja põhjalikuma eksperimendiga – "temperatuuri jälgimissüsteem" – ning selgitada, kuidas varem õpitud teadmisi põhjalikult rakendada.

Tegelikult ei ole see kvalifitseeritud nimetamiseks "SelgitusAlgajana loodab autor vaid üksteist julgustada ja koos doktoritöö kirjutamise protsessis edusamme teha!


</n; i++)




Eelmine:Zigbee teekond (8): Mitmed olulised CC2430 põhieksperimendid – valvekoerad
Järgmine:Zigbee teekond (10): Põhjalik eksperiment – temperatuuri jälgimissüsteem CC2430 põhjal
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com