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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

Вот теперь понятно! Спасибо огромное!!! Мне к примеру раз включать пин. Если я делаю переполнение беру переменную int i, инкриминирую i++, до условия i==100 PORTB.1 == 1; (100*0,013 = 1,3c) Верно? И например включаю пин.
Последний раз редактировалось Jman Чт апр 07, 2016 14:57:31, всего редактировалось 1 раз.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Да.
Станислав
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

А в каких случаях используется вектор по переполнению, и вектор по сравнению? И вопрос... Если в Тине 13 стоит CKDIV8 мне брать частоту 600КГц для расчета? Или лучше убрать этот фуз? Это аппаратный предделитель?
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Jman писал(а):в каких случаях используется вектор по переполнению, и вектор по сравнению

Зависит от ваших задач... А также, может вы будете организовывать, например, аппаратный ШИМ. Там и используется. :roll:
Если мне удобно использовать переполнение, то его и сделаю. Тоже самое и с другими режимами работы таймера.
Jman писал(а):Тине 13 стоит CKDIV8 мне брать частоту 600КГц

Да, при условии что частота настроена на 4,8 МГц.
Я обычно его убираю, т.к. чем выше частота, тем быстрее МК выполняет другие команды, а значит и больше их может выполнить за тот же промежуток времени.

Аппаратный предделитель... Да, аппаратный. Настраивается программно.
Суть их отличия лишь в том, что программный делитель вы пишите сами, своими руками. Например, ваше число 100 в прерывании в переменной = это и есть ваш программный делитель на 100. А все другие вы сконфигурировали с помощью битов в регистрах.
Станислав
Аватара пользователя
baron_P
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

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

Сообщение baron_P »

Доброго дня.
Случился затуп на ровном месте в с работой режима FastPWM в таймере 1 контроллера Atmega16.
Настраиваю вот так:

Код: Выделить всё

//Процедура инициализации Т/С1 (формирование ШИМ-выхода)
void init_TC1(void)
{
    //На выводе OC1A "0" при совпадении  Т/С1 с OCRA1, "1"
    //при переполнении Т/С1, режим 8-битного FastPWM
    TCCR1A |= (1 << COM1A1) | (1 << WGM10);
    //Предделитель 8
    TCCR1B |= (1 << CS11) | (1 << WGM12);
    //PD5 - выход ШИМ
    DDRD |= (1 << PD5);   
    //Начальное задание ШИМ
    OCR1AL = 0;
}

В принципе работает, но дает на выходе (PD5) значение ШИМ на 1 больше заданного. Т.е. при нуле, на этом выводе не ноль, а импульс минимальной длительности, как будто я написал OCR1AL = 1. В программе этот регистр вообще не задействован сейчас, т.е менять начальное значение нечему.
Суть работы FastPWM в моем примере: В регистре TCNT1 значения меняются от 0 до 255 с частотой F_CPU / 8. Когда значение TCNT1 совпадает с OCR1A, на вывод PD5 дается "0", а когда TCNT1 обнуляется - дается "1". Получается, эта "1" в любом случае появится на выходе?
Если убрать (1 << WGM12), т.е. перевести Т/С1 в режим Phase Correct PWM, то отсчет начинается с нуля, как и должен бы по идее.
Главный вопрос: как в режиме FastPWM дать нулевое значение ШИМ на выход?
We do what we must because we can (c) GLaDOS
Аватара пользователя
baron_P
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

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

Сообщение baron_P »

Ковырялся так и сяк - не смог убрать этот ненулевой ноль при FastPWM. Попробовал тот же режим в ATTiny13A - та же петрушка. Видимо, чего-то фундаментально не понимаю.
We do what we must because we can (c) GLaDOS
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

baron_P писал(а):Ковырялся так и сяк - не смог убрать этот ненулевой ноль при FastPWM. Попробовал тот же режим в ATTiny13A - та же петрушка. Видимо, чего-то фундаментально не понимаю.

Это нормально читаем даташит
в режиме FAST PWM при OCR=0 на выходе короткий импульс
как пример второй таймер меги16

If the OCR2 is set equal to BOTTOM, the
output will be a narrow spike for each MAX+1 timer clock cycle.
при нижнем значении (0) короткий импульс (сам пару месяцев назад узнал)

можно настроить инверсный PWM
тогда ноль будет чистым 0 (при OCR=255)
но будет короткий импульс нуля при максимальном значении (при OCR=0)

Setting the OCR2 equal
to MAX will result in a constantly high or low output (depending on the polarity of the out-
put set by the COM21:0 bits.)
ух ты.... показывает
Аватара пользователя
baron_P
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

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

Сообщение baron_P »

Спасибо, проморгал этот нюанс в даташите. Получается, PhaseCorrect PWM - наше все.
We do what we must because we can (c) GLaDOS
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

А мне не нравится в том частота шим ("несущая") в 2раза меньше значит фильтр надо ставить с меньшей частотой среза а значит и время реакции
цепи ООС больше .
короткий импульс 1/256 это после фильтра в FAST PWM всего то превышение 0.4 % над нулем
как для меня fast PWM лучше
ух ты.... показывает
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

Вопрос выводится апаратный шим на определенный вывод контрллера
напрмер PCINT6/OC1A/SDA/MOSI/DI/ADC6) PA6
хочу синхронизировать цикл программы к спаду выхода
конструкция вида
h=PINA.6
будет возвращать адекватное значение ?
вроде возвращает
ух ты.... показывает
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

12val12, конструкция вида "h=PINA.6" будет возвращать адекватное значение. Но с задержкой на несколько тактов.

PS: Не мешало бы использовать запятые и точки по назначению. Это форум, а не смс переписка.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

Коты, подскажите пожалуйста, почему у меня на выход PB1 тишина?
Atmega88.
Таймер Т1.
Обычный режим.
Инверсия OC1A при совпадении с 60000, считаем от 50000 до 65535.

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>

#define TCNT1BEGIN      50000
#define OCR1ABEGIN      60000

ISR(TIMER0_OVF_vect)
{
   TCNT1   =   TCNT1BEGIN;   
}

int main(void)
{
   DDRB   |=   _BV(1);            // Бит 1 порта B - выход OC1A
   TCCR1B   =   0;               // Таймер Т1 остановлен.
   TCCR1A   =   0;
   TCNT1   =   TCNT1BEGIN;
   OCR1A   =   OCR1ABEGIN;
   TCCR1A   =   _BV(COM1A0);      // изменение состояния вывода OC1A на противоположное при совпадении с OCR1A
   TIMSK1   |=   _BV(TOIE1);         // Разрешаем прерывание по переполнению
   TCCR1B   |=   _BV(CS10);         // Тактируемся от CLK   
   
   sei();

    while (1)
    {
    }
}


Всё-таки на выходе меандр пошел со скважностью 50%.
Никакая контра не уйдёт от нас
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

В этих же регистрах еще есть биты WGM, прочитайте про них в даташит. Тут еще режимы обсуждали, да их везде обсуждали.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

Обычный режим -все биты WGM равны 0
Никакая контра не уйдёт от нас
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

prinv писал(а):Всё-таки на выходе меандр пошел со скважностью 50%.
Не заметил сразу. Вы задачу решили свою?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

В том-то и дело что нет. Нужен сигнал регулируемой частоты и скважности на 15й ноге.
Последний раз редактировалось prinv Сб апр 30, 2016 08:59:06, всего редактировалось 1 раз.
Никакая контра не уйдёт от нас
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

А почему настраиваете Timer1, а прерывание ловите от Timer0?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

prinv писал(а):Нужен сигнал регулируемой частоты и скважности на 15й ноге.
Т.е. ШИМ с разной частотой. Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.

Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

COKPOWEHEU писал(а):А почему настраиваете Timer1, а прерывание ловите от Timer0?

Спасибо!
Теперь частота стала регулироваться, а вот скважность так и осталась 50%.
Никакая контра не уйдёт от нас
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

Z_h_e писал(а):Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.

Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.

Большое спасибо! С вашим настройками всё заработало!
Никакая контра не уйдёт от нас
Ответить

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