МПЗПК лаби / LR_PMZV-7
.docМіністерство освіти і науки, молоді та спорту України
Вінницький національний технічний університет
Інститут автоматики, електроніки та комп‘ютерних систем управління
Кафедра метрології та промислової автоматики
Методичні вказівки
до лабораторної роботи №7
по курсу : "Проектування мікропроцесорних засобів вимірювання "
«Послідовний зв’язок»
Вінниця - 2012
Мета: метою цієї лабораторної роботи є вивчення послідовних зв'язків з мікроконтролером MSP430. У цій лабораторній роботі ми будемо досліджувати програмне забезпечення UART і підключатись до ПК через порт USB.
• Зміна коду для запуску на WDT + Таймер
• Додає код для аналізу HI/LO/IN температурного діапазону
• Додає код UART для відправки даних на ПК через USB-COM порт
Порядок
виконання роботи:
Створіть New Project
1. Створіть новий проект (File → New → CCS Project) і назвіть його Lab7. Зніміть прапорець “use default location” ("Використовувати за замовчуванням"). Використовуючи кнопку Browse... , перейдіть до папки: C:\MSP430_LaunchPad\Labs\Lab7\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) та назвіть його Lab7.c та натисніть кнопку Finish.
Створіть lab7.c Source File
У цій лабораторній роботі ми будемо створювати програму, що передає "HI", "LO" або "IN" за допомогою програмного забезпечення UART коду. Ці дані будуть передані через порт USB COM-порт, а потім до ПК для відображення даних програми. Код UART використовує TIMER_A2, тому для початку роботи з новим кодом необхідно усунути залежність TIMER_A2 від нього. Потім ми додамо деякі "точки спрацьовування" коду. Внаслідок цього червоний або зелений світлодіод вказуватиме чи відбулась зміна темперетури. Потім ми додамо UART код і відправлятимемо повідомлення на ПК. Код файлу з останньої лабораторної роботи буде використовуватися в якості відправної точки.
3. Відкрийте Lab6a.txt використовуючи (File →Open File…)
C:\MSP430_LaunchPad\Labs\Lab6a\Files\Lab6a.txt
4. Скопіюйте весь код з Lab6a.txt та вставте його в Lab7.c. Це буде першим етапом до виконання задачі. Як ви помітили, це не малопотужний оптимізований код, який ми створили в останній частині LaB6. Реалізація програми потребує Timer_A2 UART, тому використання повністю оптимізованого коду буде неможливою. Але ми можемо зробити декілька коригувань і при цьому зберегти досить низьке електроспоживання.
Закрийте файл Lab6a.txt. Він більше не знадобиться.
5. В якості тесту, виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти приблизно один раз в 3 секунди, проте, тривалість мерехтіння буде короткою. Код має функціонувати так само, як і в попередній лабораторній роботі. Коли закінчите, зупиніть код і натиснувши кнопку Terminate all, щоб повернутися в C/C ++.
6. Необхідно усунути залежність попереднього коду з Timer_A2. WDT+ потрібно налаштовати в якості інтервального таймера. Виконайте зміни функції ConfigWDT(), як наведено нижче:
|
void ConfigWDT(void) { WDTCTL = WDT_ADLY_250; // <1 сек інтервал WDT IE1 |= WDTIE; // Вкл. переривання WDT } |
Вибір інтервалів з WDT+ дещо обмежений, проте WDT_ADLY_250 дасть затримку трохи менше ніж 1 сек, працюючи на VLO.
WDT_ADLY_250 встановлює наступні біти:
•WDTPW: WDT пароль
• WDTTMSEL: Вибір інтервалу таймера
• WDTCNTCL: Очищує значення лічильника
• WDTSSEL: WDT вибір джерела
7. Код в Timer_A0 ISR повинен працювати, коли виконується переривання запуску WDT+:
Змініть:
|
// Timer_A2 обслуговування переривання #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { |
На:
|
// WDT обслуговування переривання #pragma vector=WDT_VECTOR __interrupt void WDT(void) { |
8. Звертання CCR0 до WDT ISR у даному випадку непотрібне. Видаліть рядок CCR0 + = 36000; Крім того, зараз немає ніякої необхідності створення Timer_A2. Видаліть весь код всередині функції ConfigTimerA2().
9. Виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти приблизно один раз в секунду. Зупиніть виконання коду і натисніть кнопку Terminate all, щоб повернутися в C/C++. Якщо необхідно, цей код можна знайти у файлі Lab7a.txt у папці Files.
10. Потім видаліть обидва рядки P1OUT в WDT ISR. Нам знадобляться обидва світлодіода для продовження виконання роботи.
11. Ми повинні змінити контакти передачі і прийому (P1.1 та P1.2) на MSP430 від GPIO для функції TA0. Змініть код наступним чином:
|
void ConfigPins(void) { P1SEL |= TXD + RXD; // P1.1 & 2 TA0, інше GPIO P1DIR = ~(BIT3 + RXD); // P1.3 вхід, інші виводи P1OUT = 0; // очищ. виводи P2SEL = ~(BIT6 + BIT7); // ств. P2.6 & 7 GPIO P2DIR |= BIT6 + BIT7; // P2.6 & 7 виводи P2OUT = 0; // очищ. виводи } |
12. Нам знадобиться функція, що обробляє передачу даних. Додайте наступне у кінець Lab7.c з файлу Transmit.txt, що знаходиться в папці Files:
|
// Function Transmits Character from TXByte void Transmit() { BitCnt = 0xA; // завантаження розрядного лічильника, 8data + ST/SP while (CCR0 != TAR) // запобігання асинхронного захоплення CCR0 = TAR; // поточний стан лічильника TA CCR0 += Bitime; // певний час до першого біта TXByte |= 0x100; // додається знак зупинки до TXByte TXByte = TXByte << 1; // додається простір до стартового біта CCTL0 = CCIS0 + OUTMOD0 + CCIE; // TXD = знак = простій while ( CCTL0 & CCIE ); // Очікування завершення TX } |
Не забудьте додати оголошення функції на початку Lab7.c:
void Transmit(void);
13. Передача послідовної інформації відбувається за допомогою Timer_A2, він забезпечує усі часові інтервали, необхідні для швидкості 2400 бод. Скопіюйте вміст Timer_A2 ISR.txt та вставте його у кінець Lab7.c:
|
// Timer A0 обслуговування переривання #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { CCR0 += Bitime; // додає Offset до CCR0 if (CCTL0 & CCIS0) // TX вкл. CCI0B? { if ( BitCnt == 0) { CCTL0 &= ~ CCIE ; // усі біти TXed, викл. переривання } else { CCTL0 |= OUTMOD2; // TX простір if (TXByte & 0x01) CCTL0 &= ~ OUTMOD2; // TX Mark TXByte = TXByte >> 1; BitCnt --; } } } |
14. Налаштуйте Timer_A2. Введіть наступні рядки у функцію ConfigTimerA2() в Lab7.c, це має виглядає так:
|
void ConfigTimerA2(void) { CCTL0 = OUT; // TXD Idle as Mark TACTL = TASSEL_2 + MC_2 + ID_3; // SMCLK/8, безперервний режим } |
15. Щоб код працював, додайте наступне у верхню частину Lab7.c:
|
#define TXD BIT1 // TXD вкл. P1.1 #define RXD BIT2 // RXD вкл. P1.2 #define Bitime 13*4 // 0x0D
unsigned int TXByte; unsigned char BitCnt; |
16. Зробіть тестову перевірку коду, виконавши:
Project →Build Active Project
Перевірте код на наявність синтаксичних помилок.
17. Додайте наступне оголошення на початку Lab7.c:
volatile long tempSet = 0;
volatile int i;
В змінну TempSet буде записано перше прочитане значення температури за допомогою ADC10. В подальшому ми порівняємо його з новим виміряним значенням температури для того, щоб встановити її збільшення або зменшення.
18. Додайте наступний код управління в цикл while(1):
_bis_SR_register(LPM3_bits + GIE);
Цей код доступний у файлі While.txt:
|
if (tempSet == 0) { tempSet = tempRaw; // Set reference temp } if (tempSet > tempRaw + 5) // тест для lo { P1OUT = BIT6; // зелений LED вкл. P1OUT &= ~BIT0; // червоний LED викл. for (i=0;i<5;i++) { TXByte = TxLO[i]; Transmit(); } } if (tempSet < tempRaw - 5) // тест для hi { P1OUT = BIT0; // червоний LED вкл. P1OUT &= ~BIT6; // зелений LED викл. for (i=0;i<5;i++) { TXByte = TxHI[i]; Transmit(); } } if (tempSet <= tempRaw + 2 & tempSet >= tempRaw - 2) { // тест для діапазону in P1OUT &= ~(BIT0 + BIT6); // всі LEDs вимкнені for (i=0;i<5;i++) { TXByte = TxIN[i]; Transmit(); } } |
Даний код встановлює три стани для температури: «LO», «HI» та «IN»; індикація цих станів відбувається станом зеленого і червоного світлодіодів. Код також посилає ASCII до Transmit().
19. Пакетні дані ASCII, що будуть передаватися на ПК:
• LO<LF><BS><BS>: 0x4C, 0x4F, 0x0A, 0x08, 0x08
• HI<LF><BS><BS>: 0x48, 0x49, 0x0A, 0x08, 0x08
• IN<LF><BS><BS>: 0x49, 0x4E, 0x0A, 0x08, 0x08
Програма на ПК інтерпретується за допомогою коду ASCII і відображає відповідні символи.
Додайте наступні масиви на початок Lab7.c:
|
unsigned int TxHI[]={0x48,0x49,0x0A,0x08,0x08}; unsigned int TxLO[]={0x4C,0x4F,0x0A,0x08,0x08}; unsigned int TxIN[]={0x49,0x4E,0x0A,0x08,0x08}; |
Тестування коду
20. Виконайте завантаження і запуск коду. Якщо у вас виникли проблеми з кодом, порівняйте його з кодом, що знаходиться у файлі Lab7Finish.txt у папці Files.
21. Переконайтесь, що COM-порт вашого LaunchPad підключений до ПК. В ОS Windows, виконайте наступні операції : «Пуск → Выполнить» і введіть в діалогове вікно: devmgmt.msc, а потім натисніть OK. Повинен відкритись Диспетчер устройств OS Windows.
Поряд з вкладкою «Порты» натисніть кнопку «+» і знайдіть порт з ім'ям MSP430 Application UART. Запишіть номер COM-порту тут: _________. (Наприклад: COM45). Закрийте Диспетчер устройств.
22. CCS повинен бути відображений в Debug. Натисніть View → Other…, а у вікні Show View , натисніть кнопку «+» поруч з Terminal . Оберіть Terminal нижче, і натисніть кнопку OK.
23.
Terminal відображається на екрані. Натисніть
кнопку Settings , і задайте наступні
параметри:![]()
Далі натисніть кнопку OK.
24. Запустіть код. У Terminal Pane, ви можете побачити стан температури «IN», індикація якого повторюватиметься знову і знову. Для усунення цього клацніть правою кнопкою миші в Terminal pane і оберіть «Clear All». Запустіть код на виконання. Коли температура на MSP430 підніметься, червоний світлодіод буде світитись і у Terminal Pane відобразиться стан температури «HI». Коли температура на MSP430 спаде, зелений світлодіод буде світитись і у Terminal Pane відобразиться стан температури «LO». За прийнятної температури обидва світлодіоди будуть вимкнені, і у Terminal Pane відобразиться стан температури «IN». Занотуйте розмір згенерованого коду. У Console pane, що в нижній частині екрана, можна побачити:
MSP430: Program loaded. Code Size - Text: 770 bytes Data: 58 bytes
На підставі того, що ми робили досі, можна створити проект з удвічі більшим розміром, що без проблем розміститься у пам'яті MSP430G223. Коли ви закінчите, зупиніть код.
Завершення сеансу налагодження і закриття проекту
25. Завершіть активний сеанс налагодження за допомогою кнопки Terminate All.
26. Далі, закрийте проект натиснувши правою кнопкою миші по Lab7 у вікні C/C++ Projects і оберіть Close Project.
