;============== ; Процедура обработки прерывания по событию захвата таймера 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 раз.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
НАПАЛМ, если вопрос стоит в том, как сконвертировать табуляцию в пробелы, то я использую программу Sublime Text 2. Она позволяет настраивать количество пробелов на символ табуляции. Остальные действия — исключительно копипаст.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Длительность периода в реальном времени
Добавлено: Вт мар 28, 2017 16:27:43
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения: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
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Starichok51 писал(а):
инкремент не устанавливает флаг переноса.
Давно не прогал на асме, забывается, а в справочник не смотрел. Да, тут другое решение нужно. Можно как и у ТС, держать единицу в регистре. А если использовать индексный регистра, то еще проще.
Starichok51 писал(а):
зачем занимать еще 2 регистра?
Хотел так, но тогда результат куда-то сохранять надо будет.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Длительность периода в реальном времени
Добавлено: Вт мар 28, 2017 18:13:25
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
я бездумно повторил из кода ТС. Замечание верное, надо воспользоваться другим флагом или устанавливать непосредственно перед выходом из прерывания. Код без теста - недокод.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
В АВР-студии есть автоотступ по типу как в мелкосовтовской визуальной студии. Остальные места — ручками. Табуляции везде, кроме комментариев, очень удобно для выравнивания.
akl писал(а):
Извините, ошибочная конструкция.
Вот вы очень внимательны, завидую. Я эту ошибку обнаружил, только когда в железе попробовал, — МК ничего в комп не слал.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения