Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 7780|Svar: 0

Zigbee Journey (4): Flere vigtige CC2430 grundlæggende eksperimenter - timerafbrydelse

[Kopier link]
Opslået på 30/10/2014 23.17.29 | | | |
1. Forbindelse mellem øvre og nedre niveauer

I den forrige artikel lærte vi sammen om implementeringen af simple eksterne interrupts. Nu hvor vi har praktisk erfaring med afbrydelser, lad os tale om timerafbrydelser i dette afsnit. CC2430 har i alt 4 timere, som kan opdeles i 3 kategorier: timer 1, timer 2, timer 3/4 (brugen af 3 og 4 er den samme).

Da forfatteren også er ny i CC2430 og stort set ingen praktisk erfaring med projekter med timere, har jeg ikke til hensigt (og kan ikke gøre noget) at analysere timeren i dybden. Denne artikel giver kun en kort eksperimentel undersøgelse af brugen af timer 1 i count overflow-interrupts og nævner ikke dens input capture/output comparison/PWM-funktioner. Timer 2 og Timer 3/4 er kun simple funktionsintroduktioner. Når forfatterens færdigheder når et vist niveau af intensitet, vil jeg stå på toppen af Zigbees praktiske erfaring for at forbedre dette essay.

2. Timer 1

Timer 1 er en 16-bit timer med modulation af timer/tæller/pulsbredde. Den har 3 individuelt programmerbare input-fangst/output-sammenligningskanaler, som hver kan bruges som PWM-udgang eller som kanttid til at fange inputsignalet (for information om, hvad input-fangst/output-sammenligning er, og hvordan man implementerer PWM-output, kan læsere henvise til CC2430 kinesiske manual).

Timere har et meget vigtigt koncept:Driftsmåde

Driftstilstande inkluderer: Fri driftstilstand (Fritløbende), formtilstand (modulo) og positiv optælling/nedtællingstilstand (op-ned)。

Følgende er et uddrag fra CC2430 kinesiske manual til introduktionen af de 3 tilstande:



Ved at sammenligne de tre tilstande kan man se, at overløbsværdien for den frie driftstilstand 0xFFFF er uforanderlig; De to andre tilstande tillader præcis kontrol af timerens overløbsværdi ved at tildele en værdi til T1CC0. Dette eksperiment bruger denne funktion til at udløse et afbrud hvert 1. sekund af timeren gennem en specifik T1CC0, for nøjagtigt at kontrollere LED-lysets blinkinterval til 1 sekunder.

(1) Introduktion til eksperimentet

I modulo-tilstanden af timeren styres LED-lysets blinkeinterval præcist af 1s, nemlig: lyse 0,5s → mørke 0,5s → lyse 0,5s → svage 0,5s ...... → Lyse 0,5 sekunder → Mørke 0,5 sekunder (dvs. tidsintervallet fra mørkt til lyst er 1 sekund). Lys/mørke-inversion opnås ved overløb af interrupts.

(2) Programflowdiagram

(3) Relevante beregninger

Som nævnt tidligere er status for LED-lyset: stærk 0,5s → mørk 0,5s → lys 0,5s → svag 0,5s ...... → 0,5 sekunder lys → 0,5 sekunder mørk, og det skal implementeres med overflow-interrupts, så timerens overløbsperiode skal være 0,5 sekunder. For at gøre dette skal den tilsvarende overløbsværdi beregnes (midlertidigt sættes til N).

Systemclockfrekvensen vælges som 32MHz, og den angivne clockfrekvens er som standard 16MHz (begge bestemmes af specielle funktionsregistre).CLKCONFor detaljer, se venligst CC2430 kinesiske manual).

For timer 1 skal du sætte dens ur-crossover til 128 divisioner.

For at opsummere er listen som følger:

For at finde N=62500 er dens hexadecimal 0xF424, det vil sige, du skal sætte T1CC0H=0xF4, T1CC0L=0x24 .

(4) Eksperimentel kildekode og analyse/*
    Eksperimentbeskrivelse: Timer Timer1-eksperiment, timer count overflow, LED1 blinker
*/

#include

#define led1 P1_0         
#define led2 P1_1         
#define led3 P1_2         
#define led4 P1_3         

/*系统时钟初始化
-------------------------------------------------------*/
tomrumxtal_init(tomrum)
{
  SOV &= ~0x04;            //都上电
  mens(! (SØVN &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;            Vælg en 32MHz krystaloscillator
  SØVN |=0x04;
}

/*LED初始化
-------------------------------------------------------*/
tomrumled_init(tomrum)
{
  P1SEL =0x00;            P1 er den normale I/O-port
  P1DIR |=0x0F;            P1.0 P1.1 P1.2 P1.3 output
  
  led1 =1;                  //关闭所有LED
  led2 =1;
  led3 =1;
  led4 =1;
}

/*T1初始化
-------------------------------------------------------*/
tomrumtimer1_init(tomrum)
{
  EA=1;            //开总中断
  T1IE=1;           //开T1中断
  OVFIM=1;         //开T1溢出中断
  
  T1CC0L=0x24;      //溢出值低8位
  T1CC0H=0xF4;      //溢出值高8位
  
  T1CTL =0x0e;     128 crossover; modulo-tilstand (0x0000->T1CC0); Begynd at løbe;
  T1IF=0;           Fjern afbrydelsesskiltet  
}

/*主函数
-------------------------------------------------------*/
tomrumhoved(tomrum)
{
  xtal_init();
  led_init();
  timer1_init();

  mens(1);            //等待溢出中断
}

/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vektor=T1_VECTOR
__interrupttomrumT1_ISR(tomrum)
{
  EA=0;               //关中断
  
  led1 = !led1;      //LED灯反转

  EA=1;               //开中断
  
  T1CTL &= ~0x10;     //清中断标志
}

OK, kompiler programmet og fejlsøg online, LED1 på udviklingskortet blinker som planlagt, og det føles som om blinkintervallet er omkring 1 sekund. Men det er ikke nok til at bevise eksperimentets succes; hvis intervallet kan bestemmes strengt til at være 1s, vil det være perfekt~ Så jeg tændte for uret for WIN 7 (klik på tiden i højre side af proceslinjen). Mens han kiggede på sekundviseren, så han LED1's blink ud af øjenkrogen. Resultatet: inden for to minutter er tempoet på de to stort set helt det samme (denne præcision er tålelig~). På dette tidspunkt kan man sige, at eksperimentet stort set er afsluttet, hehe~

3. Timer 2

Timer 2 kaldes ogsåMAC-timer, er specifikt designet til at understøtte hændelsessporingsprotokollen i IEEE 802.15.4 MAC. Timeren har en 8-cifret overløbstæller, der kan bruges til at registrere antallet af cyklusser, der er opstået; Der findes et 16-bit capture-register, som registrerer det præcise tidspunkt, et billede begynder at modtage/sende, eller det præcise tidspunkt transmissionen er afsluttet. Den indeholder også et 16-bit output-sammenligningsregister, der genererer forskellige kommando-gatingsignaler (start accept, start sending osv.) til det trådløse modul på et bestemt tidspunkt.

4. Timer 3/4

Timer 3/4 er en 8-bit timer med timer/tæller/PWM-funktion. T3/T4 har 2 output-sammenligningskanaler, som hver kan bruges som PWM-udgang.

5. Konklusion

Dette afsnit lærer hovedsageligt metoden bag tælle-overløbsafbrydelsen på timer 1 og realiserer den præcise kontrol af LED-lysblinkende intervallet på 1 sekunder. Bare et par andre timere er bare et strøg, og jeg kommer tilbage og tilføjer dem senere. I næste afsnit vil vi introducere CC2430 serielle portkommunikation.






Tidligere:Zigbee Journey (3): Flere vigtige CC2430 grundlæggende eksperimenter - ekstern afbrydelse
Næste:Zigbee Journey (5): Flere vigtige CC2430 grundlæggende eksperimenter - seriel kommunikation
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com