Освоение Атмеги или кипит наш разум

Pavel_E
msv:

Что явно бросилось в глаза -

  • запрещать прерывания в конце обработчика нет необходимости.
  • индикацию лучше полностью перенести в фоновый цикл.

Мерси за коммент! Индикация недоработана сознательно - буду адаптировать под конкретные задачи, это так база. В пределе она должна уметь автоматом выводить числа со знаками и плавующей точкой, символы… Только не нужно пока, а вычислений добавляется.

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

msv

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

Pavel_E
msv:

В принципе ничего страшного, но если можно это избежать, то лучше и не делать.

Да, пожалуй. Каждый оборот основного цикла может переключать знакоместо. И таймер можно для других целей освободить. Хороший коммент.

Nick_Shl
msv:

разрешив прерывания в начале обработчика прерывания

А вот с этим надо быть очень аккуратным! Если прерывание не успеет обработаться до возникновения его самого, и условия не изменятся - пожираем стек и падаем…

msv

Да, еще… длинный код в обработчике можно выполнить примерно так:
PORTA=led_str[tim2cnt];
PORTB&=0xf0;
PORTB|=1<<tim2cnt;
if(++tim2cnt>=4) tim2cnt=0;
Ну это, так… косметика…

Pavel_E
Nick_Shl:

А вот с этим надо быть очень аккуратным! Если прерывание не успеет обработаться до возникновения его самого, и условия не изменятся - пожираем стек и падаем…

Провел эксперимент. Засунул в прерывание delay_ms(100) - т.е. задержку примерно на 40 циклов запуска этого прерывания. Все равно работает, зараза! Глотает другие прерывания, мерцает диодами, но машинками худо-бедно управляет. Как объяснить сей феномен?

msv:

Да, еще… длинный код в обработчике можно выполнить примерно так: PORTA=led_str[tim2cnt]; PORTB&=0xf0; PORTB|=1<=4) tim2cnt=0; Ну это, так… косметика…

Да, думал я это автоматизировать. Только все получались какие-то громоздкие и долгие конструкции. PORTB&=0xf0; в голову не приходило, мерси.