Здравствуйте! Я всего неделю изучаю программирование mega16 и читал курс avr123, но у меня осталось несколько вопросов. Научил ATmega16 вполне успешно рулить униполярным шаговиком в оба направления с заданным ускорением, программа на Cи в cvavr (1.2.58) получилась вполне красивой, всё вызывается через функцию c параметрами, и мейн занимает пару строк всего... Но задача моя состоит в другом. Необходимо сделать так, чтобы превратить мегу16 в связке с uln2803(по 2 ножки на вывод каждой фазы ШД для снижения тока на ее ногу) в драйвер для этого движка, то бишь мега будет промежуточным звеном, на которое будет приходить по переднему фронту импульса задание на 1 "шаг" и на "направление". Нет ли у вас материалов с примером подобной программы? Желательно пример кода (ну или хотя бы алгоритм), потому что у меня опыта маловато и не до конца понимаю работу прерываний, хоть прочитал курс avr123 (в т.ч. и про прерывания, немного листал ДШ) и половину книги "codevisionAVR Пособие для начинающих" Лебедева. Нужно чтобы по фронту импульса на одну из ног порта, например, PORTD, запускалась функция... Сейчас пробую сделать это через прерывание, потому что не знаю пока, как иначе выделить фронт и чтоб МК не проглотил управляющий импульс... Максимальная частота следования импульсов на "шаг" около 50 Гц (даже меньше), поэтому быстродействие тут не критично. Прошу прощения, если подобный вопрос поднимался уже и я свин не сумел нормально нагуглить по форуму... И мне нужно использовать именно МК, а не драйвер готовый для ШД, где уже предусмотрены такие входные сигналы.
Фронт - это изменение уровня сигнала. Уровень сигнала может измениться, например, при нажатии на поключенную к ноге кнопку. Соответственно искать примеры обработки нажатий кнопки и борьбы с дребезгом.
Добавлено спустя 1 минуту 52 секунды: А, да. Не надо в прерываниях вызывать функции. В прерываниях должен быть самый минимальный код.
dccharacter писал(а):А, да. Не надо в прерываниях вызывать функции. В прерываниях должен быть самый минимальный код.
Он должен быть минимальным, чтобы успевал обрабатываться до следующего прерывания. Я же указал, что максимальная частота импульсов на ногу не более 50 Гц, написал это не случайно, потому что задание приходит с ПЛК Schneider Electric серии Premium (не спрашивайте почему и зачем), там не скоростной, а обычный дискретный DC-выход 24 В лог. единица, частота его ограничена этими 50 Гц. Поэтому не писал о дребезге и прочих проблемах, сигнал приходит с цифрового задатчика импульсов и проходит через оптопару и RC-фильтр.
Добавлено спустя 10 минут 46 секунд: Спасибо за совет про банального обработчика нажатия кнопки. Попытаюсь сейчас реализовать, но на всякий случай еще раз спрошу, нет ли у кого-нибудь подобного примера, чтобы ошибок не наворочал вероятных?
Есть ли возможность ввести прерывание по изменению состояния любой из ножек любого порта МК ATmega16? Или только по INTx'ам? Судя по ДШ нету, но спрошу на всякий случай. Видимо придется через циклы делать, а не через прерывания, потому что проверяются первые 2 ноги порта D... Так уж я плату развел и лаком покрыл уже.
Вот так он делает 5 шагов по переднему фронту на ноге 0 порта D, исключает дребезг. Всё это уже через гальваническую развязку, даже внешний RC-фильтр НЧ отключил.