Спасибо за совет АлександрЛ. Проект в протеусе выложил.
Добавлено after 41 minute 38 seconds:Код:
или вообще уйти от привязки к частоте тактирования
ТCNT1 = -F_CPU/1000; 1мс
Отиличная мысль. Буду исправлять.
Код:
Не нравится проведение расчёта скорости. Операция деления должна проводиться в последнюю очередь. Не думаю, что компилятор настолько продвинутый, что сам определяет порядок выполнения операций.
Если вы имеете в виду эту часть кода
return (uint16_t)(((float)50000/data)*3600);
то здесь после деления, результат умножается что бы вывести нужную часть числа из дробной части (Поскольку точка скорей всего будет включена постоянно). Что бы вывести деление из формулы нужно будет добавить переменную и добавить еще отдельную строку кода для умножения. Что то типа этого:
float temp;
temp = ((float)50000/data):
return (uint16_t)(temp*3600);
Больше ничего в голову не приходит. Результат по формуле выдается правильный.
Код:
Думаю, что лучше задать режим работы таймера по сравнению с автосбросом и привязать к 1мс динамическую индикацию.
OCR1A=F_CPU/1000-1; 1мс
TCCR1B=ICES1+WGM12+CS10; CTC F_CPU/1
Про динамическую индикацию думал, но не успел добратся