Тааак. Спишу рассказать
Дорвавшись до контроллеров и их программирования - решил сделать умную электронику для дрозда.
Предпосылками послужили свои давние мысли + вот
этот замечательный материал.
Из замечательного материала позаимствовал, поверив разработчику на слово, оптимальное значение длины импульса ударника (~10мс).
Но делать из автомата "портативную игровую приставку"
крайне не хотелось: т.е. нафиг всякие дополнительные кнопечки, лампечки, счетчик выстрелов пока тоже на... фиг (поди и всякие мультиплексоры для подключения 7-сегментных нужны, которых нет. Впрочем и самих индикаторов - тоже нет
).
Часть первая - прошивка (собственно, пока кроме нее ничего и не готово)
Проц пик-12F675 (мелкий восьминогий), языг - ассэмблер.
Сначала прикинул, какая мне нужна функциональность и какова будет логика работы?
И выбрал очень простой и кмк гениальный вариант: никаких доп. кнопок управления режимом огня, никаких доп светодиодов, никаких доп. переключателей. Только штатный спусковой крючок - один на все режимы.
Нажимает один раз - происходит одиночный выстрел. Даже если после этого спуск не отпустили - дальнейшей стрельбы не происходит.
После этого если нажать снова - автомат также стрельнет один раз.
Но если нажать спуск повторно быстрее чем за Х долей секунд (интервал подбирается опытным путем, сейчас стоит 0.5с, но возможно будет меньше) - автомат включается в режим очереди со скорострельностью 900 (больше делать не хочу).
Дополнительная фича - максимальная длина очереди ограничена 29-ю шарами - из расчета, что нажав два раза при полном магазине на большее шаров не хватит, и заведомо не надо зря тратить газ впустую.
Побочная (получившаяся сама) фича - если сделать одиночный, но спуск не отпустить - то отпустив и нажав сразу получаем очередь, без необходимости "двойного клика". Хотя при 0.5с задержке скорость двойного клика высокая не требуется - нажал два раза без особой спешки - уже очередь.
Другой плюс - штатная схема дрозда если нажать спуск и быстро отпустить, либо отпустить среди очереди так, что попадет на выстрел (вероятность события не так уж низка около 10-15%) - то выстрел получается неполноценным. Микроконтроллер такую фигню себе не позволит: время импульса задается электроникой и в процессе самого импульса контроллер о кнопке не думает вовсе.
С программой, на удивление, трахался аж 2,5 часа - очень много времени не мог понять, почему временные интервалы не верные: уже и по операциям все посчитал - сходится, а времена все равно врет раза в 3! Потом как всегда оказалось, что в одном месте тупо забываю инициализировать переменную, и место это было совсем в другой части кода... Пока испытано на отладочной плате, вместо ударника - светик, вместо спуска - кнопечка. Завтра буду совать в дрозд.