|
|
  |
MSP430 - снова вопросы от чайника, Вопросы от чайника про MSP и магнитный компас |
|
|
|
Nov 19 2008, 08:49
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 19 2008, 11:42
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(VAI @ Nov 19 2008, 09:57)  У меня ИАР жрет такую конструкцию, код становится несколько иным, как и положено при работе с волатильными переменными. Может, при такой конструкции ИАР не будет заменять константы их значениями. rezident, можете это проверить у себя? Пробовал уже и такое. В 4.10A не катит. Цитата Error[Be022]: location address not allowed for initialized variables (writable variables without the __no_init attribute) \_LIB\main.c 26 К сочетанию volitile и const у компилятора идиосинкразия какая-то. Цитата(zhevak @ Nov 19 2008, 12:15)  2. А не пробовали разнести эту структуру и main по разным файлам? Это не совсем укладывается в идеологию сборки программы из готовых библиотечных модулей. Библиотеки мои собственные конечно же. Цитата(Dog Pawlowa @ Nov 19 2008, 14:06)  Еще один вариант. Заодно привязка к абсолютному адресу. С #pragma constseg тоже какая-то фишка есть. Типа компилятор предлагает #pragma location воспользоваться или что-то такое.
|
|
|
|
|
Nov 19 2008, 11:51
|

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

|
Цитата(rezident @ Nov 19 2008, 13:42)  К сочетанию volitile и const у компилятора идиосинкразия какая-то.  Хм. Открыл 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)
|
|
|
|
|
Nov 19 2008, 18:19
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Nov 19 2008, 14:42)  Пробовал уже и такое. В 4.10A не катит. К сочетанию volitile и const у компилятора идиосинкразия какая-то. Да, а я как раз хотела спросить. почему на const volatile у меня выдается ошибка Ладно, вопрос вот в чем - у меня два сегмента CONST по 128 байт, хочу хранить во flash коэффициенты фильтров. Учитывая, что каждом сегменте уже хранятся калибровочные константы, места не хватит  могу ли я записать коэффициенты в information - у меня 60КВ, сама прога занимает 20КВ, будет не больше 30, т.е. если писать, начиная с адреса, который ни при каких обстоятельствах не будет перезаписан кодом #pragma location=0xFE40, и рассчитывая, что не перезатрутся адреса вектора прерываний - можно? Вообще работает, я проверила,  но не возникнет каких-нибудь неожиданных побочных эффектов? И еще вопрос. не совсем по теме, но важный: мне нужно сделать цифровой фильтр, на очень низкой частоте. примерно10- 20Гц. Полоса пропускания аналогового фильтра 4кГц. Посчитала в MATLAB коф-ты КИХ-фильтра - получилось 127 коэффициентов. Шесть каналов. Т.е. в ОЗУ для фильтрауии постоянно должны висеть массивы на 600В. Никак нельзя  всего 2КВ, и так в притык. Как быть? Кто знает какие-нибудь фильтры, которые позволили бы задавить сигнал до такой низкой частоты и занимали бы как можно меньше времени и места в памяти? Как вообще обычно делается фильтрация? темная я, темная
|
|
|
|
|
Nov 19 2008, 22:00
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Nov 19 2008, 23:19)  Ладно, вопрос вот в чем - у меня два сегмента CONST по 128 байт, хочу хранить во flash коэффициенты фильтров. Учитывая, что каждом сегменте уже хранятся калибровочные константы, места не хватит  Именно места в сегменте не хватит или при перезаписи нужно переписывать только часть сегмента, а ОЗУ для временного буфера не хватает? Во втором случае можно использовать какой-либо выделенный сегмент 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?). Для того, чтобы в криминальном случае (при пропадании/зависании/сбое/ошибке во время перезаписи) программа знала о том, что значения констант не внушают доверия, а прибор отказывался работать, мигая лампочкой и/или жалобно попискивая и поскуливая Цитата(Daria @ Nov 19 2008, 23:19)  могу ли я записать коэффициенты в information - у меня 60КВ, сама прога занимает 20КВ, будет не больше 30, т.е. если писать, начиная с адреса, который ни при каких обстоятельствах не будет перезаписан кодом #pragma location=0xFE40, и рассчитывая, что не перезатрутся адреса вектора прерываний - можно? Можно, но только не полагаясь на "авось".  Выделите в xcl-файле свой сегмент, куда компилятор точно никогда самовольно ничего не поместит. Цитата(Daria @ Nov 19 2008, 23:19)  мне нужно сделать цифровой фильтр, на очень низкой частоте. примерно10- 20Гц. Полоса пропускания аналогового фильтра 4кГц. Отсчеты поступают равномерно? Какая скорость спада характеристики требуется? Аналог RC-цепочки (фильтр EMA) подойдет (20дБ/декаду)?
|
|
|
|
|
Nov 20 2008, 19:38
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Nov 20 2008, 01:00)  Именно места в сегменте не хватит или при перезаписи нужно переписывать только часть сегмента, а ОЗУ для временного буфера не хватает? Во втором случае можно использовать какой-либо выделенный сегмент Flash как временный буфер. ну, если делать такой жуткий фильтр 120 порядка, то именно места не хватит Цитата(rezident @ Nov 20 2008, 01:00)  Для таких "махинаций" нужно выделить в xcl-файле свой собственный сегмент с именем TEMPSEG размером 512 байт, правильно выбрав адрес. А поподробнее?  xcl-файл менять еще не пыталась Цитата(rezident @ Nov 20 2008, 01:00)  Ну и неплохо бы сопровождать (пере)запись констант каким-либо признаком валидности (CRC?). Для того, чтобы в криминальном случае (при пропадании/зависании/сбое/ошибке во время перезаписи) программа знала о том, что значения констант не внушают доверия, а прибор отказывался работать, мигая лампочкой и/или жалобно попискивая и поскуливая  да нет, калибровочные константы сначала вычисляются, потом проверяются на достоверность, и, если какие-то левоватые, то просто и не пишутся, а по UART приходит сообщение об ошибке калибровки Цитата(rezident @ Nov 20 2008, 01:00)  Отсчеты поступают равномерно? Какая скорость спада характеристики требуется? Аналог RC-цепочки (фильтр EMA) подойдет (20дБ/декаду)? Равномерно. Особая крутизна спада не важна. Именно аналог RC-цепочки и пытаюсь сделать  Но что такое фильтр EMA - не в курсе Заранее спасибо
|
|
|
|
|
Nov 20 2008, 23:01
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Nov 21 2008, 00:38)  А поподробнее?  xcl-файл менять еще не пыталась  Добавьте в 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 никак не подвержены порче?  Забыли о проблемах которые возникают при отсутствии супервизора питания? Самопроизвольное стирание Flash тоже попадает в эту группу проблем. Цитата(Daria @ Nov 21 2008, 00:38)  Равномерно. Особая крутизна спада не важна. Именно аналог RC-цепочки и пытаюсь сделать  Но что такое фильтр EMA - не в курсе  EMA (Exponential Moving Average) - экспоненциальное скользящее среднее. Можно даже в MS Exel про него почитать  В рекурсивном виде выглядит как 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-цепочки.
|
|
|
|
|
Nov 24 2008, 19:47
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Спасибо, c xcl понятно. [Заменила по вашему совету кристалл на 169 , с BOR  Супервизор теперь не нужен. А что, правда нужна постоянная проверка констант во flash?flash может все равно глюкануть? Мне как-то это в голову не пришло...  Т.е. во всех приборах, которым в принципе нужна калибровка, предусмотрено такое сообщение для пользователя, об ошибке калибровки? А не слишком ли нагружается пользователь - мало того, что ему надо этой калибровкой управлять, так еще и помнить всякие сообщения... EMA попробую, спасибо. А вот такой вопрос - извините, но не про MSP  но в рамках темы. Операционник включаю в соответствии с даташитом на датчик, только операционник другой, AD795 - другого под рукой нет. А на выходе диапазон почему-то ужимается в три раза - может он не подходит? Но почему? И как его надо было бы включить? Если кому-то вдруг будеть не влом, посмотрите: Даташит на AD795
|
|
|
|
|
Nov 24 2008, 22:49
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Nov 25 2008, 00:47)  А что, правда нужна постоянная проверка констант во flash?flash может все равно глюкануть? Мне как-то это в голову не пришло...  "Глюкает" не сама Flash, а программа в которой имеется функции записи во Flash. Проверку при старте устройства валидности констант и самой управляющей программы обычно делают для повышенной надежности прибора в ответственных применениях. Хотя если вы делаете бытовой прибор и уверены в своей программе на 101%, то можете "забить" на эти проверки  Цитата(Daria @ Nov 25 2008, 00:47)  Операционник включаю в соответствии с даташитом на датчик, только операционник другой, AD795 - другого под рукой нет. А на выходе диапазон почему-то ужимается в три раза - может он не подходит? Но почему? И как его надо было бы включить? Вы не указали величину питания, но я предполагаю что причина в том, оригинальный LMV324 "рельсовый" ОУ. Т.е. Rail-to-Rail по выходу. А примененный вами AD795 имеет ограничение для выхода Vs - 4V...2,5V.
|
|
|
|
|
Nov 26 2008, 19:22
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Nov 25 2008, 01:49)  если вы делаете бытовой прибор и уверены в своей программе на 101%, то можете "забить" на эти проверки  Ну, подкололи, подкололи.  Уверенность мне только снится  просто не знаю, как проверять - в смысле - есть ли константы в памяти вообще, или - соответствуют ли они примерному диапазону, не фигня ли записана. И во втором случае - не совсем ясны критерии оценки Цитата(rezident @ Nov 25 2008, 01:49)  Вы не указали величину питания, но я предполагаю что причина в том, оригинальный LMV324 "рельсовый" ОУ. Т.е. Rail-to-Rail по выходу. А примененный вами AD795 имеет ограничение для выхода Vs - 4V...2,5V. Да, действительно... как-то я на ограничение внимания не обратила.  Поставили другой операционник, без ограничений - все заработало  Дольше мучилась с тем, чем искала другой  Спасибо.
|
|
|
|
|
Nov 26 2008, 21:17
|
Знающий
   
Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960

