Например TDA7294

Форум РадиоКот • Просмотр темы - Таймеры/счётчики в AVR
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср окт 29, 2025 13:47:55

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 1387 ]     ... , , , , 70
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт апр 22, 2025 08:43:39 
Друг Кота

Карма: 64
Рейтинг сообщений: 1017
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4360
Откуда: Ижевск
Рейтинг сообщения: 0
Как вариант генерации нот. Меандр на PB2.


Вложения:
GEN_NOTE_TN25.zip [1.59 KiB]
Скачиваний: 55
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт апр 22, 2025 21:33:33 
Родился

Зарегистрирован: Сб апр 12, 2025 23:49:05
Сообщений: 2
Рейтинг сообщения: 0
darkkis89, фрагмент кода в студию

К сожалению, при попытке отделения кода от остальной программы и его выполнении он начинал работать как нужно, в принципе я уже немного его изменил и всё заработало как нужно, спасибо за отклик.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс авг 17, 2025 11:47:03 
Родился

Зарегистрирован: Вс авг 17, 2025 11:32:32
Сообщений: 5
Рейтинг сообщения: 0
Здравствуйте! Прошу совета. Если такое уже спрашивали ткните носом. Имеется следующий код для atmega48. Его задача выдать импульс заданной длительности в ответ на отпускание кнопки. Кнопка опрашивается по переполнению таймера 0. Если фиксируется нажатие на кнопку режим таймера меняется на CTC с другим предделителем. В данном примере я пытаюсь сделать импульс 10мс, но вместо этого получаю 16мкс.
Спойлер
Код:
#include "timer.h"

volatile uint8_t btn0_clk = 0;

ISR(TIMER0_OVF_vect)
{
   PORTB^=(1<<PB7);
   //---------- кнопки, подавление дребезга контактов-----------------
   if (~PINB&(1<<PB0))
   {
      if (btn0_clk<=10) btn0_clk++;
   }
   else
   {
      if (btn0_clk>=10) //////////////
      {
         //PORTB ^= (1<<PB1);
         exposition(0);
         btn0_clk=0;
      }
      else btn0_clk=0;
   }   
   TIFR0=0;
}

ISR(TIMER0_COMPA_vect)
{
   PORTB&=~(1<<PB1); // тушим лампу
   timer0_ini(); // запускаем опрос по переполнению, normal mode
   
}

void timer0_ini(void)
{
   TCCR0B &= ~((1<<CS00) | (1<<CS01) | (1<<CS02));
   TCCR0A &= ~(1<<WGM01); // normal mode
   TIMSK0 &= ~(1<<OCIE0A);
   TCCR0B |= (1<<CS01) | (1<<CS00); // запуск ~ 500Гц
   TIMSK0 |= (1<<TOIE0); // разрешить прерывание по переполнению
   TCNT0 = 0;
   
}

void exposition(uint16_t exp_time) // выдержка в мс
{
   
   TIMSK0 &= ~(1<<TOIE0);
   PORTB |= (1<<PB1); // зажигаем лампу
   TCCR0B &= ~((1<<CS00) | (1<<CS01) | (1<<CS02));
   TCCR0A |= (1<<WGM01); // режим СТС
   GTCCR |= (1<<PSRSYNC);
   OCR0A = 78; // прерывание каждые 10 мс
   TIFR0=0;
   TCNT0 = 0;
   TIMSK0 |= (1<<OCIE0A); // прерывание по совпадению
   TCCR0B |= (1<<CS00) | (1<<CS02); // делитель на 1024
}

Спойлер[img]url=https://img.radiokot.ru/files/161177/medium/3t8lhcz6h6.png][img]https://img.radiokot.ru/files/161177/[/img]

Опытным путем я установил, что такой импульс получится, если подать частоту на таймер вообще без делителя, то есть биты CS00 CS02 устанавливаются с какой-то задержкой. Предделитель я обнуляю, это не помогает. Почему так получается? Можно ли вообще менять настройки таймера на ходу?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс авг 17, 2025 13:46:59 
Говорящий с текстолитом
Аватар пользователя

Карма: 16
Рейтинг сообщений: 233
Зарегистрирован: Пт дек 10, 2021 12:48:46
Сообщений: 1522
Откуда: Тюмень
Рейтинг сообщения: 0
Если фиксируется нажатие на кнопку режим таймера меняется на 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) и выйти из данного прерывания. Далее в прерываниях по переполнению отслеживать нажатия кнопки и когда нажатие вновь будет зафиксировано повторить алгоритм по перенастройке данного таймера на режим СТС как описано выше. Всё. :)


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс авг 17, 2025 14:37:40 
Родился

Зарегистрирован: Вс авг 17, 2025 11:32:32
Сообщений: 5
Рейтинг сообщения: 0
Действительно, дело было в флаге. Теперь работает, спасибо большое за помощь!
Выходит, я не правильно понимал работу флагов. Они устанавливаются при выполнении условия прерывания, даже если это прерывание не разрешено, правильно?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс авг 17, 2025 14:42:55 
Говорящий с текстолитом
Аватар пользователя

Карма: 16
Рейтинг сообщений: 233
Зарегистрирован: Пт дек 10, 2021 12:48:46
Сообщений: 1522
Откуда: Тюмень
Рейтинг сообщения: 0
Они устанавливаются при выполнении условия прерывания, даже если это прерывание не разрешено, правильно?

Да.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс авг 17, 2025 14:53:39 
Родился

Зарегистрирован: Вс авг 17, 2025 11:32:32
Сообщений: 5
Рейтинг сообщения: 0
Теперь понял.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 1387 ]     ... , , , , 70

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: AQ29 и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y