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

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

  1. ИгорьК

    ИгорьК Победитель модулей

    Зря вы так ко мне предвзято, дорогой доктор от программирования (DrProg) Максим! (Или доктор от задавания вопросов?)
    Во-первых я первым и предельно точно ответил на ваш вопрос (и никто ответ не опроверг. А вы обвиняете меня что я лезу, а сказать мне нечего), а во-вторых, помог добыть еще ценные знания, поскольку вы и вопрос то сформулировать понятно не могли. Вот и делай потом хорошее :-(
    Ну а "тайна" ваших секретных кодов, почерпнутая от хора помогальщиков... Ну да, мало ли на свете тайн: пирамиды, там, сокровища... Ну добавится еще ваш код. И один единственный коллега, который у вас что-то попросил. Да правда ерунда. Всего то один.
    Пойду плакать в игноре...
     
  2. DrProg

    DrProg Вечный нерд

    Простые вопросы: при запуске МК значения регистров сбрасываются в дефолт или сохраняются как были выставлены в последний раз? Если да, то как восстановить значения по умолчанию?
     
    ИгорьК нравится это.
  3. Megakoteyka

    Megakoteyka Оракул

    При включении питания регистры в устанавливаются дефолтные значения, при ресете какие-то регистры сохраняются, какие-то могут уйти в дефолт. Подробности смотрите в описании регистров в даташите.
     
    Tomasina и DrProg нравится это.
  4. portnoj

    portnoj Нуб

    Извините что не в тему, но я тут прочитал в данном посте первые сообщения вслух и у меня воздух в воду превратился. С чего можно начать изучение МК что бы придти к тому же уровню что и вы?
     
  5. DrProg

    DrProg Вечный нерд

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

    ИгорьК Победитель модулей

    Есть два принципиально разных способа.
    Первый - читаете книги: раз, два, и даташиты с примерами три.

    А второй... Ну, скажем так, не стесняетесь задавать вопросы. Можете их, хоть 907 задать. Пусть Вам рассказывают. А че, для чего этот форум то создан?
     
    portnoj нравится это.
  7. portnoj

    portnoj Нуб

    Игорь, огромное спасибо за ссылку на русскоязычные описания , я думал я такого никогда не встречу. И за книги. Вот уж дельный ответ)

    Вопросы то я задаю , дак делеко не всегда отвечают...
     
  8. ИгорьК

    ИгорьК Победитель модулей

    Значит Вы задаете хорошие, правильные вопросы. Не детский лепет вперемежку с понтами - а реальные.
     
    Igor68 и gleco1 нравится это.
  9. gleco1

    gleco1 Нуб

    Не могу разобраться, почему не компилится прога. Помогите, нигде не нашел вразумительного ответа. Вот фрагмент:
    void setup()
    {
    //TCCR0B = TCCR0B & 0b11111000 | 0x01; // Частота ШИМ 5 и 6
    //TCCR1B = TCCR1B & 0b11111000 | 0x02; // Частота ШИМ 9 и 10
    TCCR2B = TCCR2B & 0b11111000 | 0x01; // Частота ШИМ 11 и 3
    pinMode(pinSolderOut, OUTPUT);
    pinMode(pinSolderButton, INPUT);
    pinMode(pinHotAirOut, OUTPUT);
    pinMode(pinHotAirButton, INPUT);
    lcd.begin(16, 2);
    lcd.createChar(1, char_cel); При компиляции выдаёт:
    error: 'TCCR2B' was not declared in this SCOPE.
    Не могу понять как задекларировать регистр. Помогите,а?
     
  10. ИгорьК

    ИгорьК Победитель модулей

    Это сильно похоже на то, что в МК, под который идёт компиляция, таймер 2 отсутствует. Что за МК?
     
  11. gleco1

    gleco1 Нуб

    Очень понравилось! Ответ умного человека.
     
  12. gleco1

    gleco1 Нуб

    ATMega8
     
  13. gleco1

    gleco1 Нуб

    upload_2015-12-23_18-6-37.png
    Это из даташит.
     
  14. ИгорьК

    ИгорьК Победитель модулей

    Ну так в этом МК просто нет такого регистра. Он отсутствует.
     
  15. ИгорьК

    ИгорьК Победитель модулей

    Дык... Вы же сами на вопрос ответили. Смотрите как регистр называется. То же касается таймера 0, он, скорее всего, 8 разрядный и TCCR0B у него тоже может не быть. Ага. Стр. 71 мануала.
     
  16. gleco1

    gleco1 Нуб

    [QUOTE="ИгорьК, post: 57665, member: 2107".[/QUOTE]
    Да, вы правы, когда прокомпилил относительно Меги328 - всё получилось. Не знаю, сколько бы я ещё промучился. Скорее всего так и не разобрался бы.Спасибо вам огромное/
    И последний вопрос - где искать hex file?
     
  17. ИгорьК

    ИгорьК Победитель модулей

    Зависит от ситуации. Если это Arduino IDE то надо смотреть отчёт компилятора. Если информации нет - установите расширенный его вывод в настройках. И находиться он будет в глубине временных файлов системы.
    Если это другая IDE,то файл лежит где-то в папках проекта.
     
  18. DrProg

    DrProg Вечный нерд

    в IDE 1.6.X "скетч -> экспорт бинарного файла", hex появится в папке со скетчем, причем в двух видах: с бутлоадером и без. Если компильнете для для другого МК, то там появится hex и для него.

    В IDE 1.5.Х проще всего найти поиском, он будет в подпапке временной папки и одноименен скетчу.
     
    ИгорьК нравится это.
  19. fin

    fin Нуб

    На заметку. не получалось простой пример сделать и вот почему:
    ВАЖНО где стоит установка регистра сравнения до установки режима работы или после:

    так не работает ( OCR1A сбрасывается в ноль)
    OCR1A = 10000;
    TCCR1A = 0;

    так работает:
    TCCR1A = 0;
    OCR1A = 10000;


    вот в целом программа освоения таймера1
    мигает светодиодом на 13 пине с заданными OCR1A и OCR1B отсчетами


    #include <CyberLib.h>


    // переменные

    unsigned long ss = 0;
    unsigned long ssa = 0;
    unsigned long ssb = 0;
    bool flg = LOW;




    // обработчики прерываний
    SIGNAL(TIMER1_COMPA_vect)
    {
    // гасим диод
    D13_Low;
    ssa = micros() - ss;
    ss = micros();
    }

    SIGNAL(TIMER1_COMPB_vect)
    {
    // зажигаем диод
    D13_High;
    ssb = micros() - ss;
    ss = micros();

    // обнуляем счетчик
    TCNT1 = 0;
    flg = HIGH; // флаг окончания цикла
    }



    void setup() {

    Serial.begin(9600);

    D13_Out;
    D13_Low;


    // разрешить прерывание по совпадению

    TIMSK1 = _BV(OCIE1A) | _BV(OCIE1B);

    // тактируем и запускаем
    TCCR1B = (1<<(CS12)) | (1<<(CS10)); // делитель
    // установим режим normal, а то там по умолчанию что-то другое
    TCCR1A = 0;

    // запишем в регистры сравнения.
    OCR1A = 10000;
    OCR1B = 20000;

    }


    void loop() {
    // посмотрим что дало
    if (flg) {
    Serial.print (ssa);
    Serial.print (" ");
    Serial.println (ssb);

    flg = LOW;
    }
    }
     
  20. mcureenab

    mcureenab Гуру

    Вы запустили таймер и начали дергать его режимы и пороги. А таймер то в это время работает и что то делает.