ATtiny, внутренний генератор бит CKOUT

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Доброго времени суток!

Решил сделать ещё один маленький шажок к хардкору и поиграться с завалявшейся ATtiny45. Задача была: 1) помигать светодиодом раз в 10 секунд; 2) померять чо там внутренний RC генератор выдаёт (в даташите указано отклонение до 10%, его-то и хотелось оценить) <!--break-->

По второму пункту у нас в даташите пишут вот что:

Цитата:
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.
Ну я собственно и установил этот бит. Подал питание, тыкаю щупом осцилографа в ногу 3 (где PB4) - а мне показывает синус частотой 25 МГц (2.5 периода в клетке при 0.1us). WTF? Как тогда иначе вытащить такты наружу?

Схема:

Схема подключения ATtiny тестовая

Фьюзы:

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(); //разрешить глобальные прерывания

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

По первому пункту походу что-то с инициализацией. Заподозрил, что 25 больше чем 10 примерно во столько же раз, во сколько 255 больше 97. Загнал в OCR1A число 25 - а длительность-то и не шелохнулась. Вывод - счетчик считает до конца и не сбрасывается при совпадении. Но блин... я ведь установил бит CTC1 в регистре TCCR1. Чего ж я забыл выполнить?

С фьюзом CKOUT пока без новостей. Буду признателен, если специалисты подскажут решения данных вопросов :)

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

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 раз меньше тактовой.


void setup() {
DDRB|=(1<<DDB1)|(1<<DDB4);
TCCR1= (1<<CTC1)|(1<<COM1A0)|(1<<CS10); 
GTCCR=1<<COM1B0;
OCR1C=99; 
}
  
void loop() {}


  

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

dimax, спасибо за ответ.

Про 25 МГц - факт, что оно было на экране в реале. Фиг знает откуда поймалось. В протеусе цифровой анализ показывает, что нога вообще в Z-состоянии или типа того, аналоговый - 0 вольт. 

Вы мне видимо предложили померять частоту косвенно, с помощью таймера. Я, в общем-то, так и пытался сделать, одновременно проверяя вариант с CKOUT. Просто оно-то и не получилось (второе) - хочу понять, почему с этим фьюзом получается не то, чего я ожидал после прочтения документации.

Ваш код мне, однако, помог с таймером. Пока пытался понять этот винегрет из A, B и C, вчитался внимательнее и наткнулся на строку

Цитата:
reset to $00 in the CPU clock cycle after a compare match with OCR1C register value
А я загонял значение для сравнения в OCR1A :-P Так что спасибо, будем проверять.