|
1. Ylä- ja alakerrosten yhdistäminen Edellisessä artikkelissa opimme yhdessä yksinkertaisten ulkoisten keskeytysten toteutuksesta. Nyt kun meillä on käytännön kokemusta keskeytyksistä, puhutaanpa ajastinkeskeytyksistä tässä osiossa. CC2430:ssa on yhteensä 4 ajastinta, jotka voidaan jakaa kolmeen kategoriaan: ajastin 1, ajastin 2, ajastin 3/4 (3:n ja 4:n käyttö on sama). Koska kirjoittaja on myös uusi CC2430:n parissa eikä hänellä käytännössä ole lainkaan käytännön kokemusta ajastimiin liittyvistä projekteista, en aio (enkä voi tehdä mitään) analysoida ajastinta perusteellisesti. Tämä artikkeli tarjoaa vain lyhyen kokeellisen tarkastelun ajastimen 1 käytöstä ylivuotokeskeytyksien laskemisessa, eikä mainitse sen syötteen kaappaus/tulostusvertailu/PWM-funktioita. Ajastin 2 ja Ajastin 3/4 ovat vain yksinkertaisia toimintojen esittelyjä. Kun kirjoittajan taidot saavuttavat tietyn tason, seison Zigbeen käytännön kokemuksen huipulla parantaakseni tätä esseetä. 2. Ajastin 1Ajastin 1 on 16-bittinen ajastin, jossa on ajastin/laskurin/pulssin leveyden modulaatio. Siinä on kolme erikseen ohjelmoitavaa syötteen kaappaus-/lähtövertailukanavaa, joista kukin voidaan käyttää PWM-lähtönä tai reuna-ajana tulosignaalin kaappaamiseen (tietoa siitä, mitä syötteen kaappaus/lähtö vertailu on ja miten PWM-lähtö toteutetaan, voi lukea CC2430-kiinalaisesta käsikirjasta). Ajastimilla on hyvin tärkeä käsite:Toimintatapa。 Toimintatiloihin kuuluvat: Vapaa toimintatila (vapaajuoksu), homemoodi (modulo) ja positiivisen laskurin tila (ylös-alas)。 Seuraavassa on ote CC2430:n kiinalaisesta käsikirjasta kolmen tilan esittelyä varten:
Vertaillessa kolmea tilaa voidaan nähdä, että vapaan toimintatilan ylivuotoarvo on 0xFFFF muuttumaton; Kaksi muuta tilaa mahdollistavat ajastimen ylivuotoarvon tarkan hallinnan antamalla arvon T1CC0:lle. Tässä kokeessa käytetään tätä ominaisuutta käynnistääkseen keskeytyksen joka sekunti tietyn T1CC0:n ajastimen avulla, jotta LED-valon välkkymisväli voidaan säätää tarkasti 1 sekuntiin. (1) Johdanto kokeeseenAjastimen modulo-tilassa LED-valon vilkkumisväli säädetään tarkasti 1:llä, nimittäin: kirkas 0,5s → tumma 0,5s → kirkas 0,5s → himmeät 0,5s ...... → Vaalea 0,5s → Dark 0,5s (eli aikaväli pimeästä valoon on 1s). Valo/pimeys -inversio saavutetaan ylivuotavilla keskeytyksillä. (2) Ohjelman vuokaavio
(3) Asiaankuuluvat laskelmatKuten aiemmin mainittiin, LED-valon tila on: kirkas 0,5s → tumma 0,5s → kirkas 0,5s → himmeä 0,5s ...... → 0,5s valoa → 0,5s pimeää, ja se täytyy toteuttaa ylivuotokeskeytyksillä, joten ajastimen ylivuotojakson tulee olla 0,5s. Tätä varten vastaava ylivuotoarvo täytyy laskea (tilapäisesti asetettuna N:ksi). Järjestelmän kellotaajuudeksi valitaan 32 MHz, ja annettu kellotaajuus on oletuksena 16 MHz (molemmat määräytyvät erityisten funktiorekisterien mukaan).CLKCONLisätietoja löytyy CC2430:n kiinan käsikirjasta. Timer 1:lle aseta kellon crossover 128 divisioonaan. Yhteenvetona lista on seuraava:
Löytääksesi N=62500, sen heksadesimaali on 0xF424, eli sinun täytyy asettaa T1CC0H=0xF4, T1CC0L=0x24 . (4) Kokeellinen lähdekoodi ja analyysi/*
Kokeen kuvaus: Timer Timer1 -koe, ajastimen määrän ylivuoto, LED1 vilkkuu
*/
#include
#define johti1 P1_0
#define led2 P1_1
#define johti 3 P1_2
#define johti 4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
voidxtal_init(void)
{ UNI &= ~0x04; //都上电
kun(! (UNI &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Valitse 32MHz:n kideoskillaattori UNI |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
voidled_init(void)
{ P1SEL =0x00; P1 on tavallinen I/O-portti P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 ulostulo
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
voidtimer1_init(void)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 crossover; modulomoodi (0x0000->T1CC0); Aloita juokseminen; T1IF=0; Tyhjennä keskeytyskyltti
}
/*主函数
-------------------------------------------------------*/
voidpää(void)
{ xtal_init(); led_init(); timer1_init();
kun(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vektori=T1_VECTOR __interruptvoidT1_ISR(void)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
OK, käännä ohjelma ja debuggaa verkossa, kehityskortin LED1 vilkkuu suunnitellusti, ja vilkkumisväli tuntuu olevan noin 1 sekuntia. Mutta tämä ei riitä todistamaan kokeen onnistumista, jos väli voidaan tarkasti määrittää 1s:ksi, se on täydellinen~ Joten laitoin WIN 7:n kellon päälle (klikkaa tehtäväpalkin oikealla puolella olevaa aikaa). Katsoessaan sekuntiviisaria hän näki silmänurkastaan LED1:n välkkymistä. Tulos: kahdessa minuutissa näiden kahden vauhti on käytännössä täsmälleen sama (tämä tarkkuus on siedettävä~). Tässä vaiheessa voidaan sanoa, että koe on käytännössä valmis, hehe~ 3. Ajastin 2Ajastin 2 tunnetaan myös nimelläMAC-ajastin, on erityisesti suunniteltu tukemaan tapahtumien seurantaprotokollaa IEEE 802.15.4 MAC:ssa. Ajastimessa on 8-numeroinen ylivuotolaskuri, jolla voidaan kirjata tapahtuneiden syklien määrä; On olemassa 16-bittinen tallennusrekisteri, joka tallentaa tarkan ajan, jolloin kehys alkaa vastaanottaa/lähettää tai milloin lähetys päättyy. Se sisältää myös 16-bittisen lähtövertailurekisterin, joka tuottaa erilaisia komentoporttisignaaleja (aloita hyväksyminen, aloita lähettäminen jne.) langattomalle moduulille tiettynä ajankohtana. 4. Ajastin 3/4Ajastin 3/4 on 8-bittinen ajastin, jossa on ajastin/laskuri/PWM-toiminto. T3/T4:ssä on kaksi lähtövertailukanavaa, joista kumpaakin voidaan käyttää PWM-lähtönä. 5. YhteenvetoTämä osio oppii pääasiassa ajastin 1 ylivuotokeskeytyksen laskentamenetelmän ja toteuttaa LED-valon vilkkumisjakson tarkan 1 sekunnin hallinnan. Vain muutama muu ajastin on vain yksi ajatus, ja palaan lisäämään ne myöhemmin. Seuraavassa osiossa esittelemme CC2430-sarjaporttiviestinnän.
|