|
|
  |
MSP430 - снова вопросы от чайника, Вопросы от чайника про MSP и магнитный компас |
|
|
|
Nov 5 2008, 07:07
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Daria @ Nov 4 2008, 23:06)  А Вы занимались-таки решением уравнений?  Может кинете какие-нибудь примеры, так, для размышления... Нет, Дарья, "в любви я теоретик". Точнее, это было очень давно, а мозг, как недавно выяснили ученые, начинает разрушаться уже в 39. Там уже ничего не осталось. Кроме того, решение уравнений не даст ответа, что делать, если решения нет... Или их два... Может, конфетку?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 5 2008, 18:30
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(Dog Pawlowa @ Nov 5 2008, 10:07)  Нет, Дарья, "в любви я теоретик". Точнее, это было очень давно, а мозг, как недавно выяснили ученые, начинает разрушаться уже в 39. Там уже ничего не осталось. Кроме того, решение уравнений не даст ответа, что делать, если решения нет... Или их два... Может, конфетку? Ну, только если "К звездам" - вкусная вещь...
|
|
|
|
|
Nov 6 2008, 04:23
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
У меня была задача по нескольким точкам Интерполяция табличной функции кубичным сплайном. получить функцию преобразования прибора. Заренее известно, что эта функция проходит через точку (0,0), монотонно возрастает, никаких перегибов нет. Вначале, я, выбрав апроксимирующую кривую, методом переборов подбирал её коэффициенты, в следующей версии делал регрессионный анализ, но проще всего и точнее оказалось интерполировать кубичным сплайном. Как раз в то время на телесиськах попались исходники на паскале, я их подправил, исправил ошибки и сейчас использую практически везде. Если у Вас подобная задача, то могу выложить...
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Nov 6 2008, 18:15
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(VAI @ Nov 6 2008, 07:23)  У меня была задача по нескольким точкам Интерполяция табличной функции кубичным сплайном. получить функцию преобразования прибора. Заренее известно, что эта функция проходит через точку (0,0), монотонно возрастает, никаких перегибов нет. У меня, к сожалению, перегибы как раз есть, так как многочлен четвертой степени это что-то вроде двойной параболы. Цитата(VAI @ Nov 6 2008, 07:23)  Если у Вас подобная задача, то могу выложить... Не совсем... Но пригодится.  выкладывайте, конечно! Или в личку, если не хотите здесь. спасибо а вот такой вопрос - в принципе ко всем - у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1))
|
|
|
|
|
Nov 6 2008, 18:25
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(Daria @ Nov 7 2008, 00:15)  а вот такой вопрос - в принципе ко всем - у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1))  Подсказка. На малых углах, вместо функции синуса можно смело подставлять сам аргумент. Будет работать. Причем существенно быстрее. Вспомните: lim sin(x)/x = 1, при х->0.
Сообщение отредактировал zhevak - Nov 6 2008, 18:28
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Nov 7 2008, 06:13
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Daria @ Nov 6 2008, 22:15)  - у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1)) Обычно программист добавляет контроль промежуточных значений вычислений чтобы не произошло превышение возможного диапазона вычислений. Особенно это актуально для целочисленной математики. Вы пример вычислений выложите, будем думать.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 7 2008, 11:00
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
Цитата Как раз в то время на телесиськах попались исходники на паскале, я их подправил, исправил ошибки и сейчас использую практически везде. Вот.
Прикрепленные файлы
1.rar ( 4.86 килобайт )
Кол-во скачиваний: 44
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Nov 9 2008, 20:08
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(Dog Pawlowa @ Nov 7 2008, 09:13)  Обычно программист добавляет контроль промежуточных значений вычислений чтобы не произошло превышение возможного диапазона вычислений. Особенно это актуально для целочисленной математики. Вы пример вычислений выложите, будем думать. Спасибо за предложение подумать вместе Сначала вопрос не по этой теме - у меня есть побочная задача. не относящаяся к компасному модулю: Нужно очень быстро уходить в "спящий режим" и "пробуждаться". Т.е. контроллер должен принять данные, выполнить какие-то действия и "уснуть" до следующей команды, причем потратить на все как можно меньше времени. Правильно ли я понимаю, что нужно сначала сконфигурировать периферию, затем в цикле for(;;); выполнить необходимые действия, сконфигурировать выход RST/NMI как вход вызова прерывания, и установить, например, биты OSCOFF, CPUOFF,SCG0, SCG1 для входа в LPM4. Тогда при появлении "0" на RST/NMI проц выйдет из режима LPM4 и вернется к выполнению for(;;) без всей первоначальной конфигурации? или все не так? Вообще можно оставлять RST/NMI как вывод сброса, тогда при появлении сигнала на нем, будет сброс и программа начнет выполняться с начала, но придется тратить время на начальную инициализацию теперь про вычисления После долгих раздумий пытаюсь выполнить такой способ: Вычисляются три угла alfa, beta, gamma и два числа x, y cos(alfa)=a,cos(beta)=b, sin(alfa)=c, sin(beta)=c, cos(gamma)^2=w Составляется квадратное уравнение t2*z^2 +t1*z +t0=0, где t0=(ax+cdy)^2+y^2*b^2-(x^2+y^2)*w; t1=-2bc(ax+cdy)+2ybd; t2=b^2*c^2+ d^2; Решение уравнения z=+-sqrt(t1^2-4t0*t2)/2*t2, при условии, при условии, что действительное решение существует, т.е. t1^2-4t0*t2>=0. Если не сущетсвует, пока не знаю. что делать  Пробрасывать, наверное. Ну и вот. x и y примерно от 1000 до 2500, а углы 1-2 или 3- 4 градуса. Если, например, по 2 градуса, то в знаменателе 2*t2=0.00217. Заменить синусы на сами углы...  тут все дело в оценке погрешности. не думаю, что можно. Вот такие вопросы.
|
|
|
|
|
Nov 9 2008, 20:42
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Daria @ Nov 7 2008, 00:15)  а вот такой вопрос - в принципе ко всем - у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1))  0,000289 (sin^2(1)) = 0,000000088 - это совсем даже не маленькое число  Деление на него совершенно точно является вполне легитимной операцией. Для пущей уверенности используйте тип double, а не float.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 11 2008, 20:31
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
бог с ним, с уравнением. Такой вопрос - в руководстве по MSP указано, что возле вывода RST/NMI нужно располагать "подтягивающий резистор 47 кОм и понижающую емкость 10нФ". Как это понять  Т.е. нужно просто резистор завести на питание и емкость на землю, типа фильтр? Или что значит "понижающая емкость"? И все-таки про экономные режимы. Если разрешить прерывания битом NMIIE, сконфигурировать RST/NMI как вход вызова прерывания и выполнить необходимые настройки, потом в цикле for(;;)выполнить необходимые действия и перейти в режим LPM, то после появления на RST/NMI логического 0, будет вызвано NMI прерывание, после выхода из которого программа продолжится с адреса, на которoм остановилась перед прерыванием,т.е в цикле for? Т.е. времени на все про все уйдет совсем немного - около 6 мкс на порбуждение DCO и сколько-то на выполнение действий. Так или не так? А какая должна быть длительность этого логического "0"?
|
|
|
|
|
Nov 11 2008, 21:37
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Поверьте на слово, не нужно вам NMI использовать.  MSP430 может "просыпаться" от любого другого разрешенного прерывания. А на RST/NMI заведите сигнал сброса от супервизора питания. Кристаллы MSP430 которые не имеют вcтроенного BOR (в частности ваш MSP430F149) использовать без супервизора питания крайне не рекомендуется! Кроме того, запрограммировав RST как вход NMI, можно нарваться на ситуацию с невозможностью работы BSL. Тут в соседней ветке один товарищ уже "попал" с этим NMI. Тем более, что вы вроде fuse JTAG пережигать собрались.
|
|
|
|
|
Nov 12 2008, 19:26
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Nov 12 2008, 00:37)  Поверьте на слово, не нужно вам NMI использовать.  MSP430 может "просыпаться" от любого другого разрешенного прерывания. Кроме того, запрограммировав RST как вход NMI, можно нарваться на ситуацию с невозможностью работы BSL. Тут в соседней ветке один товарищ уже "попал" с этим NMI. Тем более, что вы вроде fuse JTAG пережигать собрались. Не, эта задачка не относится к основному изделию, там проц будет использоваться в качестве переходника(принял, обработал, передал дальше), документацию на него отдельно писать не надо, а значит, и fuse пережигать  Прочитала соседнюю ветку. помимо этой проблемы с BSL какие могут быть проблемы из-за NMI? Т.е. в принципе можно просто разрешить прерывания UART(их и так нужно разрешить), выполнить программку, перейти в LPM4 и все? Как только поступят данные, придет прерывание, и проц проснется(опять все выполнит и уснет)? Правильно или не очень? И все-таки не понятно, как долго нужно держать 0 на RST  Цитата(rezident @ Nov 12 2008, 00:37)  А на RST/NMI заведите сигнал сброса от супервизора питания. Кристаллы MSP430 которые не имеют вcтроенного BOR (в частности ваш MSP430F149) использовать без супервизора питания крайне не рекомендуется! А поподробнее об этом можно?  Вы же помните, я темная...
Сообщение отредактировал Daria - Nov 12 2008, 19:30
|
|
|
|
|
Nov 12 2008, 22:36
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Nov 13 2008, 00:26)  Прочитала соседнюю ветку. помимо этой проблемы с BSL какие могут быть проблемы из-за NMI? Проблемы не из-за NMI, а из-за использования входа RST не совсем по назначению. Цитата(Daria @ Nov 13 2008, 00:26)  Т.е. в принципе можно просто разрешить прерывания UART(их и так нужно разрешить), выполнить программку, перейти в LPM4 и все? Как только поступят данные, придет прерывание, и проц проснется(опять все выполнит и уснет)? Правильно или не очень? В принципе правильно, но следует учитывать что в LPM4 все генераторы выключены. Поэтому для того, чтобы успеть принять символ после фиксации фронта старт-бита, UART должен тактироваться от DCO со всеми вытекающими отсюда последствиями. Потому, что только DCO быстро "просыпается" (за 6 мкс примерно), а часовой и высокочастотный генераторы начинают нормально генерить только через сотни мс. Цитата(Daria @ Nov 13 2008, 00:26)  И все-таки не понятно, как долго нужно держать 0 на RST  А поподробнее об этом можно?  Вы же помните, я темная...  См. скриншот из даташита MSP430F149. Сигнал RST должен удерживаться не менее 2 мкс. Проблема состоит в том, что внутренний сигнал POR (Power-On-Reset) генерируется только в том случае, когда напряжение питания упадет ниже 0,2В. Но минимальное рабочее напряжение MSP430 составляет 1,8В. Т.е. если питание пропало, но напряжение не опустилось ниже 0,2В (а это очень часто бывает, т.к. MSP430 малопотребляющий) или скорость нарастания/спада напряжения недостаточно высокая (меньше 1В/мс), то сброса МК не будет. При этом микроконтроллер может либо зависнуть, либо несанкционированно выполнять какие-то инструкции, например, стирать флешь  Поэтому, если вы хотите устройчивую работу и гарантированный сброс контроллера, то используйте внешний супервизор питания, который будет формировать сигнал сброса по снижению напряжения ниже критического. Либо применяйте кристаллы MSP430 со встроенным BOR, который выполняет ту же самую функцию, что и внешний супервизор питания - формирует сигнал сброса при снижении напряжения ниже 1,7В. Кстати, кристаллы с BOR не столь требовательны (точнее совсем не требовательны) к скорости нарастания напряжения питания. Сам проверял  Выбор супервизоров питания у того же TI весьма немалый. В т.ч. и микропотребляющих. http://focus.ti.com/paramsearch/docs/param...ER_2000794|EQ|1
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 13 2008, 18:32
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Nov 13 2008, 01:36)  В принципе правильно, но следует учитывать что в LPM4 все генераторы выключены. Поэтому для того, чтобы успеть принять символ после фиксации фронта старт-бита, UART должен тактироваться от DCO со всеми вытекающими отсюда последствиями. Потому, что только DCO быстро "просыпается" (за 6 мкс примерно), а часовой и высокочастотный генераторы начинают нормально генерить только через сотни мс. Да, это понятно. Я так и собиралась, спасибо. Цитата(rezident @ Nov 13 2008, 01:36)  Либо применяйте кристаллы MSP430 со встроенным BOR, который выполняет ту же самую функцию, что и внешний супервизор питания - формирует сигнал сброса при снижении напряжения ниже 1,7В. Кстати, кристаллы с BOR не столь требовательны (точнее совсем не требовательны) к скорости нарастания напряжения питания. Сам проверял  Плата уже разведена, все везде задокументировано  Никаких супервизоров уже не вставишь. Но вот есть MSP430F169, кажется это вы его советовали - я смотрю, он абсолютно аналогичный 149-му, и корпус, и распиновка и все параметры, только еще + BOR+ DMA и SPI. Можно заменить без проблем. правильно? тем более, что и по цене разница всего рублей 100. Эх, жаль эти 149-е уже заказаны...  но хорошо, что всего 4 штуки Вообще - большое спасибо, что заметили этот факт пор BOR, я бы так и не обратила внимание, а потом было бы поздно. У меня, действительно, были несколько раз ситуации, когда проц зависал - передернешь питание, и все нормально. Эх, темная я еще...
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|