#1 2018-05-10 11:35:35

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

прерывание из прерывания?

Привет, есть устройство, мотор с энкодером и LCD. Экран обслуживается по прерыванию таймера счетчика 1 примерно каждые 0.3 секунды.
Я решил проверить точность подсчета импульсов энкодера, параллельно  к энкодеру я подключил счетчик на семисегментных индикаторах и выяснялось, что показания разные, я начал копать и понял, что при заходе в прерывание аппаратно сбрасывается 7 бит SREG (запрет глобальных прерываний). То есть когда заходит в прерывания по таймеру счетчику перестают обслуживаться прерывание INT0, отсюда и ошибка подсчета. Вопрос в том можно (уместно) разрешать глобальные прерывания из прерывания таймера счетчика 1?
ISR(TIMER1_COMPA_vect)
{
   sei();
}
Или лучше будет написать код обслуживания LCD как подпрограмму и заходить в нею по счетчику на переменной, что честно сказать меня смущает, не хочется нагружать лишней "работой" цикл опроса энкодера.

Неактивний

#2 2018-05-10 12:42:28

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: прерывание из прерывания?

То, что вы хотите сделать называется вложенными прерываниями. Программная дипетчеризация вложенных прерываний не лучшее и не самое простое решение.  Для этого делают аппаратную поддержку, как в ATxmega или ARM. Обычно, такие ресурсоемкие функции, как графические, не размещают в теле обработчиков прерываний, а выполняют в основном процессе, синхронизируя с таймером если нужно. Выполненние обработчиков прерываний, при плоской модели (без вложенных), должно быть быстрым и длительность выполнения самого динного сегмента кода должна быть меньше самой маленькой допустимой задержки обслуживания других прервываний. Иначе события будут потеряны. Что бы ваша программа работала правильно вам придется все-таки усложнить основной цикл.

Неактивний

#3 2018-05-10 12:46:23

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: прерывание из прерывания?

ARM - настраивайте приоритеты прерываний  как  Вам будет угодно, например Teensy, RedBearLab BLE Nano и др.

Неактивний

#4 2018-05-10 13:57:25

LynX
Учасник
Зареєстрований: 2018-04-19
Повідомлень: 71

Re: прерывание из прерывания?

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



не хочется нагружать лишней "работой" цикл опроса энкодера.

Эвона как Вы все наоборот сделали. Энкодер установите на прерывания и не опрашивайте. Нельзя не нагружать лишней "работой", процессор не многоядерный, если есть какая-то нагрузка она будет выполнена в ущерб основной работе, в прерывании она или нет. И в данном случае чтобы не пропускать отсчеты енкодера единственный выход - сам енкодер поставить на прерывания.

Остання редакція LynX (2018-05-10 14:01:44)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму