Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

Да, я аппаратный и имел в виду... видимо непонятно написал (в пункте 1)...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: Таймеры/счётчики в AVR

Сообщение neid »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3959518#p3959518"]2й таймер настроен неправильно...
да и не нужен 2й таймер для этой задачи...
______
1) настрой любой (пусть будет Т1) на 1кГц с режимом PWM и с генерацией прерывания
выход PWM (ШИМ) будет управлять зарядкой, а самим этим режимом будет управлять соответствующий ему регистр OCR. Т.е. режимом зарядки теперь можно управлять, изменяя OCR.
2) т.к. прерывание вызывается с частотой 1кГц, то этим можно воспользоваться - в прерывании инкрементировать переменную i (счетчик) и сравнивать её с 2мя константами С1=заполнение, С2=1000.
если i<C1 OCR=x иначе OCR=0; //(включение-отключение импульсов, х-ширина "иголок" заряда)
если i>C2 i=0; //(перезапуск программного счетчика.)[/uquote]
Да я понял вас, аппаратный шим, реализовывал дрыганог/ программный шим думал там меньше нагружу мк.
А почему не правильно таймер2 настроил, просто для себя так сказать докапаться по полной?
Реклама
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

у тебя написано тактирование 250кГц из такой частоты 8 битным таймером 35 Гц не получить... хотя, ты получаешь более высокую частоту и дожимаешь её программным счетчиком... но тогда что мешает взять в качестве опоры прерывания таймера Т1?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

При указанном делителе на 32 можно получить ~35Гц
OCR2=250000/32/35/2-1=110
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

250 кГц - это уже счётчик Т2 (делителей там дальше уже нет...)250000/35=7142, 8 битный таймер до стольки считать не умеет...
а частота всего МК = 8 МГц, вот таймер и тикает на 8М/32=250к
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: Таймеры/счётчики в AVR

Сообщение neid »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3959576#p3959576"]у тебя написано тактирование 250кГц из такой частоты 8 битным таймером 35 Гц не получить... хотя, ты получаешь более высокую частоту и дожимаешь её программным счетчиком... но тогда что мешает взять в качестве опоры прерывания таймера Т1?[/uquote]
не понимаю вообще 16 битный таймер, и как "дожимать" тем более... как вычислить OCR1A хотя бы 1kHz.
1 kHz опытным путем добился на выходе мк...
мои рассуждения такие:
8000000Hz/(2^16=65536)/9)=1098Hz, где 9 это TCCR1B=0x09; или из теории сухой о 16 битных таймера "даный регист TCCR отвечает за установку делителя, чтобы таймер не так быстро считал, также он отвечает (вернее его определённые биты) за установку определённого режима", TCCR1A и TCCR1B правильно ли я указал?
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Ivanoff-ivПонятно. Делителей ещё до...
OCR2=8000000/1024/35/2-1~110
neid
OCR1A=8000000/1000/2-1
TCCR1B=0x09 ;режим CTC F/1
Последний раз редактировалось akl Чт янв 14, 2021 14:12:32, всего редактировалось 1 раз.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

neid, для расчетов не шибко важно, какой разрядности таймер. Просто у него расширяется диапазон. Есть частота тика таймера, которая в общем случае для старых мег = частоте меги / предделитель. Это 1 тик таймера. А максимум тиков до переполнения равно 2 в степени разрядности. Но максимум (TOP) может ограничиваться и меньшим значением, главное что не большим. И иметь промежуточные значения (OCR), по достижению которых что-то происходит (прерывание или изменения состояния пина).

Добавлено after 26 minutes 10 seconds:
Lilia, см главу 10.3.2 - 10.3.3 ДШ. По умолчанию CLK_PER делится на 6 от MAIN_CLK. Т.е. при основной частоте 20 МГц, периферия будет работать на 3.3 МГц, поэтому и неподходит. Кстати с CMP = 0x14, частота должна выходить в этом случае 4 кГц, а не 5. А так-то расчет верен. Просто выставьте предделитель CLK_PER в 1 в регистрах CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLB.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

я вот понял, попробую "перевести"...
есть исходная частота (8 МГц), есть делители на входе таймера, они как редуктор тормозят входную тактовую частоту в сколько-то (настраивается) раз, т.е таймер может тикать как на частоте 8 МГц, так и в какоето целое число раз (набор доступных делителей смотри в ДШ). каждый тик таймера увеличивает его счетчик на 1, но таймер не может считать вечно, когдато он переполнится (так-же как переворачиваются 999999 в 000000 на спидометре автомобиля...) то, как долго таймер может не переполняться как-раз и определяется его разрядностью (так-же как и в спидометре количеством счетных колёс)...
_____________
теперь о применении на практике:
тебе надо добиться, используя доступные значения делителя, чтобы счетчик тикал с частотой в целое число раз больше требуемой, но чтобы это число вместилось в разрядность таймера (для 8 битных это 256, для 16 битных - 65536 (2^16) )
тебе надо 1кГц это в 8000 раз меньше 8 МГц (число целое, и не больше 65536 - значит его можно использовать для Т1) (делитель при этом =1)
также для Т1 пойдут делители на 8 и на 64, а вот для 8 битных таймеров пойдет только делитель на 64 т.к. только (8000/64)<256 и ещё целое (при следующем доступном делителе 256 уже получается 31,25 кГц)
допустим мы оставили делитель 1, значит чтобы прошла 1мс таймер должен сосчитать от 0 до 7999, 7999 = 1F3F (HEX)
осталось сделать так, чтобы счетчик считал до этого числа и перезапускался
для этого есть режим СТС, но он нам не подходит, т.к. нам ещё нужен ШИМ сигнал на выходе, ещё есть режимы PWM - выберем "fastPWM top OCR1A" и запишем наше число в OCR1A, теперь таймер работает с частотой 1 кГц и дает выход....
нет, выход он пока не даёт, его ещё подключить надо... компаратор "А" уже занят, подключим к "В": OutB - Inverted PWM
можно выбрать и неинвертируемый, но он не умеет полностью закрываться - маленькие иголочки при сбросе таймера будут просачиваться... поэтому берём инвертируемый, но в коде это учтём.
также надо включить прерывание по совпадению А, чтобы при каждом обороте таймера ЦП контроллера об этом узнавал.
Вот, собственно и вся настройка таймера...

Добавлено after 7 minutes 29 seconds:
neid, ещё я очень рекомендую скачать программу Algorithm Builder (v5.44)в ней зоздать и настроить проект: Файл->новый..... проект->проект оптионс (тут выбрать свой МК и задать его тактовую)
потом кликнуть на красную "S" выбрать таймер/счетчик1 и поковыряться с его параметрами, и, думаю сразу станет понятней его работа...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Lilia
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Re: Таймеры/счётчики в AVR

Сообщение Lilia »

[uquote="NStorm",url="/forum/viewtopic.php?p=3959644#p3959644"]Добавлено after 26 minutes 10 seconds:
Lilia, см главу 10.3.2 - 10.3.3 ДШ. По умолчанию CLK_PER делится на 6 от MAIN_CLK. Т.е. при основной частоте 20 МГц, периферия будет работать на 3.3 МГц, поэтому и неподходит. Кстати с CMP = 0x14, частота должна выходить в этом случае 4 кГц, а не 5. А так-то расчет верен. Просто выставьте предделитель CLK_PER в 1 в регистрах CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLB.[/uquote]

Спасибо огромное! Да, именно в этом было дело :))

Может насчет прерываний тоже сможете помочь?
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Re: Таймеры/счётчики в AVR

Сообщение parovoZZ »

[uquote="Lilia",url="/forum/viewtopic.php?p=3959513#p3959513"]Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. .[/uquote]

В этом режиме он, видимо, и не будет срабатывать, т.к. в FRQ режиме значение TOP определяется регистром CMP0 (таблица 20-7 даташита).
Lilia
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Re: Таймеры/счётчики в AVR

Сообщение Lilia »

[uquote="parovoZZ",url="/forum/viewtopic.php?p=3959740#p3959740"][uquote="Lilia",url="/forum/viewtopic.php?p=3959513#p3959513"]Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. .[/uquote]

В этом режиме он, видимо, и не будет срабатывать, т.к. в FRQ режиме значение TOP определяется регистром CMP0 (таблица 20-7 даташита).[/uquote]

Не поняла. Я и хочу, чтобы СМР0 было TOP. И хочу чтобы по достижению TOP было прерывание, чтобы подсчитывать время для выходного сигнала. Или это можно только через события организовать?
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

Lilia, т.к. достижение TOP и есть переполнение таймера, срабатывает соб-но оно. Если бы срабатывали оба, в этом случае CMP0_vect срабатывало бы в то же время абсолютно.
Lilia
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Re: Таймеры/счётчики в AVR

Сообщение Lilia »

[uquote="NStorm",url="/forum/viewtopic.php?p=3959782#p3959782"]Lilia, т.к. достижение TOP и есть переполнение таймера, срабатывает соб-но оно. Если бы срабатывали оба, в этом случае CMP0_vect срабатывало бы в то же время абсолютно.[/uquote]
Я всегда думала, что переполение - это достижение максимального значения по разрядности. Для таймера 16бит - это 65 635.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

Lilia, переполнение - это достижение TOP значения. В некоторых режимах оно равно максимальной разрядности таймера, но во многих других может снижаться. В общем-то тоже самое я писал чуть выше другому человеку для старых вариантов AVR: https://radiokot.ru/forum/viewtopic.php ... 4#p3959644
Смысл не изменился. В данном режиме согласно ДШ TOP = CMP0. Таймер считает от 0 до TOP (CMP0) и начинает с нуля. Это и есть момент переполнения. Иначе оно бы никогда у вас не достигалось. Если вам нужно шагать до 65535 (максимальное значение разрядности таймера называется MAX, эти определения есть в разделе 20.3.1 ДШ), то вам нужен другой режим таймера.

Добавлено after 5 minutes 25 seconds:
Описание прерываний:

0x00 OVF Overflow and compare match interrupt
The counter has reached its top value and wrapped to zero.
Lilia
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Re: Таймеры/счётчики в AVR

Сообщение Lilia »

[uquote="NStorm",url="/forum/viewtopic.php?p=3959796#p3959796"]Lilia, переполнение - это достижение TOP значения. В некоторых режимах оно равно максимальной разрядности таймера, но во многих других может снижаться. В общем-то тоже самое я писал чуть выше другому человеку для старых вариантов AVR: https://radiokot.ru/forum/viewtopic.php ... 4#p3959644
Смысл не изменился. В данном режиме согласно ДШ TOP = CMP0. Таймер считает от 0 до TOP (CMP0) и начинает с нуля. Это и есть момент переполнения. Иначе оно бы никогда у вас не достигалось. Если вам нужно шагать до 65535 (максимальное значение разрядности таймера называется MAX, эти определения есть в разделе 20.3.1 ДШ), то вам нужен другой режим таймера.

Добавлено after 5 minutes 25 seconds:
Описание прерываний:

0x00 OVF Overflow and compare match interrupt
The counter has reached its top value and wrapped to zero.[/uquote]

Да, вижу.
Если б это было так, все было бы прекрасно и все работало уже как надо. Но частота прерываний OVF выше (период ~0,05мс) и не зависит от значения CMP0 к сожалению.
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Re: Таймеры/счётчики в AVR

Сообщение parovoZZ »

[uquote="Lilia",url="/forum/viewtopic.php?p=3959758#p3959758"][uquote="parovoZZ",url="/forum/viewtopic.php?p=3959740#p3959740"][uquote="Lilia",url="/forum/viewtopic.php?p=3959513#p3959513"]Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. .[/uquote]

В этом режиме он, видимо, и не будет срабатывать, т.к. в FRQ режиме значение TOP определяется регистром CMP0 (таблица 20-7 даташита).[/uquote]

Не поняла. Я и хочу, чтобы СМР0 было TOP. И хочу чтобы по достижению TOP было прерывание, чтобы подсчитывать время для выходного сигнала. Или это можно только через события организовать?[/uquote]
Здесь надо понимать, как таймер взводит флаги на значения счётчика таймера. А флаги взводятся не в момент совпадения / переполнения / обнуления, а только в следующем такте таймера.

Добавлено after 4 minutes 4 seconds:
[uquote="Lilia",url="/forum/viewtopic.php?p=3959808#p3959808"]Да, вижу.
Если б это было так, все было бы прекрасно и все работало уже как надо. Но частота прерываний OVF выше (период ~0,05мс) и не зависит от значения CMP0 к сожалению.[/uquote]
Потому, что флаги в прерывании автоматически не сбрасываются. Их надо сбрасывать программно. Поэтому как только МК покидает обработчик прерывания, он выполняет одну инструкцию основного кода и опять уходит в прерывание.

Добавлено after 9 minutes 52 seconds:
[uquote="Lilia",url="/forum/viewtopic.php?p=3959790#p3959790"]Я всегда думала[/uquote]
Надо не думать и даже не предполагать, а внимательно читать даташит.
И это простой синхронный таймер А. А асинхронный таймер D вообще способен вынести мозг.

0-ая и 1-ая серия AVR очень заковыристая.
Lilia
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Re: Таймеры/счётчики в AVR

Сообщение Lilia »

Все работает, действительно OVF, квитирование помогло. Даташит хитрый, не сразу поймешь, что они имеют ввиду.

Спасибо огромное!
Аватара пользователя
sergs777
Встал на лапы
Сообщения: 132
Зарегистрирован: Пн фев 06, 2017 15:20:04

Re: Таймеры/счётчики в AVR

Сообщение sergs777 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3959689#p3959689"]я вот понял, попробую "перевести"...
есть исходная частота (8 МГц), есть делители на входе таймера, они как редуктор тормозят входную тактовую частоту в сколько-то (настраивается) раз, т.е таймер может тикать как на частоте 8 МГц, так и в какоето целое число раз (набор доступных делителей смотри в ДШ). каждый тик таймера увеличивает его счетчик на 1, но таймер не может считать вечно, когдато он переполнится (так-же как переворачиваются 999999 в 000000 на спидометре автомобиля...) то, как долго таймер может не переполняться как-раз и определяется его разрядностью (так-же как и в спидометре количеством счетных колёс)...
_____________
теперь о применении на практике:
тебе надо добиться, используя доступные значения делителя, чтобы счетчик тикал с частотой в целое число раз больше требуемой, но чтобы это число вместилось в разрядность таймера (для 8 битных это 256, для 16 битных - 65536 (2^16) )
тебе надо 1кГц это в 8000 раз меньше 8 МГц (число целое, и не больше 65536 - значит его можно использовать для Т1) (делитель при этом =1)
также для Т1 пойдут делители на 8 и на 64, а вот для 8 битных таймеров пойдет только делитель на 64 т.к. только (8000/64)<256 и ещё целое (при следующем доступном делителе 256 уже получается 31,25 кГц)
допустим мы оставили делитель 1, значит чтобы прошла 1мс таймер должен сосчитать от 0 до 7999, 7999 = 1F3F (HEX)
осталось сделать так, чтобы счетчик считал до этого числа и перезапускался
для этого есть режим СТС, но он нам не подходит, т.к. нам ещё нужен ШИМ сигнал на выходе, ещё есть режимы PWM - выберем "fastPWM top OCR1A" и запишем наше число в OCR1A, теперь таймер работает с частотой 1 кГц и дает выход....
нет, выход он пока не даёт, его ещё подключить надо... компаратор "А" уже занят, подключим к "В": OutB - Inverted PWM
можно выбрать и неинвертируемый, но он не умеет полностью закрываться - маленькие иголочки при сбросе таймера будут просачиваться... поэтому берём инвертируемый, но в коде это учтём.
также надо включить прерывание по совпадению А, чтобы при каждом обороте таймера ЦП контроллера об этом узнавал.
Вот, собственно и вся настройка таймера...

Добавлено after 7 minutes 29 seconds:
neid, ещё я очень рекомендую скачать программу Algorithm Builder (v5.44)в ней зоздать и настроить проект: Файл->новый..... проект->проект оптионс (тут выбрать свой МК и задать его тактовую)
потом кликнуть на красную "S" выбрать таймер/счетчик1 и поковыряться с его параметрами, и, думаю сразу станет понятней его работа...[/uquote]
codevision тоже симулирует. но в протеусе получаются совсем другие периоды. неделю копаюсь.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

sergs777, вангую, что в протеусе, в свойствах компонента МК просто не поменяли частоту на нужную.
Ответить

Вернуться в «AVR»