Не работает код прерываний для 1 таймера attiny85
- Войдите на сайт для отправки комментариев
Ср, 29/06/2016 - 11:34
Помогите пожалуюста найти ошибку в коде, у меня не работает код прерываний 1 таймера на attiny85.
const byte LED = 4; volatile bool flag = 0; void setup() { pinMode(LED, OUTPUT); TCCR1 = 0; TCNT1 = 0; TCCR1 = (1 << CTC1); TCCR0B |= (1 << CS13) | (1 << CS12) | (1 << CS11) | (1 << CS10); OCR1A = 61; TIMSK = (1 << OCIE1A); sei(); } void loop() { } ISR(TIMER1_COMPA_vect) { if(flag == 0) { digitalWrite(LED, LOW); }else{ digitalWrite(LED, HIGH); } flag =!flag; }
Хотя таймер 0 заводится.
Но мне он не подходит, так как нарушает разботу millis и delay.
const byte LED = 4; volatile bool flag = 0; void setup() { pinMode(LED, OUTPUT); TCCR0A = 0; TCCR0B = 0; TCCR0A = (1 << WGM01); TCCR0B |= (1 << CS00) | (1 << CS02); OCR0A = 488; TIMSK = (1 << OCIE0A); sei(); } void loop() { } ISR(TIMER0_COMPA_vect) { if(flag == 0) { digitalWrite(LED, LOW); }else{ digitalWrite(LED, HIGH); } flag =!flag; }
adast123, Цитата из даташита на тини85 : "Bit 7 – CTC1 : Clear Timer/Counter on Compare Match
When the CTC1 control bit is set (one), Timer/Counter1 is reset to $00 in the CPU clock cycle after a compare
match with OCR1C register value. If the control bit is cleared, Timer/Counter1 continues counting and is unaffected
by a compare match."
Изменил, все равно не работает:
adast123, логично. Счёт у вас идёт до ocr1c, а прерывание настроено на совпадение с ocr1a. Попробуйте в OCR1C=OCR1A=61; Если не прокатит, то придётся в PWM-режим перенастроить таймер.
1) Кстати, командой TIMSK= вы убиваете настройки другого таймера. Нужно TIMSK|=
2) А у TCCR1B наоборот убрать знак | Блин! Там у вас ошибка, зачем вы регистр 0 таймера трогаете??? Всё переделайте, не буду каждую буквы разжёвыватьь
Вчера у Вас вроде второй не работал. Сегодня - первый. Не везёт Вам что-то с таймерами :(
Вчера у Вас вроде второй не работал. Сегодня - первый. Не везёт Вам что-то с таймерами :(
сгорели все таймеры нахрен
Огромное вам спасибо!!!