Приветствую! Тема такая, хочу к одному МК (мега128) подключить до 5 энкодеров и опрашивать их по таймеру. Как всегда получается, что в протеусе всё норм, а на деле ничего, реакции на вращение ноль. До этого делал, но опрос был в общем цикле, при быстром вращении были проскоки. Энкодеры ставлю эти https://ru.aliexpress.com/item/5pcs-360 ... 0.0.hEFelS
Код:
char New; int EncState1=0; int EncData1=0;
//Инициализация таймера void timer_init (void) { cli(); //остановка глобального прерывания TCCR0=(1<<WGM01); // устанавливаем режим СТС (сброс по совпадению) TIMSK |= (1<<OCIE0); // устанавливаем бит разрешения прерывания счетчика по совпадению OCR0 = 0b11111111; // определяем число сравнения TCCR0|=(1<<CS00); //запуск таймера с предделителем sei(); // enable global interrupt }
//опрос порта Д void EncoderScan(void) { New = PIND & 0xFF; // Берем текущее значение //1-й энкодер if ((New != EncState1) && (EncState1 == 3)) { if(New == 0b00000001) EncData1++; else if(New == 0b00000010) EncData1--; } EncState1 = New; // Записываем новое значение }
ISR (TIMER0_COMP_vect) { EncoderScan(); if(EncData1 == 1) { EncData1=0; j+=1; //увеличиваем переменную на 1 + преходим в режим ожидания единиц if (j > 9) //так как подключено 10 светодиодов, обнуляем. j = 0; } if(EncData1 == -1) { EncData1=0; j-=1; //уменьшаем переменную на 1 + преходим в режим ожидания единиц if (j < 0) j = 9; } }
int main(void) //Основное тело программы { //настраиваем порты ввода-вывода DDRA=0xFF; //установить PA как выходы PORTA=0x01;//Первоначально устанавливаем на всех выходах 1 DDRD=0x00; //порт PD сконфигурировать как входы PORTD=0x00;//Первоначально устанавливаем на всех выходах 0 //PORTD |= (1 << PD1)|(1 << PD0); // подключаем подтягивающие резисторы //Инициализация внутреннего таймера и установка прерываний timer_init(); while(1)//Бесконечный цикл { тут будем зажигать 1 из 10-ти светодиодов по кругу, переменная j подскажет какой зажечь }
таймер не правильно настроен частота какая? пробуйте так
Код:
TCCR0|=(1<<CS01); //запуск таймера с предделителем на 8 TIMSK |= (1<<OCIE0); // устанавливаем бит разрешения прерывания счетчика по совпадению OCR0 = 0b11111111; // определяем число сравнения sei(); // enable global interrupt
код в прерывании должен выполняться быстрее чем сработает следующее прерывание
понижать частоту таймера надо, делитель на 32 - будет опрос 489Гц для энкодера за глаза. а вообще подключаем осцил, крутим энкодер, смотрим длину импульсов - подгоняе таймер на гарантированный захват импульса....
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
может не совсем в тему, но енкодер удобно вешать (вместе с другими кнопками) на шину общих анодов/катодов семисегментных индикаторов (входа разделив диодами) потом собираем всё в одну кучу и получаем и энкодер и кнопки ценой одной лапки МК.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
понижать частоту таймера надо, делитель на 32 - будет опрос 489Гц для энкодера за глаза. а вообще подключаем осцил, крутим энкодер, смотрим длину импульсов - подгоняе таймер на гарантированный захват импульса....
Осциллографа нет, всё на глазок и методом тыка. По поводу настройки делителя на 32, в таблице нашёл только 8, 64, 128, 256, 1024. Как настроить асинхронный таймер/счтчик я не знаю.
Поменял значение 0xFF в строке New = PIND & 0xFF; на 0x03 и теперь хоть как-то начал обрабатывать сигналы. При вращении встречаются проскоки, на один щелчок, иногда бывает на 5 щелчков, если слишком быстро вращать, то всё зависает и перестаёт обрабатывать сигнал, а после отклика происходит сброс программы
по идее частота опроса должна быть не меньше максимально возможной частоты переключения энкодера: вот, допустим, крутить его будешь до 5 об/с у него 20 шагов за оборот, 4 переключения за шаг, перемножаем получается 400 гц — при меньшей частоте опроса при такой скорости вращения будут пропуски. если частота опроса выше - МК просто по несколько раз промерит одно и то же состояние, это не страшно.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Проблема в том, что кроме обработки энкодера должен ещё выполняться основной код, где имеется задержки, циклы и всё должно куда-то выводиться. Делаю развивающую игру, одну сделал, хочу ещё одну, но как-то не выходит. По ссылке ниже, можно посмотреть предыдущий вариант игры, сама игра разделена на под игры. Имеется лабиринт, где на перекрестке мигает разными цветами светодиод, на картинке есть дорожки соответствующих цветов и в зависимости от того какой цвет зажёгся, необходимо в этот момент нажать кнопку соответствующего цвета, но если дорожка выбрана не правильна можно зайти в тупик, смысл дойти до конца. Есть ещё двоичный преобразователь, щелкая 8-ю тумблерами можно получить число, тумблер это 1 или 0. Есть ещё просто крутилка, у меня ребёнок любит на стиральной машине крутить большой круг и смотреть как лампочки по кругу бегают. Все игры пришлось разделить на части и выбирать каждую соответствующей кнопкой, одновременно не получилось сделать, так как в каждой разные задержки (паузы) для цикличного мигания и т.п. Не знаю, ясно ли объяснил. https://youtu.be/1aMetwfHZxg
нужно менять принцип опроса, вешать на INT0...INT4 и таймер не понадобится количество ног тоже... еще к ногам энкодера надо подключить кондеры по 0,1мкф должно улучшить их работу
У DiHalt-а на сайте была статья про энкодеры с хорошим принципом опроса (автомат состояний). Немного стерлось из памяти, поэтому не ручаюсь за абсолютную точность, но по-моему этот принцип позволяет по единственному таймеру опрашивать хоть десяток энкодеров и помещать результат их опроса в переменные для дальнейшей обработки. Статья находится поиском на раз-два.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Карма: 15
Рейтинг сообщений: 210
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1272 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
Там у дихальта небольшая ошибка есть с состояниями (что принимать, что отбрасывать). Просто для сведения.
самое простое: настраивай инт0 (к нему один вывод приходит) например на спад и в прерывании проверяй пин, куда второй вывод приходит — 1 - крутим вперед, 0 - назад. но так можно качанием около одной точки его наматывать (но если енкодер явственно щелкает, то этот баг может никогда не выявиться), правильней: инт0 на эни ченж (любое изменение), в прерывании делать исключающее или от ног энкодера и если 1 - полшага вперед, если 0 - полшага назад (или просто сравнивать их меж собой — равно-туда/неравно-сюда). при желании можно и четверть шага ловить, но на это уже 2 прерывания понадобятся чтобы обрабатывать каждое изменение. //странно - 2ки вместо 0ей - исправил
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Последний раз редактировалось Ivanoff-iv Чт окт 12, 2017 08:51:52, всего редактировалось 1 раз.
Ivanoff-iv - В первом варианте вроде всё понятно, я так кнопку обычную подключал, прерывание по изменению сигнала на входе. По второму варианту сложнее понять, если можно приведите пример ?
при: // External Interrupt(s) initialization // INT0: On // INT0 Mode: Any change в примере D3 и D0 пины на которые подцеплены ножки энкодера (не помню на какой пин приходится инт0 у меги, у тини2313 на D3) т.е. одна из ног кроме участия в сравнении должна сменой состояния вызывать прерывание. это в кодевижне. если так пины не адресуются можно писать и ((PIND&1<<3)^^(PIND&1<<0)) должно сработать (не проверял).
Добавлено after 22 minutes 52 seconds: ((PIND&1<<3)==(PIND&1<<0)) - точно не прокатит т.к. 1цы в разных "разрядах" появляются
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Карма: 15
Рейтинг сообщений: 210
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1272 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
alexey6522, а что – вариант с диспетчером не катит совсем?
а реальная частота может быть другая или из-за фьюзов (тактирование не с кварца) или из-за включенного какого нибудь делителя. тогда конечно будут пропуски. А остальные частотозависимые задачи правильно работают?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
alexey6522, а что – вариант с диспетчером не катит совсем?
Пытался прикрутить диспетчер, нашёл проект для AVR studio, для как ой версии не знаю, но он не компилируется. Я далёк ещё от всего этого. По поводу фьюзов, тактирование включено от внешнего кварца, с этим-то я уже разобрался.
Карма: 15
Рейтинг сообщений: 210
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1272 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
Ну, не знаю тогда... Когда приперло, я под mikroPascal сам «родил» несложный диспетчер. Не рокетсайнс же.
_________________
Последний раз редактировалось trengtor Пт окт 13, 2017 10:27:28, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения