|
1. Augšējā un apakšējā līmeņa savienošana Šajā rakstā mēs apspriedīsim CC2430 miega funkciju un pamošanās metodi. Faktiskajā lietošanā CC2430 mezgls parasti tiek darbināts ar baterijām, tāpēc tā enerģijas patēriņa kontrole ir ļoti svarīga. Šis ir fragments no CC2430 ķīniešu rokasgrāmatas par CC2430 4 enerģijas patēriņa režīmu ieviešanu:
Kā redzat no iepriekš redzamās tabulas, CC2430 kopumā ir 4 jaudas režīmi:PM0(pilnīgi nomodā),PM1(nedaudz miegains),PM2(pusi nomodā un pusi aizmiguši),PM3(Ļoti smagi guļ). Jo tālāk, jo vairāk funkciju tiek izslēgtas, un enerģijas patēriņš ir arvien mazāks. Konversijas attiecības starp tām ir šādas:
ievietotPM1、PM2MostiesPM0, ir trīs veidi: atiestatīšana, ārējs pārtraukums, miega taimera pārtraukums; Bet ieliecietPM3MostiesPM0, ir tikai divi veidi: atiestatīšana, ārēja pārtraukšana (tas ir tāpēc, kaPM3Visi oscilatori pārstāja darboties, un, protams, miega taimeris tika izslēgts ~) Veiksim nelielu eksperimentu, lai iepazīstinātu ar to, kā ieiet miega režīmā un kā pamostiesPM0valsts. 2. Sistemātisks miegs un pārtraukti pamošanās eksperimenti(1) Ievads eksperimentāsistēmas inicializācijaPM0
→ ievadietPM1
→ Pamosties ar miega taimeri pēc 1 sekundesPM0
→ ievadietPM2
→ pamodināja miega taimeris pēc 2 sekundēmPM0
→ ievadietPM3
→ Pagaidiet, līdz tiek nospiests taustiņš S1, aktivizējot ārēju pārtraukumu un pamostotiesPM0
(2) Programmas plūsmas diagramma
(Piezīme: noapaļotais lodziņš iepriekš redzamajā attēlā norāda sistēmas veselības stāvokli)
(3) Eksperimentālais pirmkods un analīze (Uz šādiem lodziņiem var noklikšķināt ~)Galvenes faila un makro definīcija[url =]
[/url]
/* Eksperimentālais apraksts: Pārtraukta pamošanās miega eksperiments, kas ievieš nomodu trīs miega režīmos
*/
#include #define LED_ON 0 #define LED_OFF 1#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3 [url =] [/url]
Apakšfunkcijas[url =] [/url]
/*Sistēmas pulksteņa inicializācija -------------------------------------------------------*/
Tukšumsxtal_init (Tukšums)
{ MIEGS &= ~0x04; //Visi ir darbināmi
kamēr(! (MIEGS &0x40)); //Kristāla oscilators ir ieslēgts un vienmērīgs
CLKCON &= ~0x47; //Izvēlieties 32MHz kristāla oscilatoru
MIEGS |=0x04;
}
/*LED inicializācija -------------------------------------------------------*/
Tukšumsled_init (Tukšums)
{ P1SEL =0x00; //P1 ir parastais I/O ports
P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 izeja
led1 = LED_OFF; //Izslēdziet visas gaismas diodes
led2 = LED_OFF; led3 = LED_OFF; led4 = LED_OFF;
}
/*Ārējā pārtraukuma inicializācija -------------------------------------------------------*/
Tukšumsio_init (Tukšums)
{ P0INP &= ~0X02; //P0.1 ir pull-up un pull-down
EA =1; //Pilnīgs pieļaujamais pārtraukums
IEN1 |= 0X20; //P0IE = 1, P0 pārtrauc iespējot
PICTL |= 0X09; //P0.1 pieļauj pārtraukumus, nomešanas malas trigerus
P0IFG &= ~0x02; //P0.1 Pārtraukt atzīmi notīrīt0
}
/*Miega taimera pārtraukuma inicializācija -------------------------------------------------------*/
TukšumssleepTimer_init (Tukšums)
{ STIF =0; //Miega taimera pārtraukuma atzīme ir skaidra 0
STIE =1; //Miega taimera ieslēgšana pārtraukta
EA =1; //Atvērt kopējo pārtraukumu
}
/*Miega taimeri plānotā intervāla iestatīšana -------------------------------------------------------*/
TukšumssetSleepTimer(bez parakstaintsek)
{ bez parakstagaršmiega taimeris =0;
miega taimeris |= ST0; //Pašreizējā miega taimera skaitīšanas vērtības iegūšana
sleepTimer |= (bez parakstagarš)ST1 <<8; sleepTimer |= (bez parakstagarš)ST2 <<16;
sleepTimer += ((bez parakstagarš)sec * (bez parakstagarš)32768); //Plus nepieciešamais laika ilgums
ST2 = (bez parakstaogles)(miega taimeris >>16); //Miega taimeri salīdzināšanas vērtības iestatīšana
ST1 = (bez parakstaogles)(miega taimeris >>8); ST0 = (bez parakstaogles)miega taimeris;
}
/*Izvēlieties barošanas režīmu -------------------------------------------------------*/
TukšumsPowerMode(bez parakstaoglesrežīms)
{
ja(režīms <4) { MIEGS &=0xfc; //Notīrīt funkciju SLEEP.MODE uz 0
MIEGA režīms |= režīms; //Izvēlieties barošanas režīmu
PCON |=0x01; //Iespējot šo barošanas režīmu
}
}
/*Aizkavēšanās funkcija -------------------------------------------------------*/
TukšumsKavēšanās (bez parakstaintn)
{ bez parakstainti, j;
par(i =0; i<n; i++)
par(j =0; j <1000; j++);
}
[url =] [/url]
Galvenā funkcija[url =] [/url]
/*Galvenā funkcija -------------------------------------------------------*/
Tukšumsgalvenais(Tukšums)
{ xtal_init (); led_init ();
//PM0 statuss, indikators un aizkavēšanās
led1 = LED_ON; //Spilgtums LED1 norāda, ka sistēma darbojas PM0 režīmā
Kavēšanās(10);
//PM1 stāvoklis, gaismas izslēgtas
setSleepTimer(1); //Iestatiet miega taimeri laika intervālu uz 1s
sleepTimer_init (); //Miega taimera ieslēgšana pārtraukta
led1 = LED_OFF; PowerMode(1); //Iestatiet barošanas režīmu uz PM1
//Pēc 1s PM1 nonāk PM0, iedegas un aizkavējas
led1 = LED_ON; Kavēšanās(50);
//PM2, gaismas izslēgtas
setSleepTimer(2); //Iestatiet miega taimeri laika intervālu uz 2s
led1 = LED_OFF; PowerMode(2); //Iestatiet barošanas režīmu uz PM2
//Pēc 2 sekundēm PM2 nonāk PM0, iedegas un aizkavējas
LED1=0; Kavēšanās(50);
//PM3, izslēgtas gaismas
io_init (); //Ārējo pārtraukumu inicializēšana
led1 = LED_OFF; PowerMode(3); //Iestatiet barošanas režīmu uz PM3
//Ja notiek ārējs pārtraukums, PM3 iekļūst PM0 un iedegas
led1 = LED_ON;
kamēr(1);
}
[url =] [/url]
Pakalpojuma pārtraukšanas procedūras[url =] [/url]
/*Ārējā pārtraukuma pakalpojuma programma -------------------------------------------------------*/
#pragmavektors = P0INT_VECTOR __interruptTukšumsP0_ISR (Tukšums)
{ EA =0; //Vārti tiek pārtraukti
Kavēšanās(50);
ja((P0IFG &0x02) >0) //Taustiņi tiek pārtraukti
{ P0IFG &= ~0x02; //P0.1 Pārtraukt atzīmi notīrīt0
} P0JA =0; //P0 pārtraukt atzīmi notīrīt0
EA =1; //Atvērts pārtraukums
}
/*Miega taimeris pārtrauc servisa programmas -------------------------------------------------------*/
#pragmavektors = ST_VECTOR __interruptTukšumssleepTimer_IRQ (Tukšums)
{ EA =0; //Vārti tiek pārtraukti
STIF =0; //Miega taimera pārtraukuma atzīme ir skaidra 0
EA =1; //Atvērts pārtraukums
}
[url =] [/url]
Kā izmantot miega taimeri, lai pamodinātu sistēmu, var apkopot šādi:Miega taimera pārtraukuma atvēršana → miega taimera laika intervāla iestatīšana → barošanas režīma iestatīšana (Piezīme: solim "Iestatīt miega taimera intervālu" jābūt pirms "Iestatīt barošanas režīmu", jo sistēma neturpinās izpildīt programmu pēc miega režīma) Tālāk koncentrēsimies uz apakšfunkciju, kas nosaka miega taimera intervālu:setSleepTimer Pirmkārt, īss ievads miega taimeri: tas darbojas32,768 kHzno24. vietaTaimeris, kad sistēma darbojasPapildus PM3Visos barošanas režīmos miega taimeris būsNepārtraukta darbība。 Miega taimeru izmantotie reģistri ir:ST0,ST1,ST2。 Tālāk ir detalizēts ievads par tās funkcijām no CC2430 ķīniešu rokasgrāmatas:
Var redzēt, ka to funkcijas ietver divus aspektus:Lasīt,rakstīt。 Lasīt: Izmanto, lai nolasītu pašreizējā taimera skaitīšanas vērtību, secību, kādā jāievēro rādījumi:Lasīt ST0 → Lasīt ST1 → Lasīt ST2 rakstīt: Izmanto, lai iestatītu taimera salīdzināšanas vērtību (kad taimera skaita vērtība = salīdzinājuma vērtība, notiek pārtraukums), rakstīšanas secībai jāseko:Rakstiet ST2 → rakstiet ST1 → rakstiet ST0 Labi, paskaidrosim to kombinācijā ar avota kodu: (1) Vispirms definējiet neparakstītu garo mainīgo (32 bitu) sleepTimer, lai saņemtu miega taimera pašreizējo skaita vērtību: bez parakstagaršmiega taimeris =0;
miega taimeris |= ST0; //Pašreizējā miega taimera skaitīšanas vērtības iegūšana
sleepTimer |= (bez parakstagarš)ST1 <<8; sleepTimer |= (bez parakstagarš)ST2 <<16;
(2) Pēc tam pievienojiet nepieciešamo laika intervālu: sleepTimer += ((bez parakstagarš)sec * (bez parakstagarš)32768); //Plus nepieciešamais laika ilgums
Šeit ir neliels paskaidrojums: Kāpēc 1s apzīmē 32768? Tā kā taimeris darbojas zem 32.768 kHz, tas aizņem 1/32768 s par katru taimeri pievienoto 1; Pievienojiet 32768, un jums būs nepieciešams 1s; (3) Visbeidzot, sleepTimer vērtība tiek izmantota kā taimera salīdzināšanas vērtība: ST2 = (bez parakstaogles)(miega taimeris >>16); //Miega taimeri salīdzināšanas vērtības iestatīšana
ST1 = (bez parakstaogles)(miega taimeris >>8); ST0 = (bez parakstaogles)miega taimeris;
Tādā veidā jūs varat veiksmīgi iestatīt taimera laika periodu~ (Piezīme: Kas attiecas uz pārējām avota koda daļām, es uzskatu, ka kopā ar detalizētām anotācijām jūs varat viegli saprast, un es to šeit neatkārtošu) (4) Eksperimenta rezultātiDarbojoties programmai, novērojot LED1, parādība ir:LED1 mirgo (t.i., ieslēgts > izslēgts 1 reizi), atkal mirgo pēc 1 s, atkal mirgo pēc 2 sekundēm, pēc tam paliek izslēgts un pēc tam nospiež S1, iedegas LED1. Eksperimentālā parādība pilnībā atbilst cerībām, Over~
3. SecinājumsAk ~ Pēc 2 dienu brīvā laika es beidzot ieguvu šo žurnālu. Es patiešām atklāju, ka emuāra rakstīšana, īpaši "lasītājam draudzīga" emuāra ziņa, patiešām ir fizisks darbs: stingrība, estētika, loģika ... Tas viss ir par apsvēršanu. Katru reizi, kad es ievietoju kodu, es domāju, ka tas ir pārāk garš, bet es nelabprāt izmantoju locīšanas rīku, kas nāk kopā ar emuāra dārzu. Tāpēc šajā emuāra ierakstā autors provizoriski pievienoja dažus JQuery elementus, lai panāktu vienmērīgu koda locīšanu, un joprojām ir neliela sasnieguma sajūta, hehe (JQuery iesācējs, nesmejieties par meistaru ~). Bet es nezinu, vai tas patiešām uzlabo raksta lasāmību, un lasītāji un draugi ir laipni aicināti komentēt:) Šomēnes autors patiešām nolēma iesakņoties emuāra dārzā, tāpēc es pavadīju daudz brīvā laika, rakstot emuāra ziņas. Kad es pirmo reizi rakstīju emuāru, lai gan bija maz komentāru, lielākajai daļai žurnālu klikšķu skaits bija vairāk nekā 500, kas man bija neliels iedrošinājums! Ir nepieciešama drosme, lai emuāra dārzā publicētu saturu par mikrokontrolleriem, bet es pieturēšos pie tā ~ Deviņi emuāra ieraksti no sākuma līdz mūsdienām koncentrējas uz pamata aparatūras moduļu izmantošanu CC2430 mikroshēmā. Līdz šim mēs būtībā esam izgājuši cauri lielākajai daļai CC2430 perifērijas ierīču, taču joprojām ir tādas lietas kā Flash piekļuve, nejaušo skaitļu ģenerators, AES līdzprocesors, RF komunikācija utt., Kas nav pieskartas. Tomēr Zigbee ceļojums nav beidzies, un autors plāno selektīvi aizpildīt šos izlaidumus nākamajā tēmā (Z-Stack protokola ieviešana). Nākamajā emuāra ierakstā es plānoju beigt Zigbee pirmo braucienu ar nedaudz visaptverošāku un paplašinātu eksperimentu - "temperatūras uzraudzības sistēmu" un paskaidrot, kā visaptveroši pielietot iepriekš apgūtos zināšanu punktus. Patiesībā tas nav kvalificēts, lai to sauktu par "PaskaidrojumsKā iesācējs autors tikai cer iedrošināt viens otru un kopīgi gūt progresu doktora grāda rakstīšanas procesā! </n; i++)
|