PavelK
@PavelK

Arduino/ATmega328 как лучше распределять время выполнения?

Добрый день.
Пока что учусь на Ардуине, тапками не кидать.

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

Если это всё запихиваю в главный цикл, то тайминги не совпадают, что не удивительно.

Попробовал через прерывания по таймеру, но тогда выполнение может прерваться в самый неподходящий момент,
а расчёт идёт как в основном цикле так и в прерывании (самая малость, но никак без этого), поэтому в расчётах наступает путаница (старые значения вперемешку с новыми) а переменные в структурах при использовании прерываний вообще превращаются в кашу...
(Правильно думаю, что при изменении значения для переменных требуется несколько тактов??)
Если прерывания на время расчётов останавливать, то вообще бессмысленно прерывания использовать.

Пока что придумал просто через millis() разделить время пополам, т.е. сначала получаем значения, потом общаемся с устройством.
Но и тут тайминги ломаются!
digitalWrite не использую, пишу напрямую в порты.

Как сделать что бы МК был ГРУБО говоря половину из секунды в loop1 а другую половину в loop2
при этом не обращал внимания ни на что ещё (хз на что, но что-то ломает тайминги)
при этом гарантированно знаю, что обе функции выполняются быстрее, чем пол секунды.

Блин, туманно написал, но надеюсь понятно...

UPD1: Использовать 2 таймера никак, т.к. ШИМ нужен на этих портах.
  • Вопрос задан
  • 1069 просмотров
Решения вопроса 1
PavelK
@PavelK Автор вопроса
В общем решил вопрос - вынес все расчёты, которые занимают переменное кол-во тактов из основного цикла в прерывание, а так же при задании структуры обернул в noInterrupts(); и interrupts(); при этом правда прекратила работать millis(), но это ничё.
почти добился идеала, но тут был подвох ещё один -
для оптимизации прописал:
loop() {while(1) {

} }
Иначе всё равно тайминги сдвигались (видимо loop() занимает хз сколько тактов при этом что-то ещё делает, как и digitalWrite), не на много но это было решающим.

В общем настала пора переходить от ArduinoIDE к чему-нить посложнее.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы