Стала предо мной задача обработки двух энкодеров, обработки фотоприемника для ДУ, постоянное обновление данных регистров 74HC595 5шт. включенных последовательно, и переодический (по таймеру) выброс данных в еепром типа 24Схх
SPI и I2C программный.
Планирую применить ATmega16 . Но у нее всего 2 прерывания INT0 and INT1. Не хватает еще одного прерывания для второго энкодера... Как можно решить эту проблему? Чтоб система работала надежно без сбоев?
Посетила идея настроить таймер на прерывание по переполнению и в нем опрашивать входы энкодеров. Но не будет ли искажений сигналов при передаче данных по SPI и I2С ?
А, вон оно что. Тогда сложнее. Я бы советовал сделать опрос энкодеров в основном цикле, когда не работают прерывания. Частота там большая не нужна, говорят 500Гц достаточно. Да и если пропустить опрос - не страшно, всё равно не заметишь. Сам, правда, не пробовал, энкодеры только приехали, на днях поковыряю, как с ними лучше обращаться.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Для легкой переносимости на другую платформу + не понятно как инициализировать аппаратные SPI и I2C и использовать.
Работаю в CVAVR
Думаю что в момент попадания в прерывание по таймеру можно прижимать SCL к земле. А при выходе освобождать.
А еще лучше "синхронизировать" работу дэвайса .
ловим энкодеры по таймеру .
если поймали > обрабатываем данные запрещаем прерывания и вываливаем на индикацию HC595
если нет > возвращаемся на начало.
По таймеру если было зафиксировано срабатывание энкодеров > сохраняем в еепром 24Схх Вчера пробовал скорость работы программного I2C с памятью 24С08. В принципе скорость меня устраивает.
Еще: Что если применить 93Схх ? тогда не надо I2C городить?
А как обрабатывать дребезг контактов при использовании таймера? Просто запрещать прерывания на "N" время если было зафиксировано срабатывание энкодера что и послужит антидребезгом?
Зачем увеличивать габариты ПП и сложность схемы если есть МК ? При сдаче в производство главная цель стоит "Максимально минимальные" габариты ПП . Поэтому отпадает такая идея
Да дребезг программно нормально отсекается. Если сами не придумаете, вот алгоритм Леонида Ивановича, раскомментирован до нельзя... Спойлер
Код:
//----------
//Модуль поддержки энкодера
//Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2). //Для подавления дребезга используется анализ двух последовательных //состояний. Это позволяет обойтись без временных задержек. //Функция Encoder_Init() должна вызываться один раз в начале программы. //Функция Encoder_Exe() должна вызываться в основном цикле. //При повороте энкодера на шаг вправо или влево вызываются функции //To_Do_Step_Up() и To_Do_Step_Dn() соответственно.
Интересный код! Спасибо Вам! Надо попробовать его.
Но как то сложно все реализовано... Куча переменных, зачем? Я год назад проводил тесты с энкодером. И написал кусок кода (сейчас попробую по памяти написать)
Код:
if (enc==0 && flags_enc==0) { if (enc1==1 && flags_enc1==0) { comand_left(); // команда влево
flags_enc = flags_enc1 = 1; }
}
if (enc1==0 && flags_enc_==0) { if (enc==1 && flags_enc1_==0) { comand_right (); // команда вправо
Код реально работал в основном цикле программы. в качестве проверки выводил в порт меги8 "бегущий лог.1" подключив светодиоды к порту я видел как "бежит" светящийся светодиодик
Ну еще enc и enc1 не забыть продэфайнить в начале.
И еще можно будет убрать три переменных а использовать всего лишь 4 бита из одного байта. Тогда код вообще будет оптимальным. Так мне кажется лучше смотрится
Последний раз редактировалось Artos Вт сен 04, 2012 14:17:26, всего редактировалось 1 раз.
На какой частоте может работать порт в AVR контроллера? буду брать 4мгц тактовую. Нужно быстро рулить сдвиговым регистром но не постоянно, в момент изменения данных. (статическая индикация три разряда) + вывод двоичного кода в 2х8бит в еще два регистра. И того получается 5шт. сдвиговых регистров включенных в цепочку.
На какой частоте реально можно затактировать программный SPI?
А какая разница? У меня 595е цепочкой 14 штук, тактовая - 20МГц, никаких задержек, выплёвываю данные когда надо и всё. В любом случае логика на порядок быстрее вашего МК отработает. То есть обычный цикл, никаких таймеров и прочего. Это ведь синхронный интерфейс получается.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения