Почему ATtiny85 гинерирует 1ms?

ich
Offline
Зарегистрирован: 10.06.2012

Злравствуёте глубоко уважаемые умы.

У меня имеется ATtiny84 со следующими настройками Timer1

void init_encoder(){
  // PWM initialisieren
  TCCR1 = 0;
  TCCR1 |= (1<<CTC1); // Clear Timer on Compare Match
  TCCR1 |= ((1<<CS10)|(1<<CS11)); // CK/4 => 1mS ???
  GTCCR |= (1<<PSR1);
  TIMSK |= (1<<OCIE1A); // Timer/Count1 Output Compare Interrupt Enabled
}

ISR(TIMER1_COMPA_vect){
  do_encoder_activity();
}

Контролет работает на 1.000.000 Hz. В документации к tiny85 написанно что TCCR1 |= ((1<<CS10)|(1<<CS11)); это прескалер Clock/4.

Тоесть: 1.000.000/4=250.000 Hz => 4µS

Но я вижу на осцелографе 1mS. Как так?

ich
Offline
Зарегистрирован: 10.06.2012

Салют всем.

Что, неужеле ни кому не охото помоч?  Жаль конечно.

__Alexander
Offline
Зарегистрирован: 24.10.2012

не понятен вопрос. что такое 4uS и 1mS?  какое значение регистра OCSRA?

 

ich
Offline
Зарегистрирован: 10.06.2012

Извеняюсь за не точно выраженный вопрос.

Мне нужно с помощью ATtiny85 и TIMER1_COMPA вызывать Interrupt каждую 1мс. Я этого методом тыка дабился. Но вот теперь пытаюсь разобраться в том что я натыкал. Так как я с английским туго, то и даташит не большой помошник. Вот я и обратился к вам за помощью.

Микроконтроллер у меня настроен так: Counter/Timer0 настроен на генерирование PWM на пины PB0 и PB1 с частотой примерно 250 Hz. На пин PB2 настроен Interrupt по "подению" (вроде так называется). Ну и Counter/Timer1 на переполнение с частотой в 1мс.

Оно всё работает как надо. Но я не понимаю как так Counter/Timer1 гинерирует мне 1мс. (как я уже сказал, этот Timer1 я настроел на угад).

4µS это 4 микро секунды, 1mS это 1 миллисекунды.

Регистр OCSRA я вообще не устанавливал. Настроики Counter/Timer1 полностью находятся в функции init_encoder. Болше ни чего нет.

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

вы не настроив OCRA используете его прерывания? по умолчнию в том регистре 0. т.е. прерывание будет происходит при переходе 255 -> 0, равносильно что просто по переполнению. т.е. не до конца изучили принцип работы таймеров.

а расчет вашей 1мс простой, если делитель на 4, то таймер будет инкрементироваться в 4-ре раза медленней, при 1Мгц тактовой, один тик за 1 мксек, четыре соответственно за 4 мксек. таймер у нас 8-ми битный, т.е. макс значение 255, итого 255*4 = 1020 мксек. вот ваша милисекунда.

ich
Offline
Зарегистрирован: 10.06.2012

Спасибо огромное. Вот именно что я до конца и не разобрался (всё из за недостаточного знания английскова).

Теперь всё стало понятно.

ich
Offline
Зарегистрирован: 10.06.2012

Хм, вот что я заметел:

Чтобы получить ровно 1млсек, мне надо установить OCR1C на 249. Следовательно при 1.000.000Hz делим на 4 прескалер = 250.000 далее делим на OCR1C т.е. 250 получаем 1000 мксек, это и есть моя 1 млсек. Но вот осцелограф показывает 980 мксек.

А вот если я устанавливаю OCR1C на 255 либо 0 то осцелограф показывает ровно 1 млсек.

Где-то я опять не допанимаю.

__Alexander
Offline
Зарегистрирован: 24.10.2012

ну на вход в прерывание и выход из него тоже время надо. может не столько, надо проверять, хотя на 1Мгц возможно и такое, давно на такой скорости не работал.

ich
Offline
Зарегистрирован: 10.06.2012

Спасибки.

step962
Offline
Зарегистрирован: 23.05.2011

ich пишет:

Хм, вот что я заметел:

Чтобы получить ровно 1млсек, мне надо установить OCR1C на 249. Следовательно при 1.000.000Hz делим на 4 прескалер = 250.000 далее делим на OCR1C т.е. 250 получаем 1000 мксек, это и есть моя 1 млсек. Но вот осцелограф показывает 980 мксек.

А вот если я устанавливаю OCR1C на 255 либо 0 то осцелограф показывает ровно 1 млсек.

Где-то я опять не допанимаю.

Внутренний осциллятор?

Почитайте о его точности.