Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 7780|Antwoord: 0

Zigbee Journey (4): Verschillende belangrijke CC2430 basisexperimenten - timeronderbreking

[Link kopiëren]
Geplaatst op 30-10-2014 23:17:29 | | | |
1. Het verbinden van de boven- en benedenverdiepingen

In het vorige artikel leerden we samen over de implementatie van eenvoudige externe interrupts. Nu we praktische ervaring hebben met interrupts, laten we het in dit gedeelte hebben over timer-interrupts. CC2430 heeft in totaal 4 timers, die in 3 categorieën kunnen worden verdeeld: timer 1, timer 2, timer 3/4 (het gebruik van 3 en 4 is hetzelfde).

Aangezien de auteur ook nieuw is met de CC2430 en vrijwel geen praktische ervaring heeft met projecten met timers, ben ik niet van plan (en kan ik niets doen) om de timer diepgaand te analyseren. Dit artikel biedt slechts een korte experimentele verkenning van het gebruik van timer 1 bij count-overflow-interrupts, en noemt de inputcapture/outputvergelijking/PWM-functies niet. Timer 2 en Timer 3/4 zijn slechts eenvoudige functie-introducties. Nadat de vaardigheden van de auteur een bepaald niveau van intensiteit bereiken, zal ik op het hoogtepunt van Zigbee's praktische ervaring staan om dit essay te verbeteren.

2. Timer 1

Timer 1 is een 16-bits timer met modulatie van timer/teller/pulsbreedte. Het heeft 3 individueel programmeerbare input-capture/outputvergelijkingskanalen, elk gebruikt als PWM-uitgang of als randtijd om het ingangssignaal vast te leggen (voor informatie over wat input-opname/outputvergelijking is en hoe PWM-uitgang te implementeren, kunnen lezers de CC2430 Chinese handleiding raadplegen).

Timers hebben een heel belangrijk concept:Werkingswijze

Bedrijfsmodi zijn onder andere: Vrije bedieningsmodus (Free-running), vormmodus (modulo) en positieve tel-/aftelmodus (Omhoog-omlaag)。

Het volgende is een fragment uit de Chinese handleiding van CC2430 voor de introductie van de 3 modi:



Bij vergelijking van de drie modi is te zien dat de overloopwaarde van de vrije bedrijfsmodus 0xFFFF onveranderlijk is; De andere twee modi maken precieze controle van de overloopwaarde van de timer mogelijk door een waarde toe te wijzen aan T1CC0. Dit experiment gebruikt deze functie om elke 1s een interrupt te triggeren door de timer via een specifieke T1CC0, zodat het knipperinterval van het LED-lampje tot 1s nauwkeurig kan worden geregeld.

(1) Inleiding tot het experiment

In de modulo-modus van de timer wordt het knipperinterval van het LED-licht nauwkeurig geregeld door 1s, namelijk: helder 0,5s → donker 0,5s → helder 0,5s → zwak 0,5s ...... → Licht 0,5s → Donker 0,5s (d.w.z. het tijdsinterval van donker naar licht is 1s). Licht/donker-inversie wordt bereikt door overlopende interrupts.

(2) Programmastroomdiagram

(3) Relevante berekeningen

Zoals eerder vermeld, is de status van het LED-licht: fel 0,5s → donker 0,5s → helder 0,5s → zwak 0,5s ...... → 0,5s licht → 0,5s donker, en het moet worden geïmplementeerd met overflow-interrupts, dus de overloopperiode van de timer moet 0,5s zijn. Om dit te doen moet de overeenkomstige overloopwaarde worden berekend (tijdelijk ingesteld op N).

De systeemklokfrequentie wordt geselecteerd als 32 MHz, en de gegeven klokfrequentie is standaard 16 MHz (beide worden bepaald door speciale functieregisters).CLKCONVoor details, raadpleeg de CC2430 Chinese handleiding).

Voor Timer 1 stel je de klok-crossover in op 128 divisies.

