| I. Jatkoa edelliselle artikkelille... Edellisessä osassa opimme yhdessä yksinkertaisten ulkoisten keskeytysten toteuttamisesta. Kun meillä on käytännön kokemusta keskeytyksistä, käsittelemme tässä jaksossa ajastinkeskeytyksiä. CC2430:ssä on neljä ajastinta, jotka voidaan jakaa kolmeen luokkaan: Timer1, Timer2, Timer3/4 (3:n ja 4:n käyttö on sama). Koska kirjoittaja on myös vain koskettaa CC2430, projekti, johon liittyy ajastin kokemus on periaatteessa nolla, joten en aio (enkä voi auttaa) syvällinen analyysi ajastin. Tämä artikkeli koskee vain ajastimen 1 count overflow interrupt -käyttöä yksinkertaisen kokeellisen tutkimuksen tekemiseksi, sillä sen input capture / output comparison / PWM-toiminto on jätetty pois. Ajastin 2 ja ajastin 3/4 esitellään myös vain lyhyesti. Odotetaan, että kirjoittajan teho saavuttaa tietyn tulitason, ja sitten seisoo Zigbee-taistelukokemuksen korkeudessa tämän esseen parantamiseksi. Ajastin 1 Ajastin1 on 16-bittinen ajastin, jossa on ajastin / laskuri / pulssinleveysmodulaatiotoiminnot. Siinä on kolme erikseen ohjelmoitavaa tulon kaappaus- / lähtövertailukanavaa, joista kutakin voidaan käyttää PWM-lähtönä tai käyttää tulosignaalin reuna-ajan kaappaamiseen (lisätietoja siitä, mitä tulon kaappaus- / lähtövertailu on ja miten PWM-lähtöjen toteuttaminen toteutetaan, lukijat voivat tutustua CC2430: n kiinalaiseen käsikirjaan itse). Ajastimella on erittäin tärkeä käsite: toimintatila. Toimintatiloja ovat muun muassa: vapaa-ajo, modulo ja ylös-alas. Seuraavassa esitellään nämä kolme toimintatilaa CC2430:n kiinalaisesta käsikirjasta:
Verrattaessa näitä kolmea tilaa voidaan havaita, että: vapaasti toimivan tilan ylivuotoarvo on 0xFFFF, jota ei voi muuttaa; kun taas kahta muuta tilaa voidaan ohjata tarkasti antamalla arvo T1CC0:lle, jotta ajastimen ylivuotoarvoa voidaan ohjata tarkasti. Tässä kokeessa käytetään tätä ominaisuutta, jotta ajastin laukaisee keskeytyksen 1s välein tietyn T1CC0:n kautta, jotta LED:n 1s:n vilkkumisväliä voidaan ohjata tarkasti. (1) Johdanto kokeeseen Ajastimen modulo-tilassa LEDin vilkkumisväliä ohjataan tarkasti 1s:n suuruiseksi, eli: valo 0,5s → pimeä 0,5s → valo 0,5s → pimeä 0,5s ....... → valo 0,5s → pimeä 0,5s (eli siirtymishetki pimeästä valoon on 1s). Valon/pimeän vaihtuminen tapahtuu ylivuotokeskeytyksellä. (2) Ohjelman kulkukaavio (3) Aiheeseen liittyvät laskelmat Kuten aiemmin mainittiin, LEDin tila on: kirkas 0,5s → tumma 0,5s → kirkas 0,5s → tumma 0,5s ...... → valo 0,5s → pimeä 0,5s, ja ne on saavutettava ylivuotokeskeytyksellä, joten ajastimen ylivuotojakson on oltava 0,5 s. Tätä varten on laskettava vastaava ylivuotoarvo (asetetaan väliaikaisesti arvoksi N). Järjestelmän kellotaajuudeksi on valittu 32 MHz, ja ajastimelle annettava kellotaajuus on oletusarvoisesti 16 MHz (molemmat määritetään erityisellä toimintorekisterillä CLKCON, joka löytyy CC2430:n kiinalaisesta käsikirjasta). Aseta ajastimen 1 kellotaajuudeksi 128 jakoa. Yhteenvetona kaava voi olla seuraava:
c
Selvitä N = 62500, sen heksadesimaali on 0xF424, eli sinun täytyy asettaa T1CC0H = 0xF4, T1CC0L = 0x24 eli .
(4) kokeellinen lähdekoodi ja analyysi/* Kokeen kuvaus: Ajastin1 kokeilu, ajastimen laskennan ylivuoto, LED1 vilkkuu */ #include #define led1 P1_0 # define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
n bsp; /* järjestelmän kellon alustaminen-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // molempien virta päällewhile (! (SLEEP & 0x40 )); //kideoskillaattori päällä ja vakaa CLKCON &=~0x47; &
nbsp; //valitaan 32 MHz:n kideoskillaattori SLEEP |=0x04; }/*LED:ien alustaminen-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 on normaali I/O-portti P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 lähdöt led1 =1; &
nbsp; //Kytke kaikki LEDit pois päältä led2 =1; led3 =1; led4 =1; }/*T1 alustaminen---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // Kytke päälle kokonaiskatkos & nbsp; T1IE=1; // kytke T1-keskeytys päälleOVFIM=1; // kytke T1-ylivuoto päälle.
k eskeytysT1CC0L=0x24; //ylivuotoarvo low 8 bittiä T1CC0H=0xF4; //ylivuotoarvo high 8 bittiä &
nbsp; T1CTL =0x0e; //128 jakoa; modulo-tila (0x0000->T1CC0); käynnistä käynnissä;T1IF=0; &
nbsp; // tyhjennä keskeytyslippu }/* pääfunktio-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; // odota ylivuotokeskeytystä }/*T1-päätepalvelun aliohjelma-------------------------------------------------------*/#pragma vector=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //off interrupt led1 = !
led1; //LEDit käännetäänEA=1; //Keskeytyksessä  
; T1CTL &=~0x10; // tyhjennä keskeytyslippu } OK, kääntää ohjelman ja online debuggaus, kehityslevyn LED1 vilkkuu odotetusti, tuntuu vilkkumisväli noin 1s. Mutta tämä ei riitä todistamaan kokeen onnistumista, jos voit tarkasti määrittää 1s-väli olisi täydellinen ~ joten avasin WIN 7-kellon (napsauta tehtäväpalkin oikealla puolella aika voi olla). Katsellessani sekuntiviisaria vilkaisin silmäkulmasta vilkkuvaa LED1:tä. Tulos on: kahdessa minuutissa näiden kahden tahti on periaatteessa sama (tämä tarkkuus voidaan sietää ~). Tässä vaiheessa kokeen voidaan sanoa olevan periaatteessa valmis, hehehe~ Kolmanneksi, ajastin 2 Ajastin2, joka tunnetaan myös nimellä MAC-ajastin, on erityisesti suunniteltu tukemaan IEEE 802.15.4 MAC:n tapahtumaseurantaprotokollaa. Ajastimessa on 8-bittinen ylivuotolaskuri, jota voidaan käyttää tapahtuneiden syklien lukumäärän tallentamiseen; siinä on 16-bittinen kaappausrekisteri, jota käytetään tallentamaan tarkka aika, jolloin kehyksen aloitusrajausmerkki vastaanotetaan/lähetetään tai tarkka aika, jolloin lähetys on valmis; ja se sisältää myös 16-bittisen lähtövertailurekisterin, jota käytetään erilaisten komentoselektiivisten viestintäsignaalien tuottamiseen langattomalle moduulille tiettynä ajankohtana (vastaanoton aloittaminen, lähetyksen aloittaminen jne.). Ajastin 3/4 Ajastin 3/4 on 8-bittinen ajastin, jossa on ajastin/laskuri/PWM-toiminnot. t3/t4:ssä on kaksi lähtövertailukanavaa, joista kumpaakin voidaan käyttää PWM-lähtönä. V. Päätelmät Tässä jaksossa olemme oppineet menetelmän, jolla laskemme ajastimen 1 ylivuotokeskeytyksen, ja saavuttaneet LEDin vilkkumisvälin tarkan hallinnan 1 s. Käymme vain ohimennen läpi muut ajastimet ja palaamme sitten lisäämään ne myöhemmin. Seuraavassa jaksossa esittelemme CC2430-sarjaportin tiedonsiirron. |