подскажите с таймером

iopq
Offline
Зарегистрирован: 05.07.2016

подскажите пожалуйста. разбираюсь с работой таймера. 


void setup() {                           
    TCCR1A = 0b00000000; 
    TCCR1B = 0b00001101; //по совпадению, кд 1024
    OCR1A = 7826;       // 16 000 000 / 1024 = 15625 / 0,5 = 7826 (прерывание каждые 0,5 сек)
    TIMSK1 |= (1 << OCIE1A);  // включение прерываний по совпадению
    sei();
}

ISR( TIMER1_COMPA_vect  ) {
  Serial.println("tik");
}

вот так все вроде работает как следует. 

теперь мне нужно запустить таймер по внешнему прерыванию. для этого я делаю так 

void setup() {                           
    TCCR1A = 0b00000000; 
    TCCR1B = 0b00001101; //по совпадению, кд 1024
    OCR1A = 7826;       // 16 000 000 / 1024 = 15625 / 0,5 = 7826 (прерывание каждые 0,5 сек)
    //TIMSK1 |= (1 << OCIE1A);  // включение прерываний по совпадению
    sei();
}

ISR( TIMER1_COMPA_vect  ) {
  Serial.println("tik");
}

ISR(INT0_vect){
 TIMSK1 |= (1 << OCIE1A);  // включение прерываний по совпадению
}

только с одной особенностью. он срабатывает сразу а мне нужно что бы он выждал 0,5 сек и потом сработал. 

rkit
Offline
Зарегистрирован: 23.11.2016

Ну наверно потому что ты включаешь не таймер, а прерывание по таймеру. А таймер всё это время работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, зафигачьте 0 в TCNT перед включением прерываний

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Тогда перед включением прерываний по таймеру надо:

- Сбросить счетчик

- Сбросить флаг прерывания таймера

iopq
Offline
Зарегистрирован: 05.07.2016
  TCNT1 = 0;
  TIFR1 = 0;
  TIMSK1 |= (1 << OCIE1A);

все равно не работает

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Флаг прерывания сбрасывается иначе, записью 1 в позицию флага.

iopq
Offline
Зарегистрирован: 05.07.2016

спасибо. получилось