;============== ; Процедура обработки прерывания по событию захвата таймера 1 tc1capt: in r14, SREG set ; Установка флага события для основного цикла add r10, r1 ; Инкремент номера события adc r11, r0 mov r2, r18 ; Сохранение старого временного штампа mov r3, r19 mov r4, r20 mov r5, r21 in r18, ICR1L ; Чтение аппараной части временного штампа in r19, ICR1H mov r20, r12 ; Чтение программной части временного штампа mov r21, r13 in r15, TIFR ; Проверка наличия флага переполнения sbrs r15, TOV1 rjmp tc1capt_1 ; Если установлен, то продолжить mov r15, r19 ; Проверка старшего бита аппараной части ВШ sbrc r15, 7 rjmp tc1capt_1 ; Если сброшен, то продолжить add r20, r1 ; Коррекция программной части ВШ adc r21, r0 tc1capt_1: out SREG, r14 reti ;============== ; Процедура обработки прерывания по переполнению таймера 1 tc1ovf: in r14, SREG add r12, r1 adc r13, r0 out SREG, r14 reti ;==============
В прерывании по захвату читаем аппаратную и программную часть временного штампа. Затем, если установлен флаг переполнения таймера и сброшен старший бит аппаратной части, то считаем, что переполнение произошло до события захвата и не было обработано (Вариант Д). Поэтому корректируем программную часть штампа, увеличивая её на единицу.
Аlex писал(а):
B@R5uk писал(а):
Вариант Г 1) Событие захвата; 2) Событие переполнения; 3) Обработка события переполнения; 4) Обработка события захвата. Из-за накладки результат получается неправильный. Программная часть временного штампа на единицу больше, чем надо.
Этот вариант исключён.
Я правильно понимаю, что если у МК имеется несколько запланированных прерываний, то выполнятся будет то, которое выше по списку?
Хотя вопрос снят. Нашёл ответ в разделе 4.7 Reset and Interrupt Handling:
Цитата:
The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 – the External Interrupt Request 0
Последний раз редактировалось B@R5uk Вт мар 28, 2017 12:01:19, всего редактировалось 1 раз.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
НАПАЛМ, если вопрос стоит в том, как сконвертировать табуляцию в пробелы, то я использую программу Sublime Text 2. Она позволяет настраивать количество пробелов на символ табуляции. Остальные действия — исключительно копипаст.
Заголовок сообщения: Re: Длительность периода в реальном времени
Добавлено: Вт мар 28, 2017 16:27:43
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
B@R5uk писал(а):
Z_h_e, я правильно понял вашу идею?
Сегодня голова чего-то не варит, целый день сплю. Есть такое чувство что что-то в коде не так, возможно ложное.
По сколько голова не варит, решил накидать свой код . Переменные решил сделать так же как и у Вас, в регистрах, видимо Ваш проект это позволяет, если индексные регистры свободны, то их использование вроде как должно укоротить код.
Опеределения регистров. В Len будет измеренная длина периода импульса. Спойлер
Код не проверял, не уверен что без ошибок и если помозговать, то наверное можно с оптимизировать. Тут еще конечно нюансы конкретного МК надо учитывать.
Не забывайте про необходимость атомарности операций. Например, Вы хотите отправить по UART измеренную длительность. Для этого следует запретить прерывания которые могут изменить Len3:0. Копируете Len в некий буфер, разрешаете прерывания и затем спокойненько отправляете данные из буфера.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
inc CountOVF0 ADC CountOVF1,zero инкремент не устанавливает флаг переноса. но зато устанавливает флаг нуля. нужно сделать проверку на ноль, и если ноль, тогда сделать просто инкремент следующего регистра.
зачем занимать еще 2 регистра? CountOVF0 и CountOVF1 и есть те самые Len2 и Len3. или можно сделать наоборот. оставить имена Len2 и Len3, а имена (регистры) CountOVF0 и CountOVF1 - убрать.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Заголовок сообщения: Re: Длительность периода в реальном времени
Добавлено: Вт мар 28, 2017 17:23:59
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Starichok51 писал(а):
инкремент не устанавливает флаг переноса.
Давно не прогал на асме, забывается, а в справочник не смотрел. Да, тут другое решение нужно. Можно как и у ТС, держать единицу в регистре. А если использовать индексный регистра, то еще проще.
Starichok51 писал(а):
зачем занимать еще 2 регистра?
Хотел так, но тогда результат куда-то сохранять надо будет.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Длительность периода в реальном времени
Добавлено: Вт мар 28, 2017 18:13:25
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
я бездумно повторил из кода ТС. Замечание верное, надо воспользоваться другим флагом или устанавливать непосредственно перед выходом из прерывания. Код без теста - недокод.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
В АВР-студии есть автоотступ по типу как в мелкосовтовской визуальной студии. Остальные места — ручками. Табуляции везде, кроме комментариев, очень удобно для выравнивания.
akl писал(а):
Извините, ошибочная конструкция.
Вот вы очень внимательны, завидую. Я эту ошибку обнаружил, только когда в железе попробовал, — МК ничего в комп не слал.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения