Обсуждаем контроллеры компании Atmel.
Ответить

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

Сб авг 26, 2023 08:56:02

А вот я и не врубаюсь, используется или нет? Похоже, что это спрятано внутрях ардуины. В коде есть только установка частоты ШИМ - 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 раз переполнится между импульсами? А менять частоту ШИМ двигателей я не могу - мне нужно снять характеристики именно в таком режиме.

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

Сб авг 26, 2023 09:27:41

В вашем случае измерение периода не должно быть очень точной функцией. (Однако это напр. не частотомер с разрешением 1 Hz на напр. 50 MHz).
Почему бы не использовать готовые функции Arduino? Напр. pin change interruption ISR и micros()? Изменение вверх: начало измерения время, изменение вниз: остановка, разница: время.

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

Ср авг 30, 2023 06:39:03

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

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

Вс сен 03, 2023 22:16:33

Друзья, имеется код для статус светодиода, и разные его режимы работы.
Код:
// Массив режимов работы светодиода
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++;
      }
}

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

Пн сен 04, 2023 08:30:45

засунуть можно, только все твои битовые маски станут длиной 2000 бит, вместо 16 бит.

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

Пн сен 04, 2023 12:36:12

Starichok51, зачем!?
kote52, Добавьте в прерывании доп.счетчик байтовый. что б изменение светодиодов и сдвиг маски выполнялись каждый 125й тик таймера.

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

Пт сен 29, 2023 15:36:53

Привет. Понадобилось мне на AtTiny13 генерировать секунду. На внутреннем генераторе. Никак не могу посчитать как настроить таймер. Всё получается какие то дробные числа. 9,6МГц. Свободных регистров есть. Помогите пж настроить таймер. Для меги 8 всегда брал RC на 8 МГц и получал 1 мкС.

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

Пт сен 29, 2023 16:02:21

ciaas, ставите прескалер 64 (CS0[2:0] = 011) - получаете на вход таймера 9600 кГц / 64 = 150 кГц
Далее, таймер в СТС (WGM0[2:0 = 010) TOP <- OCR0A
В регистр OCR0A пишете 150-1 - получаете тик таймера 1 мс

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

Пт сен 29, 2023 16:35:45

Ну блин просто же. Тупею :) спс

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

Пн окт 02, 2023 05:15:15

Все равно должен быть счетчик 1мс до секунды. Можно тогда и так
9600000/256=37500
Зарядить счетчик на подсчет числа переполнений.

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

Пн окт 02, 2023 11:59:40

akl, счетчик миллисекунд до секунды в любом случае программный.
а вот 37500 уже нацело на 1000 не делится, поэтому не будет сработки каждую миллисекунду.
Если стоит задача считать секунду - то да, можно. Если стоит задача иметь миллисекундный таймер - то нет.

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

Пн окт 02, 2023 14:59:52

Just_Fluffy, не обязательно делить на 256, у таймера можно применить режим СТС.
для получения 1мс нужно разделить на 9600. 9600 = 128 * 75.
таймером делим на 128, потом программным счетчиком делим на 75 и получаем 1 мс.

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

Пн окт 02, 2023 15:19:59

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.

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

Пн окт 02, 2023 15:48:21

Just_Fluffy писал(а):Fcpu/64 -> таймером разделить на 150 - подходит
можно и так.
я просто привел один вариант, и не исследовал множество вариантов.

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

Вт окт 03, 2023 05:35:32

Задано было
... Понадобилось мне на AtTiny13 генерировать секунду...
почему то превратившиеся в 1мс. Без программных счетчиков сгенерировать секунду нельзя. :)

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

Вт окт 03, 2023 09:58:57

akl, тогда прескалер/1024 -> CTC /75 -> программно /125
1024*75*125=9 600 000
Накладные расходы - 125 прерываний в секунду, 1 байтовый счетчик.

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

Вт окт 03, 2023 11:21:17

Без программных счетчиков сгенерировать секунду нельзя. :)

Если сильно захотеть, то можно всё.)

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

Вт окт 03, 2023 13:42:19

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 кГц

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

Вт окт 03, 2023 13:56:08

OKF, Как? Если тиня тактируется от 9.6 МГц?
Да мало ли в Бразилии донов Пэдров тини13 делителей! И всяких там оскалов капитализма.)

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

Вт окт 03, 2023 15:36:18

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