Таймеры/счётчики в AVR
- Jman
- Мучитель микросхем
- Сообщения: 414
- Зарегистрирован: Ср янв 26, 2011 13:43:30
- Откуда: С того берега моря
- Контактная информация:
Re: Таймеры/счётчики в AVR
Вот теперь понятно! Спасибо огромное!!! Мне к примеру раз включать пин. Если я делаю переполнение беру переменную 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]
- Jman
- Мучитель микросхем
- Сообщения: 414
- Зарегистрирован: Ср янв 26, 2011 13:43:30
- Откуда: С того берега моря
- Контактная информация:
Re: Таймеры/счётчики в AVR
А в каких случаях используется вектор по переполнению, и вектор по сравнению? И вопрос... Если в Тине 13 стоит CKDIV8 мне брать частоту 600КГц для расчета? Или лучше убрать этот фуз? Это аппаратный предделитель?
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Таймеры/счётчики в AVR
Jman писал(а):в каких случаях используется вектор по переполнению, и вектор по сравнению
Зависит от ваших задач... А также, может вы будете организовывать, например, аппаратный ШИМ. Там и используется.
Если мне удобно использовать переполнение, то его и сделаю. Тоже самое и с другими режимами работы таймера.
Jman писал(а):Тине 13 стоит CKDIV8 мне брать частоту 600КГц
Да, при условии что частота настроена на 4,8 МГц.
Я обычно его убираю, т.к. чем выше частота, тем быстрее МК выполняет другие команды, а значит и больше их может выполнить за тот же промежуток времени.
Аппаратный предделитель... Да, аппаратный. Настраивается программно.
Суть их отличия лишь в том, что программный делитель вы пишите сами, своими руками. Например, ваше число 100 в прерывании в переменной = это и есть ваш программный делитель на 100. А все другие вы сконфигурировали с помощью битов в регистрах.
Станислав
- baron_P
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт сен 14, 2010 23:07:10
- Откуда: Ростов
Re: Таймеры/счётчики в AVR
Доброго дня.
Случился затуп на ровном месте в с работой режима FastPWM в таймере 1 контроллера Atmega16.
Настраиваю вот так:
В принципе работает, но дает на выходе (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 дать нулевое значение ШИМ на выход?
Случился затуп на ровном месте в с работой режима 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
Ковырялся так и сяк - не смог убрать этот ненулевой ноль при FastPWM. Попробовал тот же режим в ATTiny13A - та же петрушка. Видимо, чего-то фундаментально не понимаю.
We do what we must because we can (c) GLaDOS
Re: Таймеры/счётчики в AVR
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
Спасибо, проморгал этот нюанс в даташите. Получается, PhaseCorrect PWM - наше все.
We do what we must because we can (c) GLaDOS
Re: Таймеры/счётчики в AVR
А мне не нравится в том частота шим ("несущая") в 2раза меньше значит фильтр надо ставить с меньшей частотой среза а значит и время реакции
цепи ООС больше .
короткий импульс 1/256 это после фильтра в FAST PWM всего то превышение 0.4 % над нулем
как для меня fast PWM лучше
цепи ООС больше .
короткий импульс 1/256 это после фильтра в FAST PWM всего то превышение 0.4 % над нулем
как для меня fast PWM лучше
ух ты.... показывает
Re: Таймеры/счётчики в AVR
Вопрос выводится апаратный шим на определенный вывод контрллера
напрмер PCINT6/OC1A/SDA/MOSI/DI/ADC6) PA6
хочу синхронизировать цикл программы к спаду выхода
конструкция вида
h=PINA.6
будет возвращать адекватное значение ?
вроде возвращает
напрмер PCINT6/OC1A/SDA/MOSI/DI/ADC6) PA6
хочу синхронизировать цикл программы к спаду выхода
конструкция вида
h=PINA.6
будет возвращать адекватное значение ?
вроде возвращает
ух ты.... показывает
Re: Таймеры/счётчики в AVR
12val12, конструкция вида "h=PINA.6" будет возвращать адекватное значение. Но с задержкой на несколько тактов.
PS: Не мешало бы использовать запятые и точки по назначению. Это форум, а не смс переписка.
PS: Не мешало бы использовать запятые и точки по назначению. Это форум, а не смс переписка.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: Таймеры/счётчики в AVR
Коты, подскажите пожалуйста, почему у меня на выход PB1 тишина?
Atmega88.
Таймер Т1.
Обычный режим.
Инверсия OC1A при совпадении с 60000, считаем от 50000 до 65535.
Всё-таки на выходе меандр пошел со скважностью 50%.
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
В этих же регистрах еще есть биты WGM, прочитайте про них в даташит. Тут еще режимы обсуждали, да их везде обсуждали.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Таймеры/счётчики в AVR
Не заметил сразу. Вы задачу решили свою?prinv писал(а):Всё-таки на выходе меандр пошел со скважностью 50%.
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: Таймеры/счётчики в AVR
В том-то и дело что нет. Нужен сигнал регулируемой частоты и скважности на 15й ноге.
Последний раз редактировалось prinv Сб апр 30, 2016 08:59:06, всего редактировалось 1 раз.
Никакая контра не уйдёт от нас
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Таймеры/счётчики в AVR
А почему настраиваете Timer1, а прерывание ловите от Timer0?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Таймеры/счётчики в AVR
Т.е. ШИМ с разной частотой. Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.prinv писал(а):Нужен сигнал регулируемой частоты и скважности на 15й ноге.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.
Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: Таймеры/счётчики в AVR
COKPOWEHEU писал(а):А почему настраиваете Timer1, а прерывание ловите от Timer0?
Спасибо!
Теперь частота стала регулироваться, а вот скважность так и осталась 50%.
Никакая контра не уйдёт от нас
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: Таймеры/счётчики в AVR
Z_h_e писал(а):Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.
Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.
Большое спасибо! С вашим настройками всё заработало!
Никакая контра не уйдёт от нас
