Заголовок сообщения: Таймер с энкодером на ATmega8
Добавлено: Вс май 24, 2020 13:44:41
Родился
Зарегистрирован: Вс май 24, 2020 13:27:28 Сообщений: 12
Рейтинг сообщения:0
Доброго времени суток, уважаемые КОТовчане !!! Такой вопрос. Собрал таймер на ATmega8 на кнопках все норм. все работает.
Тут на видео кнопочный вариант, для наглядности.
Теперь пытаюсь Подружить его с энкодером. Т.е. вместо кнопок поставить энкодер. И недопонимаю что делаю не так. Таймер включается, отображает все нули, и вообще никак не реагирует на повороты энкодера. Может кто подскажет в чем я опять "протупил" ?
ИСХОДНИК (Atmel studio)
Код:
/*Используется семисегментный индикатор с общим АНОДОМ. т.е. на смену разрядов подается "+", а на сементы индикатора "-" Эмиттеры транзисторов прицепить к "+" кллекторы к семисегментнику (к разрядам), базу через резистор к МК*/
void start_otscheta (void) //Тут будут размещены все настроки 1-го таймер/счетчика { TCCR1B &= ~(1<<CS12); //Устанавливаем бит в 0 (для настройки делителя частоты на 64) TCCR1B |= (1<<CS11)|(1<<CS10); //Устанавливаем биты в 1 (для настройки делителя частоты на 64)
/*1000000/64 = 15625 т.е. на этой частоте будет работать МК. Далее для того чтобы получить ровно 12 сек. необходимо "убить" эти 15625 тактов. Это можно сделать настроив данный таймер/счетчик на прерывание при совпадении данного числа*/
TIMSK |= (1<<OCIE1A); //Настраивает прерывания при совпадении.
/*Далее в регистре сравнения необходимо записать в двоичной форме число 15625. Данный регист 16-ти битный, поэтому он сдвоенный*/
Возьмите энкодер, уберите индикатор и всё, что с ним связано. Подключите светодиод (или пару) и начните его/их зажигать по энкодеру. Разберитесь с энкодером на этом просто примере, тогда разберетесь и дальше.
Возьмите энкодер, уберите индикатор и всё, что с ним связано. Подключите светодиод (или пару) и начните его/их зажигать по энкодеру. Разберитесь с энкодером на этом просто примере, тогда разберетесь и дальше.
В том то и дело что с самим энкодером разобрался, а вот в программно реализовать "затык" получается (. Уже и сам пробовал код писать и в сети находил пытался использовать, просто не могу понять в чем дело. Логику кода (из сети) вроде понимаю, вижу что должно работать прошиваю МК подключаю все и результат нулевой...
Так я вам и говорю, чтобы с программой именно разобраться, для начала отбросьте весь код про таймер и прочие минуты и т.п. Сделайте на энкодере что-то элементарное. Как заработает - уже можно переносить на таймер. Вам так будет быстрее и проще разобраться.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Заголовок сообщения: Re: Таймер с энкодером на ATmega8
Добавлено: Пн май 25, 2020 17:15:36
Родился
Зарегистрирован: Вс май 24, 2020 13:27:28 Сообщений: 12
Рейтинг сообщения:0
Разобрался все заработало)).
И такой еще вопрос: если выполнять в корпусе уже готовое устройство этот таймер или что то другое. Что лучше всего использовать в качестве питания? Батарейки или аккумулятор ? Если аккумулятор для него ведь какой нибудь адаптер еще нужен что бы заряжать ? Не саму зарядку имею ввиду, а некий сигнализатор когда зарядка завешена, защита от перезарядки (высокой напруги) Может кто поделиться ссылкой где про это почитать можно ?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Ну с АКБ удобнее конечно. Замерьте потребление тока в вашей схеме - будете понимать сколько от АКБ ваше ус-во проработает. Стоит опять же предусмотреть выключение питания или целиком, или выход МК в сон когда не используется, хотя у вас индикатор потребляет больше. Для зарядки лучше использовать отдельную готовую микруху. Самые народные и частые - копеечные TP4056. На Алиэкспрессе полно разных модулей с ними, в т.ч. со встроенным Step-Up (повышайка) до 5В для атмеги. Хотя если возьмете Atmega8L вместо просто 8 - можно будет питать напрямую от 1 банки Li-Ion, т.к. там диапазон питания более широкий. Там же есть индикатор зарядки уже. На али есть микромодули сразу с парой светодиодов - есть питание/зарядка завершена. Для индикации разряда - подключаете батарею на АЦП атмеги через делитель и измеряете относительно встроенного ИОН (2.56В емнип). Делитель ес-но подбирается т.о. образом, чтобы на макс заряда напряжение после делителя было ниже напряжения ИОН, но близко к нему. Ну и дальше просто измеряете АЦП напряжение на батарее. Либо ловите падение ниже уровня определенного, либо многоуровневую индикацию, как угодно. Там уже смотрите по графику разряда вашего акка.
Заголовок сообщения: Re: Таймер с энкодером на ATmega8
Добавлено: Вт янв 19, 2021 18:11:46
Родился
Зарегистрирован: Вс май 24, 2020 13:27:28 Сообщений: 12
Рейтинг сообщения:0
Доброго времени суток, Уважаемые форумчане! Такой вопрос возникла необходимость немного улучшить вышеописанный код. А именно настроить работу таймера в асинхронном режиме. На 9-ю и 10-ю ножку прицеплен часовой кварц, без конденсаторов. Код согласно даташиту на ATmega 8. Все нормально все включается НО сам таймер не запускается. т.е. при нажатии на кнопку старт ничего не происходит. При прошивке МК фьюзы по умолчанию, т.к. как я понял тактируется только таймер - 2, а не весь МК.
Никак не могу понять в чем я опять "протупил". )))
/*6. Разрешить прерывания, если это необходимо.*/ sei();
}
.......................................................................... ISR (TIMER2_OVF_vect) //Прерывания для второго таймера по переполнению. Чтобы отслеживать 1сек. { start_sec--;
if (start_sec < 0) start_sec = 0;
/*Теперь когда изначальное значение снизилось до 0, включать пищалку*/
/*3. Запишите новые значения в TCNT2, OCR2 и TCCR2.*/
Вот именно запишите, а вы их пытаетесь менять. В ДШ написано, что при переключении режима таймера синх/асинх, эти регистры будут содержать мусор. Поэтому не надо пытаться их менять. Надо целиком перезаписать значения.
Попробуйте так:
Код:
void start_otscheta (void) //Тут будут размещены все настроки 2-го таймер/счетчика {
/*6. Разрешить прерывания, если это необходимо.*/ TIMSK |= (1 << TOIE2); // разрешаем прерывания по переполнению (!) T2 // - зачем у вас тут OCIE2 было? У вас же нет прерывания по совпадению с OCR2.
// Запускаем таймер. Всё остальное тут было лишнее. В TCCR2 надо писать, а не пытаться менять биты, смысла нет, когда мы пишем все биты. Через = записывают только 1, остальные все пишутся в 0. И именно это и нужно сделать TCCR2 = (1 << CS22)|(1 << CS20); // Предделитель на 128(32768/128 = 256 тиков/c)
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения