|
1. Viršutinio ir apatinio lygių sujungimas Šiame straipsnyje aptarsime CC2430 miego funkciją ir pažadinimo metodą. Iš tikrųjų CC2430 mazgas paprastai maitinamas baterijomis, todėl labai svarbu kontroliuoti jo energijos suvartojimą. Toliau pateikiama ištrauka iš CC2430 kinų vadovo, skirto CC2430 4 energijos suvartojimo režimų įvedimui:
Kaip matote iš aukščiau pateiktos lentelės, CC2430 iš viso turi 4 maitinimo režimus:KD0(visiškai pabudęs),KD1(šiek tiek mieguistas),KD2(pusiau pabudęs ir pusiau miegantis),KD3(Labai sunkiai miega). Kuo toliau atgal, tuo daugiau funkcijų išjungiama, o energijos suvartojimas yra vis mažesnis. Konversijos ryšys tarp jų yra toks:
įdėtiPM1、PM2AtsibuskKD0, yra trys būdai: atstatymas, išorinis pertraukimas, miego laikmačio pertraukimas; Bet įdėkiteKD3AtsibuskKD0, yra tik du būdai: atstatymas, išorinis pertraukimas (taip yra todėl, kadKD3Visi osciliatoriai nustojo veikti, ir, žinoma, miego laikmatis buvo išjungtas~) Atlikime nedidelį eksperimentą, kad supažindintume, kaip įjungti miego režimą ir kaip pabustiKD0valstybės. 2. Sistemingas miegas ir nutrauktas pabudimas eksperimentai(1) Įvadas į eksperimentąsistemos inicijavimas,KD0
→ įvestiKD1
→ Pabuskite miego laikmačiu po 1 sKD0
→ įvestiKD2
→ pažadino miego laikmatis po 2 sekundžiųKD0
→ įvestiKD3
→ Palaukite, kol bus paspaustas klavišas S1, suaktyvinamas išorinis pertraukimas ir pažadinamasKD0
(2) Programos eigos schema
(Pastaba: suapvalintas langelis aukščiau esančiame paveikslėlyje rodo sistemos sveikatos būklę)
(3) Eksperimentinis šaltinio kodas ir analizė (Šiuos langelius galima spustelėti~)Antraštės failas ir makrokomandos apibrėžimas[url=]
[/url]
/* Eksperimentinis aprašymas: Nutraukto pabudimo miego eksperimentas, kuris įveda budrumą trimis miego režimais
*/
#include #define LED_ON 0 1 #define LED_OFF#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3 [url=] [/url]
Papildomos funkcijos[url=] [/url]
/*Sistemos laikrodžio inicijavimas -------------------------------------------------------*/
tuščiaxtal_init (tuščia)
{ MIEGAS &= ~0x04; //Visi yra maitinami
Nors(! (MIEGO IR0x40)); //Kristalinis osciliatorius įjungtas ir pastovus
CLKCON &= ~0x47; //Pasirinkite 32 MHz kristalinį osciliatorių
MIEGO REŽIMAS |=0x04;
}
/*LED inicijavimas -------------------------------------------------------*/
tuščialed_init (tuščia)
{ P1SEL =0x00; //P1 yra įprastas įvesties / išvesties prievadas
P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 išėjimas
LED1 = LED_OFF; //Išjunkite visus šviesos diodus
LED2 = LED_OFF; led3 = LED_OFF; led4 = LED_OFF;
}
/*Išorinio pertraukimo inicijavimas -------------------------------------------------------*/
tuščiaio_init(tuščia)
{ P0INP &= ~0X02; //P0.1 turi prisitraukimą ir traukimą
EA =1; //Visiškas leidžiamas pertraukimas
IEN1 |= 0X20; //P0IE = 1, P0 pertraukia įjungti
PICTL |= 0X09; //P0.1 leidžia pertraukti, nuleisti krašto paleidiklius
P0IFG &= ~0x02; //P0.1 Pertraukimo žymė išvalyta0
}
/*Miego laikmačio pertraukimo inicijavimas -------------------------------------------------------*/
tuščiasleepTimer_init (tuščia)
{ STIF=0; //Miego laikmačio pertraukimo žyma yra aiški 0
STIE =1; //Miego laikmačio įjungimas nutrauktas
EA =1; //Atidaryti bendrą pertrauką
}
/*Nustatykite suplanuotą miego laikmačio intervalą -------------------------------------------------------*/
tuščiasetSleepTimer(nepasirašytasintsek.)
{ nepasirašytasilgasmiego laikmatis =0;
sleepTimer |= ST0; //Dabartinio miego laikmačio skaičiavimo reikšmės gavimas
sleepTimer |= (nepasirašytasilgas)ST1 <<8; sleepTimer |= (nepasirašytasilgas)ST2 <<16;
sleepTimer += ((nepasirašytasilgas)sec * (nepasirašytasilgas)32768); //Plius reikiama laiko trukmė
ST2 = (nepasirašytasanglis)(sleepTimer >>16); //Nustatykite miego laikmačio palyginimo vertę
ST1 = (nepasirašytasanglis)(sleepTimer >>8); ST0 = (nepasirašytasanglis)miego laikmatis;
}
/*Pasirinkite maitinimo režimą -------------------------------------------------------*/
tuščiaPowerMode(nepasirašytasanglisrežimas)
{
jei(režimas <4) { MIEGAS &=0xfc; //Išvalyti SLEEP.MODE į 0
SLEEP |= režimas; //Pasirinkite maitinimo režimą
PCON |=0x01; //Įgalinti šį maitinimo režimą
}
}
/*Delsos funkcija -------------------------------------------------------*/
tuščiaDelsa (nepasirašytaintn)
{ nepasirašytasinti, j;
dėl(i =0; i<n; i++)
dėl(j =0; j <1000; j++);
}
[url=] [/url]
Pagrindinė funkcija[url=] [/url]
/*Pagrindinė funkcija -------------------------------------------------------*/
tuščiapagrindinis(tuščia)
{ xtal_init (); led_init ();
//PM0 būsena, lemputė ir vėlavimas
led1 = LED_ON; //Ryškumas LED1 rodo, kad sistema veikia PM0 režimu
Vėlavimas(10);
//PM1 būsena, šviesos išjungtos
setSleepTimer(1); //Nustatykite miego laikmačio laiko intervalą į 1s
sleepTimer_init (); //Miego laikmačio įjungimas nutrauktas
LED1 = LED_OFF; Maitinimo režimas(1); //Nustatykite maitinimo režimą į PM1
//Po 1 s PM1 patenka į PM0, užsidega ir vėluoja
led1 = LED_ON; Vėlavimas(50);
//PM2, lemputės išjungtos
setSleepTimer(2); //Nustatykite miego laikmačio laiko intervalą į 2s
LED1 = LED_OFF; Maitinimo režimas(2); //Nustatykite maitinimo režimą į PM2
//Po 2 sekundžių PM2 patenka į PM0, užsidega ir vėluoja
LED1=0; Vėlavimas(50);
//PM3, šviesos išjungtos
io_init (); //Inicijuoti išorinius pertraukimus
LED1 = LED_OFF; Maitinimo režimas(3); //Nustatykite maitinimo režimą į PM3
//Kai įvyksta išorinis pertraukimas, PM3 patenka į PM0 ir užsidega
led1 = LED_ON;
Nors(1);
}
[url=] [/url]
Paslaugos nutraukimo procedūros[url=] [/url]
/*Išorinė pertraukimo paslaugos programa -------------------------------------------------------*/
#pragmavektorius = P0INT_VECTOR __interrupttuščiaP0_ISR(tuščia)
{ EA =0; //Vartai nutraukiami
Vėlavimas(50);
jei((P0IFG &0x02) >0) //Klavišai nutraukiami
{ P0IFG &= ~0x02; //P0.1 Pertraukimo žymė išvalyta0
} P0IF =0; //P0 pertraukimo žymė išvalyta0
EA =1; //Atviras pertraukimas
}
/*Miego laikmatis nutraukia aptarnavimo programas -------------------------------------------------------*/
#pragmavektorius = ST_VECTOR __interrupttuščiasleepTimer_IRQ (tuščia)
{ EA =0; //Vartai nutraukiami
STIF=0; //Miego laikmačio pertraukimo žyma yra aiški 0
EA =1; //Atviras pertraukimas
}
[url=] [/url]
Kaip naudoti miego laikmatį sistemai pažadinti, galima apibendrinti taip:Atidarykite miego laikmatį Pertraukimo → nustatykite miego laikmačio laiko intervalą → nustatykite maitinimo režimą (Pastaba: "Nustatyti miego laikmačio intervalą" veiksmas turi būti prieš "Nustatyti maitinimo režimą", nes sistema nebevykdys programos įjungus miego režimą) Toliau sutelkime dėmesį į subfunkciją, kuri nustato miego laikmačio intervalą:setSleepTimer Visų pirma, trumpas įvadas į miego laikmatį: jis veikia32,768 kHziš24 vietaLaikmatis, kai sistema veikiaBe KD3Visais maitinimo režimais miego laikmatis busNepertraukiamas veikimas。 Miego laikmačių naudojami registrai:ST0,ST1,ST2。 Toliau pateikiamas išsamus jo funkcijų įvadas iš kinų kalbos vadovo CC2430:
Galima pastebėti, kad jų funkcijos apima du aspektus:Skaityti Daugiau,rašyti。 Skaityti Daugiau: Naudojamas dabartinio laikmačio skaičiavimo reikšmei nuskaityti, rodmenų laikymo tvarka:Skaitykite ST0 → skaitykite ST1 → skaitykite ST2 rašyti: Naudojamas laikmačio palyginimo vertei nustatyti (kai laikmačio skaičiavimo reikšmė = palyginimo reikšmė, įvyksta pertrauka), rašymo tvarka turi būti tokia:Parašykite ST2 → rašykite ST1 → rašykite ST0 Gerai, paaiškinkime tai kartu su šaltinio kodu: (1) Pirmiausia apibrėžkite nepasirašytą ilgą kintamąjį (32 bitų) sleepTimer, kad gautumėte dabartinę miego laikmačio skaičiavimo vertę: nepasirašytasilgasmiego laikmatis =0;
sleepTimer |= ST0; //Dabartinio miego laikmačio skaičiavimo reikšmės gavimas
sleepTimer |= (nepasirašytasilgas)ST1 <<8; sleepTimer |= (nepasirašytasilgas)ST2 <<16;
(2) Tada pridėkite reikiamą laiko intervalą: sleepTimer += ((nepasirašytasilgas)sec * (nepasirašytasilgas)32768); //Plius reikiama laiko trukmė
Štai nedidelis paaiškinimas: Kodėl 1s reiškia 32768? Kadangi laikmatis veikia žemiau 32.768 kHz, kiekvienam 1 pridėtam prie laikmačio reikia 1/32768 s; Pridėkite 32768 ir jums reikės 1s; (3) Galiausiai sleepTimer reikšmė naudojama kaip laikmačio palyginimo vertė: ST2 = (nepasirašytasanglis)(sleepTimer >>16); //Nustatykite miego laikmačio palyginimo vertę
ST1 = (nepasirašytasanglis)(sleepTimer >>8); ST0 = (nepasirašytasanglis)miego laikmatis;
Tokiu būdu galite sėkmingai nustatyti laikmačio laiką~ (Pastaba: Kalbant apie kitas šaltinio kodo dalis, manau, kad kartu su išsamiomis anotacijomis galite lengvai suprasti, ir čia to nekartosiu) (4) Eksperimento rezultataiVykdant programą, stebint LED1, reiškinys yra:LED1 mirksi (t. y. 1 kartą įjungtas > išjungtas), vėl mirksi po 1 s, vėl mirksi po 2 s, tada lieka išjungtas, tada paspaudžia S1, užsidega LED1. Eksperimentinis reiškinys visiškai atitinka lūkesčius, Over~
3. IšvadaO ~ Po 2 dienų laisvo laiko, aš pagaliau gavau šį žurnalą. Aš tikrai pastebėjau, kad tinklaraščio rašymas, ypač "skaitytojui patogus" tinklaraščio įrašas, iš tiesų yra fizinis darbas: griežtumas, estetika, logika... Viskas priklauso nuo svarstymo. Kiekvieną kartą, kai skelbiu kodą, manau, kad jis per ilgas, bet nenoriu naudoti lankstymo įrankio, kuris pateikiamas kartu su tinklaraščio sodu. Todėl šiame tinklaraščio įraše autorius preliminariai pridėjo keletą JQuery elementų, kad sklandžiai sulankstytų kodą, ir vis dar yra nedidelis pasiekimo jausmas, hehe (JQuery naujokas, nesijuok iš meistro ~). Bet nežinau, ar tai tikrai pagerina straipsnio skaitomumą, o skaitytojai ir draugai kviečiami komentuoti:) Šį mėnesį autorius tikrai nusprendė įsitvirtinti tinklaraščio sode, todėl daug laisvo laiko praleidau rašydamas tinklaraščio įrašus. Kai pirmą kartą parašiau tinklaraštį, nors komentarų buvo nedaug, daugumos žurnalų paspaudimų rodiklis buvo didesnis nei 500, o tai man buvo nedidelis paskatinimas! Reikia drąsos skelbti turinį apie mikrovaldiklius dienoraštyje sode, bet aš laikysiuosi jo ~ Devyniuose tinklaraščio įrašuose nuo pradžios iki šių dienų pagrindinis dėmesys skiriamas pagrindinių aparatinės įrangos modulių naudojimui CC2430 luste. Iki šiol iš esmės peržiūrėjome daugumą CC2430 periferinių įrenginių, tačiau vis dar yra tokių dalykų kaip "Flash" prieiga, atsitiktinių skaičių generatorius, AES koprocesorius, RF ryšys ir kt., kurie nebuvo paliesti. Tačiau "Zigbee" kelionė nesibaigė, ir autorius ketina selektyviai užpildyti šiuos praleidimus kitoje temoje (Z-Stack protokolo įgyvendinimas). Kitame tinklaraščio įraše planuoju užbaigti pirmąją Zigbee kelionę šiek tiek išsamesniu ir išplėstiniu eksperimentu - "temperatūros stebėjimo sistema" ir paaiškinti, kaip visapusiškai pritaikyti anksčiau išmoktas žinias. Tiesą sakant, jis nėra tinkamas vadintis "PaaiškinimasKaip pradedantysis, autorius tikisi tik padrąsinti vienas kitą ir kartu daryti pažangą rašydamas daktaro laipsnį! </n; i++)
|