|
1. Prepojenie hornej a dolnej úrovne V predchádzajúcom článku sme sa spoločne učili o implementácii jednoduchých externých prerušení. Teraz, keď máme praktické skúsenosti s prerušeniami, poďme sa v tejto časti porozprávať o časovačových prerušeniach. CC2430 má celkovo 4 časovače, ktoré možno rozdeliť do 3 kategórií: časovač 1, časovač 2, časovač 3/4 (použitie 3 a 4 je rovnaké). Keďže autor je tiež nový v CC2430 a prakticky nemá žiadne praktické skúsenosti s projektmi s časovačmi, nemám v úmysle (a nemôžem nič robiť) podrobne analyzovať časovač. Tento článok poskytuje len stručné experimentálne preskúmanie použitia časovača 1 pri prerušeniach pretečenia počtu a nespomína jeho funkcie na zachytávanie/porovnávanie výstupov/PWM. Časovač 2 a Časovač 3/4 sú len jednoduché predstavenia funkcií. Keď autorove schopnosti dosiahnu určitú úroveň intenzity, postavím sa na vrchol Zigbeeho praktických skúseností, aby som túto esej zlepšil. 2. Časovač 1Timer 1 je 16-bitový časovač s moduláciou šírky časovača/čítača/pulzu. Má 3 individuálne programovateľné kanály na zachytávanie/porovnávanie vstupov, z ktorých každý môže slúžiť ako výstup PWM alebo ako edge time na zachytenie vstupného signálu (pre informácie o tom, čo je porovnávanie vstupov/výstupov a ako implementovať výstup PWM, môžu čitatelia použiť čínsky manuál CC2430). Časovače majú veľmi dôležitý koncept:Spôsob prevádzky。 Prevádzkové režimy zahŕňajú: Režim voľnej prevádzky (voľne bežiaci), mold mode (modulo) a režim pozitívneho počítania/odpočítavania (hore-dole)。 Nasleduje úryvok z čínskeho manuálu CC2430 na zavedenie troch režimov:
Porovnaním týchto troch režimov je vidieť, že hodnota pretečenia voľného prevádzkového režimu je 0xFFFF nemenná; Ostatné dva režimy umožňujú presnú kontrolu hodnoty pretečenia časovača priradením hodnoty T1CC0. Tento experiment využíva túto funkciu na vyvolanie prerušenia každých 1s časovačom cez špecifický T1CC0, aby sa presne kontroloval interval blikania LED svetla na 1s. (1) Úvod do experimentuV modulo režime časovača je interval blikania LED svetla presne riadený jednotkami, konkrétne: jasných 0,5 s → tmavých 0,5 s → jasných 0,5 s → tlmených 0,5 s ...... → Svetlé 0,5 s → Tmavé 0,5 s (t. j. časový interval od tmy k svetlu je 1s). Inverzia svetla/tmy sa dosahuje pretečením prerušení. (2) Schéma toku programu
(3) Relevantné výpočtyAko už bolo spomenuté, stav LED svetla je: jasných 0,5 s → tmavých 0,5 s → jasných 0,5 s → tlmených 0,5 s ...... → 0,5 sekundy svetla → 0,5 sekundy tmy, a je potrebné to implementovať s prerušeniami pretečenia, takže doba pretečenia časovača musí byť 0,5 sekundy. Na to je potrebné vypočítať zodpovedajúcu prepadovú hodnotu (dočasne nastavenú na N). Systémová hodinová frekvencia je zvolená ako 32MHz a daná frekvencia je predvolene 16MHz (obe sú určené špeciálnymi funkčnými registrami).CLKCONPodrobnosti nájdete v čínskom manuáli CC2430). Pre Timer 1 nastavte jeho časový crossover na 128 divízií. Na záver, zoznam je nasledovný:
Na nájdenie N=62500 je jeho hexadecimálne číslo 0xF424, teda musíte nastaviť T1CC0H=0xF4, T1CC0L=0x24 . (4) Experimentálny zdrojový kód a analýza/*
Popis experimentu: Experiment Timer Timer1, pretečenie časovača, blikanie LED1
*/
#include
#define viedol1 P1_0
#define LED2 P1_1
#define LED3 P1_2
#define Lead4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
prázdnotaxtal_init(prázdnota)
{ SPAJ &= ~0x04; //都上电
zatiaľ čo(! (SLEEP &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Vyberte 32MHz kryštálový oscilátor SPAK |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
prázdnotaled_init(prázdnota)
{ P1SEL =0x00; P1 je bežný I/O port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 výstup
led1 =1; //关闭所有LED led2 =1; LED3 =1; LED4 =1;
}
/*T1初始化
-------------------------------------------------------*/
prázdnotatimer1_init(prázdnota)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 crossover; modulo režim (0x0000->T1CC0); Začni utekať; T1IF=0; Odstráňte prerušovaciu značku
}
/*主函数
-------------------------------------------------------*/
prázdnotamain(prázdnota)
{ xtal_init(); led_init(); timer1_init();
zatiaľ čo(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vektor=T1_VECTOR __interruptprázdnotaT1_ISR(prázdnota)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
OK, skompiluj program a debuguj online, LED1 na vývojovej doske bliká podľa plánu a zdá sa, že interval blikania je asi 1s. Ale to nestačí na preukázanie úspechu experimentu, ak sa interval dá presne určiť ako 1s, bude to dokonalé~ Tak som zapol hodiny WIN 7 (kliknite na čas na pravej strane panela úloh). Pri pohľade na sekundovú ručičku si periférne všimol blikanie LED1. Výsledok: do dvoch minút je tempo oboch v podstate rovnaké (táto presnosť je znesiteľná~). V tomto bode sa dá povedať, že experiment je v podstate dokončený, hehe~ 3. Časovač 2Časovač 2 sa tiež nazývaMAC časovač, je špeciálne navrhnutý na podporu protokolu sledovania udalostí v IEEE 802.15.4 MAC. Časovač má 8-miestny čítač pretečenia, ktorý sa dá použiť na zaznamenanie počtu cyklov, ktoré nastali; Existuje 16-bitový registr zachytávania, ktorý zaznamenáva presný čas, kedy rámec začína prijímať/odosielať, alebo presný čas dokončenia prenosu. Obsahuje tiež 16-bitový porovnávací register výstupov, ktorý generuje rôzne signály na bránenie príkazov (začať prijímať, začať odosielať atď.) bezdrôtovému modulu v konkrétnom čase. 4. Časovač 3/4Timer 3/4 je 8-bitový časovač s funkciou časovača/čítača/PWM. T3/T4 má 2 kanály na porovnávanie výstupov, z ktorých každý môže slúžiť ako výstup PWM. 5. ZáverTáto sekcia sa hlavne učí metódu prerušenia počítania časovača 1 a presné ovládanie intervalu blikania LED svetla 1s. Len pár ďalších časovačov je len mŕtvica, a neskôr sa k nim vrátim. V ďalšej časti predstavíme komunikáciu cez sériový port CC2430.
|