Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
05.03.2016
Размер:
220.31 Кб
Скачать

Министерство образования и науки Украины Государственное высшее учебное заведение «Приазовский государственный технический университет» Кафедра автоматизации и компьютерных технологий

Сокол С.П.

ПРОГРАММИРОВАНИЕ ТАЙМЕРОВ

Методические указания к выполнению лабораторной работы

по курсу «Микропроцессорная техника» для студентов направления 6.050202 «Автоматизация и

компьютерно-интегрированные технологии» дневной и заочной форм обучения

Мариуполь 2014

УДК 658.5

Программирование таймеров : Методические указания к выполнению лабораторной работы по курсу «Микропроцессорная техника» для студентов направления подготовки 6.050202 «Автоматизация и компьютерноинтегрированные технологии» дневной и заочной форм обучения. / сост. С.П. Сокол. – Мариуполь: ГВУЗ «ПГТУ», 2014.- 16 с.

Сформулированы цель и задачи лабораторной работы. Изложены необходимые теоретические сведения для

программирования различных таймеров микроконтроллеров MSP430. Приведены примеры работы с таймерами. Даны задания для индивидуального выполнения. Приводится список рекомендованных источников и контрольные вопросы для подготовки.

Составитель: С.П. Сокол ст. преподаватель

Рецензент: А.А. Койфман, ст. преподаватель

Утверждено на заседании кафедры АиКТ

Протокол № ___ от ____ 2014 г.

Утверждено методической комиссией факультета информационных технологий,

протокол № 3 от 05 февраля 2014 г.

©ГВУЗ «ПГТУ», 2014

2

 

СОДЕРЖАНИЕ

 

ВВЕДЕНИЕ....................................................................................

4

1

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ ....................

5

 

1.1. Сторожевой таймер.............................................................

5

 

1.2 Таймер А..............................................................................

6

 

1.3 Пример программы..............................................................

9

2

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ..........................

12

3

ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТА.........................

16

4

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ.......................................

16

5

СПИСОК РЕКОМЕНДОВАННЫХ ИСТОЧНИКОВ..............

16

3

ВВЕДЕНИЕ

Лабораторная работа № 5.

Целью выполнения данной лабораторной работы является ознакомление студентов с таймерами, имеющимися в микроконтроллерах MSP430.

Задачи лабораторной работы:

-ознакомление со сторожевым таймером и таймером А микроконтроллеров MSP430.

-получение навыков конфигурирования регистров управления таймерами;

-получение общих сведений о программировании таймеров при помощи программной среды IAR Embedded Workbench.

Лабораторная работа является заключительной в курсе «Микропроцессорная техника» и содержит информацию о программировании таймеров микроконтроллеров MSP430 на языке С.

На выполнение данной работы отводится 4 академических

часа.

Для выполнения лабораторной работы студентам требуется наличие компьютера с установленной программой IAR Embedded Workbench for MSP430, которую можно найти в интернете на официальном сайте, либо на сервере кафедры.

Теоретический материал для выполнения данной лабораторной работы рассматривается в лекционном курсе и приведен в конспекте лекций.

Результатом выполнения лабораторной работы является оформленный по требованиям и сданный отчет.

Максимальное количество баллов, которое студент может получить за выполнение данной лабораторной работы – 10.

4

1 ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ

1.1. Сторожевой таймер

Сторожевой таймер представляет собой 16-битный таймер, который имеет следующие особенности:

-режим сторожевого или интегрального таймера;

-четыре конфигурируемых временных интервала;

-защита регистра управления доступом при помощи

пароля;

-выбор источника тактового сигнала;

-защита от пропадания тактового сигнала.

В режиме сторожевого таймера этот модуль вырабатывает сигнал сброса при зависании программы на время, большее периода срабатывания таймера. В режиме интервального таймера вместо сигнала сброса генерируется прерывание, которое является маскируемым.

Счетный регистр таймера недоступен напрямую из программы, однако он может быть программно сброшен, а при достижении им некоторых фиксируемых значений может быть сгенерировано прерывание или сигнал сброса.

После запуска микроконтроллера модуль сторожевого таймера автоматически включается в режиме сторожевого таймера с интервалом, равным 32768 тактам сигнала DCOCLK. До истечения этого интервала необходимо либо сбросить этот таймер, либо сконфигурировать его как интегральный.

Для конфигурации модуля сторожевого таймера используется регистр WDTCTL. Рассмотрим те его биты, которые относятся непосредственно к сторожевому таймеру.

Как было упомянуто ранее, доступ к регистру WDTCTL защищен паролем. Этот пароль занимает старший байт регистра WDTCTL и при записи всегда должен быть равен 0x5A. В противном случае будет сгенерирован сигнал сброса. Читается же он всегда как 0х69.

Этот пароль определяется макросом WDTPW, который мы и использовали в начале каждой программы, не задумываясь о том, что это такое.

5

Бит WDTHOLD также неоднократно встречался нам. Если WDTHOLD = 1, то модуль сторожевого таймера останавливается, при этом несколько снижается ток потребления микроконтроллера. При сбросе этого бита в 0 таймер запускается вновь.

Бит WDTTMSEL определяет режим работы модуля. Если он равен 0, то модуль функционирует как сторожевой таймер, а если 1 – как интервальный.

Бит WDTCNTCL предназначен для сброса счетчика модуля. При установке его в 1 в счетчик загружается значение 0х0000. При этом бит сбрасывается автоматически. Этот бит более полезен в режиме сторожевого таймера.

Бит WDTSSEL определяет источник тактового сигнала модуля. Если он равен 0, то SMCLK, а если 1 – ACLK.

Биты WDTIS0 и WDTIS1 определяют интервал, по истечении которого генерируется прерывание или сигнал сброса:

WDTIS1 = 0 и WDTIS0 = 0 – Частота тактового сигнала / 32768; WDTIS1 = 0 и WDTIS0 = 1 – Частота тактового сигнала / 8192; WDTIS1 = 1 и WDTIS0 = 0 – Частота тактового сигнала / 512; WDTIS1 = 1 и WDTIS0 = 1 – Частота тактового сигнала / 64;

Разрешение прерываний от сторожевого таймера (в режиме интервального) осуществляется при помощи регистра IE1 и его бита WDTIE соответственно. При наступлении этого прерывания устанавливается флаг WDTIFG в регистре IFG1. Бит WDTIFG сбрасывается автоматически при наступлении прерывания.

1.2 Таймер А

В микроконтроллерах MSP430G2001 имеется один таймер А. Буква «А» обозначает функциональные особенности таймера. В других подсемействах микроконтроллеров MSP430 могут иметься таймер B и так называемый базовый таймер, структура которых несколько отличается.

Таймер А микроконтроллеров MSP430G2001 имеет следующие функциональные возможности:

6

-асинхронный 16-битный таймер/счетчик, имеющий четыре режима работы;

-возможность выбора и конфигурирования источника тактового сигнала;

-три конфигурируемых регистра захвата/сравнения;

-конфигурируемые выходы с возможностью генерирования ШИМ-сигналов.

В качестве тактового сигнала для таймера А могут использоваться ACLK, SMCLK, а также внешний сигнал, подаваемый на определенный вход контроллера.

Таймер А может работать в одном из четырех режимов: «Останов». В этом режиме таймер остановлен.

«Прямой счет». Таймер циклически считает от нуля до значения, записанного в регистре TACCR0.

«Непрерывный счет». Таймер циклически считает от нуля до 65535.

«Реверсивный счет». Таймер циклически считает от нуля до значения, записанного в регистре TACCR0, а затем в обратном направлении до нуля.

Для конфигурирования таймера А используется регистр TACTL. В этом регистре определены следующие биты:

1. TASSEL1 и TASSSEL0, предназначенные для выбора источника тактового сигнала таймера:

-при TASSEL1 = 0 и TASSEL0 = 0 – TACLK – внешний сигнал;

-при TASSEL1 = 0 и TASSEL0 = 1 – ACLK;

-при TASSEL1 = 1 и TASSEL0 = 0 – SMCLK;

-при TASSEL1 = 1 и TASSEL0 = 1 – INCLK –

инвертированный внешний сигнал.

2. ID1 и ID0, задающие коэффициент деления тактового сигнала таймера:

-при ID1 = 0 и ID0 = 0 делитель равен 1;

-при ID1 = 0 и ID0 = 1 делитель равен 2;

-при ID1 = 1 и ID0 = 0 делитель равен 4;

-при ID1 = 1 и ID0 = 1 делитель равен 8.

3. MC1 и MC0, определяющие режим работы таймера:

7

-при MC1 = 0 и MC0 = 0 – «Останов»;

-при MC1 = 0 и MC0 = 1 – «Прямой счет»;

-при MC1 = 1 и MC0 = 0 – «Непрерывный счет»;

-при MC1 = 1 и MC0 = 1 – «Реверсивный счет».

4.TACLR – очистка таймера. Установка этого бита обнуляет регистр TAR, делитель и сбрасывает признак направления счёта. Бит TACLR автоматически сбрасывается

5.TAIE – разрешение прерывания от таймера А. Если он равен единице, то прерывание разрешено, если нулю, то запрещено.

6.TAIFG – флаг прерывания таймера. Если этот бит равен единице, это сигнализирует о том, что прерывание произошло, если нулю, то прерывания не было. Флаг прерывания должен сбрасываться программно в подпрограмме обработки прерывания.

Регистр TAR является регистром счетчика таймера А, в нем содержится текущее значение таймера А.

Регистр TACCRх уже упоминался выше. В него записывается число, с которым сравнивается содержимое регистра TAR. При равенстве содержимого обоих регистров в режиме прямого счета происходит обнуление регистра TAR, генерируется запрос на прерывание (если оно было предварительно разрешено) и устанавливается флаг TAIFG.

Регистр TACCTLх предназначен для управления блоком захвата/сравнения. Он содержит следующие биты:

1.СМ0 и СМ1 определяют режим захвата: - при СМ1 = 0 и СМ0 = 0 – нет захвата;

- при СМ1 = 0 и СМ0 = 1 – захват по нарастающему фронту;

- при СМ1 = 1 и СМ0 = 0 – захват по спадающему фронту; - при СМ1 = 1 и СМ0 = 1 – захват по обоим фронтам.

2.CCIS0 и CCIS1 определяют вход захвата/сравнения: - при CCIS1 = 0 и CCIS0 =1 – CCIxA;

- при CCIS1 = 0 и CCIS0 =1 – CCIxB; - при CCIS1 = 0 и CCIS0 =1 – GND; - при CCIS1 = 0 и CCIS0 =1 – VCC.

8

3.SCS используется для синхронизации сигнала захвата с тактовым сигналом таймера. Если этот бит равен 0, то захват асинхронный, а если 1 – синхронный.

4.CAP определяет режим работы блока захвата/сравнения. Если он равен 1, то режим захвата, а если 0, то режим сравнения.

5.OUTMOD2, OUTMOD1, OUTMOD0 задают режим работы модуля вывода. Для регистра TACCR0 использование режимов 2, 3, 6 и 7 не имеет смысла.

-OUTMOD2=0, OUTMOD1=0, OUTMOD0=0 – состояние бита OUT;

-OUTMOD2=0, OUTMOD1=0, OUTMOD0=1 – установка;

-OUTMOD2=0, OUTMOD1=1, OUTMOD0=0 – Переключение/

сброс;

-OUTMOD2=0, OUTMOD1=1, OUTMOD0=1 – Установка/сброс;

-OUTMOD2=1, OUTMOD1=0, OUTMOD0=0 –Переключение;

-OUTMOD1=0, OUTMOD1=0, OUTMOD0=1 – Сброс;

-OUTMOD1=0, OUTMOD1=0, OUTMOD0=1 – Переключение/

установка;

-OUTMOD2=1, OUTMOD1=1, OUTMOD0=1 – Сброс/установка.

6.CCIE разрешает генерацию запроса прерывания при установке соответствующего флага CCIFG. Если он равен 0, то прерывание запрещено, а если 1 – разрешено.

7.OUT при работе модуля вывода в режиме 0 напрямую управляет состоянием выхода. Если он равен 0, на выходе низкий уровень, а если 1 – высокий.

8.CCIFG – флаг прерывания захвата/сравнения. Если он равен 0, то прерывания не было, а если 1 - прерывание было.

1.3 Пример программы

Рассмотрим программу, которая бы переключала светодиод LED1 в противоположное состояние при наступлении прерывания от сторожевого таймера, работающего в режиме интервального, а также изменяла яркость светодиода LED2, управляемого при помощи ШИМ.

#include <msp430.h> //1.Подключение заголовочного файла микроконтроллеров MSP430

//2.

9

#pragma vector=WDT_VECTOR//3.Вектор прерывания от сторожевого таймера

__interrupt void WDT_ISR (void)//4.Функция, вызываемая при прерывании от сторожевого таймера

{//5.

P1OUT

^= BIT0;

//6.Переключение состояние светодиода

LED1 в

противоположное

 

}//7.

#pragma vector=TIMER0_A1_VECTOR//8.Вектор прерывания по переполнению таймера А

__interrupt void timer_a(void)//9.Функция,вызываемая при прерывании от таймера А

{//10.

TACCR1+=10;

//11.Увеличение яркости светодиода LED2

if (TACCR1 == 10000)

//12.Если яркость достигла максимальной

TACCR1 = 0;

//13.Уменьшить ее до 0

TACTL &= ~TAIFG;

//14.Сброс флага прерывания по

переполнению таймера А

}//15.

int main(void)

//16.Главная функция программы

{//17.

WDTCTL = WDTPW|WDTTMSEL|WDTCNTCL;//18.Настройка сторожевого

таймера

//19.Перевод линий Р1.0 и Р1.6 на выход

P1DIR = BIT0|BIT6;

P1SEL = BIT6;

//20.Подключенние вывода Р1.6 к выходу

блока захвата/сравнения таймера А

TACTL=TASSEL1|MC0|TAIE; //21.Настройка таймера А

TACCTL1 = OUTMOD0|OUTMOD1|OUTMOD2;//22.Режим работы ШИМ -

сброс/установка

TACCR0 = 10000; //23.Установка максимального значения счета таймера А равным 10000

IE1 |= WDTIE;//24.Разрешение прерывания сторожевого таймера

__bis_SR_register(SCG0|CPUOFF|GIE);//25.Выключение неиспользуемых источников, ЦПУ и разрешение прерываний

while (1);

//26.Бесконечный цикл

}

 

Рассмотрим кратко основные нюансы программы.

Встроке 18 сторожевой таймер обнуляется (WDTCNTCL =

1)и настраивается как интервальный таймер (WDTTMSEL = 1), тактируемый от SMCLK (WDTSSEL = 0) и периодом срабатывания равным 1100000 / 32768 = 33,6 Гц (WDTIS0 = WDTIS1 = 0).

Встроке 20 встречается новый регистр P1SSEL. Почти любой вывод микроконтроллера может выполнять несколько операций. По умолчанию все выводы настроены как дискретные

10