Samengevat is de lijst als volgt:

Om N=62500 te vinden, is de hexadecimale factor 0xF424, dat wil zeggen, je moet T1CC0H=0xF4, T1CC0L=0x24 instellen.

(4) Experimentele broncode en analyse/*
    Experimentbeschrijving: Timer Timer1 experiment, timer count overflow, LED1 knipperend
*/

#include

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

/*系统时钟初始化
-------------------------------------------------------*/
leegtextal_init(leegte)
{
  SLAAP &= ~0x04;            //都上电
  terwijl(! (SLAAP &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;            Kies een 32MHz kristaloscillator.
  SLAAP |=0x04;
}

/*LED初始化
-------------------------------------------------------*/
leegteled_init(leegte)
{
  P1SEL =0x00;            P1 is de normale I/O-poort
  P1DIR |=0x0F;            P1.0 P1.1 P1.2 P1.3 uitgang
  
  led1 =1;                  //关闭所有LED
  led2 =1;
  led3 =1;
  led4 =1;
}

/*T1初始化
-------------------------------------------------------*/
leegtetimer1_init(leegte)
{
  EA=1;            //开总中断
  T1IE=1;           //开T1中断
  OVFIM=1;         //开T1溢出中断
  
  T1CC0L=0x24;      //溢出值低8位
  T1CC0H=0xF4;      //溢出值高8位
  
  T1CTL =0x0e;     128 crossover; modulo modus (0x0000->T1CC0); Begin met rennen;
  T1IF=0;           Maak het onderbrekingsbord weg  
}

/*主函数
-------------------------------------------------------*/
leegtehoofd(leegte)
{
  xtal_init();
  led_init();
  timer1_init();

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

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

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

Oké, compileer het programma en debug online, LED1 op het ontwikkelbord knippert zoals gepland, en het voelt alsof het knipperingsinterval ongeveer 1 seconde is. Maar dit is niet genoeg om het succes van het experiment te bewijzen; als het interval strikt als 1s kan worden bepaald, zal het perfect zijn~ Dus zette ik de klok van WIN 7 aan (klik op de tijd aan de rechterkant van de taakbalk). Terwijl hij naar de secondewijzer keek, zag hij vanuit zijn ooghoek het knipperen van LED1. Het resultaat: binnen twee minuten is het tempo van de twee in principe exact hetzelfde (deze precisie is draaglijk~). Op dit punt kan men zeggen dat het experiment in wezen voltooid is, hehe~

3. Timer 2

Timer 2 wordt ook wel genoemdMAC-timer, is specifiek ontworpen ter ondersteuning van het event tracking-protocol in IEEE 802.15.4 MAC. De timer heeft een 8-cijferige overloopteller die kan worden gebruikt om het aantal cycli te registreren; Er is een 16-bits capture-register dat de exacte tijd registreert waarop een frame begint te ontvangen/verzenden of het exacte moment waarop de transmissie is voltooid. Het bevat ook een 16-bits outputvergelijkingsregister dat verschillende command gating-signalen genereert (start accepting, start send, enz.) naar de draadloze module op een specifiek moment.

4. Timer 3/4

Timer 3/4 is een 8-bits timer met timer/teller/PWM-functie. T3/T4 heeft 2 uitgangsvergelijkingskanalen, die elk als PWM-uitgang kunnen worden gebruikt.

5. Conclusie

Deze sectie leert vooral de methode van de teloverlooponderbreking van timer 1 en realiseert de precieze controle van het knipperende LED-lichtinterval van 1 seconden. Een paar andere timers zijn slechts een streek, en ik kom later terug om ze toe te voegen. In de volgende sectie introduceren we de CC2430 seriële poortcommunicatie.






Vorig:Zigbee Journey (3): Verschillende belangrijke CC2430 basisexperimenten - externe onderbreking
Volgend:Zigbee Journey (5): Verschillende belangrijke CC2430 basisexperimenten - seriële communicatie
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com