реклама на сайте
подробности

 
 
17 страниц V  « < 10 11 12 13 14 > »   
Reply to this topicStart new topic
> MSP430 - снова вопросы от чайника, Вопросы от чайника про MSP и магнитный компас
Сергей Борщ
сообщение Nov 19 2008, 08:49
Сообщение #166


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(VAI @ Nov 19 2008, 06:57) *
Сами константы объявлены в файле, где функция main(), а используются в других файлах. Такого не наблюдал.
Наступал на эти же грабли 4 года назад. volatile помогло даже без разнесения по разным файлам. Судя по листингам, ИАР был версии 2.21B. Учитывая, что современные компиляторы умеют компилить сразу все файлы, volatile следует признать наиболее правильным решением. А в тех местах, где volatile-поведение нежелательно - корпировать во временную переменную.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 19 2008, 09:06
Сообщение #167


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Еще один вариант.
Заодно привязка к абсолютному адресу.

#define Firmware "1.07"

#pragma constseg=VERSION
const char version[6] = Firmware;
#pragma constseg=default

// Constant data
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1100-FFCF
-Z(CONST)VERSION=FFD0-FFDF


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 19 2008, 11:42
Сообщение #168


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(VAI @ Nov 19 2008, 09:57) *
У меня ИАР жрет такую конструкцию, код становится несколько иным, как и положено при работе с волатильными переменными. Может, при такой конструкции ИАР не будет заменять константы их значениями.
rezident, можете это проверить у себя?
Пробовал уже и такое. В 4.10A не катит. sad.gif
Цитата
Error[Be022]: location address not allowed for initialized variables (writable variables without the __no_init attribute) \_LIB\main.c 26

К сочетанию volitile и const у компилятора идиосинкразия какая-то. laughing.gif
Цитата(zhevak @ Nov 19 2008, 12:15) *
2. А не пробовали разнести эту структуру и main по разным файлам?
Это не совсем укладывается в идеологию сборки программы из готовых библиотечных модулей. Библиотеки мои собственные конечно же.
Цитата(Dog Pawlowa @ Nov 19 2008, 14:06) *
Еще один вариант.
Заодно привязка к абсолютному адресу.
С #pragma constseg тоже какая-то фишка есть. Типа компилятор предлагает #pragma location воспользоваться или что-то такое.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2008, 11:51
Сообщение #169


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(rezident @ Nov 19 2008, 13:42) *
К сочетанию volitile и const у компилятора идиосинкразия какая-то. laughing.gif
Хм. Открыл io430x14x.h, читаю там:
Код
#ifdef __cplusplus
#define __READ    /* not supported */
#else
#define __READ    const
#endif

/* Sum Extend */
__no_init volatile unsigned __READ short SUMEXT @ 0x013E;
Т.е. в режиме голого С должно работать. Почему в режиме С++ оно not supported - загадка.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Daria
сообщение Nov 19 2008, 18:19
Сообщение #170


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Nov 19 2008, 14:42) *
Пробовал уже и такое. В 4.10A не катит. sad.gif

К сочетанию volitile и const у компилятора идиосинкразия какая-то.

Да, а я как раз хотела спросить. почему на const volatile у меня выдается ошибка biggrin.gif

Ладно, вопрос вот в чем - у меня два сегмента CONST по 128 байт, хочу хранить во flash коэффициенты фильтров. Учитывая, что каждом сегменте уже хранятся калибровочные константы, места не хватит smile.gif могу ли я записать коэффициенты в information - у меня 60КВ, сама прога занимает 20КВ, будет не больше 30, т.е. если писать, начиная с адреса, который ни при каких обстоятельствах не будет перезаписан кодом
#pragma location=0xFE40,
и рассчитывая, что не перезатрутся адреса вектора прерываний - можно?
Вообще работает, я проверила, biggrin.gif но не возникнет каких-нибудь неожиданных побочных эффектов?
И еще вопрос. не совсем по теме, но важный:
мне нужно сделать цифровой фильтр, на очень низкой частоте. примерно10- 20Гц. Полоса пропускания аналогового фильтра 4кГц. Посчитала в MATLAB коф-ты КИХ-фильтра - получилось 127 коэффициентов. Шесть каналов. Т.е. в ОЗУ для фильтрауии постоянно должны висеть массивы на 600В. Никак нельзя crying.gif всего 2КВ, и так в притык. Как быть?
Кто знает какие-нибудь фильтры, которые позволили бы задавить сигнал до такой низкой частоты и занимали бы как можно меньше времени и места в памяти?
Как вообще обычно делается фильтрация? темная я, темная smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 19 2008, 22:00
Сообщение #171


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Nov 19 2008, 23:19) *
Ладно, вопрос вот в чем - у меня два сегмента CONST по 128 байт, хочу хранить во flash коэффициенты фильтров. Учитывая, что каждом сегменте уже хранятся калибровочные константы, места не хватит smile.gif
Именно места в сегменте не хватит или при перезаписи нужно переписывать только часть сегмента, а ОЗУ для временного буфера не хватает? Во втором случае можно использовать какой-либо выделенный сегмент Flash как временный буфер.
Т.е. допустим вам нужно переписать 10 байт в сегменте INFOA (0x1000-0x107F), начиная с адреса 0x1012. Вы переписываете из INFOA в заранее зарезервированый сегмент TEMPSEG данные, начиная с 0x1000 по 0x1011. Затем вставляете в TEMPSEG 10 требуемых байт с адреса 0x1012 по 0x101B. И далее переписываете из INFOA оставшиеся данные с 0x101C по 0x107F. Затем стираете INFOA и из сегмента TEMPSEG переписываете 128 уже модифицированных байт в INFOA. Поскольку все остальные сегменты (кроме сегментов INFO и нескольких рядом с сегментом векторов прерываний) по 512 байт, то проблем с размером не возникает. Для таких "махинаций" нужно выделить в xcl-файле свой собственный сегмент с именем TEMPSEG размером 512 байт, правильно выбрав адрес. Ну и неплохо бы сопровождать (пере)запись констант каким-либо признаком валидности (CRC?). Для того, чтобы в криминальном случае (при пропадании/зависании/сбое/ошибке во время перезаписи) программа знала о том, что значения констант не внушают доверия, а прибор отказывался работать, мигая лампочкой и/или жалобно попискивая и поскуливая biggrin.gif
Цитата(Daria @ Nov 19 2008, 23:19) *
могу ли я записать коэффициенты в information - у меня 60КВ, сама прога занимает 20КВ, будет не больше 30, т.е. если писать, начиная с адреса, который ни при каких обстоятельствах не будет перезаписан кодом
#pragma location=0xFE40,
и рассчитывая, что не перезатрутся адреса вектора прерываний - можно?
Можно, но только не полагаясь на "авось". wink.gif Выделите в xcl-файле свой сегмент, куда компилятор точно никогда самовольно ничего не поместит.
Цитата(Daria @ Nov 19 2008, 23:19) *
мне нужно сделать цифровой фильтр, на очень низкой частоте. примерно10- 20Гц. Полоса пропускания аналогового фильтра 4кГц.
Отсчеты поступают равномерно? Какая скорость спада характеристики требуется? Аналог RC-цепочки (фильтр EMA) подойдет (20дБ/декаду)?
Go to the top of the page
 
+Quote Post
Daria
сообщение Nov 20 2008, 19:38
Сообщение #172


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Nov 20 2008, 01:00) *
Именно места в сегменте не хватит или при перезаписи нужно переписывать только часть сегмента, а ОЗУ для временного буфера не хватает? Во втором случае можно использовать какой-либо выделенный сегмент Flash как временный буфер.

ну, если делать такой жуткий фильтр 120 порядка, то именно места не хватит biggrin.gif
Цитата(rezident @ Nov 20 2008, 01:00) *
Для таких "махинаций" нужно выделить в xcl-файле свой собственный сегмент с именем TEMPSEG размером 512 байт, правильно выбрав адрес.

А поподробнее? biggrin.gif xcl-файл менять еще не пыталась 05.gif

Цитата(rezident @ Nov 20 2008, 01:00) *
Ну и неплохо бы сопровождать (пере)запись констант каким-либо признаком валидности (CRC?). Для того, чтобы в криминальном случае (при пропадании/зависании/сбое/ошибке во время перезаписи) программа знала о том, что значения констант не внушают доверия, а прибор отказывался работать, мигая лампочкой и/или жалобно попискивая и поскуливая biggrin.gif

да нет, калибровочные константы сначала вычисляются, потом проверяются на достоверность, и, если какие-то левоватые, то просто и не пишутся, а по UART приходит сообщение об ошибке калибровки

Цитата(rezident @ Nov 20 2008, 01:00) *
Отсчеты поступают равномерно? Какая скорость спада характеристики требуется? Аналог RC-цепочки (фильтр EMA) подойдет (20дБ/декаду)?

Равномерно. Особая крутизна спада не важна. Именно аналог RC-цепочки и пытаюсь сделать smile.gif Но что такое фильтр EMA - не в курсе crying.gif
Заранее спасибо biggrin.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 20 2008, 23:01
Сообщение #173


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Nov 21 2008, 00:38) *
А поподробнее? biggrin.gif xcl-файл менять еще не пыталась 05.gif

Добавьте в XCL-файл раздел типа такого
Код
// ---------------------------------------------------------
// My Segment Constant data
// ---------------------------------------------------------

-P(CONST)MYINFOSEG=FC00-FDFF

А в где-то, например, в main напишите
Код
#define MYINFOSEG 0xFC00

#pragma location=MYINFOSEG
const MyCalibrateTable_t CalTbl=
{ 1.0,
  2.0,
  17322,
  62350
};
#pragma required=CalTbl

Цитата(Daria @ Nov 21 2008, 00:38) *
да нет, калибровочные константы сначала вычисляются, потом проверяются на достоверность, и, если какие-то левоватые, то просто и не пишутся, а по UART приходит сообщение об ошибке калибровки
Это проверка на этапе калибровки. А при старте уже калиброванного прибора коэффициенты как-то проверяются? Вдруг некалиброванный прибор попадет кому-то? Или вы надеетесь, что калибровочные значения во Flash никак не подвержены порче? wink.gif Забыли о проблемах которые возникают при отсутствии супервизора питания? Самопроизвольное стирание Flash тоже попадает в эту группу проблем.
Цитата(Daria @ Nov 21 2008, 00:38) *
Равномерно. Особая крутизна спада не важна. Именно аналог RC-цепочки и пытаюсь сделать smile.gif Но что такое фильтр EMA - не в курсе crying.gif
EMA (Exponential Moving Average) - экспоненциальное скользящее среднее. Можно даже в MS Exel про него почитать smile.gif В рекурсивном виде выглядит как
Y(i+1)=Y(i)+(X(i)–Y(i))*K,
где K=2/(N+1), Y(i+1) выходное значение фильтра, Y(i) - предыдущее выходное значение фильтра, X(i) - значение текущего отсчета. N имеет тот же смысл, что и "тау" RC-цепочки. Только если для RC через время "тау" напряжение на конденсаторе изменяется в e (2.718) раз, то для EMA выходное значение фильтра принимает значение равное входному через через N дискретных отсчетов. N должно быть больше или равно 1. Огибающая (потому что отсчеты дискретные) переходной характеристики EMA-фильтра схожа по форме с ПХ RC-цепочки.
Go to the top of the page
 
+Quote Post
Daria
сообщение Nov 24 2008, 19:47
Сообщение #174


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Спасибо, c xcl понятно.
[Заменила по вашему совету кристалл на 169 , с BOR smile.gif Супервизор теперь не нужен. А что, правда нужна постоянная проверка констант во flash?flash может все равно глюкануть? Мне как-то это в голову не пришло... smile.gif Т.е. во всех приборах, которым в принципе нужна калибровка, предусмотрено такое сообщение для пользователя, об ошибке калибровки? А не слишком ли нагружается пользователь - мало того, что ему надо этой калибровкой управлять, так еще и помнить всякие сообщения... 05.gif
EMA попробую, спасибо.
А вот такой вопрос - извините, но не про MSP smile.gif но в рамках темы.
Операционник включаю в соответствии с даташитом на датчик, только операционник другой, AD795 - другого под рукой нет. А на выходе диапазон почему-то ужимается в три раза - может он не подходит? Но почему? И как его надо было бы включить?
Если кому-то вдруг будеть не влом, посмотрите:
Даташит на AD795
Прикрепленные файлы
Прикрепленный файл  _______________.doc ( 35.5 килобайт ) Кол-во скачиваний: 52
 
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 24 2008, 22:49
Сообщение #175


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Nov 25 2008, 00:47) *
А что, правда нужна постоянная проверка констант во flash?flash может все равно глюкануть? Мне как-то это в голову не пришло... smile.gif
"Глюкает" не сама Flash, а программа в которой имеется функции записи во Flash. Проверку при старте устройства валидности констант и самой управляющей программы обычно делают для повышенной надежности прибора в ответственных применениях. Хотя если вы делаете бытовой прибор и уверены в своей программе на 101%, то можете "забить" на эти проверки smile.gif
Цитата(Daria @ Nov 25 2008, 00:47) *
Операционник включаю в соответствии с даташитом на датчик, только операционник другой, AD795 - другого под рукой нет. А на выходе диапазон почему-то ужимается в три раза - может он не подходит? Но почему? И как его надо было бы включить?
Вы не указали величину питания, но я предполагаю что причина в том, оригинальный LMV324 "рельсовый" ОУ. Т.е. Rail-to-Rail по выходу. А примененный вами AD795 имеет ограничение для выхода Vs - 4V...2,5V.
Go to the top of the page
 
+Quote Post
Daria
сообщение Nov 26 2008, 19:22
Сообщение #176


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Nov 25 2008, 01:49) *
если вы делаете бытовой прибор и уверены в своей программе на 101%, то можете "забить" на эти проверки smile.gif

Ну, подкололи, подкололи. smile.gif Уверенность мне только снится smile.gif просто не знаю, как проверять - в смысле - есть ли константы в памяти вообще, или - соответствуют ли они примерному диапазону, не фигня ли записана. И во втором случае - не совсем ясны критерии оценки smile.gif
Цитата(rezident @ Nov 25 2008, 01:49) *
Вы не указали величину питания, но я предполагаю что причина в том, оригинальный LMV324 "рельсовый" ОУ. Т.е. Rail-to-Rail по выходу. А примененный вами AD795 имеет ограничение для выхода Vs - 4V...2,5V.

Да, действительно... как-то я на ограничение внимания не обратила. 05.gif Поставили другой операционник, без ограничений - все заработало smile.gif Дольше мучилась с тем, чем искала другой smile.gif Спасибо.
Go to the top of the page
 
+Quote Post
_3m
сообщение Nov 26 2008, 21:17
Сообщение #177


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(Daria @ Nov 26 2008, 22:22) *
Ну, подкололи, подкололи. smile.gif Уверенность мне только снится smile.gif просто не знаю, как проверять - в смысле - есть ли константы в памяти вообще, или - соответствуют ли они примерному диапазону, не фигня ли записана. И во втором случае - не совсем ясны критерии оценки smile.gif

При прошивке флэша пишите в область калибровочных данных 0xff, перед началом калибровки тоже стирайте эту область, после окончания калибровки дописывайте CRC или хотя бы контрольную сумму. При следующем старте проверяйте ее. По крайней мере это предотвратит работу изделия если калибровка вообще не была выполнена или не завершена, например из-за сдыхания источника питания или тупоголовости юзера.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 26 2008, 23:29
Сообщение #178


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Nov 27 2008, 00:22) *
просто не знаю, как проверять - в смысле - есть ли константы в памяти вообще, или - соответствуют ли они примерному диапазону, не фигня ли записана. И во втором случае - не совсем ясны критерии оценки smile.gif
"Фигню". от "нефигни" можно попытаться отличить по
- CRC в конце каждого сегмента. После записи сегмента (или группы сегментов) Flash делается верификация и только в том случае, если она прошла успешно, то в конец сегмента (или группы сегментов) записывается CRC.
- проверка ранее записанных констант на попадение в допустимый для них диапазон данных. Если конечно заранее известен этот диапазон.
- для констант типа float, например, проверка их функцией isnan (а число ли это вообще в данном формате?).
- ну и т.п.
При подозрении на некорректность констант вы (точнее ваша программа) должны всеми доступными способами сообщать об этом пользователю: моргать индикаторами, бибикать, посылать в ответе на запрос "ошибка", но только ни в коем случае не работать штатным образом! Пускай уж лучше пользователь забеспокоится о том, что прибор ведет себя как-то необычно, вместо того, чтобы будучи уверенным в работоспособности устройства, он будет пользоваться результатом, основанным на расчете с некорректными константами.
Go to the top of the page
 
+Quote Post
aag
сообщение Nov 27 2008, 08:53
Сообщение #179


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 8-04-06
Из: Новосибирск
Пользователь №: 15 939



Может кому пригодится smile.gif

Для работы с флешкой использую специальный класс. под каждый проект изменяю в нем только число переменных и переделываю несколько функций. работает безотказно.

исходники в прикрепленном архиве
Прикрепленные файлы
Прикрепленный файл  flash.rar ( 2.52 килобайт ) Кол-во скачиваний: 36
 
Go to the top of the page
 
+Quote Post
Daria
сообщение Nov 27 2008, 20:19
Сообщение #180


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



А вот такой вопрос - для еще одной версии недоделанного девайса, получается нужно три uart 05.gif Т.е. будет три адресата. таких кристаллов не нашла, но может вместо одного можно как-то использовать BSL? Или это глупая версия? многопроцессорный формат разбирать сейчас не очень хочется... 05.gif
Go to the top of the page
 
+Quote Post

17 страниц V  « < 10 11 12 13 14 > » 
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016