Ассемблер (ASM) для AVR в вопросах и ответах
Вообще-то в документации так и написано что этим способом пользоваться не рекомендуется из-за того что эта конструкция работает по принципу чтение-модификация-запись. Правильней было бы хранить состояние порта в отдельной переменной, изменять её и потом целиком вывести в порт.
- Реклама
Вот уж глупости. Посмотрите внимательно даташит в разделе IO Ports и обратите внимание на синхронизатор, который и дает задержку в 1 такт. Делается это для борьбы с метастабильностью.
Вот цитата
Тоесть, за командой OUT нужно как минимум один NOP, после этого только занчение PINx примет правильное значение.
Учите матчасть
Вот цитата
И дальше по тексту там об этом еще есть.Independent of the setting of Data Direction bit DDxn, the port pin can be read through
the PINxn Register bit. As shown in Figure 21, the PINxn Register bit and the preceding
latch constitute a synchronizer. This is needed to avoid metastability if the physical pin
changes value near the edge of the internal clock, but it also introduces a delay. Figure
22 shows a timing diagram of the synchronization when reading an externally applied
pin value. The maximum and minimum propagation delays are denoted tpd,max and tpd,min
respectively.
Тоесть, за командой OUT нужно как минимум один NOP, после этого только занчение PINx примет правильное значение.
Учите матчасть
Все будет только лучше, в крайнем случае - хуже.
В общем, вопрос даже не столько по АСМу...
ATtiny13
Кто-нибудь имел дело с калибровочным регистром RC-генератора OSCCAL? Насколько я понял, с завода МК поставляется с таким значением, чтобы обеспечивать точность тактовой частоты 1% (или сколько там). При этом значение в регистр заносится из ПЗУ во время ресета?
Чтобы софтово разгонять МК, выкручивая этот регистр на полную, придётся каждый раз после ресета это делать? Хотя дальше они пишут
В общем, буду рад если кто-нибудь поделится опытом, знанием и/или догадками.
ATtiny13
Кто-нибудь имел дело с калибровочным регистром RC-генератора OSCCAL? Насколько я понял, с завода МК поставляется с таким значением, чтобы обеспечивать точность тактовой частоты 1% (или сколько там). При этом значение в регистр заносится из ПЗУ во время ресета?
В АВР Студии (на закладке Advanced) можно считать значение калибровочного байта и... записать его по указанному адресу во флэш или еепром? Не совсем понятно зачем.Writing the calibration byte to this address will trim the internal Oscillator to remove process variations from the Oscillator frequency. This is done automatically during Chip Reset... Writing 0x7F to the register gives the highest available frequency.
Чтобы софтово разгонять МК, выкручивая этот регистр на полную, придётся каждый раз после ресета это делать? Хотя дальше они пишут
Что не стоит разгонять более чем на 10%, если флэш или еепром уже записаны. Откуда такое ограничение, если МК может работать до 20 МГц? Непонятно.The calibrated Oscillator is used to time EEPROM and Flash access. If EEPROM or Flash is written, do not calibrate to more than 10% above the nominal frequency. Otherwise, the EEPROM or Flash write may fail. Note that the Oscillator is intended for calibration to 9.6 MHz or 4.8 MHz. Tuning to other values is not guaranteed, as indicated in Table 6-7 below.
Ну, тут вроде всё понятно — разгонять МК небольшими шагами.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
В общем, буду рад если кто-нибудь поделится опытом, знанием и/или догадками.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Так он только для унутреннего приема -Откуда такое ограничение, если МК может работать до 20 МГц?
насколько я помню. Ну да - в tiny11 -tuj вообще нетthe internal Oscillator
Последний раз редактировалось ILYAUL Ср июн 13, 2012 10:25:25, всего редактировалось 1 раз.
Вы к тому, что сам RC-генератор не сможет работать быстрее? Зачем они тогда рисуют график и таблицу, где написано и нарисовано что этот генератор можно разогнать до 200% — 19 МГц?ILYAUL писал(а):Так он только для унутреннего приема
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
Таки пришлось открыть DS
Мне не нравится сие утверждение перед приведённой таблице
Мне не нравится сие утверждение перед приведённой таблице
Note that the Oscillator is intended for calibration to 9.6 MHz or
4.8 MHz. Tuning to other values is not guaranteed.....
Насколько я понял, не гарантируется т.к. неизвестно какое значение установлено на заводе при калибровке. Т.е. там вполне может оказаться и 0x7F, так что разогнать не получится — только замедлить. Или наоборот 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Студия читает калибровочное значение.Они предупреждают , что внутренний генератор работает с номинальными частотати 9.6 и 4.8 Мгц. и не гарантируют настройку на другие чачтоты. Также:
Вот эту последнюю их мысль , честно говоря не очень понял
.Изменения в OSCCAL не должны превышать 0x20 для каждой калибровки. Необходимо убедиться, что микроконтроллер находится в Reset во время этих изменений
Вот эту последнюю их мысль , честно говоря не очень понял
Мне гугль перевёл что в противном случае МК ресетнится, если за раз перестроиться больше чем на 0x20.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Вот я и не понял их мысль - заглянул в справочники - они по этому поводу вообще молчат.
Но обратите особое внимание на это
Но обратите особое внимание на это
Да и нашёл вот этоThe calibrated Oscillator is used to time EEPROM and Flash access. If EEPROM or Flash is
written, do not calibrate to more than 10% above the nominal frequency. Otherwise, the
EEPROM or Flash write may fail.
- Вложения
-
- Calibration of the internal RC oscillator.zip
- (81.25 КБ) 184 скачивания
-
- Calibration of the internal RC oscillator.pdf
- (86.52 КБ) 657 скачиваний
И это мне непонятно — я тоже привёл эту цитату в своём посте.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Если Вы про это .The calibrated Oscillator is used to time EEPROM and Flash access. If EEPROM or Flash is
written, do not calibrate to more than 10% above the nominal frequency. Otherwise, the
EEPROM or Flash write may fail.
Калиброванный (внутренний) генератор используется для доступа к EEPROM и FLASH. Если они уже были записаны , то не стоит подстраивать генератор больше чем 10% от номинальной частоты. Иначем , можно "потерять" их насовсем.
Мдя. Лучше не трогать, как я понял.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Там ведь в чем фишка, калибровочная константа хранится в отдельном адресном пространстве, и заносится только при прошивке. Оттуда значение калибровки копируется в регистр калибровки ТОЛЬКО ДЛЯ 9.6МГЦ если ставишь 4.8, значение калибровки не копируется автоматически.
На заводе калибруется с точностью 10% (для тини13 однако, для других контроллеров точность выше - смотри даташит). Поэтому при работе на 4.8Мгц нужно предусмотреть программную загрузку регистра калибровки из общедоступной EEPROM, т.е. константу надо считать программатором для 9.6Мгц и занести в исходник программы как константу в EEPROM, а потом реализовать код загрузки этой константы в регистр калибровки.
генератор при этом один и тот же, просто частота делится на два, поэтому калибровка подойдет и для 4.8Мгц.
Про гарантии - если внимательно почитать даташит, то вы увидите что зависимость частоты от кода НЕЛИНЕЙНАЯ и гарантировать что поставишь такой-то код и частота изменится на 2% - нельзя. При том что калибровка производится для напряжения 3.3В при 20 градусах.
В даташите кстати даны приблизительные зависимости частоты от кода и температуры, так что можно прикинуть(по методу пальца в небо) на сколько нужно изменить код чтобы попасть в нужную частоту.
Потом на этот генератор завязаны временные интервалы записи во ФЛЕШ-память, при сильном отклонении от номинала контроллер либо не будет успевать записать ячейку что чревато частыми ошибками либо будет их пересвечивать что тоже чревато ошибками, и скорей всего это будет сильнее проявляться при экстремальных температурах.
Мне приходилось заниматься этим вопросом, среди 8 контроллеров у двух отклонение частоты было чуть более 4%, остальные до 2%.
получилось вот так:
На заводе калибруется с точностью 10% (для тини13 однако, для других контроллеров точность выше - смотри даташит). Поэтому при работе на 4.8Мгц нужно предусмотреть программную загрузку регистра калибровки из общедоступной EEPROM, т.е. константу надо считать программатором для 9.6Мгц и занести в исходник программы как константу в EEPROM, а потом реализовать код загрузки этой константы в регистр калибровки.
генератор при этом один и тот же, просто частота делится на два, поэтому калибровка подойдет и для 4.8Мгц.
Про гарантии - если внимательно почитать даташит, то вы увидите что зависимость частоты от кода НЕЛИНЕЙНАЯ и гарантировать что поставишь такой-то код и частота изменится на 2% - нельзя. При том что калибровка производится для напряжения 3.3В при 20 градусах.
В даташите кстати даны приблизительные зависимости частоты от кода и температуры, так что можно прикинуть(по методу пальца в небо) на сколько нужно изменить код чтобы попасть в нужную частоту.
Потом на этот генератор завязаны временные интервалы записи во ФЛЕШ-память, при сильном отклонении от номинала контроллер либо не будет успевать записать ячейку что чревато частыми ошибками либо будет их пересвечивать что тоже чревато ошибками, и скорей всего это будет сильнее проявляться при экстремальных температурах.
Мне приходилось заниматься этим вопросом, среди 8 контроллеров у двух отклонение частоты было чуть более 4%, остальные до 2%.
получилось вот так:
Код: Выделить всё
// Константа находится в EEPROM, по адресу ee_calibration;
LDI R16, ee_calibration // адрес
OUT EEAR, R16
SBI EECR, 0 ; Команда чтения
IN R16, EEDR
OUT OSCCAL, R16 ; заносим калибровкуAlexeyslav, спасибо. Более-менее понятней стало.
Ещё раз повторюсь: задача — максимально разогнать тиньку, так что исходные данные — это генератор 9.6 МГц без делителя.
Если не планируется запись ни во флэш, ни в еепром — можно разгонять? И это надо будет делать после каждого ресета? Причём в ДШ рекомендуют разгонять постепенно (не более чем на 0x20). Т.е. считав значение калибровочной константы программатором, можно прикинуть насколько конкретный МК поддаётся разгону?
Ещё раз повторюсь: задача — максимально разогнать тиньку, так что исходные данные — это генератор 9.6 МГц без делителя.
Если не планируется запись ни во флэш, ни в еепром — можно разгонять? И это надо будет делать после каждого ресета? Причём в ДШ рекомендуют разгонять постепенно (не более чем на 0x20). Т.е. считав значение калибровочной константы программатором, можно прикинуть насколько конкретный МК поддаётся разгону?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Если не секрет, что за задача что 9,6 мгц не хватает?Gudd-Head писал(а):задача — максимально разогнать тиньку, так что исходные данные — это генератор 9.6 МГц без делителя.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Используй внешний тактовый генератор. Там можно и 20Мгц использовать, но при этом надо подать соответствующее напряжение на контроллер.
Да вообще, изврат это делать DC-DC преобразователь на микроконтроллере который для этого не предназначен. Проще уж использовать народную MC34063 которая даже дешевле контроллера.
Но если уж так хочется сделать на микроконтроллере, существуют специальные для ШИМ-регуляторов, там и выходы с аппаратным "мертвым временем" симметрично раздвоенные - можно от одного ключ запитать, а от другого синхронный выпрямитель.
Да вообще, изврат это делать DC-DC преобразователь на микроконтроллере который для этого не предназначен. Проще уж использовать народную MC34063 которая даже дешевле контроллера.
Но если уж так хочется сделать на микроконтроллере, существуют специальные для ШИМ-регуляторов, там и выходы с аппаратным "мертвым временем" симметрично раздвоенные - можно от одного ключ запитать, а от другого синхронный выпрямитель.
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Даже не думал, что для DC-DC преобразователя такие ресурсы нужны.....Gudd-Head писал(а):DC-DC Step-Down на ATtiny13
При чём тут ресурсы? Даже на тупой программный меандр (на любую ногу вывести) надо как минимум 9 тактов. А там еще обработать что-то надо...
Поэтому и делают подобные вещи на "железных" микросхемах. Хотя сама задумка интересная
Поэтому и делают подобные вещи на "железных" микросхемах. Хотя сама задумка интересная


