Jump to content
    

Влияние регистра CLKPR (Clock Prescale Register) в режиме программирования

Уважаемые форумчане, помогите разобраться. Как известно, в ATtiny регистр CLKPR задает коэф-т деления и определяет системную тактовую частоту. Если фьюз CKDIV8 запрограммирован, то четыре младших разряда регистра CLKPR равны 0011, а если не запрограммирован, то они равны 0000. Т.к. регистр CLKPR относится к энергозависимой памяти (SRAM), то при отключении питания его содержимое по идее должно сбрасываться в начальное состояние, которое определяется значением фьюза CKDIV8 и которое не зависит от той программы, которая записана в Flash-память м-контроллера.

Проблема собственно в следующем: есть м-сх ATtiny13A, работающая от внутреннего генератора 9,6 МГц. Фьюз CKDIV8 запрограммирован и его состояние я не менял. Сначала (со старой программой) ATtiny13A прекрасно программировалась и читалась программатором. Затем я записал новую программу, в которой применил коэф-т деления генератора на 256 (младшие разряды регистра CLKPR равны 1000). Программа записалась и правильно работала, но контроллер перестал читаться и я не мог его перепрограммировать. Когда же я уменьшил частоту SCK программатора, то м-сх опять стала читаться и программироваться. После этого я снова записал старую программу, в которой не было деления частоты генератора на 256, и снова м-сх стала читаться программатором с высокой частотой SCK.

Вопрос: почему ?

Share this post


Link to post
Share on other sites

... то при отключении питания его содержимое по идее должно сбрасываться в начальное состояние, которое определяется значением фьюза CKDIV8 и которое не зависит от той программы, которая записана в Flash-память м-контроллера.

При подаче сигнала Reset (внешний и внутренний). А т.к. программирование всегда начинается с подачи Reset, то содержимое CLKPR не должно влиять на программирование. Точнее на частоту клока программатора.

Edited by GetSmart

Share this post


Link to post
Share on other sites

Хм... Я бы поостерегся утверждать, что "Reset" _после_ подачи питания приводит к тем же результатам, что и сам факт сброса по питанию. Т.е. если программа все ж стартовала и проинициализировала регистр CLKPR - могу допустить, что последующий внешний сброс не изменит состояние. Не проверял, поэтому не уверен (хотя проверить, в общем-то, дело недолгое, состояние CLKPR отправить на ноги и посмотреть, что там появляется). Как обойти - понятно, удерживать активный сброс от момента включения до начала программирования.

Share this post


Link to post
Share on other sites

Если только предположить, что разработчики накосячили. Т.к. этот регистр, как и многие другие обязан сбрасываться в стартовое состояние всегда при сбросе, т.к. он задаёт частоту ядра и всего остального. Стартовое значение указывается в комплит даташите. Очевидно, что и по включению питания и по какому-либо сбросу запускаться программа должна одинаково. Но можно пофантазировать, что регистр мог инициализироваться не при активации Reset, а при дезактивации.

 

Как говорил Ленин: практика - критерий истины. Но важно её ещё правильно "интерпретировать", если это аналог чёрного ящика.

Edited by GetSmart

Share this post


Link to post
Share on other sites

Смущает то, что состояние младших четырех битов объявлено "see bit description". А по логике, там должно бы быть только два варианта в зависимости от фьюза CKDIV8.

Когда в очередной раз буду с tiny13 играться - проверю...

Share this post


Link to post
Share on other sites

А по логике, там должно бы быть только два варианта в зависимости от фьюза CKDIV8.

Там так и написано. Значение бит будет либо 0000 либо 0011. В переводе на делитель 1/1 или 1/8.

Share this post


Link to post
Share on other sites

Я вижу, что именно так написано, например, в даташите на ATmega168, но для tiny13 в даташите Rev. 2535J–AVR–08/10 - явного указания не увидел. Или читаю невнимательно ? Впрочем, все равно при случае проверю...

Share this post


Link to post
Share on other sites

Я вижу, что именно так написано, например, в даташите на ATmega168, но для tiny13 в даташите Rev. 2535J–AVR–08/10 - явного указания не увидел. Или читаю невнимательно ? Впрочем, все равно при случае проверю...

 

Да, я тоже заметил этот интересный момент. В даташитах, например, ATtiny2313, ATtiny25, ATtiny48 в разделе, в котором описываются биты CLKPS регистра CLKPR, сказано:

The CKDIV8 Fuse determines the initial value of the CLKPS bits. If CKDIV8 is unprogrammed, the CLKPS bits will be reset to “0000”. If CKDIV8 is programmed, CLKPS bits are reset to “0011”, giving a division factor of eight at start up.

А в соответствующем разделе даташита ATtiny13 этой фразы нет.

 

Share this post


Link to post
Share on other sites

Странно, а у меня в Rev 2535D (Preliminary 2004-ого года) почему-то есть. Скрин места сразу над таблицей расшифровки делителей CLKPR. Более новую ревизию не смотрел.

 

На тему CLKPR в даташите нет особых уточнений, что он может инициализироваться только при включении питания. Применяя аналогию с другими регистрами, "initial value" регистра можно толковать как постоянно выставляемую при включении питания и ЛЮБОМ сбросе.

 

В эррате есть какое-то упоминание о проблемах с программированием при фьюзах, задающих очень короткое startup-time. Может из-за этого проблемы.

post-16753-1453585281_thumb.png

Edited by GetSmart

Share this post


Link to post
Share on other sites

Посмотрел, да действительно в предварительной версии даташита (Preliminary 2004-ого года) эта фраза была. А в даташите за 2010 год (Rev 2535J–AVR–08/10) этого уже нет. Почему-то решили убрать.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...