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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

А вот я и не врубаюсь, используется или нет? Похоже, что это спрятано внутрях ардуины. В коде есть только установка частоты ШИМ - 31250 Гц, путём установки делителя равного 1:

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

void set_motor_pwm_frequency(int frequency) {
  switch (frequency) {
    case PWM_31250_HZ:
      // Divide by 1. frequency = 31.25 kHz;
      bitClear(TCCR1B, CS11);
      bitSet(TCCR1B, CS10);
      break;
И analogWrite принимает аргумент от 0 до 255. Получается, что счетчик считает только до 255? Т.е. тактовая 8Мгц (хотя мне казалось, что кварц 16 МГц), делим на 256 - получаем частоту ШИМ 31250. Или всё же 16Мгц, а TOP установлен как 1FF, а analogWrite записывает со сдвигом? Т.е. замерить интервал невозможно, так как счетчик уже 10 раз переполнится между импульсами? А менять частоту ШИМ двигателей я не могу - мне нужно снять характеристики именно в таком режиме.
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

В вашем случае измерение периода не должно быть очень точной функцией. (Однако это напр. не частотомер с разрешением 1 Hz на напр. 50 MHz).
Почему бы не использовать готовые функции Arduino? Напр. pin change interruption ISR и micros()? Изменение вверх: начало измерения время, изменение вниз: остановка, разница: время.
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

uldemir писал(а):Т.е. замерить интервал невозможно, так как счетчик уже 10 раз переполнится между импульсами? А менять частоту ШИМ двигателей я не могу - мне нужно снять характеристики именно в таком режиме.
У меня есть тахометр на tiny2313, у которого таймер 1 имеет такой же функционал как и у mega328.
СпойлерИзображение
Программа считает длительность входного сигнала с периодом p_pwm=8192 такта для работы ШД. Не вижу никаких противопоказаний для задания p_pwm=256 тактов и 2-х байтном накопительном счетчике.
kote52
Встал на лапы
Сообщения: 120
Зарегистрирован: Пт мар 19, 2021 08:58:45

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

Сообщение kote52 »

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

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

// Массив режимов работы светодиода
uint16_t modes[] = {
	0B0000000000000000, //Светодиод выключен (
	0B1111111111111111, //Горит постоянно 
	0B0000111100001111, //Мигание по 0.5 сек 
	0B0000000100000001, //Короткая вспышка раз в секунду 
	0B0000000000001001, //Две короткие вспышки раз в 2 секунды 
	0B0000000001001001, //Три короткие вспышки раз в 2 секунды
	0B0101010101010101 //Частые вспышки
};

int main(void){

     while(1){

		// Событие срабатывающее каждые 125 мс СТАТУС СВЕТОДИОД
		if( ( msec_cnt - ms_led_st ) > 125 || msec_cnt < ms_led_st ) {
			ms_led_st = msec_cnt;
			// Режим светодиода ищем по битовой маске
			if(blink_mode & 1<<(blink_loop&0x0F)) {
				PORTC |=(1<<LED_STATUS);  //ON светодиод;
			}else{
				PORTC &=~(1<<LED_STATUS); //OFF светодиод
			}
			blink_loop++;
		}
      }
}
Вопрос можно ли такое засунуть в прерывания настроенные на 1 милисекунду, и какими последствиями плоха такая затея?

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

ISR (TIMER0_OVF_vect)
{
       		// Событие срабатывающее каждые 125 мс СТАТУС СВЕТОДИОД
		if( ( msec_cnt - ms_led_st ) > 125 || msec_cnt < ms_led_st ) {
			ms_led_st = msec_cnt;
			// Режим светодиода ищем по битовой маске
			if(blink_mode & 1<<(blink_loop&0x0F)) {
				PORTC |=(1<<LED_STATUS);  //ON светодиод;
			}else{
				PORTC &=~(1<<LED_STATUS); //OFF светодиод
			}
			blink_loop++;
		}
}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

засунуть можно, только все твои битовые маски станут длиной 2000 бит, вместо 16 бит.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

Starichok51, зачем!?
kote52, Добавьте в прерывании доп.счетчик байтовый. что б изменение светодиодов и сдвиг маски выполнялись каждый 125й тик таймера.
Белая и Пушистая
Реклама
ciaas
Нашел транзистор. Понюхал.
Сообщения: 152
Зарегистрирован: Вт окт 11, 2022 13:45:06

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

Сообщение ciaas »

Привет. Понадобилось мне на AtTiny13 генерировать секунду. На внутреннем генераторе. Никак не могу посчитать как настроить таймер. Всё получается какие то дробные числа. 9,6МГц. Свободных регистров есть. Помогите пж настроить таймер. Для меги 8 всегда брал RC на 8 МГц и получал 1 мкС.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

ciaas, ставите прескалер 64 (CS0[2:0] = 011) - получаете на вход таймера 9600 кГц / 64 = 150 кГц
Далее, таймер в СТС (WGM0[2:0 = 010) TOP <- OCR0A
В регистр OCR0A пишете 150-1 - получаете тик таймера 1 мс
Белая и Пушистая
ciaas
Нашел транзистор. Понюхал.
Сообщения: 152
Зарегистрирован: Вт окт 11, 2022 13:45:06

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

Сообщение ciaas »

Ну блин просто же. Тупею :) спс
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Все равно должен быть счетчик 1мс до секунды. Можно тогда и так
9600000/256=37500
Зарядить счетчик на подсчет числа переполнений.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

akl, счетчик миллисекунд до секунды в любом случае программный.
а вот 37500 уже нацело на 1000 не делится, поэтому не будет сработки каждую миллисекунду.
Если стоит задача считать секунду - то да, можно. Если стоит задача иметь миллисекундный таймер - то нет.
Белая и Пушистая
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

Just_Fluffy, не обязательно делить на 256, у таймера можно применить режим СТС.
для получения 1мс нужно разделить на 9600. 9600 = 128 * 75.
таймером делим на 128, потом программным счетчиком делим на 75 и получаем 1 мс.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

Starichok51, тут речь о прескалере. И о том, что б получить период счета 1мс аппаратно, без досчитывания программным счетчиком.
Тиня мелкая, там всего 512 команд влазит.
И если аппаратно можно что то сделать, то лучше аппаратно, нежели программно.

Прескалер может быть 1, 8, 64, 256, 1024
таймер 8 бит.
Делитель на 9600 можно сделать так:
Fcpu/1 -> таймером разделить на 9600 - не подходит, таймер может максимум на 256 делить
Fcpu/8 -> таймером разделить на 1200 - не подходит, таймер может максимум на 256 делить
Fcpu/64 -> таймером разделить на 150 - подходит
Fcpu/256 -> таймером разделить на 37,5 - не подходит, таймер не может делить на дробное число. Но если достаточен период счета 2 мс - то подходит
Fcpu/1024 -> таймером разделить на 9,375 - не подходит, таймер не может делить на дробное число. Но если достаточен период счета 8 мс - то подходит

Резюмируя: Получить 1 мс без программных счетчиков можно, разделив тактовую 9,6Мгц прескалером на 64 и установив коэффициент 150 пересчета счетчика (СТС).

Кстати, если нужно считать секундные импульсы, то есть смысл взять прескалер 1024, коэфф. пересчета счетчика 75 - тогда получим период счета 8 мс. Или 125 тиков таймера в секунду, т.е. можно обойтись однобайтовым счетчиком.
Если же нужны интервалы по 1 мс - то счетчик миллисекунд уже будет двухбайтовый, что бы насчитать от 0 до 999.

Хотя тут все зависит от постановки задачи - что из временнЫх интервалов нужно ciaas.
Белая и Пушистая
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

Just_Fluffy писал(а):Fcpu/64 -> таймером разделить на 150 - подходит
можно и так.
я просто привел один вариант, и не исследовал множество вариантов.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Задано было [uquote="ciaas",url="/forum/viewtopic.php?p=4482642#p4482642"]... Понадобилось мне на AtTiny13 генерировать секунду...[/uquote] почему то превратившиеся в 1мс. Без программных счетчиков сгенерировать секунду нельзя. :)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

akl, тогда прескалер/1024 -> CTC /75 -> программно /125
1024*75*125=9 600 000
Накладные расходы - 125 прерываний в секунду, 1 байтовый счетчик.
Белая и Пушистая
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

[uquote="akl",url="/forum/viewtopic.php?p=4484233#p4484233"]Без программных счетчиков сгенерировать секунду нельзя. :)[/uquote]
Если сильно захотеть, то можно всё.)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

OKF, Как? Если тиня тактируется от 9.6 МГц?

Кстати, в тиньке есть еще один "таймер" - прерывание АЦП - В непрерывном режиме АЦП будет дергать прерывание каждые 13 тактов.
Тактирование АЦП идет через делитель 2, 4, 8, 16 32, 64 или 128.
Соответственно, имеем 7 фиксированных делителей - от 2*13 до 128*13
9600 / (2*13) = 369,2 кГц
9600 / (128*13) = 5,77 кГц
Белая и Пушистая
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4484379#p4484379"]OKF, Как? Если тиня тактируется от 9.6 МГц?[/uquote]Да мало ли в Бразилии донов Пэдров тини13 делителей! И всяких там оскалов капитализма.)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

OKF, в то м то и дело, что мало. максимум на 1024 можно поделить тактовую.
Оскалом тактовую можно занизить в 2 раза (в теории).
Но даже 4800000 Гц / (1024*256) - это 18.3 Гц
Белая и Пушистая
Ответить

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