|
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:ST0,ST1,ST2。 Järgnevalt on üksikasjalik sissejuhatus selle funktsioonidesse CC2430 hiina käsiraamatust:
On näha, et nende funktsioonid hõlmavad kahte aspekti:Loe,kirjuta。 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 tulemusedProgrammi 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õteOh~ 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++)
|