Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430 - снова вопросы от чайника
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Страницы: 1, 2, 3, 4, 5, 6
Daria
Цитата(rezident @ Nov 13 2008, 22:36) *
Можно заменить. И даже нужно, раз лишние 100 рублей погоды не делают wink.gif

Скажате, а WDT не спасет отца русской демократии? wink.gif В случае, если не получится заменить. Ведь он же как раз эту функцию выполняет - сбрасывает проц при зависании 05.gif
rezident
Цитата(Daria @ Nov 15 2008, 02:12) *
Скажате, а WDT не спасет отца русской демократии? wink.gif
Вы имеете в виду дочь российской демократии? biggrin.gif Не знаю. Не уверен на 100%. Попробуйте провести эксперименты с медленным нарастанием и спадом напряжения питания. И спадом напряжения ниже минимального рабочего (1,8В), но выше уровня срабатывания RST. Скажем до 0,7В...1,0В снижайте и потом обратно до 2,5-3,0В повышайте.
_3m
Цитата(Daria @ Nov 15 2008, 00:12) *
Скажате, а WDT не спасет отца русской демократии? wink.gif В случае, если не получится заменить. Ведь он же как раз эту функцию выполняет - сбрасывает проц при зависании 05.gif

Не получится. В msp430 вообще не самая удачная реализация wdt.
Проблема чисто аппаратная, для борьбы с ней wdt просто не предназначен. При плохом питании (провалы, медленное нарастание и/или спад) и отсутствии сигнала ресет (ведь у вас нет ни встроенного BOR ни внешнего супервизора) чип попадает в недокументированные внутренние состояния в которых как правило ведет себя весьма странно и уж точно не в соответствии с документацией.
Daria
Цитата(rezident @ Nov 15 2008, 02:39) *
Вы имеете в виду дочь российской демократии? biggrin.gif

Ну да biggrin.gif Это просто фраза такая. Из фильма biggrin.gif


Цитата(_3m @ Nov 15 2008, 22:39) *
Не получится. В msp430 вообще не самая удачная реализация wdt.
Проблема чисто аппаратная, для борьбы с ней wdt просто не предназначен. При плохом питании (провалы, медленное нарастание и/или спад) и отсутствии сигнала ресет (ведь у вас нет ни встроенного BOR ни внешнего супервизора) чип попадает в недокументированные внутренние состояния в которых как правило ведет себя весьма странно и уж точно не в соответствии с документацией.

Ясно, спасибо. Значит, точно надо менять
rezident
Цитата(Daria @ Nov 16 2008, 01:55) *
Ну да biggrin.gif Это просто фраза такая. Из фильма biggrin.gif
Вообще-то эта фраза (про отца русской демократии) из произведения Ильфа и Петрова "Двенадцать стульев" wink.gif А фильмов по этому произведению снято по-моему как минимум четыре штуки. Эх, молодежь! Только фильмы и знаете sad.gif
Цитата
В следующую минуту выяснилось, что председатель
биржевого комитета не имеет возможности принять участие
в завтрашней битве. Он очень сожалеет, но не может. Он
незнаком с военным делом. Потому-то его и выбрали
председателем биржевого комитета. Он в полном отчаянии,
но для спасения жизни отца русской демократии (сам
он старый октябрист) готов оказать возможную финансовую
помощь.

-- Вы верный друг отечества! -- торжественно сказал
Остап, запивая пахучий шашлык сладеньким кипиани. --
Пятьсот рублей могут спасти отца русской демократии.

-- Скажите, -- спросил Кислярский жалобно, -- а двести
рублей не могут спасти гиганта мысли?

Остап не выдержал и под столом восторженно пнул Ипполита
Матвеевича ногой.

-- Я думаю, -- сказал Ипполит Матвеевич, -- что торг
здесь неуместен!

Сорри за bb-offtopic.gif
zhevak
Цитата(rezident @ Nov 16 2008, 03:21) *
Сорри за bb-offtopic.gif


Ну что, Вы, коллега! Какие могут быть извинения? Наоборот. Что касается лично меня, так я с огромным удовольствием перечитал приведенный Вами кусочек текста несколько раз. Соответственно, пасибо несколько раз. Это как внезапный бальзам на мои раны. smile.gif

Но вот что меня беспокоит. Это у точно офф-топ. Но я не побоюсь поднять этот вопрос. Мы становимся настолько информационно-зависимыми людьми, что наше сознание стало меняться. Я не одинок в оэтом, и я имею ввиду это:
Цитата
Интернет уменьшает мою способность концентрироваться и созерцать. Мой мозг теперь ожидает поступления информации в том виде, в каком ее распространяет Сеть
...
Создается такое впечатление, что мне постоянно приходится насильно возвращать свой своевольный мозг к тексту.
...
'Теперь я практически утратил способность читать и усваивать длинные статьи в Интернете или в напечатанном виде', - писал он в этом году. Фридман, патолог, давно работающий на медицинском факультете Мичиганского университета... Он сказал, что его мышление стало отрывочным, подобно тому, как он по диагонали просматривает отрывки текстов из многих сетевых источников. 'Я уже не могу читать 'Войну и мир', - признался он. - Я утратил эту способность. Мне даже стало трудно дочитать до конца пост, в котором больше трех-четырех параграфов. Такие я бегло просматриваю'
...

http://www.inosmi.ru/translation/245027.html
Daria
Да читала, читала я "произведение Ильфа и Петрова Двенадцать стульев"! и "Золотой теленок", кстати, тоже, и упомянутый выше "Война и Мир". Просто мне показалось, что Вы вообще не узнали фразу, так что говорить о книге было уже не уместно biggrin.gif Извиняюсь, в свою очередь.
А насчет поднятой темы, о том, что читать и запоминать информацию становится все тяжелее, так вот не согласна. wink.gif Ну, у меня, правда, были проблемы с руководством по MSP biggrin.gif Но это потому, что информация - техническая и новая для меня - все равно, что с китайского пытаться переводить. Сейчас уже становится полегче воспринимать подобные тексты, когда мышление потихоньку подстраивается. А художественные тексты как читались, так и читаются. А молодое поколение, кстати, тоже не такое уж безнадежное в этом смысле, просто они читают... другие книги smile.gif Ну так, каждому возрасту свое.
Вот такой развернутый оффтоп, с Вашей подачи, надеюсь, что модераторы не заблокируют нас biggrin.gif Было бы не хорошо. у меня еще впереди МНОГО вопросов biggrin.gif
P.S. Четырех фильмов, кстати, не помню. Знаю только два. И еще два "Золотых теленка". Но пообщаться на литературную и кинематографическую тему могу пригласить Вас в другое место, если захотите - кину ссылочку biggrin.gif
Daria
Опять детские вопросы smile.gif Если объявлять константыкак const в какой раздел flash они пишутся - в information или main?
rezident
Цитата(Daria @ Nov 18 2008, 01:26) *
Если объявлять константыкак const в какой раздел flash они пишутся - в information или main?
В раздел, выделенный для CONST smile.gif Если вы не правили типовой xcl-файл, то CONST и CODE совпадают. Вот часть содержимого lnk430F149.xcl
CODE
/ ---------------------------------------------------------
// Read only memory


// ---------------------------------------------------------
// Information memory
// ---------------------------------------------------------

-Z(CODE)INFO=1000-10FF
-Z(CODE)INFOA=1080-10FF
-Z(CODE)INFOB=1000-107F



// ---------------------------------------------------------
// Constant data
// ---------------------------------------------------------

-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=1100-FFDF
-Z(CONST)DATA20_C,DATA20_ID=1100-FFDF


// ---------------------------------------------------------
// Code
// ---------------------------------------------------------

-Z(CODE)CSTART,ISR_CODE=1100-FFDF
-P(CODE)CODE=1100-FFDF


// ---------------------------------------------------------
// Interrupt vectors
// ---------------------------------------------------------

-Z(CODE)INTVEC=FFE0-FFFF
-Z(CODE)RESET=FFFE-FFFF


// ---------------------------------------------------------
// The end
// ---------------------------------------------------------
Daria
Цитата(rezident @ Nov 18 2008, 01:03) *
В раздел, выделенный для CONST smile.gif

Мм... Вопрос в чем - у меня в оба сегмента CONST пишутся калибровочные константы(начиная с адреса 1000 и начиная с адреса 1080), которые должны там быть пожизненно. При перезаписи flash, насколько я понимаю, стирается весь сегмент, к которому относится адрес, по которому пишется. Так вот - если буду объявлять кучу const - не перезатрется ли нужная инфа?
rezident
Цитата(Daria @ Nov 18 2008, 22:09) *
Так вот - если буду объявлять кучу const - не перезатрется ли нужная инфа?

Область INFO про которую вы упоминаете, обычно стирается отдельно. Точнее в программаторах обычно есть опция, стирать всю Flash перед загрузкой программы или стирать только основную часть Flash, оставляя область INFO нетронутой.
Кстати, а вы хорошо представляете себе работу с константами в Си? Квалификатор const указывает лишь, что эта переменная в данной функции/модуле не модифицируется. Куда поместится такая константа зависит от компилятора. У MSP430 она во Flash помещается, а вот у AVR, если доп. указания не делать и опции типа __flash не писать, то в ОЗУ. Кроме того, IAR хитро оптимизирует и может помещать значения констант прямо в исполняемый код. Я сам подзабыл о такой его подлючей особенности и налетел на эти "грабли" буквально пару недель назад. Если интересно, то могу объяснить в чем суть "грабелек".
zhevak
Цитата(rezident @ Nov 18 2008, 23:38) *
Кроме того, IAR хитро оптимизирует и может помещать значения констант прямо в исполняемый код. Я сам подзабыл о такой его подлючей особенности и налетел на эти "грабли" буквально пару недель назад. Если интересно, то могу объяснить в чем суть "грабелек".

Да, я хотел бы послушать.
Пожалуйста, коллега, если это Вас не сильно затруднит.
rezident
Цитата(zhevak @ Nov 18 2008, 23:47) *
Да, я хотел бы послушать.
Пожалуйста, коллега, если это Вас не сильно затруднит.
Пишу перед main что-то типа
Код
#pragma location=0x10A0
const netSeg_t netSeg=
{ UART_MAXBUFSIZE,
  30,
  300,
  15,
  15,
  13,
  0x00,
  0x21,
  0x00,
  0xFF,
  0x00
};
Это параметры для инициализации UART и сетевых дел. В теле main использую значения этой структуры для инициализации переменных, которые в т.ч. могут быть модифицированы по связи. После модификации переменные сохраняются по указанному адресу (0x10A0) в область INFO. После перезагрузки используются уже новые (модифицированные) параметры. Ну все как обычно.
Но этот "злобный" IAR, видя что это const, подставляет значения констант из структуры непосредственно в код. А саму структуру выкидывает, как ненужную sad.gif
Хоть так
Код
GD.idNet=netSeg.idNet;   //сетевой адрес

хоть так
Код
netSeg_t *ptr=&netSeg;
GD.idNet=ptr->idNet;   //сетевой адрес

В результате имеем
Код
// 25 GD.idNet=netSeg.idNet;   //сетевой адрес
        MOV.B   #0x21, &GD

Причем формально IAR вполне прав. laughing.gif С выкидыванием побороться довольно просто. Добавляем
Код
#pragma required=netSeg
и вуаля! Компилятору надавали по рукам smile.gif теперь константы на месте.
А вот с явной подставой значения константы, вместо считывания значения по адресу из структуры как-либо изящно побороться не получается sad.gif Приходится обходным путем ее инициализировать, объявлять как
Код
__no_init const netSeg_t netSeg;

а значения уже прямо в прошивку подставлять.
Код
@10A0
0C 02 1E 00 2C 01 0F 00 0F 00 0D 00 21 00 FF 00

