Не работает код прерываний для 1 таймера attiny85

adast123
Offline
Зарегистрирован: 14.04.2015

Помогите пожалуюста найти ошибку в коде, у меня не работает код прерываний 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;
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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
Offline
Зарегистрирован: 14.04.2015

Изменил, все равно не работает:

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);    
    OCR1C = 61;
    TIMSK = (1 << OCIE1A);   
    sei();
}

void loop() {
}

ISR(TIMER1_COMPA_vect) {
  if(flag == 0) {
    digitalWrite(LED, LOW);
  }else{
    digitalWrite(LED, HIGH);
  }
  flag =!flag;
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

adast123, логично. Счёт у вас идёт до ocr1c, а прерывание настроено на совпадение с ocr1a. Попробуйте в OCR1C=OCR1A=61;  Если не прокатит, то придётся в PWM-режим перенастроить таймер.

1) Кстати, командой TIMSK= вы убиваете настройки другого таймера. Нужно TIMSK|=

2) А у TCCR1B наоборот убрать знак | Блин! Там у вас ошибка, зачем вы регистр 0 таймера трогаете??? Всё переделайте, не буду каждую буквы разжёвыватьь

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

Вчера у Вас вроде второй не работал. Сегодня - первый. Не везёт Вам что-то с таймерами :(

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ЕвгенийП пишет:

Вчера у Вас вроде второй не работал. Сегодня - первый. Не везёт Вам что-то с таймерами :(

сгорели все таймеры нахрен

adast123
Offline
Зарегистрирован: 14.04.2015

Огромное вам спасибо!!!