| I. Continuarea de la articolul anterior În secțiunea anterioară, am învățat împreună despre implementarea întreruperilor externe simple. După ce am dobândit experiență practică cu întreruperile, vom discuta despre întreruperile de temporizator în această secțiune. CC2430 are 4 temporizatoare, care pot fi împărțite în 3 categorii: Timer1, Timer2, Timer3/4 (utilizarea lui 3 și 4 este aceeași). Deoarece autorul este, de asemenea, doar atingând CC2430, proiectul care implică experiența temporizatorului este practic zero, așa că nu intenționez să (și nu pot ajuta) analiza aprofundată a temporizatorului. Acest articol numai pe timer 1 count overflow întrerupere utilizare pentru a face o explorare experimentală simplă, pentru funcția sa de captură de intrare / comparație de ieșire / PWM este omisă. Timer 2 și Timer 3/4 sunt, de asemenea, introduse doar pe scurt. Așteptând ca puterea autorului să atingă un anumit nivel de foc, și apoi să stea în înălțimea experienței de luptă Zigbee pentru a îmbunătăți acest eseu. Timer 1 Timer1 este un timer pe 16 biți cu funcții de temporizare / contor / modulare a lățimii impulsurilor. Acesta are trei canale de comparare a capturii / ieșirii de intrare programabile individual, fiecare dintre acestea putând fi utilizat ca ieșire PWM sau utilizat pentru a capta timpul de front al semnalului de intrare (pentru mai multe informații despre ce este compararea capturii / ieșirii de intrare și cum se implementează ieșirile PWM, cititorii pot consulta manualul chinez al CC2430 pe cont propriu). Temporizatorul are un concept foarte important: modul de funcționare. Modurile de funcționare includ: free-running, modulo și up-down. Următoarea este introducerea celor trei moduri din manualul chinezesc al CC2430:
Comparând cele trei moduri, se poate observa că: valoarea de debordare a modului free-running este 0xFFFF, care nu poate fi modificată; în timp ce celelalte două moduri pot fi controlate cu precizie prin atribuirea unei valori la T1CC0 pentru a controla cu precizie valoarea de debordare a cronometrului. Acest experiment utilizează această caracteristică pentru a face ca cronometrul să declanșeze o întrerupere la fiecare 1 s prin T1CC0 specific, astfel încât să controleze cu precizie intervalul de clipire a LED-urilor de 1 s. (1) Introducere în experiment În modul modulo al cronometrului, intervalul de clipire al LED-ului este controlat cu precizie pentru a fi de 1s, și anume: lumină 0,5s → întuneric 0,5s → lumină 0,5s → întuneric 0,5s ...... → lumină 0,5s → întuneric 0,5s (adică momentul de tranziție de la întuneric la lumină este de 1s). Inversarea luminii/întunericului este realizată prin întreruperea overflow. (2) Diagrama de flux a programului (3) Calcule conexe După cum s-a menționat anterior, starea LED-ului este: luminos 0,5s → întunecat 0,5s → luminos 0,5s → întunecat 0,5s ...... → luminos 0,5s → întunecat 0,5s, și trebuie să fie realizate cu întreruperea de debordare, astfel încât perioada de debordare a temporizatorului trebuie să fie de 0,5s. În acest scop, trebuie calculată valoarea de debordare corespunzătoare (setată temporar la N). Frecvența ceasului sistemului este selectată ca fiind de 32 MHz, iar frecvența ceasului furnizată timerului este implicit de 16 MHz (ambele sunt configurate prin registrul de funcții speciale CLKCON, care poate fi găsit în manualul chinez CC2430). Pentru temporizatorul 1, setați frecvența sa de ceas la 128 de diviziuni. Pentru a rezuma, formula poate fi după cum urmează:
c
Aflați N = 62500, hexazecimalul său este 0xF424, adică trebuie să setați T1CC0H = 0xF4, T1CC0L = 0x24 adică .
(4) codul sursă experimental și analiza/* Descrierea experimentului: Experimentul Timer1, depășirea numărătorii timerului, LED1 clipește */ #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; /* inițializarea ceasului de sistem-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // ambele porniriwhile (! (SLEEP & 0x40 )); //cristal oscilator pornit și stabil CLKCON &=~0x47; &
nbsp; //selectează oscilatorul cu cristal de 32MHz SLEEP |=0x04; }/*Inițializarea LED-urilor-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 este un port I/O normal P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 ieșiri led1 =1; &
nbsp; //Opriți toate LED-urile led2 =1; led3 =1; led4 =1; }/*Inițializare Timer1---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // activează întreruperea totală & nbsp; T1IE=1; // activează întreruperea T1OVFIM=1; // activează depășirea T1
întrerupere T1CC0L=0x24; //valoare depășire 8 biți joasă T1CC0H=0xF4; //valoare depășire 8 biți înaltă &
nbsp; T1CTL =0x0e; //128 diviziuni; mod modulo (0x0000->T1CC0); începe să funcționeze;T1IF=0; &
nbsp; // clear interrupt flag }/* funcția principală-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; //așteptați întreruperea pentru depășire }/*Subprogramul de serviciu terminal T1-------------------------------------------------------*/#pragma vector=T1_VECTOR __interrupt
v oid T1_ISR( void ) {EA=0; //off întrerupere led1 = !
led1; //LED-uri inversateEA=1; //On întrerupere  
; T1CTL &=~0x10; // șterge steagul de întrerupere } OK, compilați programul și depanarea online, placa de dezvoltare pe LED1 clipește așa cum era de așteptat, simțiți intervalul de clipire de aproximativ 1s. Dar acest lucru nu este suficient pentru a dovedi succesul experimentului, dacă puteți determina riguros intervalul de 1s ar fi perfect ~ așa că am deschis ceasul WIN 7 (faceți clic pe partea dreaptă a timpului bara de activități poate fi). În timp ce mă uitam la mâna a doua, m-am uitat cu coada ochiului la LED1 intermitent. Rezultatul este: în două minute, ritmul celor două sunt practic identice (această precizie poate fi tolerată ~). În acest moment, se poate spune că experimentul a fost practic finalizat, hehehe~ În al treilea rând, Timer 2 Timer2, cunoscut și sub numele de timer MAC, este special conceput pentru a sprijini protocolul de urmărire a evenimentelor în IEEE 802.15.4 MAC. Timerul are un contor de depășire de 8 biți care poate fi utilizat pentru a înregistra numărul de cicluri care au avut loc; are un registru de captură de 16 biți care este utilizat pentru a înregistra momentul exact în care un delimitator de început de cadru este primit/transmis sau momentul exact în care o transmisie este finalizată; și conține, de asemenea, un registru de comparare a ieșirii de 16 biți care este utilizat pentru a genera diverse semnale de comunicare selective de comandă către modulul wireless la un moment dat (începe recepția, începe transmisia etc.). Timer 3/4 Temporizatorul 3/4 este un temporizator pe 8 biți cu funcții de temporizator/contor/PWM. t3/t4 are două canale de comparare a ieșirilor, fiecare dintre acestea putând fi utilizată ca ieșire PWM. V. Concluzie În această secțiune, am învățat metoda de numărare a întreruperii overflow a temporizatorului 1 și am realizat controlul precis al intervalului de clipire a LED-ului de 1 s. Vom trece doar cu vederea celelalte temporizatoare, pentru a reveni mai târziu la adăugarea lor. În secțiunea următoare, vom prezenta despre comunicarea prin portul serial CC2430. |