Таймеры и прерывания

Тема в разделе "Микроконтроллеры AVR", создана пользователем DrProg, 18 авг 2015.

  1. DrProg

    DrProg Вечный нерд

    Усиленно курю тему, в голове комплит процентов на 70, но остаются некоторые вопросы. Например, их этого хорошего примера с объяснениями:
    Код (Text):
    void setup()
    {
    //------ Timer0 ----------
    TCCR0A = (1<<WGM01);  // Режим CTC (сброс по совпадению)
    TCCR0B = (1<<CS00);    // Тактирование от CLK.
                          // Если нужен предделитель :
    // TCCR0B = (1<<CS01);          // CLK/8
    // TCCR0B = (1<<CS00)|(1<<CS01); // CLK/64
    // TCCR0B = (1<<CS02);          // CLK/256
    // TCCR0B = (1<<CS00)|(1<<CS02); // CLK/1024

    OCR0A = 123;            // Верхняя граница счета. Диапазон от 0 до 255.
                            // Частота прерываний будет = Fclk/(N*(1+OCR0A))
                            // где N - коэф. предделителя (1, 8, 64, 256 или 1024)
    TIMSK0 = (1<<OCIE0A);  // Разрешить прерывание по совпадению

    //------ Timer1 ----------
    TCCR1B = (1<<WGM12);    // Режим CTC (сброс по совпадению)
    TCCR1B |= (1<<CS10);    // Тактирование от CLK.
                            // Если нужен предделитель :
    // TCCR1B |= (1<<CS11);          // CLK/8
    // TCCR1B |= (1<<CS10)|(1<<CS11); // CLK/64
    // TCCR1B |= (1<<CS12);          // CLK/256
    // TCCR1B |= (1<<CS10)|(1<<CS12); // CLK/1024

    OCR1A = 2678;          // Верхняя граница счета. Диапазон от 0 до 65535.
                            // Частота прерываний будет = Fclk/(N*(1+OCR1A))
                            // где N - коэф. предделителя (1, 8, 64, 256 или 1024)
    TIMSK1 = (1<<OCIE1A);  // Разрешить прерывание по совпадению

    //------ Timer2 ----------
    TCCR2A = (1<<WGM21);    // Режим CTC (сброс по совпадению)
    TCCR2B = (1<<CS20);    // Тактирование от CLK.
                            // Если нужен предделитель :
    // TCCR2B = (1<<CS21);                    // CLK/8
    // TCCR2B = (1<<CS20)|(1<<CS21);          // CLK/32
    // TCCR2B = (1<<CS22);                    // CLK/64
    // TCCR2B = (1<<CS20)|(1<<CS22);          // CLK/128
    // TCCR2B = (1<<CS21)|(1<<CS22);          // CLK/256
    // TCCR2B = (1<<CS20)|(1<<CS21)|(1<<CS22); // CLK/1024

    OCR2A = 234;            // Верхняя граница счета. Диапазон от 0 до 255.
                            // Частота прерываний будет = Fclk/(N*(1+OCR2A))
                            // где N - коэф. предделителя (1, 8, 32, 64, 128, 256 или 1024)
    TIMSK2 = (1<<OCIE2A);  // Разрешить прерывание по совпадению

    sei ();                // Глобально разрешить прерывания
    }

    ISR (TIMER0_COMPA_vect)
    {
        // Обработчик прерывания таймера 0
    }

    ISR (TIMER1_COMPA_vect)
    {
        // Обработчик прерывания таймера 1
    }

    ISR (TIMER2_COMPA_vect)
    {
        // Обработчик прерывания таймера 2
    }
    и этого краткого описания регистров мозаика немного не складывается. Например, регистр TCCR0A - что обозначает буква A, о которой в описании ни слова?

    И еще, OCo это что выходы или входы? И почему опять A и B?
     
    fin и ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Я думаю, Вы скромничаете. Вы уже не на 70%, а на 95 разобрались.
    Остались мелочи. Подсказываю. TCCR0A - А означает, что это не регистр TCCR0B.
    То же качается и OCR-регистров - это не входы, не выходы, это регистры. А и В говорит о том, что это не одно и то же. Брат и сестра, А и В.
     
    Последнее редактирование: 18 авг 2015
  3. Unixon

    Unixon Оракул Модератор

    Буквами обозначаются выходы каналов одного и того же таймера. Посмотрите в даташите блок-схему узла таймеров и ШИМ и все станет понятно.
     
  4. ИгорьК

    ИгорьК Гуру

    Надеюсь, ТС поймет (он уже на 70-95% в теме), а я - не понял. Что такое "выходы каналов"? Регистры знаю, назначение регистров - читаю в даташите, ноги - знаю. Выходы каналов - не знаю. О чем речь?
     
  5. Unixon

    Unixon Оракул Модератор

    О разных компараторах, работающих от одного таймера, и соответствующих каналах ШИМ (выводы МК с функциями OCxy, x=0,1,2,... y=A,B,C,...).
     
  6. ИгорьК

    ИгорьК Гуру

    Ну то есть все равно регистрах.
     
  7. DrProg

    DrProg Вечный нерд

    Почему тогда конфигурирование в приведенном выше примере идет частично на A и частично на B?
    Код (Text):
    TCCR0A = (1<<WGM01);  // Режим CTC (сброс по совпадению)
    TCCR0B = (1<<CS00);    // Тактирование от CLK.
    А на таймер 1 ниже прописывают в B и то и другое. Не могу понять системы, A и B работают независимо друг от друга? Куда все же прописывать биты?
     
    Последнее редактирование: 18 авг 2015
    ИгорьК нравится это.
  8. ИгорьК

    ИгорьК Гуру

    У меня есть смутное подозрение, что Таймер 0 и Таймер 1 - они немного не похожи.
    А ну-ка, объясните нам с коллегой :)
     
  9. Alex19

    Alex19 Гуру

    Потому что в 1 регистр, все настройки не влезли бы, поэтому их 2.

    Тут надо пояснить.

    В контексте ATmega328
    Регистр TCCR0A:
    7, 6, 5, 4, 3, 2, 1, 0
    COM0A1, COM0A0, COM0B1, COM0B0, -, -, WGM01, WGM00

    Регистр TCCR0B:
    7, 6, 5, 4, 3, 2, 1, 0
    FOC0A, FOC0B, -, -, WGM02, CS02, CS01, CS00

    Регистр счетчика TCNT0, 2 регистра сравнения OCR0A, OCR0B. Остальные регистры опустим.

    И так
    CS00- CS02 определяют источник тактовой частоты
    WGM01- WGM02 определяют режим работы таймера
    COM0A1, COM0A0, COM0B1, COM0Bo - определяют поведение вывода A и B
    FOC0A, FOC0B - принудительное изменение состояния вывода A и B


    В TCCR0B (CS00- CS02) - задается источник тактовой частоты. По умолчанию 000 - таймер/счетчик T остановлен.

    Затем выбирается режим работы WGM, тут все не только от конкретного контролера, а еще и таймера. К примеру для счетчика T0 в режиме CTC (ATmega328).
    WGM01 = 1 (стр. 106)
    А для T1
    WGM12 = 1 (стр. 132)

    Теперь о совпадении, есть OCR0A и OCRоB, это 2 разных совпадения и разные прерывания у Вас используется A и TIMER0_COMPA_vect.

    После этого указывается значение по совпадению OCR0A и включаем прерывание.
    TIMSK0 = (1<<OCIE0A); // Разрешить прерывание по совпадению

    Более подробно - http://chipenable.ru/index.php/programming-avr/item/171-avr-timer-t0-ch1.html (там отличные руководства, и не только о таймерах). Описание регистров ATmega328 - http://avrprog.blogspot.com/2013/03/t0-8.html. Ну и конечно pdf на Ваш контролер.
     
    Последнее редактирование: 18 авг 2015
    DrProg нравится это.
  10. DrProg

    DrProg Вечный нерд

    При чем тут разные таймеры? Это разные устройства, грубо говоря, первый вообще 16битный а не 8 как нулевой, но при чем тут это? Интересуют отличия внутри одного таймера, а именно что обозначают литеры и как ими правильно пользоваться.
     
    ИгорьК нравится это.
  11. DrProg

    DrProg Вечный нерд

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

    То есть в tiny13, например, этот регистр один?
     
    Последнее редактирование: 18 авг 2015
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Не наезжайте! Я просто решил вам помочь разводить лохов на ваше обучение. Смотрите как хорошо получилось. Осталось только их отучить отправлять вас к чтению мануалов и руководств. Но вдвоем справимся как-нибудь, правда?
     
  13. DrProg

    DrProg Вечный нерд

    Есть игнор на этом форуме?
    О, есть, круто!
     
    ИгорьК нравится это.
  14. ИгорьК

    ИгорьК Гуру

    Главное чтобы доброхоты цитирования мануалов страницами и снабжения ссылками не перевелись :)
     
  15. Alex19

    Alex19 Гуру

    Нет тоже 2 - http://www.atmel.com/ja/jp/Images/doc2535.pdf

    Полагаю это относилось ко всем, кто хотел помочь, включая и меня.

    Лично я помогаю, лишь потому, что мне частенько помогали на этом форуме. Таким образом, я просто отвечаю добром на добро. Дурное воспитание, так сказать.

    Если исходить из того, что есть огромное кол-во мануалов от производителей, то все форумы по электронике и программированию должны умереть, полагаю и другие. Они просто не нужны.

    Но не все их могут осилить, проблема языка (большинство на анг.), время, мы все хоббийсты и у 99% другая работа, семья и т.д. Поэтому в сети тысячи примеров, кода и т.д. За что им огромное спасибо.

    Полагаю, мы высказали свои точки зрения, так же предположу, что мы их не изменим:).
     
    DrProg нравится это.
  16. DrProg

    DrProg Вечный нерд

    У меня к вам очевидная просьба: не лезть с воспитательными целями в мои темы, если нечего сказать по существу вопроса. Нет у меня ни желания ни времени оправдываться перед вами почему я не понял с наскоку то или другое.
    Сам стараюсь помогать другим как могу при этом не говорю "лошара ты нергамотный, на гугле забаненый".
     
    ИгорьК и gleco1 нравится это.
  17. ИгорьК

    ИгорьК Гуру

    Нет. Ко мне. Это я, прочитав пост, в котором ТС объявил что на 70% разорбался в теме, задает очаровательный вопрос: "TCCR0A - что обозначает буква A" не увидел надувательства и не въехал в глубину познания.
    И ничуть не к Вам. Потому что Вы не знаете о количестве аналогичных вопросов, сгенерированных на этом форуме, при религиозном нежелании читать ничего, кроме услужливых объяснений. И Вы не в теме, что наряду с этими вопросами, на просьбу одного и участников форума поделиться кодом был дан ответ - "тайна".

    Так что к Вам это не относится, Вы этого ничего не знаете и не видите. Не возводите на себя напраслину. И, упаси Боже, менять мнение.
     
  18. ИгорьК

    ИгорьК Гуру

    Неисправный форум? Кнопка сломалась?
     
  19. DrProg

    DrProg Вечный нерд

    Абсолютно личное предвзятое мнение не связанное с реальностью и уводящее очередную тему во флуд. Все, в игнор так в игнор.
     
    ИгорьК нравится это.
  20. Alex19

    Alex19 Гуру

    К сожалению редко занимаюсь контролерами, как следствие не часто бываю на форуме. Львиная доля сообщений, проходит мимо. Поэтому, не буду судить или защищать кого-то.

    Я рад, что мы разобрались и как я понял наши мнения близки.
     
    Последнее редактирование: 18 авг 2015