| I. Продължение на предишната статия В предишния раздел научихме за съвместното изпълнение на прости външни прекъсвания. След като придобихме практически опит с прекъсванията, в този раздел ще обсъдим прекъсванията на таймерите. CC2430 има 4 таймера, които могат да бъдат разделени на 3 категории: Timer1, Timer2, Timer3/4 (използването на 3 и 4 е едно и също). Тъй като авторът също едва се докосва до CC2430, опитът в проекта, включващ таймер, е на практика нулев, затова не възнамерявам (и не мога да помогна) за задълбочен анализ на таймера. Тази статия се отнася само за използването на прекъсване на брояча на таймера 1, за да се направи просто експериментално изследване, тъй като неговата функция за улавяне на вход/изход за сравнение/PWM е пропусната. Таймер 2 и таймер 3/4 също са представени само накратко. Чакаме силата на автора да достигне определено ниво на огъня, след което да застане на височината на бойния опит на Zigbee, за да подобри това есе. Таймер 1 Timer1 е 16-битов таймер с функции на таймер/брояч/модулация на ширината на импулса. Той разполага с три индивидуално програмируеми канала за улавяне на вход/изход за сравнение, всеки от които може да се използва като ШИМ изход или да се използва за улавяне на времето на фронта на входния сигнал (за повече информация относно това какво представлява улавянето на вход/изход за сравнение и как да се реализират ШИМ изходи, читателите могат да направят самостоятелна справка с китайското ръководство на CC2430). Таймерът има много важна концепция: режим на работа. Режимите на работа включват: свободен ход, модул и нагоре-надолу. По-долу е представено въвеждането на трите режима от китайското ръководство на CC2430:
Сравнявайки трите режима, може да се види, че: стойността на препълване на режима на свободен ход е 0xFFFF, която не може да се променя; докато другите два режима могат да бъдат точно контролирани чрез задаване на стойност на T1CC0, за да се контролира точно стойността на препълване на таймера. В този експеримент се използва тази функция, за да се накара таймерът да задейства прекъсване на всеки 1s чрез специфичната стойност T1CC0, така че да се контролира точно интервалът на мигане на светодиода от 1s. (1) Въведение в експеримента В модулния режим на таймера интервалът на мигане на светодиода се контролира точно да бъде 1s, т.е.: светло 0,5s → тъмно 0,5s → светло 0,5s → тъмно 0,5s ...... → светло 0,5s → тъмно 0,5s (т.е. моментът на преминаване от тъмно към светло е 1s). Превключването на светло/тъмно се реализира чрез прекъсване на преливането. (2) Блок-схема на програмата (3) Свързани изчисления Както беше споменато по-горе, състоянието на светодиода е: светло 0,5s → тъмно 0,5s → светло 0,5s → тъмно 0,5s ...... → светло 0,5s → тъмно 0,5s, и трябва да се постигне с прекъсване на препълването, така че е необходимо периодът на препълване на таймера да бъде 0,5s. За тази цел трябва да се изчисли съответната стойност на препълване (временно зададена на N). Тактовата честота на системата е избрана като 32 MHz, а тактовата честота, предоставяна на таймера, е 16 MHz по подразбиране (и двете се конфигурират чрез специалния функционален регистър CLKCON, който може да бъде намерен в китайското ръководство на CC2430). За таймер 1 задайте тактовата му честота на 128 деления. В обобщение, формулата може да бъде следната:
c
Открийте N = 62500, неговата шестнадесетична форма е 0xF424, т.е. трябва да зададете T1CC0H = 0xF4, T1CC0L = 0x24, т.е. .
(4) Изходен код на експеримента и анализ/* Описание на експеримента: Експеримент с таймер1, препълване на брояча на таймера, мигане на LED1 */ #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; /* инициализация на системния часовник-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // и двете захранванияwhile (! (SLEEP & 0x40 )); //кристалният осцилатор е включен и стабилен CLKCON &=~0x47; &
nbsp; //изберете 32MHz кристален осцилатор SLEEP |=0x04; }/*Инициализация на светодиодите-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 е нормален входно-изходен порт P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 изходи led1 =1; &
nbsp; //Изключване на всички светодиоди led2 =1; led3 =1; led4 =1; }/*Инициализация на T1---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; //включване на общото прекъсване & nbsp; T1IE=1; // включване на прекъсване на T1OVFIM=1; // включване на препълване на T1
прекъсване T1CC0L=0x24; //стойност на преливане ниско 8 бита T1CC0H=0xF4; //стойност на преливане високо 8 бита &
nbsp; T1CTL =0x0e; //128 честота на деление; модуло режим (0x0000->T1CC0); стартирайте работа;T1IF=0; &
nbsp; // изчистване на флага за прекъсване }/* основна функция-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1); &
nbsp; //изчаква прекъсване за препълване }/* Подпрограма за обслужване на терминал Т1-------------------------------------------------------*/#pragma vector=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //изключване на прекъсването led1 = !
led1; //Светлинните диоди са обърнатиEA=1; //Включено прекъсване  
; T1CTL &=~0x10; // изчистване на флага за прекъсване } Добре, компилирайте програмата и онлайн отстраняване на грешки, развойната платка на LED1 мига, както се очаква, усещате интервала на мигане от около 1 s. Но това не е достатъчно, за да докажете успеха на експеримента, ако можете стриктно да определите интервала от 1s, ще бъде перфектно ~ така че отворих часовника на WIN 7 (кликнете върху дясната страна на лентата на задачите, времето може да бъде). Докато наблюдавах втората стрелка, с ъгълчето на окото си погледнах мигащия светодиод1. Резултатът е следният: за две минути темпото на двете е почти идентично (тази точност може да се толерира ~). В този момент може да се каже, че експериментът е в общи линии завършен, хехехе ~ Трето, таймер 2 Таймер 2, известен също като таймер на MAC, е специално проектиран да поддържа протокола за проследяване на събития в IEEE 802.15.4 MAC. Таймерът има 8-битов брояч за препълване, който може да се използва за записване на броя на извършените цикли; има 16-битов регистър за улавяне, който се използва за записване на точното време, когато се получава/предава разделител за начало на кадър или точното време, когато предаването е завършено; и също така съдържа 16-битов регистър за сравнение на изхода, който се използва за генериране на различни комуникационни сигнали за безжичния модул в определен момент (начало на приемане, начало на предаване и т.н.). Таймер 3/4 Таймер 3/4 е 8-битов таймер с функции на таймер/брояч/PWM. t3/t4 има два изходни канала за сравнение, всеки от които може да се използва като PWM изход. V. Заключение В този раздел научихме метода за отчитане на прекъсването на препълването на таймер 1 и постигнахме прецизно управление на интервала на мигане на светодиода от 1 s. Ще се спрем само на другите таймери, а по-късно ще се върнем да ги добавим. В следващия раздел ще се запознаем с комуникацията през серийния порт на CC2430. |