Прерывания по таймеру, что я делаю не так?

nontxt
Offline
Зарегистрирован: 20.03.2018

Есть код в интерпретации Си:

ISR(TIMER1_OVF_vect) 
{ 
PORTB^=(1<<5); 

TCNT1=61630;//Начальное значение таймера 
} 

int main(void) 
{ 
DDRB|=(1<<PB5); 

TCCR1B=B00001001;//Предделитель = 1024 
TIMSK1=B00000001;//Разрешить прерывание по переполнению таймера 1
TCNT1=61630;//Начальное значение таймера 

sei();//Разрешить прерывания 

while(1) 
{ 

} 
}

 

И аналогичный ему код в интерпретации arduino:

void setup() {
  // put your setup code here, to run once:
DDRB|=(1<<PB5); 
TCCR1B=B00000101;//Предделитель = 1024 
TIMSK1=B00000001;//Разрешить прерывание по переполнению таймера 1
TCNT1=61630;//Начальное значение таймера 

sei();//Разрешить прерывания 
}

void loop() {
}

ISR(TIMER1_OVF_vect) 
{ 
PORTB^=(1<<5); 

TCNT1=61630;//Начальное значение таймера 
} 

 

Так вот, код в интерпретации Си работает как положено, а аналогичный ему код ардуино нет, в чем причина? 

 

Заранее прошу прощение за столь нубский вопрос, ответа на него к сожалению не смог найти.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

открой даташит и настрой таймер полностью!

......

Поясняю, если в отказ пойдешь ;) ;) ;):

Ардуино настраивает все таймеры для генерации ШИМ. В Студии ты расчитываешь на "голый" контроллер, после ресета. И таймер там по дефолту.

В ардуино таймер1 настроен уже так:

	TCCR1B = 0;
	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
	sbi(TCCR1B, CS10);
	sbi(TCCR1A, WGM10);

 

nontxt
Offline
Зарегистрирован: 20.03.2018

Вот где собака зарыта была)

Я почему-то запамятовал что у ардуины таймера на шим настроены.

Спасибо))

Решилось все добавлением строчки 

TCCR1A=0;