9zip.ru - технологии для людей
9zip.ru Инструкции Точное таймерное прерывание

Когда таймер переполняется, процессор не сразу уходит в обработку прерывания. Сначала он должен завершить текущую команду. В AVR на это уходит до трех тактов в зависимости от текущей команды и момента возникновения прерывания. Мне видится три пути обхода этой проблемы:

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

Более "правильный" - загнать процессор в SLEEP. Если после этого возникнет прерывание от таймера, процессор сразу же начнет его выполнять. Проблема в том, чтобы гарантированно уходить в SLEEP _перед_ приходом прерывания. Этот способ удобно использовать, когда "фоновую" задачу можно порезать на заведомо быстрые кусочки, или "фоновая" задача сама привязана к таймеру.

Ну и наконец есть способ прочитать значение таймера внутри процедуры обработки, определить сколько времени прошло с момента переполнения и скомпенсировать ошибку. Это наиболее удобный способ, так как он позволяет не курочить ВСЮ программу, чтобы привязать ее к таймеру.

В результате экспериментов родилась последовательность команд, приведенная чуть ниже.

Обратите внимание на использование команд "SBRC" и "SBRS". Какую из них когда использовать зависит от места расположения этих команд в обработчике прерывания. Так что в вашем проекте возможно понадобится другая комбинация команд "SBRC" и "SBRS".

Еще одно замечание. Этот кусок изменяет регистры "R16" и "R0" (командой "LPM"). Так что, если они используются в программе, их придется сохранить.


; Корректируем время: ; такты
in r16,TCNT0 ; 1 Читаем Таймер0
sbrc r16,1 ; 1/2 Смотрим бит 1 - 2 или 4 такта
lpm ; 3
sbrs r16,0 ; 1/2 Смотрим бит 0 - 2 или 3 такта
rjmp _next ; 2

_next: ; Здесь в фиксированное время
; относительно момента переполния


Целиком пример можно скачать в виде архива: timer_int.zip Он написан для AT90S2313 и компилировался в AVR-Studio. Эта тестовая программка выдает на ноге D.0 импульс длиной в 10 тактов с периодом 100 тактов. Ради интереса можно посмотреть на лог порта, который выдал симулятор AVR-Studio:


; Такты:Порт
000000000:00
000000090:01
000000100:00
000000190:01
000000200:00
000000290:01
000000300:00
000000390:01
000000400:00


И еще одно замечание: Фоновая задача может быть какой угодно сложной и написанной на чем угодно. Однако любое другое прерывание (или команда "STI") могут заблокировать ваш обработчик.


9 нравится? 8


01.02.2015 © 9zip.ru
Авторские права охраняет Роскомнадзор

Понравилась статья?
Винни Пух говорит:
поделись с друзьями!

Хочешь почитать ещё про инструкции? Вот что наиболее популярно на этой неделе:
Лампы против транзисторов или предрассудки против качества и красоты?
Согласование усилителя с аккустической системой
Простой генератор звуковой частоты



Есть вопросы, комментарии? Напиши:

Имя
Комментарий
Длина текста:
число с картинки
Правила прочитал(а)
Как вставить картинку в свой комментарий?

Пользовательские теги: таймерное прерывание что это таймерное прерывание в процессоре intel [ Что это? ]

Дальше в разделе Инструкции: Описание работы схемы центрифуги, Электродвигатель питается от сети переменного тока напряжением 220 В частотой 50 Гц. Под крышкой центрифуги установлен выключатель, блокирующий включение двигателя при открытой крышке. Установкой требуемой выдержки времени подготавливают цепи включения реле и нагревателя.

Главная 9zip.ru База знаний радиолюбителя Контакты
Девять кучек хлама:

Радиотехника, электроника и схемы своими руками Ремонт домашней электроники Виртуальный музей старых радиодеталей XX века Ламповый звук hi-end и ретро электроника Катушки Теслы Радиодетали и модули с Aliexpress Интернет и сети, компьютеры и программы Категория свободна Инструкции


Дайджест
радиосхем

Новые схемы интернета - в одном месте!

 15.11 Терморегулятор с двумя каналами на ATtiny13
 15.11 Часы на ESP32 и светодиодах WS2812b
 15.11 Акустическая система с открытым верхом

Задай вопрос радиолюбителям!


2.11 Есть проект, где к МК через транзистор подключен ...
1
28.10 Здравия Всем. Нужна помочь, чтоб после запуска ...
18.10 Ребята помогите сделать схему простенькую для ...
2