|
Цитата(Daria @ Nov 26 2008, 22:22)  Ну, подкололи, подкололи.  Уверенность мне только снится  просто не знаю, как проверять - в смысле - есть ли константы в памяти вообще, или - соответствуют ли они примерному диапазону, не фигня ли записана. И во втором случае - не совсем ясны критерии оценки  При прошивке флэша пишите в область калибровочных данных 0xff, перед началом калибровки тоже стирайте эту область, после окончания калибровки дописывайте CRC или хотя бы контрольную сумму. При следующем старте проверяйте ее. По крайней мере это предотвратит работу изделия если калибровка вообще не была выполнена или не завершена, например из-за сдыхания источника питания или тупоголовости юзера.
|
|
|
|
|
Nov 26 2008, 23:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Nov 27 2008, 00:22)  просто не знаю, как проверять - в смысле - есть ли константы в памяти вообще, или - соответствуют ли они примерному диапазону, не фигня ли записана. И во втором случае - не совсем ясны критерии оценки  "Фигню". от "нефигни" можно попытаться отличить по - CRC в конце каждого сегмента. После записи сегмента (или группы сегментов) Flash делается верификация и только в том случае, если она прошла успешно, то в конец сегмента (или группы сегментов) записывается CRC. - проверка ранее записанных констант на попадение в допустимый для них диапазон данных. Если конечно заранее известен этот диапазон. - для констант типа float, например, проверка их функцией isnan (а число ли это вообще в данном формате?). - ну и т.п. При подозрении на некорректность констант вы (точнее ваша программа) должны всеми доступными способами сообщать об этом пользователю: моргать индикаторами, бибикать, посылать в ответе на запрос "ошибка", но только ни в коем случае не работать штатным образом! Пускай уж лучше пользователь забеспокоится о том, что прибор ведет себя как-то необычно, вместо того, чтобы будучи уверенным в работоспособности устройства, он будет пользоваться результатом, основанным на расчете с некорректными константами.
|
|
|
|
|
Nov 27 2008, 08:53
|

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

|
Может кому пригодится  Для работы с флешкой использую специальный класс. под каждый проект изменяю в нем только число переменных и переделываю несколько функций. работает безотказно. исходники в прикрепленном архиве
Прикрепленные файлы
flash.rar ( 2.52 килобайт )
Кол-во скачиваний: 36
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|