|
1. Conectarea nivelurilor superioare și inferioare În articolul anterior, am învățat împreună despre implementarea întreruperilor externe simple. Acum că avem experiență practică cu întreruperile, să vorbim despre întreruperile temporizator în această secțiune. CC2430 are în total 4 cronometre, care pot fi împărțite în 3 categorii: cronometr 1, cronometru 2, cronometru 3/4 (utilizarea numărului 3 și 4 este aceeași). Deoarece autorul este și el nou în CC2430 și practic nu are experiență practică în proiecte care implică cronometre, nu intenționez (și nu pot face nimic) să analizez cronometrul în profunzime. Acest articol oferă doar o scurtă explorare experimentală a utilizării timerului 1 în întreruperile de numărare a overflow și nu menționează funcțiile sale de captură/comparație de ieșire/PWM. Timer 2 și Timer 3/4 sunt doar introduceri simple de funcții. După ce abilitățile autorului ating un anumit nivel de intensitate, voi sta la apogeul experienței practice a lui Zigbee pentru a îmbunătăți acest eseu. 2. Cronometru 1Timerul 1 este un temporizator pe 16 biți cu modulație de timer/contor/lățime de impuls. Are 3 canale de comparație de captură/ieșire de intrare programabile individual, fiecare putând fi folosit ca ieșire PWM sau ca timp de margine pentru captarea semnalului de intrare (pentru informații despre ce este comparația captură/ieșire de intrare și cum se implementează ieșirea PWM, cititorii pot consulta manualul chinezesc CC2430). Cronometrele au un concept foarte important:Mod de funcționare。 Modurile de operare includ: Modul liber de operare (Alergare liberă), modul matriței (Modulo) și Numărătoare pozitivă/Mod de numărătoare inversă (Sus-jos)。 Următorul este un fragment din manualul chinezesc CC2430 pentru introducerea celor 3 moduri:
Comparând cele trei moduri, se poate observa că valoarea overflow a modului de operare liberă este 0xFFFF neschimbabilă; Celelalte două moduri permit controlul precis al valorii de overflow a temporizatorului prin atribuirea unei valori către T1CC0. Acest experiment folosește această caracteristică pentru a declanșa o întrerupere la fiecare 1 secundă de către cronometrul unui anumit T1CC0, pentru a controla cu precizie intervalul de intermitere al luminii LED-ului la 1. (1) Introducere în experimentÎn modul modulo al temporizatorului, intervalul de intermitere al luminii LED este controlat precis de 1s, și anume: 0,5s → 0,5s întunecat → 0,5s → 0,5s slab ...... → 0,5 lumină → 0,5 secunde întunecată (adică intervalul de timp de la întuneric la lumină este de 1 secundă). Inversiunea lumină/întuneric se realizează prin întreruperi care se debordează. (2) Diagramă de flux a programului
(3) Calcule relevanteDupă cum am menționat anterior, starea luminii LED este: puternic 0,5s → întunecat 0,5s → puternic 0,5s → slab întunecat 0,5s ...... → 0,5s lumină → 0,5s întunecată, și trebuie implementată cu întreruperi de debordare, astfel încât perioada de depășire a temporizatorului trebuie să fie de 0,5 secunde. Pentru a face acest lucru, trebuie calculată valoarea corespunzătoare a depășirii (setată temporar la N). Frecvența de ceas a sistemului este selectată ca 32MHz, iar frecvența de ceas dată este implicit 16MHz (ambele sunt determinate de registre speciale de funcție).CLKCONPentru detalii, vă rugăm să consultați manualul chinezesc CC2430). Pentru Timer 1, setează crossover-ul ceasului la 128 de divizii. În concluzie, lista este următoarea:
Pentru a găsi N=62500, hexazecimalul său este 0xF424, adică trebuie să setezi T1CC0H=0xF4, T1CC0L=0x24 . (4) Cod sursă experimental și analiză/*
Descrierea experimentului: Experiment Timer Timer1, depășire a numărului de timere, LED1 intermitent
*/
#include
#define condus P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Voidxtal_init(Void)
{ SOMN &= ~0x04; //都上电
în timp ce(! (SOMN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Alege un oscilator cu cristal de 32MHz SLEEP |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Voidled_init(Void)
{ P1SEL =0x00; P1 este portul normal de I/O P1DIR |=0x0F; Ieșire P1.0 P1.1 P1.2 P1.3
a condus1 =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; modul modul (0x0000->T1CC0); Începe să alergi; T1IF=0; Șterge semnul de întrerupere
}
/*主函数
-------------------------------------------------------*/
Voidmain(Void)
{ xtal_init(); led_init(); timer1_init();
în timp ce(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vector=T1_VECTOR __interruptVoidT1_ISR(Void)
{ EA=0; //关中断
a condus1 = !a condus1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
OK, compilam programul și depanează online, LED1 de pe placa de dezvoltare clipește conform programului și pare că intervalul de flashare este cam 1 secundă. Dar acest lucru nu este suficient pentru a demonstra succesul experimentului, dacă intervalul poate fi determinat strict ca fiind 1s, va fi perfect~ Așa că am pornit ceasul WIN 7 (click pe ora din partea dreaptă a barei de sarcini). În timp ce se uita la secundare, a privit cu coada ochiului flash-ul LED1. Rezultatul: în două minute, ritmul celor două este practic același (această precizie este tolerabilă~). În acest moment, experimentul poate fi considerat practic finalizat, hehe~ 3. Cronometrul 2Cronometru 2 mai este numit șiTemporizator MAC, este proiectat special pentru a susține protocolul de urmărire a evenimentelor din IEEE 802.15.4 MAC. Cronometrul are un contor de overflow de 8 cifre care poate fi folosit pentru a înregistra numărul de cicluri care au avut loc; Există un registru de captură pe 16 biți care înregistrează momentul exact în care un cadru începe să primească/trimită sau momentul exact în care transmiterea este finalizată. De asemenea, conține un registru de comparație de ieșire pe 16 biți care generează diverse semnale de comandă (start accept, start send etc.) către modulul wireless la un moment specific. 4. Temporizator 3/4Timerul 3/4 este un temporizator pe 8 biți cu funcție de timer/contor/PWM. T3/T4 are 2 canale de comparație de ieșire, fiecare putând fi folosit ca ieșire PWM. 5. ConcluzieAceastă secțiune învață în principal metoda întreruperii de debordare a numărării temporizatorului 1 și realizează controlul precis al intervalului de intermitere al LED-ului de 1s. Doar câteva alte cronometrate sunt doar o lovitură, și mă voi întoarce să le adaug mai târziu. În următoarea secțiune, vom introduce comunicarea prin port serial CC2430.
|