![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
Nikkolaj
-
Постов
206 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Nikkolaj
-
-
Опубликовано · Изменено пользователем Nikkolaj · Пожаловаться
Спасибо, Артём !!
Попробовал, Code Vision AVR всё нормально принял.
Интересно, а для ОЗУ, FLASH тоже можно поступать аналогично?
-
Я их считывал... Для всех четырёх частот в МК были одни и те же значения. Подозреваю, что в МК один генератор на 8МГц, а остальные частоты получают путем деления этой частоты...
Ради интереса я тоже сейчас попробовал их прочитать.
Под руками был ATmega128, значения оказались разными, от 0x9B до 0xA1.
Сомнительно, что это один генератор и делитель.
Есть ещё и такой аргумент,
в типичных характеристиках процентное отклонение частоты для 1МГц как минимум в два раза меньше, чем для 8МГц.
К моему удивлению оказалось что из AVR Studio калибровочные ячейки можно не только прочитать,
но и сразу записать в любую ячейку как Flash, так и EEPROM.
Всё оказалось очень просто.
Я знаю в какую ячейку EEPROM я запишу нужное значение калибровки.
В программе прочитать его конечно можно и по процедуре чтения EEPROM.
Но можно ли сделать проще,
указать компилятору разместить мою переменную, например Calibr8, именно по этому адресу EEPROM ?
Тогда даже не надо будет задумываться над процедурой чтения EEPROM.
Можно ли это сделать в Code Vision AVR ?
-
Опубликовано · Изменено пользователем Nikkolaj · Пожаловаться
Спасибо за ответ.
Если программа в регистр OSCCAL ничего не заносит, то в него записываются "заводское значение" определенное для указанных в DS напряжении питания и температуре. Погрешность частоты при этих напряжении и температуре 3% или 10% (значение указано в DS, конкретно для mega8A - 3% при 5V и 25°C.).Насколько я понял, Если программа в регистр OSCCAL ничего не заносит,
то в него по сбросу записывается "заводское значение" для частоты 1МГц,
не зависимо от того, какую частоту мы зададим в конфигурационных ячейках.
Это значение для другой частоты, например 8МГц, может совсем и не подходить.
Заводское калибровочное значение для частоты, отличной от 1МГц, в регистр OSCCAL надо по сбросу записать в программе.
Я правильно понял?
-
Спасибо за ответы.
Почитал указанную документацию, в основном понятно.
Только программу к AppNote "AVR053: Calibration of the internal RC oscillator" я не смог найти, подскажите...
Хочется разобраться в возможностях внутреннего RC генератора на частоте 8МГц.
Задачи бывают разные, и требования к точности генератора тоже.
Скажите, правильно ли я понял, что:
1. если ничего не записывать в калибровочный регистр OSCCAL,
то гарантируемая изготовителем точность частоты будет +\- 10%, это в температурном диапазоне -40\+80С .
2. если записать заводское значение из калибровочной ячейки в калибровочный регистр OSCCAL,
то точность частоты будет +\- 3%, это при 25С,
а в температурном диапазоне -40\+80С надо добавить ещё примерно 2-2,5%,
в зависимости от контроллера, итого будет +\-5%.
3. если производить калибровку по внешней образцовой частоте, то можно получить точность
+\-1% в температурном диапазоне -40\+80С.
-
Компилятор Code Vision AVR
-
Контроллер ATmega8A, программатор STK500
-
Добрый день.
Хочу использовать в AVR контроллере внутренний генератор с частотой отличной от 1МГЦ.
Хочу произвести калибровку этой частоты.
Понимаю, что при программировании надо прочитать соответствующую калибровочную ячейку,
и записать её в определённый адрес ( например последний ) FLASH или EEPROM.
А в начале программы перезаписать его в калибровочный регистр OSCCAL.
Подскажите пожалуйста, как разместить переменную в конкретную ячейку FLASH памяти, или в EEPROM.
-
Возможно в железе вы не замечаете перезапуска программы.
Это исключено, при перезапусках она бы просто не работала.
-
В HELP STUDIO действительно указано что watshdog поддерживается не для всех контроллеров.
Правда, для моего ATmega16 написано что поддерживается.
Но это уже не имеет большого значения, попробовал программу в железе, она работает, это главное.
Будем считать что это баг симулятора, и следуя разумному совету от GDI, буду спокойнее к ним относится.
Спасибо всем за советы.
To ILYAUL.
Выходим из симмулятора и забываем его как кошмарный сонХорошо, а чем пользуемся взамен симулятора?
Кстати, подскажите как Вы вставляете в текст цитаты.
Я щёлкаю по иконке цитата, затем копирую нужный текст, и вставляю его между двух quote.
При этом цитата получается без верхне заглавной строчки.
-
Согласен, действительно Stop Watch в окне Processor не имеет отношения к вотчдогу.
Тут я ошибся.
Но команда wdr всё равно не обнуляет счётчик сторожевого таймера.
Это я чётко вижу при симуляции программы.
-
Где вы там нашли счётчик watchdog-а?
В AVR Studio, в окне Processor есть Stop Watch именно он и не сбрасывается
по ассемблерной команде wdr.
В результате симулятор через определённое время делает Reset.
PS Какой контроллер?Контроллер ATmega16.
Другое дело, что вочдог перед применением следует разрешить, и на разных процах эта процедура может быть разной.Вочдог в программе конечно разрешён,
возможно его сброс нужно дополнительно разрешать какими то опциями в симуляторе?
-
Добрый день.
При отладке программы на AVR Studio, versia 4.19
команда wdr (watch dog reset) не обнуляет счётчик сторожевого таймера.
Для отладки программы пришлось выключить сторожевой таймер.
Не подскажете, в чём может быть причина?
-
Если запихнуть обработчик программного SPI в таймер (сделать что-то на подобие диспетчера задач), то проблемма уйдет сама собой и ничего прерывать не нужно будет....
Спасибо за ответ, идея действительно красивая и неожиданная для меня.
Сейчас просчитывал как её реализовать.
К сожалению для этой задачи она не подойдёт по скорости.
Сейчас у меня время ожидания между действиями составляет 10-12 машинных тактов.
Вставить в это время диспетчер задач не получается.
Наверное диспетчер задач применяется для более медленных задач.
А вообще предложение интересное, возможно применю его в других задачах.
Ещё раз благодарю.
to xemul.
Спасибо за ответ.
Свой предыдущий пост я начал писать до того, как увидел Ваше сообщение,
поэтому получилось такое несколько несуразное смещение ответов. Извините.
Наши расчёты допустимого прерывания практически совпадают.
Это внушает оптимизм.
Попробую делать с прерыванием, тем более что его удалось уменьшить, и он будет не больше 10мкс.
-
Предполагаю, что ограничение частоты снизу вызвано не возможностью SPI порта АЦП,
а процессом разряда во времени входного конденсатора Сsample, на котором хранится измеряемое напряжение.
При минимальной частоте 85кГц цикл измерения будет примерно 150мкс.
Думаю что это и есть то время, которое конденсатор держит измеряемое напряжение с достаточной точностью.
Я работаю на частоте 400кГц, соответственно цикл измерения у меня будет примерно 30мкс.
Получается, что я могу прервать свой цикл измерения в любом месте примерно на 150-30= 120мкс.
Но полной уверенности в этом у меня нет, поэтому и спрашиваю.
-
Добрый день.
У меня такой вопрос.
Работаю с АЦП MCP3301.
Управляю им с помощью программного SPI на частоте 400кГц.
Аппаратный SPI занят другими задачами.
Во время измерения может поступить прерывание, на которое я обязан ответить,
и соответственно прервать посылки на MCP3301.
Спрашивается, на какое время можно прервать посылки на MCP3301 без потери точности измерения ?
В документации сказано, что минимальная частота = 85кГц.
-
Обычно SS у каждого slave свой - соответственно адрес в протоколе не нужен.
Это и есть стандартное использование SPI.
Да, я понимаю что стандартное использование SPI именно такое, но у меня в шине SPI только 4 провода, и больше просто нет.
Поэтому придётся адрес slave передавать в посылке.
А что на счёт стандартных протоколов, они существуют?
-
Тормозить будет если поступают прерывания также и из других источников. Если прерывание от SPI придёт во время того как обрабатывается другое прерывание, то выполнить SPDR=*TxData++; вовремя она может и не успеть.
В таком случае целесообразно в программе ведущего предусмотреть паузу перед выдачей следующего байта.
Величину паузы выбрать достаточной, для того что бы ведомый надёжно успевал загружать данные.
В развитие этой темы.
О протоколах передачи данных для подобных задач.
Для организации передачи данных по SPI между одним ведущим и несколькими ведомыми
существуют какие либо стандартные протоколы?
Или каждый разработчик пишет свой протокол?
Особенностью задачи является то, что сигнал SS один для всех ведомых,
т.е. ведущий задаёт адрес ведомого в протоколе.
-
Что такое my_inc_included ?
-
Извините, но из последних двух ответов я всё равно не понял,
как правильно обявить глобальные переменные, которые используются в нескольких файлах.
-
Ссылки на глобальные переменные можно собрать в одном заголовочном файле (какой-нибудь globvar.h, не забыть сделать стражи вкючения в нем) и использовать в других файлах с кодом.
Спасибо за ответ.
Я тоже думал обявить все глобальные переменные в одном globvar.h файле.
Что такое СТРАЖИ ВКЛЮЧЕНИЯ, и как ими пользоваться ?
Но в HELP для Сode Vision написано что
обявление глобальных переменных должны быть установлены в файлах с расширением С. ( а, не h )
Цитата из HELP для Сode Vision:
· global variables declarations must be placed in the .C files where necessary
· there's no need to declare global variables, that are not static, in header .H files, because if these files will be #include -ed more than once, the compiler will issue errors about variable redeclarations.
Попробовал обявить их во всех С файлах где они используются, компилятору это не нравится.
Подскажите как правильно.
-
Добрый день.
Спасибо за дистрибутив, я его скачал, но устанавливать пока не стал.
Я нашёл в чём была ошибка.
Я подключал к проекту все 3 файла в конфигурации по add files, а
в filemain.c у меня были директивы #include file1.c, #include file2.c.
Двойное подключение файлов компилятору и не нравилось.
Сейчас решил переделать правильно.
Из файла filemain.c директивы #include file1.c, #include file2.c удалил.
Добавил файл glob_defs.h для всех #define, и подключил его к нужным файлам.
Посоветуйте пожалуйста,
как праильно поступить с обявлением глобальных переменных,
которые используются в разных файлах.
-
Спасибо за ответ.
Хорошо, дайте Ваш дистрибутив, попробую переставить.
Путь без русских букв?Да, путь без русских букв.
Он вообще формирует только один файл с расширением .о filemain.о
-
Добрый день.
У меня такой вопрос.
Есть у меня проект, который я когда то сделал на Сode Vision AVR версия 1.25.9.
Контроллер ATmega16.
Возникла необходимость внести изменения в алгоритм.
С Сode Vision AVR я уже давно не работал, перешёл на IAR.
Поставил новую версию Сode Vision AVR, версия 2.05.0.
Компилируется проект нормально.
А при построении проекта выдаёт сообщение: Cant open file: ....\file1.o
Проект состоит из 3 СИ файлов, назовём их
filemain.c
file1.c
file2.c
И двух header. файлов:
file1.h
file2.h
В проект включены только СИ файлы, а header файлы подключены директивой #include.
В окне навигатора, в папке Проекта естественно находятся все три СИ файла.
После компиляции, в папке Проекта так и остаются три СИ файла,
а вот в папке Headers почему то находятся и СИ файлы, и Headers файлы:
file1.c
file1.h
mega16.h
file2.c
file2.h
Почему компилятор помещает file1.c, file2.c в папку Headers я не понимаю.
Пробовал менять конфигурацию проекта, результат такой же.
Посоветуйте что то толковое.
Не знаю, имеет ли это значение, но всё же, проект создавался под ОС Windovs XP, а сейчас стоит Windovs.7
Вроде бы вся информация.
-
Да, я понимаю что при изменении частоты в диапазоне 45 - 55Гц,
ДСП даст погрешность существенно выше, чем 1%.
Поэтому я планировал помимо измерения, следить за частотой,
и соответственно, периодически корректировать время между отсчётами.
Интересно, при каком изменении частоты, нужно начинать коррекцию.
К сожалению, я пока не знаю что такое адаптивный алгоритм.
Это то, что я написал, или что то другое?
Да, Вы правы, в пром сетях действительно далеко не чистый синус.
Калибровка частоты в AVR
в MCS51, AVR, PIC, STM8, 8bit
Опубликовано · Пожаловаться
Спасибо, посмотрел.
Такая возможность есть для ОЗУ и EEPROM.