Как правильно согласовать код с основным циклом Loop(), и аппартными прерываниями, таймерами?

Эмммм, я как бы только учусь… Можно чуть подробнее?
Вы подразумеваете поместить в атомарный блок функцию отображения на дисплее, или достаточно только переменную OptoStepCounter ?

Вот именно, и никакого “буфера” для этого не нужно.

1 лайк

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

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

1 лайк

Вход-выход в прерываниеи на AVR слишком дорогой.
201 строка срабатывпет на 1Мгц ??? Это жопа !!!

:grin: :grin: :+1: Лаконично!
Ясно, понятно ))

Щаззз, падаждии,…
Гляну, что я там в таймере с вызовом понастраивал…

Опечатка :
Частота прерываний = (16 МГц / 64) / 250 = 1000 Гц (1 кГц)
Не 1 МГц.
Прерывание раз в 1 мс.
Слишком часто?

Смотрим на этот код. Для начала, выглядит смешно, что в комменте обещается выводить на семи-сегментник с частотой 1 МГц.
Правда, если заглянуть в код, никакого 1 МГц там нет, а есть делитель 64 - то есть 250 КГц и максимальное значение 256 - то есть частота вызова чуть менее 1 КГц время на выполнение кода прерывания порядка 1 мс

А дальше смотрим в библиотеку дисплея и пытаемся прикинуть, сколько же занимает вызов display.showNumberDec()
У меня насчиталось 42 мс

Уже исправил. Тупанул в коменте.
Частот вывода 1 мс.
( уже написал выше @Comandir)

делить не на 250, а 256

Зависит от того, что делать. А ты поленился заглянуть в код библиотеки

Судя по коду, регистры ты где-то списал, а понимания у тебя не на грощ

Щас еще окажется, что на высоких оборотах ШД станина трясется так, что pot мотает от нуля до максимума и поэтому двиатель начинает пропердывать.

Да, поленился. Вот сейчас ткнули носом. За что благодарен.

А регистры элементарно списываются с ДШ по Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V.
Методом проб и ошибок, получается то что желаешь. На самом низком уровне и быстродействии.
Без медленных, стандартных функций Arduino.
В этом и фишка, когда код работает криво и медленно , начинаешь копать непонятные вначале регистры. Но потом , жизнь налаживается.

мозги тоже нужны.
Таймер 2 у тебя настроен неверно.
Ты задал значение для совпадания, а прерывание настроил по переполнению. В итоге частота не та. То что она у тебя получилась близкой к нужной - не более чем случайность

Нет, не окажется. Станина жесткая, PSU достаточен по току, и ничего не дребезжит.
Потенциометр надежный, и энкодер Alps.

А, понятно, ты наверно думаешь, что твои программы работает медленно из-за “медленных, функций Arduino.” Поэтому ты и напихал сюда регистры?

Если код дерьмо - никакие регистры не помогут.
Сначала надо учится программировать,

По порядку:

void setupTimer2() {
// Настраиваем Timer2 на прерывание при переполнении
  TCCR2A = 0;             // Сбрасываем регистр управления таймером
  TCCR2B = 0;             // Сбрасываем регистр управления таймером
  TCNT2 = 0;              // Сбрасываем счетчик таймера
  OCR2A = 250;            // Устанавливаем значение сравнения, чтобы вызывать прерывание каждые 1 мс
  TIMSK2 |= (1 << TOIE2); // Включаем прерывание по переполнению таймера
  TCCR2B |= (1 << CS22);  // Устанавливаем делитель частоты 64, чтобы таймер 2 работал на частоте 1 kГц
}

Что тут не верно?
OCR2A = 250; ? Так я и считал значение, что бы получилось 1мс ((16 МГц / 64) / 250 = 1 кГц)
По твоему нельзя выставлять значения в OCR2A отличные от степени 2 ?
Или я забыл установить флаг в регистр TIFR2 ?

TIFR2 |= (1 << TOV2);

И да, я настраивал таймер по переполнению, а не по совпадению.

Смотри, я не претендую на гуру погромиста. Поэтому и отписываюсь в ветке для новичков.
Но стараюсь понять и вполне поддаюсь обучению.

Так я и учусь!
Может ты выдашь порцию конструктивной критики, а не пафоса?

Это не идеал, это - глупость.
Никогда не нужно отображать что-то на экране с периодом меньше 16 мс. Лучше 30-100 мс. А стандартом de facto считается 500 мс.
Потому Вы и не можете добиться работоспособности, что пытаетесь заставить МК выполнять лишнюю и совершенно не нужную работу.

И да, я так думаю. Я хочу учиться писать код, максимально быстрый и приближенный к регистрам, если это возможно. И да, я ненавижу функцию loop (), а особенно задержки в виде delay(), и иже с ними.

Я уже понял. Благодарю.
Просто вот нашла такая блажь, получить режим “турбо” на " закиси азота" )

178 и 194 рубля в зависимости от объема флеша

Нахрена? Человеческий глаз быстрее 50 мс все равно ничего увидеть не в состоянии