Помогите с Timer2 и UART

не, не надо.
Я слепой и перепутал прерывания между собой.

@te238s прав

Все мои замечания выше ошибочны

При значении 500 лучше конечно стало. Быстрее. Просто идея была отправлять в терминал не с 63 строчки а с 71
А частоту отправки изменять 72 строкой и значением как вы указали в 41. Это не спидометр. Такой точности мне бы хватило.
Сам код то может и гавно) как то топорно, не как обычно, но он работает. Вопрос в том, почему строка 69 работает (регулярно) а следующая 71 нет (как будто через неё перескакивает)

Верно. С 40000 снизил до 1000, стало быстрее, просто точность измерения снижается. Но такой точности мне хватает. А вот всё же, почему 71 строчка не работает, в отличии от 69… так и не разобрался.

Так. Я в такой ситуации бы:
1.В целях отладки убрать вычисления,пусть будет в попугаях

Speed=countin;

вместо

  1. Убрать бесполезную конструкцию

Поставить

И,соответственно,выбрать ближайший подходящий предделитель(на вскидку не вспомню),например 1024.
Так меньше шансов запутаться и словить непонятные глюки.
Возможно из-за частых прерываний? Без отладки наверняка не сказать.
Попробуй в setup

поставить. Хотя бы исключим перезагрузку от переполнения стека.

Если в исходном коде заменить добавить volatile то 71 строчка будет выводится и при пустом цикле while (Finishcountin == 0)
volatile unsigned long Finishcountin = 0;

(На работоспособности не сказывается, но не ясно зачем переменная unsigned long, там где достаточно байта).

Дополнение
countin и timer тоже объявить volatile

ISR(TIMER2_OVF_vect) // процедура обработки прерывания
{
     Finishcountin = 1;
}

Исправил как ты подсказал. Работает хорошо. Предделитель на 1024.
Но print работает без изменений только в цикле while. В цикле Loop не работает. Хотя если их установить оба, то в паре работают

void loop() 
{ 
  
  Finishcountin = 0;
  countin = 0;
  timer = 0;
  Floy = 0;
  
while (Finishcountin == 0)
 {
    Serial.print(64); // для теста
    delay(500);      // для теста
 }


  Speed = countin;
   
  Serial.print(128); 
  delay(1000);
 
}

Ещё подсказали что то про volatile. С ним пока не разбирался.

“Finishcountin изменит значение в строке 42”. Этого не будет, т.к. без таймера(если действительно его убрать) и обработчик вызываться не будет. Видимо не полностью убираете.

Просто в строке 14 добавить volatile

Вообще, в Протеусе у меня всё работает и без volatile

void loop() 
{ 
  
  Finishcountin = 0;
  countin = 0;
  timer = 0;
  Floy = 0;
  
while (Finishcountin == 0)
 {
     Serial.print("Speed on 63 line = ");
     Serial.println(Speed); // тут переменная отправляется в порт
     delay(500);
 }

////////////////////////////
  xx = (62500*countin)/timer;  // Вычисляет частоту. В Гц
  Speed = ((2*3.14*Rkolesa*((xx/42)*60))/60)*3.6;  // Вычисляет скорость от частоты и радиуса колеса. (42 - это 42 импульса на 1 оборот)
  Serial.print("Speed on 71 line = ");
  Serial.println(Speed); // тут переменная не отправляется в порт
delay(1000);
 
}

Огромное вам спасибо. Искренне благодарен. Всё заработала как нужно. While пуст

Да volatile всё решил. Буду дальше править. Спасбо

Возможно, Дим-мычь прав и это происки компилятора. Что-то где-то упрощает,выкидывая “ненужное”.
Поэтому я и не понимаю,как люди вообще пишут код в Ардуино ИДЕ без пошаговой отладки.
Вечерком,если силы и время будут попробую прогнать в Студии.
Опоздал)
Про волатиль было первое сообщение) я лох.

Это оптимизатор. Мне на форуме это не так давно объясняли, тоже не верил

Всё заработало с volatile. А как делать пошаговую отладку ? Хотя поищу в гугле)))
Спасибо за отклик. Буду дальше править и добавить ADC нужно ещё

Просто я сразу начал это занятие в Avr Studio, потом уже Microchip Studio. Это правильно. Это по-взрослому. Детально видишь что,где и как происходит с переменными.
В последней,кстати, можно и скетчи запускать,но пока не пробовал,нужды не было.

1 лайк

Когда то очень давно тоже начал с Avr Studio но не осилел. Потом попался Flowcode. Он очень расслабил своей простотой)) А теперь когда понадобилось что то по серьёзней сделать приходится всё таки изучать нормальное программирование. Но все равно Flowcode помог в каком то смысле понять логику.
Спасибо вам огромное что не отвернулись от корявого кода и помогали)