Использую IAR EW430 4.10A.
VAI
А я по старинке использую ИАР 3.30. У меня массив с константами тоже хранится во флэшь и эти константы обновляются при калибровке прибора. Сами константы объявлены в файле, где функция main(), а используются в других файлах. Такого не наблюдал.
А если Вам попробовать объявить так:
Код
#pragma location=0x10A0
const volatile netSeg_t netSeg=
{ UART_MAXBUFSIZE,
  30,
  300,
  15,
  15,
  13,
  0x00,
  0x21,
  0x00,
  0xFF,
  0x00
};

У меня ИАР жрет такую конструкцию, код становится несколько иным, как и положено при работе с волатильными переменными. Может, при такой конструкции ИАР не будет заменять константы их значениями.
rezident, можете это проверить у себя?
zhevak
1. Спасибо.
2. А не пробовали разнести эту структуру и main по разным файлам?

Компиляция каждого файла пройдет отдельно и не зависимо. "Дикой" оптимизации констатн в код не произойдет. А линкер потом все вместе свяжет.

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

#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
rezident
Цитата(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 воспользоваться или что-то такое.
Сергей Борщ
Цитата(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 - загадка.
Daria
Цитата(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
rezident
Цитата(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дБ/декаду)?
Daria
Цитата(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
rezident
Цитата(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-цепочки.
Daria
Спасибо, c xcl понятно.
[Заменила по вашему совету кристалл на 169 , с BOR smile.gif Супервизор теперь не нужен. А что, правда нужна постоянная проверка констант во flash?flash может все равно глюкануть? Мне как-то это в голову не пришло... smile.gif Т.е. во всех приборах, которым в принципе нужна калибровка, предусмотрено такое сообщение для пользователя, об ошибке калибровки? А не слишком ли нагружается пользователь - мало того, что ему надо этой калибровкой управлять, так еще и помнить всякие сообщения... 05.gif
EMA попробую, спасибо.
А вот такой вопрос - извините, но не про MSP smile.gif но в рамках темы.
Операционник включаю в соответствии с даташитом на датчик, только операционник другой, AD795 - другого под рукой нет. А на выходе диапазон почему-то ужимается в три раза - может он не подходит? Но почему? И как его надо было бы включить?
Если кому-то вдруг будеть не влом, посмотрите:
Даташит на AD795
rezident
Цитата(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.
Daria
Цитата(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 Спасибо.
_3m
Цитата(Daria @ Nov 26 2008, 22:22) *
Ну, подкололи, подкололи. smile.gif Уверенность мне только снится smile.gif просто не знаю, как проверять - в смысле - есть ли константы в памяти вообще, или - соответствуют ли они примерному диапазону, не фигня ли записана. И во втором случае - не совсем ясны критерии оценки smile.gif

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

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

исходники в прикрепленном архиве
Daria
А вот такой вопрос - для еще одной версии недоделанного девайса, получается нужно три uart 05.gif Т.е. будет три адресата. таких кристаллов не нашла, но может вместо одного можно как-то использовать BSL? Или это глупая версия? многопроцессорный формат разбирать сейчас не очень хочется... 05.gif
Сергей Борщ
Цитата(Daria @ Nov 27 2008, 22:19) *
но может вместо одного можно как-то использовать BSL? Или это глупая версия?
Нет, почему же. Вот в соседней ветке ссылка на пример реализации. Только не сам BSL (BSL-это программа внутри процессора), а программный UART (точно такой же, какой используется и в BSL).
rezident
Цитата(Daria @ Nov 28 2008, 01:19) *
А вот такой вопрос - для еще одной версии недоделанного девайса, получается нужно три uart 05.gif Т.е. будет три адресата. таких кристаллов не нашла, но может вместо одного можно как-то использовать BSL? Или это глупая версия? многопроцессорный формат разбирать сейчас не очень хочется... 05.gif
Если интерфейс внешний, то для не слишком высокой скорости приемопередачи возможно сделать программно-аппаратный на TimerA или чисто программный UART. Сергей Борщ, уже выше привел ссылку на тему где это обсуждается. В той теме я давал ссылки и на соответствующий application note и на его перевод.
Если же интерфейс у вас чисто внутренний для связи внутри платы/устройства, то рассмотрите возможность применения синхронного интерфейса (SPI, например). Потому что в модуле USCI (который имплементирован в МК серии MSP430F2xxx) имеется возможность одновременного использования двух интерфейсов одного модуля: одного асинхронного (UART/IrDA) и одного синхронного (SPI/I2C) или двух синхронных (SPI/I2C). Аппаратная реализация интерфейса I2C что в модуле USART, что в USCI довольно заморочена, к тому же я сам его ни разу на деле не использовал (в смысле аппаратную поддержку I2C в MSP430, чисто программный I2C-master делал) поэтому из синхронных интерфейсов, имеющихся в MSP430, могу рекомендовать пока только SPI. laughing.gif
aag
в MSP430F2617 четыре уарта на борту, можно его попробовать. Причем распиновка у 64-пинового корпуса такая же как в F149 или F169
rezident
Цитата(aag @ Nov 28 2008, 09:25) *
в MSP430F2617 четыре уарта на борту, можно его попробовать. Причем распиновка у 64-пинового корпуса такая же как в F149 или F169
Вы ошибаетесь. В даташите конечно написано, что там четыре USCI модуля, но именно как UART (Universal Asynchronous Receiver / Transmitter) можно использовать только два, как я и описал в своем предыдущем сообщении. И вообще деление на четыре модуля весьма условное. Я бы классифицировал их скорее как два модуля, каждый из которых содержит один USCI и один USI.
msalov
Цитата(Daria @ Nov 27 2008, 22:19) *
А вот такой вопрос - для еще одной версии недоделанного девайса, получается нужно три uart 05.gif Т.е. будет три адресата. таких кристаллов не нашла, но может вместо одного можно как-то использовать BSL? Или это глупая версия? многопроцессорный формат разбирать сейчас не очень хочется... 05.gif


Возможно в тему
http://tech.groups.yahoo.com/group/msp430/message/33745
Цитата
Re: MSP430F417 UART

You can call the asynchronous serial Receive-a-Character and
Transmit-a-Character subroutines in the BSL of a MSP430F417 under the
following conditions:
(a) You must set up and use P1.0 as the serial output.
(cool.gif You must set up and use P1.1 as the serial input.
© MCLK must be faster than 100*BAUD. For example, to use 9600b/s,
you need to have MCLK>0.96MHz.
(d) You need to set up the word at RAM 0x0202-0x0203 to [MCLK/BAUD].
For example, if MCLK=1MHz and BAUD=9600b/s, this word need to be 100
(0x0064).
(e) You need to set up the word at RAM 0x0204-0x0205 to
[(MCLK/BAUD)/2-30]. For example, if MCLK=1MHz and BAUD=9600b/s, this
word need to be 20 (0x00).
(f) You must set up TimerA to count in Continuous Mode. The counting
rate should be the same as MCLK.
(g) You can do either serial input or serial output. You cannot do
both at the same time.
(h) You cannot handle interrupts while doing either serial input or
serial output.
(i) You must use Even Parity. You have none, 1-byte or 2-byte
block-checksum options.

For the checksum options, do one of the followings:
(1) If you do not want checksum, set R9 to 0x1000 or 0x1001 before you
call the subroutines. The subroutines will change R9 from 0x1000 to
0x1001 and from 0x1001 to 0x1000. Thus subsequent calls do not need to
set R9 again.
(2) If you want a 1-byte XOR checksum, set R9 to 0 every time you call
the subroutines. The subroutines will update a 1-byte checksum at
0x0212 and change R9 to 1. You need to initialize and read the
checksum yourself.
(3) If you want a 2-byte XOR checksum, set R9 to 0 when you initialize
the checksum. The subroutines will update a 2-byte checksum at
0x0212-0x0213 and change R9 from 0 to 1 or from 1 to 0 to select which
byte to update. You need to initialize and read the checksum yourself
but you should not change R9.

In addition to the above, to Receive-a-Character, you do the following:
Код
CLR R11
CALL #0x0F56

The character will be returned in R12.
R11:BIT1 is an error flag.
R5 is destroyed.
RAM 0x0209 is destroyed.

To Transmit-a-Character, you do the following instead:
Код
MOV.B [Character], R12
CALL #0x0EEA

R11 is destroyed
R5 is destroyed
RAM 0x0207 is destroyed.
AHTOXA
Цитата(rezident @ Nov 28 2008, 05:16) *
Потому что в модуле USCI (который имплементирован в МК серии MSP430F2xxx) имеется возможность одновременного использования двух интерфейсов одного модуля: одного асинхронного (UART/IrDA) и одного синхронного (SPI/I2C) или двух синхронных (SPI/I2C).

Позанудствуюsmile.gif i2c - не синхронныйsmile.gif
Сергей Борщ
Цитата(AHTOXA @ Nov 29 2008, 11:24) *
Позанудствуюsmile.gif i2c - не синхронныйsmile.gif
Оба-на! Вносите определение синхронного интерфейса и вместе посмотрим, где I2C этому определению не соответствует.
rezident
Цитата(AHTOXA @ Nov 29 2008, 14:24) *
Позанудствуюsmile.gif i2c - не синхронныйsmile.gif
Да-а-а? 07.gif А какой же тогда по-вашему? cranky.gif
Daria
Цитата(rezident @ Nov 28 2008, 03:16) *
Если интерфейс внешний, то для не слишком высокой скорости приемопередачи возможно сделать программно-аппаратный на TimerA или чисто программный UART. Сергей Борщ, уже выше привел ссылку на тему где это обсуждается. В той теме я давал ссылки и на соответствующий application note и на его перевод.
Если же интерфейс у вас чисто внутренний для связи внутри платы/устройства, то рассмотрите возможность применения синхронного интерфейса (SPI, например).

Нет, интерфейс внешний. Смысл в чем - есть одна плата(управляющая), она принимает команды с компа, опрашивает компасный модуль и дальше посылает команду на поворотное устройство. Вот вся программа. Сначала поворотное устройство было "тупое", без внутреннего контроллера, управлялось оно просто импульсами тока заданной длительности - это не здорово. Теперь есть другое устройство, с собственным контроллером, ему достаточно просто отправить команду - и оно поедет, куда сказали smile.gif Итого три абонента - комп, компас и поворотник.
Насчет "не слишком высокой скорости приемопередачи "... 05.gif вот не знаю. какую можно реализовать на TimerA? Хотя бы 19200 можно?
Ваши ссылки скачала, спасибо, буду разбираться. В понедельник ждите вопросов - не думаю, что все получится с первого раза biggrin.gif
rezident
Цитата(Daria @ Nov 29 2008, 21:48) *
Нет, интерфейс внешний. Смысл в чем - есть одна плата(управляющая), она принимает команды с компа, опрашивает компасный модуль и дальше посылает команду на поворотное устройство. Вот вся программа. Сначала поворотное устройство было "тупое", без внутреннего контроллера, управлялось оно просто импульсами тока заданной длительности - это не здорово. Теперь есть другое устройство, с собственным контроллером, ему достаточно просто отправить команду - и оно поедет, куда сказали smile.gif Итого три абонента - комп, компас и поворотник.
Как я понял у вас три различных устройства и все они независимо-автономные. Одно устройство (компас?) является т.с. "управляющим ретранслятором" и транслирует команды, переданные по технологическому каналу с PC на два других. Тип связи (асинхронный) уже определен и изменению не подлежит. Вам не хватает одного UART в вашем компасе для технологического канала. Я все правильно понял?
Цитата(Daria @ Nov 29 2008, 21:48) *
Насчет "не слишком высокой скорости приемопередачи "... 05.gif вот не знаю. какую можно реализовать на TimerA? Хотя бы 19200 можно?
Когда-то я "баловался" с приемопередатчиком IrDA на TimerA по мотивам тех же самых апликух производителя. Скорость 38400 получил довольно легко даже на заморачиваясь написанием функций на ASM. Реализовывал на Си. Так что 19200 при вашей тактовой (8МГц) можно тоже реализовать без особых затруднений. Только следует учесть, что связь будет полудуплексной. Если для технологического канала вам это не подходит, то используйте обычный UART, а к программно-аппаратному UART подключите устройство, которое не так критично к полудуплексной связи.
AHTOXA
Цитата(Сергей Борщ @ Nov 29 2008, 15:18) *
Оба-на! Вносите определение синхронного интерфейса и вместе посмотрим, где I2C этому определению не соответствует.


У меня нет определения, есть лишь какое-то смутное чувство, что он не синхронныйsmile.gif Из-за задержек наверное... Хотя это можно рассматривать как синхронизацию с принимающей стороной... Может я и не подумамши ляпнулsmile.gif
А что такое синхронный в вашем понимании? С чем синхронный?
Сергей Борщ
Цитата(AHTOXA @ Nov 29 2008, 21:53) *
А что такое синхронный в вашем понимании? С чем синхронный?
С тактовым сигналом. Это когда тактовый сигнал (SCLK) передается вместе с данными (SDAT) по каналу связи, а не восстанавливается из сигнала данных на приемной стороне.
rezident
Цитата(AHTOXA @ Nov 30 2008, 00:53) *
Может я и не подумамши ляпнулsmile.gif
Очень на это похоже biggrin.gif
Сергей Борщ вполне понятно пояснил.
AHTOXA
Цитата(Сергей Борщ @ Nov 30 2008, 01:49) *
С тактовым сигналом. И тактовый сигнал (SCLK) передается вместе с данными (SDAT) по каналу связи, а не восстанавливается из сигнала данных на приемной стороне.


А можно всё же определение синхронного интерфейса? Я что-то не нагуглил ничего. В описании i2c от Филипс не сказано, что интерфейс синхронный. Там упоминается синхронизация, но лишь в контексте арбитража шины при мультимастере.

Цитата(rezident @ Nov 30 2008, 01:59) *
Очень на это похоже biggrin.gif
Сергей Борщ вполне понятно пояснил.


Я въедливый:-)

ЗЫ. Прошу прощения за офтопик.
rezident
Синхронный интерфейс это интерфейс в котором наряду с сигналом(ами) данных передается сигнал тактовой синхронизации. Если к обычным сигналам UART (RX и TX) добавить тактовый сигнал UCLK, то интерфейс тоже станет синхронным. Модуль в MSP430 не зря называется USART (Universal Synchronous/Asynchronous Receive/Transmit), т.к. у него имеется вход внешнего тактирования, который может использоваться для синхронизации как в режиме UART, так и в режиме SPI (slave).
Кстати, двухпроводный синхронный интерфейс SSI с дифф. интерфейсом физической линии RS485/RS422 широко применяется в промышленных энкодерах.
Daria
Цитата(rezident @ Nov 29 2008, 22:10) *
Как я понял у вас три различных устройства и все они независимо-автономные. Одно устройство (компас?) является т.с. "управляющим ретранслятором" и транслирует команды, переданные по технологическому каналу с PC на два других. Тип связи (асинхронный) уже определен и изменению не подлежит. Вам не хватает одного UART в вашем компасе для технологического канала. Я все правильно понял?

Почти. Центральное устройство - не компас, а именно "управляющий ретранслятор", он транслирует команды PC, "сверяясь" с компасом smile.gif Там тоже стоит MSP(потому что больше я ничего не знаю biggrin.gif ) И вот для этого MSP мне и нужно три UART - для приема команд PC, для опроса компаса и для передачи команд поворотнику. Вообще какой кристалл посоветуете для такой цели "ретранслятора"?
Цитата(rezident @ Nov 29 2008, 22:10) *
Когда-то я "баловался" с приемопередатчиком IrDA на TimerA по мотивам тех же самых апликух производителя. Скорость 38400 получил довольно легко даже на заморачиваясь написанием функций на ASM. Реализовывал на Си. Так что 19200 при вашей тактовой (8МГц) можно тоже реализовать без особых затруднений. Только следует учесть, что связь будет полудуплексной. Если для технологического канала вам это не подходит, то используйте обычный UART, а к программно-аппаратному UART подключите устройство, которое не так критично к полудуплексной связи.

Вы меня извините... а что значит ПОЛУдуплексная? biggrin.gif
AHTOXA
Цитата(rezident @ Nov 30 2008, 03:29) *
Синхронный интерфейс это...

Спасибо, понятно. (Иногда и ляпнуть что-то не подумамши полезноsmile.gif )
Но всё же несколько смущает, что на клоки может воздействовать и слейв. Сложно провести аналогию с классическим синхронным режимом USART или с SPI. Как-то несинхронно этоsmile.gif
Хотя наверное можно считать, что сигнал SCL используется двояко - для передачи синхроимпульсов от передатчика к приёминку и для подтверждения приёма - в другую сторону.

ЗЫ. Ещё раз спасибо Вам (и Сергею).
ЗЫЫ. Оффтопить прекращаюsmile.gif
rezident
Цитата(Daria @ Nov 30 2008, 04:42) *
Почти. Центральное устройство - не компас, а именно "управляющий ретранслятор", он транслирует команды PC, "сверяясь" с компасом smile.gif Там тоже стоит MSP(потому что больше я ничего не знаю biggrin.gif ) И вот для этого MSP мне и нужно три UART - для приема команд PC, для опроса компаса и для передачи команд поворотнику. Вообще какой кристалл посоветуете для такой цели "ретранслятора"?
Дык выбирайте сами из таблицы. TimerA есть во всех кристаллах, а количество UARTов там отдельно указано. Если же не останавливаться на MSP430, то среди МК с ядром ARM, например, и с 5-ю UART на борту кристаллы имеются. http://mcu.caxapa.ru/db.htm
Цитата(Daria @ Nov 30 2008, 04:42) *
Вы меня извините... а что значит ПОЛУдуплексная? biggrin.gif
Полудуплексный режим работы означает, что в конкретный момент времени UART может выполнять только одно действие: либо прием, либо передачу. Аппаратный же модуль USART в MSP430 может одновременно и то и другое, т.е. он полнодуплексный. Если ваш протокол обмена использует схему "запрос-ответ", то полный дуплекс и не нужен.
AHTOXA
Цитата(Daria @ Nov 30 2008, 04:42) *
а что значит ПОЛУдуплексная? biggrin.gif

Это значит, что в обе стороны, но по очередиsmile.gif
Кстати, это совершенно необязательное требование. Можно и полный дуплекс софтовый сделать. Могу бросить примерчик.
rezident
Цитата(AHTOXA @ Nov 30 2008, 05:01) *
Но всё же несколько смущает, что на клоки может воздействовать и слейв. Сложно провести аналогию с классическим синхронным режимом USART или с SPI. Как-то несинхронно этоsmile.gif
Почему сложно? Отчего несинхронно? Данные выдаются на шину SDA синхронно с SCL и считываются опять же синхронно с SCL. Какая разница кто именно (какое именно устройство) определяет длительность "нуля" на шине SCL? Вы что никогда логику I2C в ПЛИС не реализовывали что ли? cranky.gif
Цитата(AHTOXA @ Nov 30 2008, 05:01) *
Хотя наверное можно считать, что сигнал SCL используется двояко - для передачи синхроимпульсов от передатчика к приёминку и для подтверждения приёма - в другую сторону.
SCL не используется "для передачи синхроимпульсов", а сам является источником синхроимпульсов. Может вас смущает, что в спецификации нет четкой привязки к фронтам SCL? Ну дык это сделано с расчетом на программную реализацию интерфейса, когда переходы определяются программным поллингом (опросом) пинов МК, подключенных к шинам SCL и SDA.
Насчет оффтопа. Если у вас есть еще желание подискутировать, то давайте выделю сообщения в отдельную тему. Либо завязываем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.