Почему ATtiny85 гинерирует 1ms?
- Войдите на сайт для отправки комментариев
Чт, 28/08/2014 - 02:43
Злравствуёте глубоко уважаемые умы.
У меня имеется 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. Как так?
Салют всем.
Что, неужеле ни кому не охото помоч? Жаль конечно.
не понятен вопрос. что такое 4uS и 1mS? какое значение регистра OCSRA?
Извеняюсь за не точно выраженный вопрос.
Мне нужно с помощью 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. Болше ни чего нет.
вы не настроив OCRA используете его прерывания? по умолчнию в том регистре 0. т.е. прерывание будет происходит при переходе 255 -> 0, равносильно что просто по переполнению. т.е. не до конца изучили принцип работы таймеров.
а расчет вашей 1мс простой, если делитель на 4, то таймер будет инкрементироваться в 4-ре раза медленней, при 1Мгц тактовой, один тик за 1 мксек, четыре соответственно за 4 мксек. таймер у нас 8-ми битный, т.е. макс значение 255, итого 255*4 = 1020 мксек. вот ваша милисекунда.
Спасибо огромное. Вот именно что я до конца и не разобрался (всё из за недостаточного знания английскова).
Теперь всё стало понятно.
Хм, вот что я заметел:
Чтобы получить ровно 1млсек, мне надо установить OCR1C на 249. Следовательно при 1.000.000Hz делим на 4 прескалер = 250.000 далее делим на OCR1C т.е. 250 получаем 1000 мксек, это и есть моя 1 млсек. Но вот осцелограф показывает 980 мксек.
А вот если я устанавливаю OCR1C на 255 либо 0 то осцелограф показывает ровно 1 млсек.
Где-то я опять не допанимаю.
ну на вход в прерывание и выход из него тоже время надо. может не столько, надо проверять, хотя на 1Мгц возможно и такое, давно на такой скорости не работал.
Спасибки.
Хм, вот что я заметел:
Чтобы получить ровно 1млсек, мне надо установить OCR1C на 249. Следовательно при 1.000.000Hz делим на 4 прескалер = 250.000 далее делим на OCR1C т.е. 250 получаем 1000 мксек, это и есть моя 1 млсек. Но вот осцелограф показывает 980 мксек.
А вот если я устанавливаю OCR1C на 255 либо 0 то осцелограф показывает ровно 1 млсек.
Где-то я опять не допанимаю.
Внутренний осциллятор?
Почитайте о его точности.