| I. Продовження попередньої статті У попередньому розділі ми разом ознайомилися з реалізацією простих зовнішніх переривань. Маючи практичний досвід роботи з перериваннями, у цьому розділі ми обговоримо переривання за допомогою таймерів. CC2430 має 4 таймери, які можна розділити на 3 категорії: Timer1, Timer2, Timer3/4 (використання 3 і 4 однакове). Оскільки автор також тільки знайомиться з CC2430, досвід роботи з таймерами практично нульовий, тому я не маю наміру (та й не можу допомогти) глибоко аналізувати таймер. У цій статті розглядається лише використання переривання переповнення таймера 1 для простого експериментального дослідження, оскільки його функція захоплення входу/порівняння виходу/ШІМ не розглядається. Таймер 2 і таймер 3/4 також представлено лише побіжно. Чекаємо, поки авторська сила досягне певного рівня вогню, а потім стоятиме на висоті бойового досвіду Zigbee, щоб покращити цей нарис. Таймер 1 Timer1 - це 16-бітний таймер з функціями таймера/лічильника/широтно-імпульсної модуляції. Він має три індивідуально програмовані канали захоплення/порівняння вхідного/вихідного сигналу, кожен з яких може бути використаний як ШІМ-вихід або для захоплення переднього фронту вхідного сигналу (для отримання додаткової інформації про те, що таке захоплення/порівняння вхідного/вихідного сигналу і як реалізувати ШІМ-виходи, читачі можуть самостійно звернутися до китайського посібника з експлуатації CC2430). Таймер має дуже важливе поняття: режим роботи. Режими роботи включають: вільний хід, за модулем і вгору-вниз. Нижче наведено опис цих трьох режимів з китайської інструкції до CC2430:
:
Порівнюючи три режими, можна побачити, що: значення переповнення вільного режиму дорівнює 0xFFFF і не може бути змінене; в той час як двома іншими режимами можна точно керувати, призначивши значення T1CC0 для того, щоб точно контролювати значення переповнення таймера. Цей експеримент використовує цю функцію, щоб змусити таймер викликати переривання кожні 1 с через певний T1CC0, щоб точно контролювати інтервал блимання світлодіода в 1 с. (1) Вступ до експерименту У режимі таймера по модулю інтервал миготіння світлодіода точно контролюється на 1 с, тобто: світло 0,5 с → темрява 0,5 с → світло 0,5 с → темрява 0,5 с ...... → світло 0,5 с → темрява 0,5 с (тобто момент переходу від темряви до світла становить 1 с). Реверс світлого/темного реалізовано перериванням за переповненням. (2) Блок-схема програми (3) Відповідні розрахунки Як згадувалося раніше, стан світлодіода: яскравий 0.5с → темний 0.5с → яскравий 0.5с → темний 0.5с ...... → світлий 0.5 с → темний 0.5 с, і має бути досягнутий за допомогою переривання за переповненням, тому період переповнення таймера має становити 0.5 с. Для цього потрібно обчислити відповідне значення переповнення (тимчасово встановлюємо його рівним N). Системна тактова частота вибрана 32 МГц, а тактова частота, що надається таймеру, за замовчуванням становить 16 МГц (обидві частоти конфігуруються спеціальним функціональним регістром CLKCON, який можна знайти в китайському керівництві CC2430). Для таймера 1 встановіть його тактову частоту 128 поділок. Підсумовуючи, формула може бути такою:
c
З'ясуємо, що N = 62500, його шістнадцяткове значення 0xF424, тобто потрібно задати T1CC0H = 0xF4, T1CC0L = 0x24, тобто .
(4) Експериментальний вихідний код та аналіз/* Опис експерименту: Експеримент Timer1, переповнення лічильника таймера, миготіння світлодіоду 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; //вибираємо 32МГц кварцовий генератор 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; //очікуємо переривання за переповненням }/*Підпрограма обслуговування терміналу T1-------------------------------------------------------*/#pragma vector=T1_VECTOR __interrupt
v oid T1_ISR( void ) {EA=0; //виключити переривання led1 = !
led1; //Світлодіоди реверсуютьсяEA=1; //При перериванні  
; T1CTL &=~0x10; // очистити прапор переривання } ОК, компілюю програму і запускаю онлайн налагодження, на макетній платі світлодіод LED1 спалахує як і очікувалося, відчуваю інтервал миготіння близько 1с. Але цього недостатньо, щоб довести успішність експерименту, якщо б можна було строго визначити інтервал в 1с було б ідеально ~ тому я відкрив годинник WIN 7 (натиснути праворуч на панелі завдань час можна). Спостерігаючи за секундною стрілкою, я краєм ока поглянув на миготливий світлодіод LED1. Результат: через дві хвилини темп обох практично однаковий (з такою точністю можна миритися ~). На цьому експеримент можна вважати практично завершеним, хе-хе~. По-третє, таймер 2 Timer2, також відомий як MAC-таймер, спеціально розроблений для підтримки протоколу відстеження подій в IEEE 802.15.4 MAC. Таймер має 8-бітний лічильник переповнення, який можна використовувати для запису кількості циклів, що відбулися; має 16-бітний регістр захоплення, який використовується для запису точного часу прийому/передачі роздільника початку кадру або точного часу завершення передачі; а також містить 16-бітний регістр порівняння вихідних даних, який використовується для генерації різних командно-вибіркових сигналів зв'язку з бездротовим модулем у певний час (початок прийому, початок передачі тощо). Таймер 3/4 Таймер 3/4 - це 8-бітний таймер з функціями таймера/лічильника/ШІМ. t3/t4 має два канали порівняння виходів, кожен з яких може використовуватися як ШІМ-вихід. V. Висновок У цьому розділі ми вивчили метод підрахунку переривання при переповненні таймера 1 і досягли точного керування інтервалом миготіння світлодіода в 1 с. Ми лише побіжно розглянемо інші таймери, а потім повернемося, щоб додати їх пізніше. У наступному розділі ми розповімо про зв'язок з послідовним портом CC2430. |