ATtiny, внутренний генератор бит CKOUT
- Войдите на сайт для отправки комментариев
Сб, 28/11/2015 - 13:17
Доброго времени суток!
Решил сделать ещё один маленький шажок к хардкору и поиграться с завалявшейся ATtiny45. Задача была: 1) помигать светодиодом раз в 10 секунд; 2) померять чо там внутренний RC генератор выдаёт (в даташите указано отклонение до 10%, его-то и хотелось оценить) <!--break-->
По второму пункту у нас в даташите пишут вот что:
Ну я собственно и установил этот бит. Подал питание, тыкаю щупом осцилографа в ногу 3 (где PB4) - а мне показывает синус частотой 25 МГц (2.5 периода в клетке при 0.1us). WTF? Как тогда иначе вытащить такты наружу?
The device can output the system clock on the CLKO pin (when not used as XTAL2 pin). To enable the output, the CKOUT Fuse has to be programmed. This mode is suitable when the chip clock is used to drive other circuits on the system. Note that the clock will not be output during reset and that the normal operation of the I/O pin will be overridden when the fuse is programmed. Internal RC Oscillator, WDT Oscillator, PLL, and external clock (CLKI) can be selected when the clock is output on CLKO.
Схема:
Фьюзы:
High: 0xDF Low: 0xA2 Ext: 0xFF
Программатор ArduinoISP + Sinaprog 2.1
По первому пункту, кстати, тоже проблема есть - светодиод мигает раз в 25 секунд, а не 10. Для отсчета времени использовался таймер в режиме CTC и прерывания. Связано это с генератором, или инициализация неправильная чтоли?
TCCR1=0x8E; //CTC вкл., делитель 8192 (период 1.024 мс при тактовой 8 МГц) OCR1A = 97; //счетчик 1 считает до 97 (~0.1 сек) TIFR = (1<<OCF1A); //сброс флага прерываний по совпадению счетчика TIMSK |= (1<<OCIE1A); //Разрешить прерывания от таймера 1 по совпадению sei(); //разрешить глобальные прерывания
По первому пункту походу что-то с инициализацией. Заподозрил, что 25 больше чем 10 примерно во столько же раз, во сколько 255 больше 97. Загнал в OCR1A число 25 - а длительность-то и не шелохнулась. Вывод - счетчик считает до конца и не сбрасывается при совпадении. Но блин... я ведь установил бит CTC1 в регистре TCCR1. Чего ж я забыл выполнить?
С фьюзом CKOUT пока без новостей. Буду признателен, если специалисты подскажут решения данных вопросов :)
dezz0riented, я не имел дела с tiny45, но имел с tiny85, а они как известно кровные родственники. Откуда у вас на выходе CLK0 25 MHZ уму не постяжимо. Там может быть только 3 основных частоты, либо 8Мгц при CLKSEL=0010, либо 16Мгц при CLKSEL=0001, либо 6,4Мгц при CLKSEL=0011. При включении бита CKDIV8 они соответсвенно поделяться на 8. Но варианта 25МГц тут нет.
По второму вопросу -вы привели огрызок программы. Ничего не понятно. Голый таймер1 в тини 45/85 не способен генерить частоты ниже чем: F_CPU/2/16384/256. Всё зависит от того, какая у вас тактовая. тактовую можно осциллом измерить, задав таймеру точный параметр. Например в данном скетче на выходах B1, B4 будет частота ровно в 200 раз меньше тактовой.
dimax, спасибо за ответ.
Про 25 МГц - факт, что оно было на экране в реале. Фиг знает откуда поймалось. В протеусе цифровой анализ показывает, что нога вообще в Z-состоянии или типа того, аналоговый - 0 вольт.
Вы мне видимо предложили померять частоту косвенно, с помощью таймера. Я, в общем-то, так и пытался сделать, одновременно проверяя вариант с CKOUT. Просто оно-то и не получилось (второе) - хочу понять, почему с этим фьюзом получается не то, чего я ожидал после прочтения документации.
Ваш код мне, однако, помог с таймером. Пока пытался понять этот винегрет из A, B и C, вчитался внимательнее и наткнулся на строку