МПЗПК лаби / LR_PMZV-5
.docМіністерство освіти і науки, молоді та спорту України
Вінницький національний технічний університет
Інститут автоматики, електроніки та комп‘ютерних систем управління
Кафедра метрології та промислової автоматики
Методичні вказівки
до лабораторної роботи №5
по курсу : "Проектування мікропроцесорних засобів вимірювання "
«Таймер і переривання»
Вінниця - 2012


Мета: метою лабораторної роботи, є вивчення основних принципів роботи таймера і переривань. У даній роботі має бути створено програмний код для настройки таймера. Крім того, код буде змінюватись таким чином, щоб він міг працювати з використанням переривань.

Порядок виконання роботи:
Створіть New Project
1. Створіть новий проект (File → New → CCS Project) і назвіть його Lab5. Зніміть прапорець “use default location” ("Використовувати за замовчуванням"). Використовуючи кнопку Browse... , перейдіть до папки: C:\MSP430_LaunchPad\Labs\Lab5\Project. Натисніть кнопку ОК, а потім натисніть кнопку Next. Наступні параметри у трьох вікнах вже повинні бути встановленими за замовчуванням (project type MSP430, no inter-project dependencies selected, and device variant set to MSP430G2231). Наступні параметри також встановіть за замовчуванням, а в останньому вікні натисніть кнопку Finish.
Створіть Source File
2. Додайте source file до проекту (File → New → Source File) та назвіть його Lab5.c та натисніть кнопку Finish.
Створіть lab5.c Source File
Результуючий файл з останньої лабораторної роботи буде використовуватися в якості відправної точки. Ми очистимо файл, щоб зробити його читабельнішим, поставивши код ініціалізації на окремі функції.
3. Відкрийте Lab5_Start.txt використовуючи (File → Open File…)
C:\MSP430_LaunchPad\Labs\Lab5\Files\Lab5_Start.txt
4. Скопіюйте весь код з Lab5_Start.txt та вставте його в Lab5.c. Це буде першим етапом до виконання задачі.
5. Закрийте файл Lab5_Start.txt. Він більше не знадобиться.
6. В якості тесту, виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти приблизно один раз в секунду, і він повинен функціонувати так само, як і в попередній лабораторній роботі. Коли закінчите, зупиніть код і натисніть кнопку Terminate all, щоб повернутися в C/C ++.
Використання Timer_A2 для реалізації затримки
7. У найближчі кроки ми реалізуємо затримку в одну секунду, що було раніше виконано з використанням внутрішньої затримки з таймером.
Знайдіть _delay_cycles (125 000) і видаліть цей рядок.
8. Нам потрібно додати функцію для налаштування Timer_A2. Додадайте оголошення функції у верхній частині коду, під одну для ADC10:
void ConfigTimerA2(void);
Потім додайте виклик функції до запиту ConfigADC10;
ConfigTimerA2();
І додайте шаблон для функції в нижній частині програми:
void ConfigTimerA2(void)
{
}
9. Далі, нам необхідно заповнити ConfigTimerA2()шаблон коду для настройки таймера. Ми могли б узяти це на прикладі коду, але це досить просто, тому ми будемо робити це самі. Додайте наступний код в якості першого рядка:
CCTL0 = CCIE;
Це дозволить нульове переривання регістру лічильника/компаратора в CCTL0 регістру управління. На відміну від попередньої лабораторної роботи, на цей раз буде використовуватись переривання. Потім додайте наступні два рядки:
CCR0 = 12000;
TACTL = TASSEL_1 + MC_2;
Встановіть таймер для роботи у безперервному режимі, отриманого з ACLK (VLO), а також згенеруйте переривання кожну секунду. Зверніть увагу на наступне:
• TACTL - це Timer_A контроль регістру
• TASSEL_1 - вибір ACLK
• MC_2 - встановлює роботу для безперервного режиму
Коли таймер досягає значення в CCR0, переривання буде генеруватися. ACLK (VLO) працює на частоті 12 кГц, значення повинно бути 12000 циклів.
10. Ми встановили переривання для CCR0, але потрібно встановити глобальні переривання для того, щоб процесор знав про це. Прямо перед while(1) , додамо наступне:
_BIS_SR(GIE);
Створення переривань Sevice Routine (ISR)
11. На даний момент ми створили переривання. Нам потрібно створити процедуру обслуговування переривання (ISR). Додайте наступний код шаблону в нижній частині Lab5.c:
|
#pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { } |
12. Видаліть код зсередини while(1)і вставте його в шаблон ISR. Цикл while(1) залишиться на даний момент порожнім.
13. Майже все що потрібно для роботи першого переривання виконано. Для того, щоб реалізувати 2-ге, 3-тє, 4-те, ... з інтервалом у одну секунду, необхідно встановити наступне:
a) Прапор переривання повинен бути очищений (це автоматично)
б) CCR0 має бути встановлено у 12,000 циклів
Таким чином, додайте в якості останнього рядку в ISR:
CCR0 +=12000;
14. Ми повинні мати деякий код, що перериватиметься. Додайте наступне до коду while(1):
P1OUT |= BIT0;
for (i = 100; i > 0; i--);
P1OUT &= ~BIT0;
for (i = 5000; i > 0; i--);
Ця процедура не використовує вбудовані функції. Таким чином, ми будемо налагоджувати переривання в C. Потрібно об’явити i на початку Lab5.c:
volatile unsigned int i;
Зміна коду Functions та ISR
15. Ми зробимо деякі зміни в коді для зручності читання і функції LED.
У FaultRoutine(),
Замініть: P1OUT = 0x01;
На: P1OUT = BIT0;
У ConfigLEDs(),
Замініть: P1DIR = 0x41;
На: P1DIR = BIT6 + BIT0;
У Timer ISR,
Замініть: P1OUT = 0x40;
На: P1OUT |= BIT6;
та
Замініть: P1OUT = 0;
На: P1OUT &= ~BIT6;
16. На даний момент, наш код повинен виглядати так. Було додано коментарі, для кращого розуміння. Натисніть кнопку Save на панелі меню, щоб зберегти файл.
|
#include <msp430g2231.h> volatile long tempRaw; volatile unsigned int i; void FaultRoutine(void); void ConfigWDT(void); void ConfigClocks(void); void ConfigLEDs(void); void ConfigADC10(void); void ConfigTimerA2(void); void main(void) { ConfigWDT(); ConfigClocks(); ConfigLEDs(); ConfigADC10(); ConfigTimerA2(); _BIS_SR(GIE); // Вкл. переривання while(1) { P1OUT |= BIT0; // Вкл. червоний LED for (i = 100; i > 0; i--); // очікув. P1OUT &= ~BIT0; // Викл. червоний LED for (i = 5000; i > 0; i--); // очікув. } } void ConfigWDT(void) { WDTCTL = WDTPW + WDTHOLD; // Зупин. сторожовий таймер } void ConfigClocks(void) { if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) FaultRoutine(); // Якщо калібрувальні дані стираються // run FaultRoutine() BCSCTL1 = CALBC1_1MHZ; // Встанов. діапазон DCOCTL = CALDCO_1MHZ; // Встнов. DCO step + модуляція BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO IFG1 &= ~OFIFG; // Очист. прапор OSCFault BCSCTL2 |= SELM_0 + DIVM_3 + DIVS_3; //MCLK = DCO/8, SMCLK = DCO/8 } void FaultRoutine(void) { P1OUT = BIT0; // P1.0 на (черв. LED) while(1); } void ConfigLEDs(void) { P1DIR = BIT6 + BIT0; // P1.6 і P1.0 виводи P1OUT = 0; // LEDs викл. } void ConfigADC10(void) { ADC10CTL1 = INCH_10 + ADC10DIV_0; // Temp Sensor ADC10CLK } void ConfigTimerA2(void) { CCTL0 = CCIE; // CCR0 вкл. переривання CCR0 = 12000; // одна секунда TACTL = TASSEL_1 + MC_2; // ACLK, безперервний режим } // Timer_A2 переривання #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON; _delay_cycles(5); // Затримка ADC10CTL0 |= ENC + ADC10SC; // Відбір проб і перетворення початку P1OUT |= BIT6; // P1.6 вкл. (зелений LED) _delay_cycles(100); ADC10CTL0 &= ~ENC; // Відключення перетворення АЦП ADC10CTL0 &= ~(REFON + ADC10ON); // Ref та ADC10 викл. tempRaw = ADC10MEM; // Зчитув. перетв. значення P1OUT &= ~BIT6; // зелений LED викл. CCR0 += 12000; // Додає одну секунду CCR0
|
Примітка: для довідки, код можна знайти в Lab5_Finish.txt в папці Files.
17. Натисніть “Build” і спостерігайте як програма працює у вікні Console. Перевірте код на наявність помилок у вікні Problems.
18. Натисніть кнопку “Debug” . Відкриється “Debug Perspective” і програма завантажиться автоматично, далі перейдіть на початок main().
19. Запустіть код програми і спостерігайте за світлодіодами LED. Якщо все працює правильно, то червоний LED повинен мерехтіти приблизно 2 рази за секунду. Це цикл таймеру переривання while(1). Зелений LED повинен мерехтіти один раз за секунду. Це швидкість, що ми обрали для датчика температури. Натисніть «halt», щоб зупинити код.
Тестування коду
20. Переконайтеся, що змінна tempRaw все ще знаходиться у вікні перегляду. Якщо ні, то двічі натисніть tempRaw у коді tempRaw = ADC10MEM; і обреріть його. Потім натисніть по ньому правою кнопкою миші і виберіть Add Watch Expression. Якщо необхідно, натисніть на вкладку Watch щоб побачити зміни у вікні перегляду.
21. У Timer_A2 ISR, знайдіть рядок P1OUT &= ~BIT6; і місце його завершення. Щоб розмістити точку зупинки, клацніть правою кнопкою миші на рядку коду і виберіть Toggle Breakpoint.
22. Запустіть код. Вікно налагодження повинно швидко зупинитись у точці завершення tempRaw і значення буде оновлено. Зверніть увагу на вікно спостереження і перевірки датчика температури, як і в попередній лабораторній роботі запуск коду відбувається після натискання клавіші F8.
Завершення сеансу і закриття проекту
23. Завершіть активний сеанс налагодження за допомогою кнопки Terminate All.
24. Закрийте проект натиснувши правою кнопкою миші по Lab5 у вікні C/C++ Projects і оберіть Close Project.
