Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Вообще-то в документации так и написано что этим способом пользоваться не рекомендуется из-за того что эта конструкция работает по принципу чтение-модификация-запись. Правильней было бы хранить состояние порта в отдельной переменной, изменять её и потом целиком вывести в порт.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

Вот уж глупости. Посмотрите внимательно даташит в разделе IO Ports и обратите внимание на синхронизатор, который и дает задержку в 1 такт. Делается это для борьбы с метастабильностью.
Вот цитата
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 примет правильное значение.
Учите матчасть :)
Все будет только лучше, в крайнем случае - хуже.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

В общем, вопрос даже не столько по АСМу...
ATtiny13
Кто-нибудь имел дело с калибровочным регистром RC-генератора OSCCAL? Насколько я понял, с завода МК поставляется с таким значением, чтобы обеспечивать точность тактовой частоты 1% (или сколько там). При этом значение в регистр заносится из ПЗУ во время ресета?
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.
В АВР Студии (на закладке Advanced) можно считать значение калибровочного байта и... записать его по указанному адресу во флэш или еепром? Не совсем понятно зачем.
Чтобы софтово разгонять МК, выкручивая этот регистр на полную, придётся каждый раз после ресета это делать? Хотя дальше они пишут
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.
Что не стоит разгонять более чем на 10%, если флэш или еепром уже записаны. Откуда такое ограничение, если МК может работать до 20 МГц? Непонятно.
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
Ну, тут вроде всё понятно — разгонять МК небольшими шагами.

В общем, буду рад если кто-нибудь поделится опытом, знанием и/или догадками.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Откуда такое ограничение, если МК может работать до 20 МГц?
Так он только для унутреннего приема -
the internal Oscillator
насколько я помню. Ну да - в tiny11 -tuj вообще нет
Последний раз редактировалось ILYAUL Ср июн 13, 2012 10:25:25, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ILYAUL писал(а):Так он только для унутреннего приема
Вы к тому, что сам RC-генератор не сможет работать быстрее? Зачем они тогда рисуют график и таблицу, где написано и нарисовано что этот генератор можно разогнать до 200% — 19 МГц?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение 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.....
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Насколько я понял, не гарантируется т.к. неизвестно какое значение установлено на заводе при калибровке. Т.е. там вполне может оказаться и 0x7F, так что разогнать не получится — только замедлить. Или наоборот :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Студия читает калибровочное значение.Они предупреждают , что внутренний генератор работает с номинальными частотати 9.6 и 4.8 Мгц. и не гарантируют настройку на другие чачтоты. Также:
Изменения в OSCCAL не должны превышать 0x20 для каждой калибровки. Необходимо убедиться, что микроконтроллер находится в Reset во время этих изменений
.
Вот эту последнюю их мысль , честно говоря не очень понял
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Мне гугль перевёл что в противном случае МК ресетнится, если за раз перестроиться больше чем на 0x20.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Вот я и не понял их мысль - заглянул в справочники - они по этому поводу вообще молчат.
Но обратите особое внимание на это
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 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

И это мне непонятно — я тоже привёл эту цитату в своём посте.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

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% от номинальной частоты. Иначем , можно "потерять" их насовсем.
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Мдя. Лучше не трогать, как я понял.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Там ведь в чем фишка, калибровочная константа хранится в отдельном адресном пространстве, и заносится только при прошивке. Оттуда значение калибровки копируется в регистр калибровки ТОЛЬКО ДЛЯ 9.6МГЦ если ставишь 4.8, значение калибровки не копируется автоматически.

На заводе калибруется с точностью 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     ; заносим калибровку
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Alexeyslav, спасибо. Более-менее понятней стало.
Ещё раз повторюсь: задача — максимально разогнать тиньку, так что исходные данные — это генератор 9.6 МГц без делителя.
Если не планируется запись ни во флэш, ни в еепром — можно разгонять? И это надо будет делать после каждого ресета? Причём в ДШ рекомендуют разгонять постепенно (не более чем на 0x20). Т.е. считав значение калибровочной константы программатором, можно прикинуть насколько конкретный МК поддаётся разгону?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Gudd-Head писал(а):задача — максимально разогнать тиньку, так что исходные данные — это генератор 9.6 МГц без делителя.
Если не секрет, что за задача что 9,6 мгц не хватает?
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Используй внешний тактовый генератор. Там можно и 20Мгц использовать, но при этом надо подать соответствующее напряжение на контроллер.

Да вообще, изврат это делать DC-DC преобразователь на микроконтроллере который для этого не предназначен. Проще уж использовать народную MC34063 которая даже дешевле контроллера.

Но если уж так хочется сделать на микроконтроллере, существуют специальные для ШИМ-регуляторов, там и выходы с аппаратным "мертвым временем" симметрично раздвоенные - можно от одного ключ запитать, а от другого синхронный выпрямитель.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Gudd-Head писал(а):DC-DC Step-Down на ATtiny13 :)))
Даже не думал, что для DC-DC преобразователя такие ресурсы нужны.....
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

При чём тут ресурсы? Даже на тупой программный меандр (на любую ногу вывести) надо как минимум 9 тактов. А там еще обработать что-то надо...
Поэтому и делают подобные вещи на "железных" микросхемах. Хотя сама задумка интересная :)
Ответить

Вернуться в «AVR»