| I. Videreføring fra forrige artikkel I forrige avsnitt lærte vi om implementering av enkle eksterne avbrudd sammen. Etter å ha fått praktisk erfaring med interrupts, skal vi i dette avsnittet diskutere timerinterrupts.CC2430 har 4 timere, som kan deles inn i 3 kategorier: Timer1, Timer2, Timer3/4 (bruken av 3 og 4 er den samme). Siden forfatteren også bare berører CC2430, er prosjektet som involverer timeropplevelse i utgangspunktet null, så jeg har ikke tenkt å (og kan ikke hjelpe) grundig analyse av timeren. Denne artikkelen bare på timeren 1 teller overløpsavbrudd for å gjøre en enkel eksperimentell utforskning, for dens inngangsfangst / utgangssammenligning / PWM-funksjon er utelatt. Timer 2 og Timer 3/4 introduseres også bare kort. Venter på at forfatterens kraft skal nå et visst nivå av brann, og deretter stå i høyden av Zigbee-kamperfaringen for å forbedre dette essayet. Timer 1 Timer1 er en 16-biters timer med timer/teller/pulsbreddemoduleringsfunksjoner. Den har tre individuelt programmerbare kanaler for input capture/output-sammenligning, som hver kan brukes som en PWM-utgang eller til å fange opp flankens tid på inngangssignalet (for mer informasjon om hva input capture/output-sammenligning er og hvordan man implementerer PWM-utganger, kan leserne se den kinesiske manualen til CC2430 på egen hånd). Timeren har et veldig viktig konsept: driftsmodus. Driftsmodusene inkluderer: free-running, modulo og opp-ned. Her følger en introduksjon av de tre modusene fra den kinesiske manualen til CC2430:
Når man sammenligner de tre modusene, ser man at: Overløpsverdien i free-running-modus er 0xFFFFFF, som ikke kan endres, mens de to andre modusene kan styres nøyaktig ved å tilordne en verdi til T1CC0 for å kontrollere timerens overløpsverdi nøyaktig. Dette eksperimentet benytter seg av denne funksjonen for å få timeren til å utløse et avbrudd hvert 1s gjennom den spesifikke T1CC0, for å kontrollere LED-blinkintervallet på 1s nøyaktig. (1) Introduksjon til eksperimentet I modulo-modusen til tidtakeren styres blinkintervallet til LED-lampen nøyaktig til å være 1s, dvs.: lys 0,5s → mørk 0,5s → lys 0,5s → mørk 0,5s ...... → lys 0,5s → mørke 0,5s (dvs. at øyeblikket for overgang fra mørke til lys er 1s). Reverseringen av lys/mørke realiseres ved hjelp av overflow-interrupt. (2) Flytdiagram for programmet (3) Relaterte beregninger Som nevnt tidligere er tilstanden til LED-lampen: lys 0,5s → mørk 0,5s → lys 0,5s → mørk 0,5s ...... → lys 0,5s → mørk 0,5s, og må oppnås med overløpsavbruddet, så overløpsperioden til tidtakeren må være 0,5s. For dette formålet må den tilsvarende overløpsverdien beregnes (midlertidig satt til N). Systemklokkefrekvensen er valgt til 32 MHz, og klokkefrekvensen til tidtakeren er 16 MHz som standard (begge konfigureres av det spesielle funksjonsregisteret CLKCON, som du finner i den kinesiske manualen til CC2430). For timer 1 setter du klokkefrekvensen til 128 divisjoner. For å oppsummere kan formelen være som følger:
c
Finn ut N = 62500, dens heksadesimale er 0xF424, det vil si at du må sette T1CC0H = 0xF4, T1CC0L = 0x24, det vil si .
(4) eksperimentell kildekode og analyse/* Eksperimentbeskrivelse: Timer1-eksperiment, timertelling overløp, LED1 blinker */ #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; /* initialisering av systemklokke-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // begge slås påwhile (! (SLEEP & 0x40 )); //krystalloscillator på og stabil CLKCON &=~0x47; &
nbsp; //velg 32 MHz krystalloscillator SLEEP |=0x04; }/*LED-initialisering-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 er en normal I/O-port P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 utganger led1 =1; &
nbsp; //Slå av alle lysdioder led2 =1; led3 =1; led4 =1; }/*T1-initialisering---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // slå på totalt avbrudd & T 1IE=1; // slå på T1-avbruddOVFIM=1; // slå på T1-overløp
a vbruddT1CC0L =0x24; //overløpsverdi lav 8 bits T1CC0H =0xF4; //overløpsverdi høy 8 bits & nbsp;T1CTL=0x0x24; //overløpsverdi lav 8 bitsT1CC0H = 0x0xF4; //overløpsverdi høy 8 bits
nbsp; T1CTL =0x0e ; //128 divisjoner; modulo-modus (0x0000->T1CC0); start kjøring;T1IF=0 ; &
nbsp; // fjern avbruddsflagg }/* hovedfunksjon-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); & nbsp; &
nbsp; //vent på overløpsavbrudd }/*T1 terminal service subrutine-------------------------------------------------------*/#pragma vector=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //av avbrudd led1 = !
led1; //LEDs reversertEA=1; //På avbrudd  
; T1CTL &=~0x10; // tøm avbruddsflagg } OK, kompilere programmet og online feilsøking, utvikling styret på LED1 blinker opp som forventet, føler blinkende intervall på ca 1s. Men dette er ikke nok til å bevise suksessen til eksperimentet, hvis du kan strengt bestemme intervallet på 1s ville være perfekt ~ så jeg åpnet WIN 7 klokke (klikk på høyre side av oppgavelinjen tid kan være). Mens jeg så på sekundviseren, kikket jeg på den blinkende LED1 ut av øyekroken. Resultatet er: i to minutter, tempoet i de to er i utgangspunktet identiske (denne nøyaktigheten kan tolereres ~). På dette tidspunktet kan eksperimentet sies å være i utgangspunktet fullført, hehehe~ For det tredje, Timer 2 Timer2, også kjent som MAC-timeren, er spesialdesignet for å støtte hendelsessporingsprotokollen i IEEE 802.15.4 MAC. Timeren har en 8-bits overløpsteller som kan brukes til å registrere antall sykluser som har oppstått; har et 16-bits fangstregister som brukes til å registrere det nøyaktige tidspunktet for når en rammestartavgrensning mottas/overføres eller det nøyaktige tidspunktet for når en overføring er fullført; og inneholder også et 16-bits utgangssammenligningsregister som brukes til å generere ulike kommandoselektive kommunikasjonssignaler til den trådløse modulen på et spesifikt tidspunkt (start mottak, start sending osv.). Tidtaker 3/4 Timer 3/4 er en 8-bits timer med timer/teller/PWM-funksjoner. t3/t4 har to utgangssammenligningskanaler, som hver kan brukes som PWM-utgang. V. Konklusjon I dette avsnittet har vi lært metoden for å telle overløpsavbruddet til timer 1, og oppnådd presis kontroll av LED-blinkintervallet på 1 s. Vi vil bare skumme over de andre tidtakerne, og så gå tilbake for å legge dem til senere. I neste avsnitt vil vi introdusere CC2430 seriell portkommunikasjon. |