Уроки MSP430 LaunchPad. Урок 09: Таймеры

Теперь, когда мы научились регулировать частоту тактовых сигналов MSP430, мы можем использовать это, для управления периферией. Периферия, это устройства, которые могут быть встроены в микроконтроллер, а могут быть установлены нами извне. Работа с периферийными устройствами, это то, ради чего микроконтроллер создан, и то, ради чего мы учимся с ним работать. Первое периферийное устройство, которое мы изучим, это таймер Timer_A.

Маленькое замечание, существует так же таймер Timer_B, он во многом похож на Timer_A, но не встречается в микроконтроллерах серии Value Line. Если вам встретится Timer_B в других MSP430, просто научитесь работать с таймером Timer_A, а остальные детали уточните по руководству пользователя.

Таймер, это просто счётный механизм, привязанный к импульсам тактового сигнала от системы синхронизации. Таймер Timer_A, является 16 битным таймером. Это значит, что он считает от 0 до двоичного 0b1111111111111111, или шестнадцатеричного 0xFFFF, или десятиричного 65535. Из таймера можно извлечь много пользы, если научиться управлять его поведением.

Режимы работы таймера






У таймера Timer_A три режима работы. Какой из них используется, зависит от программы. Первый: Режим непрерывного счёта, в нём таймер просто считает от 0 до 0xFFFF, потом начинает с начала, и так до бесконечности. Второй: Режим прямого счёта, в нём таймер работает так же, считает до верхней границы, и начинает опять с 0. Только в этом режиме вы можете выбирать, верхнюю границу, до которой будет считать таймер. Третий: Режим реверсивного счёта, похож на режим прямого счёта тем, что в нём вы можете выбрать максимальное значение таймера. Отличие его в том, что достигнув максимума, таймер начинает считать вниз, потом, достигнув 0, опять вверх и т.д. Возможно, для вас не вполне очевидно, какой из режимов вам нужен, просто почитайте этот урок, почитайте про таймеры на других сайтах, изучите примеры приложений, использующих таймер.

В дополнение к трём режимам счёта в Timer_A, есть несколько путей его использования. В нём есть возможность ставить ключевые точки, по достижении которых, таймер вызывает прерывание. Микроконтроллеры серии Value Line, имеют либо две, либо три ключевых точки, в зависимости от модели. В документации они зовутся регистрами захвата/сравнения. Типичное их использование, установка флагов, по которым микроконтроллер должен что-либо сделать. По факту, первый из этих регистров используется для установки верхней границы в режимах прямого и реверсивного счёта. Остальные регистры, являются просто флагами для процессора, и не влияют на работу таймера. В режиме непрерывного счёта, первый регистр тоже является флагом для процессора.

Так работает регистр сравнения, мы просто устанавливаем значение, которое сравнивается с текущим счётом таймера. Если значения совпадают, процессор получает сигнал об этом. Регистры захвата, работают несколько иначе. Таймер ждет определенного сигнала, зачастую идущего из входов портов, и записывает текущее значение счётчика в регистр, это похоже на функцию “lap” круг, в спортивном секундомере.

Регистры


С таким большим количеством функций в Timer_A, вы наверно думаете, сколько же нужно регистров, что бы этим всем управлять. На самом деле, в каждом MSP430, имеющем Timer_A, используется семь регистров для его контроля. Давайте рассмотрим их более детально. В руководстве пользователя сводная таблица регистров для Timer_A приведена на странице 321.

  • TACTL – Timer_A Control Register, Регистр управления Таймера А. Используется для связи таймера с тактовыми сигналами и выбора режимов работы.
      • TASSELx, биты 8 и 9, указывают таймеру, какой из тактовых сигналов использовать.
      • IDx, биты 6 и 7, указывают, какой делитель частоты тактового сигнала использовать, 2, 4 или 8. Делится частота, полученная уже после применения делителя в самом генераторе тактового сигнала.
      • MCx, биты 4 и 5, указывают на режим работы таймера. Если они равны 0 (стоит по умолчанию) таймер полностью остановлен.
      • TACLR, бит 2. Если в него вписать 1, это приведет к сбросу таймера. Микроконтроллер автоматически вписывает в этот бит 0, после перезапуска таймера.
      • TAIE и TAIFG, биты 0 и 1, соответственно. Контролируют прерывание таймера, об этом чуть ниже.
  • TAR – Timer_A Register, Регистр счётчика Таймера А, в нём содержится текущее значение таймера.
  • TACCRx – Timer_A Capture/Compare Registers, Регистры захвата/сравнения Таймера А. Их может быть два (TACCR0 и TACCR1), может быть три (TACCR0, TACCR1 и TACCR2) в зависимости от модели микроконтроллера. В режиме сравнения, мы вписываем в них значения, по достижении которых, таймер должен подать нам сигнал. TACCR0 зачастую используется для указания верхней границы счёта. В режиме захвата, процессор записывает в них текущее значение TAR, по сигналу на входе.
  • TACCTLx – Timer_A Capture/Compare Control Registers, Регистр управления блоком захвата/сравнения Таймера А. От его значения, зависят режимы работы регистров захвата/сравнения.
      • CMx, биты 14 и 15, определяют тип сигнала, по которому происходит захват. (По нарастающему, спадающему, обоим фронтам. – Прим. пер.)
      • CCISx, биты 12 и 13, выбирают, откуда берется сигнал захвата.
      • SCS и SCCI, биты 11 и 10 соответственно, синхронизация сигнала захвата с тактовым сигналом таймера. Обычно, таймер работает независимо, асинхронно, от внешних сигналов. (Я сам до конца не разобрался в этой функции, напишу подробней в следующих уроках)
      • CAP, бит 8, выбор режима работы, 1 – режим захвата, 0 – режим сравнения.
      • OUTMODx, биты 5-7, выбор режима работы модуля вывода, т.е. тип реакции на событие захвата или сравнения.
      • CCIE и CCIFG, биты 4 и 0 соответственно, обработка прерываний по захвату/сравнению.
      • CCI и OUT, биты 3 и 2 соответственно, вход и выход захвата/сравнения.
      • COV, бит 1, переполнение захвата. Устанавливается в 1, если произошел второй захват, а первый еще не был считан. Должен сбрасываться программно.
  • TAIV – Taimer_A Interrupt Vector Register, регистр вектора прерывания Таймера А. Так как прерывание таймера, может быть вызвано по нескольким разным причинам, содержимое этого регистра, указывает на причину вызова прерывания.
      • TAIVx, биты 1-3, содержат тип случившегося прерывания, что позволяет нам, совершить разные действия для обработки разных причин прерываний.


К несчастью, нужно очень много рассказывать разных деталей, для описания всех возможностей этих регистров. Поэтому мы будем использовать таймер по разному, в разных примерах, в дальнейших уроках, дабы проиллюстрировать его возможности. Но до этого, мы должны узнать, что такое прерывания, поэтому следующий урок о них. Надеюсь, вы что-то узнали для себя, о работе периферийного устройства Timer_A, из этого урока.

Оригинал урока на английском: Tutorial 09: Timers

Предыдущий урок этого цикла: Урок 08: Бьющееся Сердце BCS+
Следующий урок этого цикла: Урок 10: Постой паровоз… (Прерывания)
  • +13
  • 17 ноября 2012, 05:25
  • Tabke

Комментарии (5)

RSS свернуть / развернуть
Странные уроки. Мне кажется это пересказ MSP430xxxx Family User's Guide.
0
Ну пересказ-не пересказ, а направленность на конкретную платформу (LaunchPad) плюс описанные примеры — для новичков очень хорошее подспорье. Ибо по MSP430 на Русском вобще мало литературы. А уроков я в сети до сих пор вобще не видел.
0
по MSP430 на Русском вобще мало литературы
Может, и мало, но достаточно.
0
То, что у меня есть в бумаге — это две компэловские книжки по x1xx (руководство пользователя и рекомендации по применению), ещё одна довольно свежая по x2xx.
0
Более менее грамотным программистам наверно достаточно. А мне его освоение даётся с трудом.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.