Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 7780|Відповідь: 0

Zigbee Journey (4): Кілька важливих базових експериментів CC2430 — переривання таймера

[Копіювати посилання]
Опубліковано 30.10.2014 23:17:29 | | | |
1. З'єднання верхнього та нижнього рівнів

У попередній статті ми разом дізнавалися про реалізацію простих зовнішніх переривань. Тепер, коли ми маємо практичний досвід із перериваннями, давайте поговоримо про таймерні переривання в цьому розділі. CC2430 має загалом 4 таймери, які можна поділити на 3 категорії: таймер 1, таймер 2, таймер 3/4 (використання 3 і 4 однакове).

Оскільки автор також новачок у CC2430 і практично не має практичного досвіду у проектах із таймерами, я не маю наміру (і нічого не можу зробити) глибоко аналізувати таймер. У цій статті наведено лише коротке експериментальне дослідження використання таймера 1 у перериваннях переповнення підрахунку і не згадується його функції порівняння захоплення/виходу/PWM. Таймер 2 і Таймер 3/4 — це лише прості введення функцій. Коли навички автора досягнуть певного рівня гостроти, я стану на вершині практичного досвіду Зігбі, щоб покращити це есе.

2. Таймер 1

Таймер 1 — це 16-бітний таймер з модуляцією таймер/лічильник/ширина імпульсу. Він має 3 окремо програмовані канали порівняння захоплення/виведення входу, кожен з яких може використовуватися як PWM-вихід або як граничний час для захоплення вхідного сигналу (для отримання інформації про порівняння захоплення/виведення вхіду та як реалізувати PWM-вихід, читачі можуть звернутися до китайського посібника CC2430).

Таймери мають дуже важливе поняття:Режим роботи

Режими роботи включають: режим вільної роботи (Вільний біг), режим форми (Modulo) та режим позитивного підрахунку/зворотного відліку (Вгору-вниз)。

Нижче наведено уривок із китайського посібника CC2430 для введення трьох режимів:



Порівнюючи три режими, можна побачити, що значення переповнення вільного режиму роботи 0xFFFF незмінне; Інші два режими дозволяють точно контролювати значення переповнення таймера, присвоюючи значення T1CC0. Цей експеримент використовує цю функцію для запускання переривання кожні 1 секунди за таймером через певний T1CC0, щоб точно контролювати інтервал миготіння світлодіодного світла до 1 секунд.

(1) Вступ до експерименту

У режимі за модулем таймера інтервал миготіння світлодіодного світла точно регулюється 1s, а саме: яскраві 0,5s → темні 0,5s → яскраві 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 дивізіонів.

Підсумовуючи, список виглядає так:

Щоб знайти N=62500, його шістнадцятковий 0xF424, тобто потрібно встановити T1CC0H=0xF4, T1CC0L=0x24 .

(4) Експериментальний вихідний код і аналіз/*
    Опис експерименту: Timer Timer1 експеримент, переповнення кількості таймерів, миготіння LED1
*/

#include

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

/*系统时钟初始化
-------------------------------------------------------*/
Порожнечаxtal_init(Порожнеча)
{
  SLEEP &= ~0x04;            //都上电
  поки(! (SLEEP &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;            Виберіть кристалічний осцилятор на 32 МГц
  СОН |=0x04;
}

/*LED初始化
-------------------------------------------------------*/
Порожнечаled_init(Порожнеча)
{
  P1SEL =0x00;            P1 — це звичайний порт введення/виведення
  P1DIR |=0x0F;            P1.0 P1.1 P1.2 P1.3 вихід
  
  led1 =1;                  //关闭所有LED
  led2 =1;
  led3 =1;
  led4 =1;
}

/*T1初始化
-------------------------------------------------------*/
Порожнечаtimer1_init(Порожнеча)
{
  EA=1;            //开总中断
  T1IE=1;           //开T1中断
  OVFIM=1;         //开T1溢出中断
  
  T1CC0L=0x24;      //溢出值低8位
  T1CC0H=0xF4;      //溢出值高8位
  
  T1CTL =0x0e;     128 кросовер; модульний режим (0x0000->T1CC0); Починайте бігати;
  T1IF=0;           Звільніть знак переривання  
}

/*主函数
-------------------------------------------------------*/
ПорожнечаГоловна(Порожнеча)
{
  xtal_init();
  led_init();
  timer1_init();

  поки(1);            //等待溢出中断
}

/*T1终端服务子程序
-------------------------------------------------------*/
#pragma вектор=T1_VECTOR
__interruptПорожнечаT1_ISR(Порожнеча)
{
  EA=0;               //关中断
  
  led1 = !led1;      //LED灯反转

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

Добре, компілюю програму і відлагоджу онлайн, LED1 на платі розробки блимає за графіком, і відчуття, що інтервал миготіння становить близько 1 секунди. Але цього недостатньо, щоб довести успіх експерименту, якщо інтервал можна точно визначити як 1с, він буде ідеальним~ Тож я увімкнув годинник WIN 7 (натисніть на час праворуч на панелі завдань). Дивлячись на секундну стрілку, він краєм ока помітив миготіння LED1. Результат: за дві хвилини темп двох майже однаковий (така точність терпима~). На цьому етапі експеримент фактично завершено, хе-хе~

3. Таймер 2

Таймер 2 також називаютьТаймер MAC, спеціально розроблений для підтримки протоколу відстеження подій у IEEE 802.15.4 MAC. Таймер має 8-значний лічильник переповнення, який можна використовувати для фіксації кількості циклів, що відбулися; Існує 16-бітний регістр захоплення, який фіксує точний час початку прийому/передачі кадру або точний час завершення передачі. Він також містить 16-бітний вихідний регістр порівняння, який генерує різні сигнали гейтингу команд (початок прийняття, початок надсилання тощо) на бездротовий модуль у певний час.

4. Таймер 3/4

Таймер 3/4 — це 8-бітний таймер із функцією таймер/лічильник/PWM. T3/T4 має 2 канали порівняння виходів, кожен з яких може використовуватися як PWM-вихід.

5. Висновок

Цей розділ головним чином вивчає метод переривання переповнення підрахунку таймера 1 і реалізує точне керування інтервалом миготіння світлодіодного світла в 1с. Ще кілька таймерів — це лише інсульт, і я повернуся, щоб додати їх пізніше. У наступному розділі ми представимо комунікацію через послідовний порт CC2430.






Попередній:Zigbee Journey (3): Кілька важливих базових експериментів CC2430 — зовнішнє переривання
Наступний:Zigbee Journey (5): Кілька важливих базових експериментів CC2430 — послідовна комунікація
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com