К сожалению, при попытке отделения кода от остальной программы и его выполнении он начинал работать как нужно, в принципе я уже немного его изменил и всё заработало как нужно, спасибо за отклик.
Здравствуйте! Прошу совета. Если такое уже спрашивали ткните носом. Имеется следующий код для atmega48. Его задача выдать импульс заданной длительности в ответ на отпускание кнопки. Кнопка опрашивается по переполнению таймера 0. Если фиксируется нажатие на кнопку режим таймера меняется на CTC с другим предделителем. В данном примере я пытаюсь сделать импульс 10мс, но вместо этого получаю 16мкс. Спойлер
Спойлер[img]url=https://img.radiokot.ru/files/161177/medium/3t8lhcz6h6.png][img]https://img.radiokot.ru/files/161177/[/img] Опытным путем я установил, что такой импульс получится, если подать частоту на таймер вообще без делителя, то есть биты CS00 CS02 устанавливаются с какой-то задержкой. Предделитель я обнуляю, это не помогает. Почему так получается? Можно ли вообще менять настройки таймера на ходу?
Если фиксируется нажатие на кнопку режим таймера меняется на CTC с другим предделителем. В данном примере я пытаюсь сделать импульс 10мс, но вместо этого получаю 16мкс.
Ваш код не смотрел, так как ничего в нём не понимаю, но предполагаю, что вы перед переходе на режим СТС не сбросили флаг прерывания (OCF0A) с регистром сравнения (OCRA). Потому когда разрешаете глобальные прерывания, прерывание по сравнению осуществляется, так как флаг прерывания по сравнению (OCF0A) уже давно был установлен, а сбрасывается он только, или автоматически при возникновении прерывания, или записью в него 1.
Как я вижу алгоритм данной задачи: вам необходимо в прерывании по переполнению регистра TCNT0 (после фиксации нажатой кнопки), сбросить флаг прерывания сравнения (OCF0A), затем перенастроить таймер в режим СТС, установить нужное значение регистра OCRA, разрешить прерывание (Timer 0 / Compare Match A), установить 1 на нужном выводе. Далее в прерывании (по Timer 0 Compare Match A), снять установленную 1 с вывода, далее перевести таймер в режим Normal, перенастроить прерывания по переполнению (Timer 0 / Overflow) и выйти из данного прерывания. Далее в прерываниях по переполнению отслеживать нажатия кнопки и когда нажатие вновь будет зафиксировано повторить алгоритм по перенастройке данного таймера на режим СТС как описано выше. Всё.
Действительно, дело было в флаге. Теперь работает, спасибо большое за помощь! Выходит, я не правильно понимал работу флагов. Они устанавливаются при выполнении условия прерывания, даже если это прерывание не разрешено, правильно?
Приветствую всех. Есть рабочая плата на Atmega88 программно настроено управление выводом OC1A, непрерывно выводится в режиме CTC меанд на OC1A(PB1). Понадобилось изменить пин вывода на OC1B(PB2). Внёс изменения в программу настойки регистра сравнения таймера OCR1B, выставил TCCR1A Bit 5:4 – COM1B1:0: Toggle OC1B on compare match. Выход OC1B не меняется. Вопрос возможно ли так , или всё таки мне придётся на плате пере коммутировать выводы , чего бы не хотелось.
Спасибо "akl". пример заработал. У меня почему то влияет изменения OCR1A, и на OCR1B. А значение в OCR1B меньше чем в OCR1A не влияет на частоту выхода OC1B. Большее значение OCR1B чем в OCR1A - меандр на OC1B останавливает - это понятно. Но почему то меньшее значение на частоту не влияет?
ldi temp,0b0101.0000 ; Bit 7:6 – COM1A1:0: Compare output mode for channel A sts TCCR1A,temp ; Bit 5:4 – COM1B1:0: Compare output mode for channel B ; ldi temp,0b0000.1001 ; sts TCCR1B,temp ; ldi temp,0
Добавлено after 25 minutes 19 seconds: То что мне нужно было с заменой выводов OC1А на OC1B без вмешательство в плату Работает!. Ещо раз спасибо "akl". У меня не работало из за того что значение в OCR1B было больше чем OCR1А.
А значение в OCR1B меньше чем в OCR1A не влияет на частоту выхода OC1B.
потому, что режим СТС работает только по регистру OCR1A. поэтому любое значение в OCR1B никак не может влиять на частоту выхода OC1B. даже если будет изменяться скважность на выходе OC1B частота задается регистром OCR1A.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Это я выяснил в процессе эксперимента. Замысел был перенаправить событие на другой пин OC1А на OC1B без вмешательство в плату. Всё удачно получилось. Работает. Всем Спасибо.
Приветствую. Чтобы не перепощивать, дам ссылку на топик. Кто-то может прояснить эту ситукцию? Вкратце, в режиме 15 как-то особенно работают таймеры (в топике - 14, но по итогу именно 15 режим ведет себя отлично от остальных). Стенд был простой - установка режима, задается необходимое количество пульсов в tx_counts, старт таймера, в прерывании TIMERx_COMPB_vect (одинаковое для всех режимов):
Код:
if(!--tx_counts) { stop_tx(); }
Количество пульсов отрабатывается корректно во всех режимах. Спасибо.
dfxman, а зачем тебе нужна работа таймера в режиме ШИМ для работы со счетчиком tx_counts? если тебе нужно просто прерывание таймера, то достаточно режима СТС.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Starichok51, скажем так, нужно генерировать сигналы, с определенными характеристиками, в том числе количеством импульсов, стартовать синхронно, выдавать максимально точную последовательность (в плане джиттера).
Занятно, вроде два профильных форума, а по делу никто ничего сказать не может. Конкретный вопрос, и даже с картинками, а ответы про все на свете, кроме, собственно, заданного вопроса. Жаль.
картинок я тут не увидел. и, собственно, на мой заданный вопрос я ответ не получил. одни только обиды на оба форума. чтобы сказать по делу, нужно иметь ПОЛНУЮ информацию, а информации о проекте представлено абсолютный ноль.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Да какие обиды, что Вы. Просто констатация. Я не спрашивал, как мне что-то сделать, поэтому никакого смысла рассказывть про проект нет, это просто увод в сторону от темы. Картинки на другом форуме, сразу про это написал. Вопрос конкретный, про поведение определенного режима работы таймера. Не более. Полагал, что есть более опытные люди, которые с этим сталкивались, может, я чего не дочитал в даташитах или апнотах. Ан нет. Ладно, считаю вопрос закрытым, дальнейшую дискуссию бессмысленной.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения