Имеется контроллер ATtiny13 Частоты внутреннего RC генератора составляют 4,8 MHZ и 9,6 MHZ. Для проекта (EEPROM не используется) необходима частота 6,0 MHZ Понятно что 4,8 + 25% = 6 MHZ Как при помощи регистра OSCCAL изменит частоту с 4,8 до 6 MHZ ??? Не могу понять как сделать чтобы частота за один цикл изменялась меньше чем на 2% (согласно datasheet) если, как я понимаю, запись в регистр OSCCAL происходит однократно при сбросе контролера. Возможно ли выстроит програмную цепочку чтобы увеличить частоту 4,8 MHZ на 25% для получения 6,0 MHZ ???
И ещё вопрос по таблице из datasheet: Как для одного значения регистра OSCCAL может быт такая большая разбежка в процентах, к примеру для $7F 75% 150% и что означают эти проценты, как их высчитывать????
Заранее всем спасибо!!! P.S. 10 раз прочитал datasheet, но работу OSCCAL ни как понять не могу
_________________ "Разум, единожды раздвинувший свои границы, никогда не вернется в границы прежние" Альбе́рт Эйнште́йн
“Так что же такое электричество? Уже на протяжении всей жизни я задаю себе этот вопрос.” Никола Тесла
Странно, что вы не нашли всю информацию в даташите. для того чтобы настроить ваш контроллер на требуемую частоту (6МГц), сначала нужно установить фьюзы для тактирования от 4,8 МГц. Далее нужно поменять значение регистра OSCCAL. В даташите написано соответствующее предупреждение о том КАК нужно это делать.
Цитата:
To ensure stable operation of the MCU the calibration value should be changed in small steps. A variation in frequency of more than 2% from one cycle to the next can lead to unpredicatble behavior. Changes in OSCCAL should not exceed 0x20 for each calibration. It is required to ensure that the MCU is kept in Reset during such changes in the clock frequency
Теперь про значения. раздел даташита 19.8 Internal Oscillator Speed скрин: Ну и про точность внутреннего генератора можно почитать в разделе 18.4 Clock Characteristics
Вложения:
Комментарий к файлу: значения OSCCAL values.PNG [28.41 KiB]
Скачиваний: 3069
Комментарий к файлу: фьюзы fuses.PNG [13.43 KiB]
Скачиваний: 2949
Странно, что вы не нашли всю информацию в даташите. для того чтобы настроить ваш контроллер на требуемую частоту (6МГц), сначала нужно установить фьюзы для тактирования от 4,8 МГц.
О том как выставить рабочую частоту 4,8 или 9,6 MHZ с помощью фьюзов я прекрасно знаю... Вопрос состоит в том как правильно организовать алгоритм записи значений в регистр OSCCAL чтобы увеличить рабочую частоту 4,8 MHZ на 25% и получить тем самым 6 MHZ и не превысить лимит перехода 2% от одной частоты к другой???
Главные открытые вопросы которые остаётся до сих пор открыты: 1) Как понимать нижеприведённую таблицу????
2) В datasheet указано (перевод брал из книги A.В.Белова "Самоучитель разработчика устройвств на микроконтроллерах AVR"): a) Изменение частоты более чем на 2% от одного цикла генератора до следующего может привести к непредсказуемому поведению микросхемы. Вопрос: Как задать это число в OSCCAL чтобы значение приращение было меньше 2% иначе контролер может зависнуть??? b) Изменение регистра OSCCAL не должно превышать 32 (0x20) за один шаг калибровки. Мне кажется здесь противоречие, так как 0x20 явно больше 2%???
Теперь мои предположения:
1) Если я правильно понял при записи во фьюзы CKSEL1..0 значения 01 частота внутреннего RC генератора выбирается 4,8 MHZ и это является эквивалентным тому что в регистр OSCCAL записывается значение (если смотреть по графику) приблизительно 84 (0x54). 2) Чтобы получить частоту 6 MHZ мне нужно изменить значение OSCCAL от 84 (0x54) до 105 (0x69) 3) Изменение OSCCAL от 84 до 105 в данном случае соответствует 25%. 4) 105-84 = 21; изменение OSCCAL на 21 (0x15) меньше максимально допустимого значения изменения 32 (0x20) OSCCAL 5) 25% / 21=1.2%. Получается что при изменении OSCCAL на 1 значение частоты будет увеличиваться на 1,2% от предыдущего. Что является меньше максимально допустимых 2%. 6) Вот пример моего программного кода:
ПОПРАВЬТЕ ЕСЛИ Я НЕ ПРАВ!!! Так как описание ррегистра OSСCAL брал из книги A.В.Белова "Самоучитель разработчика устройвств на микроконтроллерах AVR" - может неправильный по смыслу перевод и не даёт понять мне самой сути...
_________________ "Разум, единожды раздвинувший свои границы, никогда не вернется в границы прежние" Альбе́рт Эйнште́йн
“Так что же такое электричество? Уже на протяжении всей жизни я задаю себе этот вопрос.” Никола Тесла
Последний раз редактировалось Катяра Вс апр 15, 2012 02:12:13, всего редактировалось 11 раз(а).
так легче подкорректировать незначительное расхождение между 0,75 и 0,6, тем более, что начальное значение калибровки при 9,6 загружается автоматически, а при 4,8 его еще сначала хитрым способом достать надо ну и на крайний случай внешний генератор на 6МГц... хотя... а зачем такой садомазо- внутренний таймер с предделителем любую подгонку выполнить в состоянии, а аппаратных приемопередатчиков в 13й вроде как не имеется
Ваш приведенный код должен работать. Смысл того текста, который я процитировал из даташита, заключался именно в том, что нужно изменять регистр OSCCAL за несколько итераций, которые бы сильно не меняли частоту контроллера. А вообще, раз уж разобрались, расскажите для чего вам именно 6МГц? мне тоже интересно))) в этой тиньке нет аппаратных приемопередатчиков, следовательно все подгонки по частоте можно реализовать и программно, без шаманства с системной тактовой.
Ваш приведенный код должен работать. Смысл того текста, который я процитировал из даташита, заключался именно в том, что нужно изменять регистр OSCCAL за несколько итераций, которые бы сильно не меняли частоту контроллера. А вообще, раз уж разобрались, расскажите для чего вам именно 6МГц? мне тоже интересно))) в этой тиньке нет аппаратных приемопередатчиков, следовательно все подгонки по частоте можно реализовать и программно, без шаманства с системной тактовой.
Мне нужно чтобы частота выходного ШИМ сигнала составляла 23...24 KHZ. (самая оптимальная частота, выше восприятия человеческим ухом и не сильно нагружает выходной ключ). Я заметил что во многих устройствах подобного типа используется именно эта частота. T0 = 6 MHZ / 256 = 23.4 KHZ С помощью этого ШИМ сигнала будет задаваться скорость вращения электродвигателем. Думал сначала подогнать программно, но код получиться на порядки сложнее, а из-за задержки прерываний будут неточности в формировании сигнала. Я решил пойти по пути наименьшего сопротивления, если будут сбои, тогда уже буду делать программно...
_________________ "Разум, единожды раздвинувший свои границы, никогда не вернется в границы прежние" Альбе́рт Эйнште́йн
“Так что же такое электричество? Уже на протяжении всей жизни я задаю себе этот вопрос.” Никола Тесла
????! 24 килогерца и такой садомазо??? (9600000/8)/24000=50 + режим аппаратного ШИМ на выбор
В моём случае я могу использовать T0 = 255 и тем самым большую точность выбора ШИМ сигнала. А частота 1,2 MHZ - маловата для моего проекта, мне нужно ещё успевать обрабатывать входные сигналы. Я посчитал что 6 MHZ как раз будет всё успевать....
P.S. Это не такое уж садо-мазо:
Код:
for (Cnt = 84; Cnt<106; Cnt++ ) {OSCCAL = Cnt; }
_________________ "Разум, единожды раздвинувший свои границы, никогда не вернется в границы прежние" Альбе́рт Эйнште́йн
“Так что же такое электричество? Уже на протяжении всей жизни я задаю себе этот вопрос.” Никола Тесла
так есть возможность поднять ее вплоть до 9,6 ! 9,6 - 4,8 - 2,4 - 1,2(по умолчанию) кроме того у таймера есть возможность подключить предделитель... то же 4800000/200=24000 (и это при внутренней тактовой 4,8(исполнение команд) а основная 9,6) да... совсем склероз, я ж ассемблерист...
Последний раз редактировалось BOB51 Вс апр 15, 2012 12:32:13, всего редактировалось 2 раз(а).
"И незачем так орать" (с) Увеличение шрифта сообщения не прибавит понимания. Рекомендую читать оригинальный даташит, если не получается понять смысл вырезанной таблицы. Смотрим, читаем, переводим, вкуриваем!!!
BOB51 писал(а):
да... совсем склероз, я ж ассемблерист...
на ассемблере тоже не особо сложно. Но честно говоря мне было бы лень на месте топикстартера париться с калибровкой системной тактовой, если ее значение и так не особо стабильно и делал именно так, как Вы предложили - рассчитать значение таймера.
разжувываю: запускаемся на установках "по умолчанию" - RC генератор с заводской калибровкой на 9,6 МГц, меняем значение в CLKPR на коэффициент деления 2, тем самым сохраняя заводскую точность калибровки и повышая внутреннюю тактовку до 4,8МГц против исходных 1,2 (0,000000208s/команда вместо 0,000000833s/команда), а в таймере коэффициент деления 200 если еще хочется позаморачиваться теперь можно немножко "подергать" содержимое OSCCAL, благо там уже записано содержимое, соответствующее базовому значению частоты в 9,6МГц зато и частота ШИМ в пределах, и диапазон вариаций 200 шагов и быстродействие/стабильность соблюдены
Последний раз редактировалось BOB51 Вс апр 15, 2012 12:59:08, всего редактировалось 1 раз.
"И незачем так орать" (с) Увеличение шрифта сообщения не прибавит понимания. Рекомендую читать оригинальный даташит, если не получается понять смысл вырезанной таблицы. Смотрим, читаем, переводим, вкуриваем!!!
Прочитал несколько раз, не вкурил!!! Всё равно не могу понять смысл этой таблицы. Может кто объяснит что означают эти проценты....
_________________ "Разум, единожды раздвинувший свои границы, никогда не вернется в границы прежние" Альбе́рт Эйнште́йн
“Так что же такое электричество? Уже на протяжении всей жизни я задаю себе этот вопрос.” Никола Тесла
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения