Скажите где найти описания регистров для счетчиков?

Тема в разделе "Микроконтроллеры AVR", создана пользователем Радиокот, 25 фев 2019.

  1. Нужно счетчик 16р поставить с делителем 1024 и сбросом по переполнению, где найти описание этих регистров? Даташите кроме установке сторожевого таймера нет ничегошеньки. может в апноте смотреть?
     
  2. Неправда. Всё есть в разделе про счетчик, и очень подробно.
     
  3. Это не даташит, это отрывок перевода даташита. В оригинале страниц раз в пять больше.
     
  4. parovoZZ

    parovoZZ Гуру

    Да ну? Во всех главах есть раздел Register Descriptions. А все даташиты лежат на сайте микрочипа. В других местах их искать крайне глупо - там могут оказаться вчерашние версии.

    upd^
    а вот и подтверждение
    Это не даташит, а неизвестно что.
     
  5. Спасибо, вот только вопрос, я не силен в английском, в и этом вся загвоздка:)
     
  6. b707

    b707 Гуру

    учите.
    Без английского в программировании ловить нечего
     
    DetSimen и parovoZZ нравится это.
  7. parovoZZ

    parovoZZ Гуру

    А мы здесь при чем? Я китайские даташиты читаю, хотя в китайском ниже нуля)), Ставь в браузер переводчик. У меня ImTranslator. С китайского хорошо переводит.

    *******************
    Ладно. Я сегодня добрый. Говори какой МК и какой счетчик хочешь задействовать.
     
    Warphat и Daniil нравится это.
  8. Daniil

    Daniil Гуру

    Вот тут мужик перевел и собрал в кучку. Но без английского - никуда
     
    Warphat нравится это.
  9. Belkin

    Belkin Гик

    Вот тут немало информации и, главное - много на русском... ;)
    http://www.gaw.ru/html.cgi/txt/doc/micros/avr/index.htm
    Значит, так искали...
     
    Warphat, Daniil и parovoZZ нравится это.
  10. Tiny2313A, 16р счетчик
     
  11. Да я то прочитать могу, по заученной памяти, только на это потребуется день
     
  12. Нет, на мой на английском, буду переводить
     
  13. Скачать там нельзя?
     
  14. parovoZZ

    parovoZZ Гуру

    Ща напишу. Погодь с полчасика)
     
    Belkin нравится это.
  15. Belkin

    Belkin Гик

    А вы туда заглянули хоть ?
    Вопроса бы не было...

    Как вы ищете ? Может, у нас интернеты разные ? ;)
    Вот тут еще "учебник" на русском http://easyelectronics.ru/avr-uchebnyj-kurs-tajmery.html
    Ничего, что про Мега - подход одинаков и для Тини.
    Кстати, там, если полистать, не только про таймеры.
     
  16. Спасибо, что указали, такой мелкий знак:D
     
  17. parovoZZ

    parovoZZ Гуру

    Итак.
    Настраиваем прескалер. Но сперва запишем макросы.
    Код (C++):
    #define Prescaler_1            Bit(CS10)                            // Делитель тактов
    #define Prescaler_8            Bit(CS11)
    #define Prescaler_64        Bit(CS10) | Bit(CS11)
    #define Prescaler_256        Bit(CS12)
    #define Prescaler_1024        Bit(CS10) | Bit(CS12)
    Здесь редактор сильно моржопит табуляцию, в редакторе же у меня всё выглядит стройно)))
    Теперь самый главный момент! Если мы хотим сразу после запуска таймера отмерять точное время, то нам необходимо сбрасывать предделитель, если коэффициент предделителя больше единицы.
    Код (C++):
    #define ClearPrescaler        GTCCR = Bit(PSR10)                        // Сброс предделителя
    Как вообще устроен предделитель? Это 5-ти разрядный счетчик, к выходам которого мы можем подключить наши счетчики/таймеры. Т.е. предделитель не для каждого таймера, а он один для всех таймеров. Таким образом, если мы его сбрасываем, то это повлияет на работу остальных таймеров, которые к нему подключены (за исключением единичного коэффициента деления).
    Далее определяем, на каком выходе предделителя будет висеть счетчик нашего таймера. В нашем случае:
    Код (C++):
    #define Timer1_Start        TCCR1B |= Prescaler_1024; ClearPrescaler    // Пуск таймера1 с очисткой делителя
    Здесь важно понимать - как только мы задали коэффициент деления предделителя, наш таймер пошел тикать!
    Для остановки счетчика таймера необходимо задать нулевой коэффициент:
    Код (C++):
    #define Timer1_Stop            TCCR1B &= (~(Bit(CS10) | Bit(CS11) | Bit(CS12)))    // Останов таймера1 (делитель = 0)
    Чтобы нам отловить сообщения от счетчика, нам необходимо разрешить либо прерывания от него, либо же проверять флаги. Но флаги это не всегда интересно, поэтому разрешим прерывания. В данном случае мне неизвестно, какие нужны, поэтому разрешим все:
    Код (C++):
    #define SetTIMSK            TIMSK |= Bit(TOIE1) | Bit(OCIE1B) | Bit(ICIE1)    // Установка прерываний по переполнению, от счетчика и от цифрового компаратора
    Теперь напишем скелет обработчика вектора переполнения счетчика таймера1:
    Код (C++):
        //... Прерывание при переполнении таймера 1
    ISR(TIMER1_OVF_vect)
    {
    /// говнокод писать здесь
    }
    Ну и осталось нам всю эту шайтан машину запустить:
    Код (C++):
    int main(void)
    {  
       ///// здесь какие-то настройки, какая-то инициализация
        //... Инициализация таймера 1
        SetTIMSK;

        Timer1_Start;                        // Включаем таймер 1  

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

        //... Основной цикл
        while (1)
        {
    ////// здесь наша копрограмма
        }
    }
    Студент, вопросы?
     
    Daniil, Радиокот и Belkin нравится это.
  18. Есть вопросы, во-первых что такое маска и флаги, во-вторых почему команда ,на ассемблере, сравнение с пропуском не работает на r16, в-третьих в чем различие РОН , ну я знаю что пары 32-31 30-29 и 28-27 это для чтения\записи в ОЗУ.
     
  19. Belkin

    Belkin Гик

    Маска определяет, какие события таймера будут задействованы.
    Флаги показывают, какие события таймера "сбылись"...
    Потому, что вы неправильно прочитали (ожидаете) результата.
    Ассемблер гораздо более точен, чем другие ЯП, посему тут надо быть внимательнее.