Приветствую Уважаемые форумчане. Недавно по просьбе знакомого автомоделиста ( скорее по желанию попробовать собрать что-то серьезное) начал разработку измеритель скорости. В чем заключается суть данного девайса. Модель автомобиля едет по кругу в произвольный момент времени (т. е. по желанию спортсмена) при нажатии на кнопку начинается отсчет определенного количества кругов. И после все этих процедур выводится финальный результат. Забыл упомянуть до нажатия на кнопку показывается скорость каждого круга. Так спортсменам легче определить лучший момент.
Добавлено after 28 minutes 52 seconds:
Выклыдываю проект в протеусе и собственно саму программу.
Добавлено after 23 minutes 22 seconds:
Схему в протеусе выложить не получается(не знаю почему, но скорей всего ограничение модератора) Попробую нарисовать .jpeg
Программу выложил. Если есть мысли как её ускорить, сделать более читаемой критика приветствуется(попрошу сильно не пинаться это моя 2я программа).
Tuz писал(а):Программу выложил. Если есть мысли как её ускорить, сделать более читаемой критика приветствуется(попрошу сильно не пинаться это моя 2я программа).
Не нравится проведение расчёта скорости. Операция деления должна проводиться в последнюю очередь. Не думаю, что компилятор настолько продвинутый, что сам определяет порядок выполнения операций.
Думаю, что лучше задать режим работы таймера по сравнению с автосбросом и привязать к 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
Про динамическую индикацию думал, но не успел добратся