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

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

  1. Brathobbit

    Brathobbit Нуб

    Всем доброго времени суток, коллеги. Возник странный и парадоксальный вопрос, программирую мегу 328р
    Пишу код для инициализации таймера в режиме СТС, ставлю предделитель и счёт до 65535 что должно получиться : Fмиг=16000000/(1024*(1+65534))=0,2384 Гц, а значит светодиод должен мигать примерно один раз в 4 секунды, однако у меня получается совершенно другой результат,частота порядка 23 герц!
    вот код:

    #define led1 2 //pd2
    byte flag,flag1,flag2;

    void setup() {
    pinMode(led1, OUTPUT);

    //------ Timer1 ----------
    TCCR1B = (1<<WGM12); // Режим CTC (сброс по совпадению)

    TCCR1B |= (1<<CS10)|(1<<CS12); // CLK/1024

    OCR1A = 65534; //до чего считаем
    TIMSK1 = (1<<OCIE1A); // Разрешить прерывание по совпадению
    }

    ISR (TIMER1_COMPA_vect)
    {
    if(flag1==1){flag1=0;}else{flag1=1;}
    }
    }

    void loop()
    {
    digitalWrite( led1,flag1);
    }
     
  2. Brathobbit

    Brathobbit Нуб

    РАЗОБРАЛСЯ!!!!
    //------ Timer1 ----------
    TCCR1A = 0; //вот про это я вчера, мля, писал. НУЖНО УКАЗЫВАТЬ ВСЕ ПАРАМЕТРЫ
    TCCR1B = (1<<WGM12)|(1<<CS10)|(1<<CS12); // CLK/1024
    OCR1A = 65534; // Верхняя граница счета. Диапазон от 0 до 65535.
    TIMSK1 |=(1<<OCIE1A); // прерывание по совпадению

    Так правильно настраивать таймер