Ну надо в железе проверить. То, что они в протеусе скачут я и сам знаю )
Код
Из каких соображений например функция работы компаратора с таймером были разделены?
а из каких соображений они должны быть объединены?
Каждую сущность мы должны по возможности описывать самостоятельно и следить за тем, чтобы внутреннее устройство этой сущности было как можно меньше видно остальным, предоставляя необходимый и достаточный интерфейс для связи этой сущности с другими сущностями.
В проекте есть служба времени, отсчитывающая тики таймера. Ничего более от таймера не требуется. Тогда почему мы должны смешивать его внутреннее устройство(работу с регистрами) с функцией замера времени срабатывания компаратора?
Имеем интерфейс:
инициализация
timer0_init() и собственно, функция, позволяющая эти тики получить
timer0_get_tick_count()
Прерывание, которое мы используем только для расширения разрядности - скрыто внутри модуля timer0.c и это правильно ибо нужно отделять мух от котлет ) Инициализация также сосредоточена в одном месте.
Далее имеем модуль ac.c, в котором реализуется функция замера времени срабатывания компаратора + все телодвижения, необходимые для работы этого узла схемы(управление транзистором, контроль разряда конденсатора...)
И зачем нам здесь таймер? Правильно, чтобы отследить сколько тиков прошло с момента вызова
ac_start_comparison(); до срабатывания прерывания компаратора. Что мы для этого делаем? Правильно, засекаем время. Вызываем
timer0_get_tick_count(); в начале и запоминаем время старта(в условных тиках, естественно)
Код
//remember comparison start time
start_time = timer0_get_tick_count();
и делаем то-же самое в прерывании компаратора
Код
result = timer0_get_tick_count() - start_time;
в итоге в result имеем время(в тиках) прошедшее с момента запуска сравнения до сработки компаратора.
А теперь Вы скажите мне:
1. исходя из каких соображений мы должны совмещать работу таймера и компаратора в одной функции?
2. как вы в таком случае будете выкручиваться если мы захотим ввести таймаут на поворот. Ну что-то вроде: если мы крутим вправо и на протяжении 3000 тиков не произошла остановка по сигналу от датчика - значит датчик неисправен и нужно останавливать движок.
При моём подходе - всё просто. Я засеку время начала поворота в какой-нибудь локальной переменной
Код
rotation_start_time = timer0_get_tick_count();
а в конце основного цикла управления буду просто проверять не вышла ли разница timer0_get_tick_count() - rotation_start_time; за дозволенные приделы(3000). Я обойдусь буквально пятью строчками в программе для реализации этого функционала.
Сколько строк потратите вы для такой доработки при Вашем подходе?
3. зачем что-то менять
в таймере при переходе на оптопару?
Хотите научиться программировать? Учитесь мыслить структурно и автоматно что-ли...
Предыдущий вариант этого проекта занимал меньше строк, но внесение каких-либо изменений или отладка такого проекта на практике оказывается очень сложной. Хотя... это не самый подходящий вариант для иллюстрации...проект действительно очень простой и даже в случае полнейшего быдлокодерства, всё-таки как-то можно напрячь мозК и отладить...
Попробовали бы вы написать в таком стиле проектик раз в пять масштабнее, а потом резко попытаться внести в него изменения/доработки.
Всегда помните о том, что набыдлокодить легче, чем продумать хотя-бы элементарный дизайн, но потом это обязательно обернется Вам геморроем в дальнейшем.
Знаете как легко в мой вариант проекта прикрутить управление с ПК? строчек в 20 обойдется "со всеми пирогами".
А теперь я бы хотел увидеть сколько вы промучаетесь с добавкой управления с ПК в ваш код )
В чем разница? Ведь оба проекта делают тоже самое... а разница именно в дизайне. а на сколько легче дышать потом в итоге.