|
1. Ülemiste ja alumiste korruste ühendamine Eelmises artiklis õppisime koos lihtsate väliste katkestuste rakendamisest. Nüüd, kui meil on praktiline kogemus katkestustega, räägime selles osas taimeri katkestustest. CC2430-l on kokku 4 taimerit, mida saab jagada 3 kategooriasse: taimer 1, taimer 2, taimer 3/4 (3 ja 4 kasutus on sama). Kuna autor on samuti CC2430-ga uus ja tal puudub praktiliselt igasugune praktiline kogemus taimeritega seotud projektides, ei kavatse ma (ega saa midagi teha) taimerit põhjalikult analüüsida. See artikkel annab vaid lühikese eksperimentaalse ülevaate taimeri 1 kasutamisest ülevoolukatkestuste loendamisel ega maini selle sisendi püüdmise/väljundi võrdluse/PWM funktsioone. Taimer 2 ja taimer 3/4 on vaid lihtsad funktsioonide tutvustused. Kui autori oskused jõuavad teatud tasemele, seisan Zigbee praktilise kogemuse tipus, et seda esseed täiustada. 2. Taimer 1Taimer 1 on 16-bitine taimer, millel on taimeri/loenduri/impulsi laiuse modulatsioon. Sellel on 3 eraldi programmeeritavat sisendi püüdmise/väljundi võrdluskanalit, millest igaüht saab kasutada PWM-väljundina või servaajana sisendsignaali püüdmiseks (info selle kohta, mis on sisendi püüdmise/väljundi võrdlus ja kuidas PWM-väljundi rakendada, võivad lugejad vaadata CC2430 hiina käsiraamatut). Taimeritel on väga oluline kontseptsioon:Töörežiim。 Töörežiimid hõlmavad: vaba töörežiimi (vabajooks), vormirežiim (modulo) ja positiivne loendus/loendusrežiim (Üles-alla)。 Järgnevalt on väljavõte CC2430 Hiina käsiraamatust kolme režiimi tutvustamiseks:
Võrreldes kolme režiimi, on näha, et vaba töörežiimi ülevoolu väärtus on 0xFFFF muutumatu; Teised kaks režiimi võimaldavad taimeri ülevoolu täpset kontrolli, määrates väärtuse T1CC0-le. See katse kasutab seda funktsiooni, et käivitada iga 1 sekundi järel katkestus taimeri poolt kindla T1CC0 kaudu, et täpselt juhtida LED-tule vilkumisintervalli kuni 1 sekundini. (1) Sissejuhatus eksperimendileTaimeri modulo-režiimis juhitakse LED-valguse vilkumisintervalli täpselt 1-dega, nimelt: hele 0,5s → tume 0,5s → hele 0,5s → hämar 0,5s ...... → Heledad 0,5s → Dark 0,5s (st ajavahemik pimedusest heledasse on 1s). Valguse/pimeduse inversioon saavutatakse ülevoolavate katkestustega. (2) Programmi vooskeem
(3) Asjakohased arvutusedNagu varem mainitud, on LED-tule staatus: hele 0,5s → tume 0,5s → hele 0,5s → tuhm 0,5s ...... → 0,5 sekundit valgust → 0,5 sekundit pimedat ning see tuleb rakendada ülevoolu katkestustega, seega peab taimeri ületäitumise periood olema 0,5 sekundit. Selleks tuleb arvutada vastav ülevoolu väärtus (ajutiselt seatud N-iks). Süsteemi taktsagedus on valitud 32MHz ning antud taktsagedus on vaikimisi 16MHz (mõlemad määratakse erifunktsioonide registrite abil).CLKCONLisateabe saamiseks vaadake palun CC2430 hiina keele käsiraamatut. Timer 1 puhul sea kella ristlõige 128 divisjoni peale. Kokkuvõtteks on nimekiri järgmine:
Et leida N=62500, on selle heksadekomaline 0xF424, st tuleb määrata T1CC0H=0xF4, T1CC0L=0x24 . (4) Eksperimentaalne lähtekood ja analüüs/*
Eksperimendi kirjeldus: Taimer Timer1 eksperiment, taimerite arvu ületäitmine, LED1 vilkumine
*/
#include
#define juhtis1 P1_0
#define juhtis2 P1_1
#define juhtis3 P1_2
#define juhtis4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
tühixtal_init(tühi)
{ UNI &= ~0x04; //都上电
samal ajal(! (UNI &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Vali 32MHz kristall-ostsillaator UNI |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
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 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
tühitimer1_init(tühi)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 crossover; modulo režiim (0x0000->T1CC0); Alusta jooksmist; T1IF=0; Puhasta katkestusmärk
}
/*主函数
-------------------------------------------------------*/
tühipea(tühi)
{ xtal_init(); led_init(); timer1_init();
samal ajal(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vektor=T1_VECTOR __interrupttühiT1_ISR(tühi)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
Olgu, kompileeri programm ja silu online, arendusplaadil vilgub LED1 vastavalt plaanile ja tundub, et vilkumisintervall on umbes 1 sekundit. Aga sellest ei piisa eksperimendi edu tõestamiseks, kui intervalli saab rangelt määrata 1s-ks, on see täiuslik~ Nii lülitasin WIN 7 kella sisse (klõpsa tegumiriba paremal küljel oleval ajal). Vaadates sekundiseiuti, nägi ta silmanurgast LED1 vilkumist. Tulemus: kahe minuti jooksul on nende tempo põhimõtteliselt täpselt sama (see täpsus on talutav~). Sel hetkel võib eksperimenti põhimõtteliselt lõpetada, hehe~ 3. Taimer 2Taimer 2 nimetatakse kaMAC-taimer, on spetsiaalselt loodud toetama sündmuste jälgimise protokolli IEEE 802.15.4 MAC-is. Taimeril on 8-kohaline ülevooluloendur, millega saab registreerida toimunud tsüklite arvu; On olemas 16-bitine salvestusregister, mis salvestab täpse aja, millal raam hakkab vastu võtma/saatma või millal edastuse lõpetatakse. See sisaldab ka 16-bitist väljundi võrdlusregistrit, mis genereerib traadita moodulile kindlal ajal erinevaid käskude värava signaale (alusta vastuvõttu, alusta saatmist jne). 4. Taimer 3/4Taimer 3/4 on 8-bitine taimer, millel on taimer/loendur/PWM funktsioon. T3/T4-l on 2 väljundi võrdluskanalit, millest igaüht saab kasutada PWM-väljundina. 5. KokkuvõteSee osa õpib peamiselt taimeri 1 loenduse ülevoolu katkestamise meetodit ning rakendab LED-tule vilkumisintervalli täpset juhtimist 1 sekundiga. Mõned teised taimerid on vaid tõmbe, ja ma tulen hiljem tagasi, et need juurde lisada. Järgmises osas tutvustame CC2430 jadapordi kommunikatsiooni.
|