Перейти к содержанию
    

MSP430 - снова вопросы от чайника

А Вы занимались-таки решением уравнений? ;) Может кинете какие-нибудь примеры, так, для размышления...

Нет, Дарья, "в любви я теоретик". :)

Точнее, это было очень давно, а мозг, как недавно выяснили ученые, начинает разрушаться уже в 39.

Там уже ничего не осталось. :crying:

Кроме того, решение уравнений не даст ответа, что делать, если решения нет... Или их два...

Может, конфетку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, Дарья, "в любви я теоретик". :)

Точнее, это было очень давно, а мозг, как недавно выяснили ученые, начинает разрушаться уже в 39.

Там уже ничего не осталось. :crying:

Кроме того, решение уравнений не даст ответа, что делать, если решения нет... Или их два...

Может, конфетку?

Ну, только если "К звездам" - вкусная вещь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня была задача по нескольким точкам Интерполяция табличной функции кубичным сплайном. получить функцию преобразования прибора. Заренее известно, что эта функция проходит через точку (0,0), монотонно возрастает, никаких перегибов нет.

Вначале, я, выбрав апроксимирующую кривую, методом переборов подбирал её коэффициенты, в следующей версии делал регрессионный анализ, но проще всего и точнее оказалось интерполировать кубичным сплайном.

Как раз в то время на телесиськах попались исходники на паскале, я их подправил, исправил ошибки и сейчас использую практически везде.

Если у Вас подобная задача, то могу выложить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня была задача по нескольким точкам Интерполяция табличной функции кубичным сплайном. получить функцию преобразования прибора. Заренее известно, что эта функция проходит через точку (0,0), монотонно возрастает, никаких перегибов нет.

У меня, к сожалению, перегибы как раз есть, так как многочлен четвертой степени это что-то вроде двойной параболы.

Если у Вас подобная задача, то могу выложить...

Не совсем... Но пригодится. :) выкладывайте, конечно! Или в личку, если не хотите здесь.

спасибо

а вот такой вопрос - в принципе ко всем - у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1)) :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вот такой вопрос - в принципе ко всем - у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1)) :05:

Подсказка. На малых углах, вместо функции синуса можно смело подставлять сам аргумент. Будет работать. Причем существенно быстрее.

 

Вспомните: lim sin(x)/x = 1, при х->0.

Изменено пользователем zhevak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

- у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1))

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как раз в то время на телесиськах попались исходники на паскале, я их подправил, исправил ошибки и сейчас использую практически везде.

Вот.

1.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:)

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

Спасибо за предложение подумать вместе :)

Сначала вопрос не по этой теме - у меня есть побочная задача. не относящаяся к компасному модулю:

Нужно очень быстро уходить в "спящий режим" и "пробуждаться". Т.е. контроллер должен принять данные, выполнить какие-то действия и "уснуть" до следующей команды, причем потратить на все как можно меньше времени.

Правильно ли я понимаю, что нужно сначала сконфигурировать периферию, затем в цикле 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.

Заменить синусы на сами углы... :( тут все дело в оценке погрешности. не думаю, что можно.

Вот такие вопросы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вот такой вопрос - в принципе ко всем - у меня происходит умножение и деление на синусы и косинусы очень маленьких углов, и даже на квадраты синусов и косинусов. Когда решаю, проц, как я понимаю, отождествляет это с делением на ноль. получается фигня. как можно было бы решить проблему - работать нужно с очень маленькими числами, вплоть до 0,000289 (sin^2(1)) :05:

 

0,000289 (sin^2(1)) = 0,000000088 - это совсем даже не маленькое число:) Деление на него совершенно точно является вполне легитимной операцией.

Для пущей уверенности используйте тип double, а не float.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

бог с ним, с уравнением.

Такой вопрос - в руководстве по MSP указано, что возле вывода RST/NMI нужно располагать "подтягивающий резистор 47 кОм и понижающую емкость 10нФ". Как это понять :07: Т.е. нужно просто резистор завести на питание и емкость на землю, типа фильтр? Или что значит "понижающая емкость"?

И все-таки про экономные режимы. Если разрешить прерывания битом NMIIE, сконфигурировать RST/NMI как вход вызова прерывания и выполнить необходимые настройки, потом в цикле for(;;)выполнить необходимые действия и перейти в режим LPM, то после появления на RST/NMI логического 0, будет вызвано NMI прерывание, после выхода из которого программа продолжится с адреса, на которoм остановилась перед прерыванием,т.е в цикле for? Т.е. времени на все про все уйдет совсем немного - около 6 мкс на порбуждение DCO и сколько-то на выполнение действий. Так или не так?

А какая должна быть длительность этого логического "0"? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поверьте на слово, не нужно вам NMI использовать. :( MSP430 может "просыпаться" от любого другого разрешенного прерывания. А на RST/NMI заведите сигнал сброса от супервизора питания. Кристаллы MSP430 которые не имеют вcтроенного BOR (в частности ваш MSP430F149) использовать без супервизора питания крайне не рекомендуется!

Кроме того, запрограммировав RST как вход NMI, можно нарваться на ситуацию с невозможностью работы BSL. Тут в соседней ветке один товарищ уже "попал" с этим NMI. Тем более, что вы вроде fuse JTAG пережигать собрались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поверьте на слово, не нужно вам NMI использовать. :( MSP430 может "просыпаться" от любого другого разрешенного прерывания. Кроме того, запрограммировав RST как вход NMI, можно нарваться на ситуацию с невозможностью работы BSL. Тут в соседней ветке один товарищ уже "попал" с этим NMI. Тем более, что вы вроде fuse JTAG пережигать собрались.

Не, эта задачка не относится к основному изделию, там проц будет использоваться в качестве переходника(принял, обработал, передал дальше), документацию на него отдельно писать не надо, а значит, и fuse пережигать :) Прочитала соседнюю ветку. помимо этой проблемы с BSL какие могут быть проблемы из-за NMI?

Т.е. в принципе можно просто разрешить прерывания UART(их и так нужно разрешить), выполнить программку, перейти в LPM4 и все? Как только поступят данные, придет прерывание, и проц проснется(опять все выполнит и уснет)? Правильно или не очень?

И все-таки не понятно, как долго нужно держать 0 на RST :05:

 

А на RST/NMI заведите сигнал сброса от супервизора питания. Кристаллы MSP430 которые не имеют вcтроенного BOR (в частности ваш MSP430F149) использовать без супервизора питания крайне не рекомендуется!

А поподробнее об этом можно? :) Вы же помните, я темная... :)

Изменено пользователем Daria

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитала соседнюю ветку. помимо этой проблемы с BSL какие могут быть проблемы из-за NMI?
Проблемы не из-за NMI, а из-за использования входа RST не совсем по назначению.

Т.е. в принципе можно просто разрешить прерывания UART(их и так нужно разрешить), выполнить программку, перейти в LPM4 и все? Как только поступят данные, придет прерывание, и проц проснется(опять все выполнит и уснет)? Правильно или не очень?
В принципе правильно, но следует учитывать что в LPM4 все генераторы выключены. Поэтому для того, чтобы успеть принять символ после фиксации фронта старт-бита, UART должен тактироваться от DCO со всеми вытекающими отсюда последствиями. Потому, что только DCO быстро "просыпается" (за 6 мкс примерно), а часовой и высокочастотный генераторы начинают нормально генерить только через сотни мс.

И все-таки не понятно, как долго нужно держать 0 на RST :05:

А поподробнее об этом можно? :) Вы же помните, я темная... :)

См. скриншот из даташита 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

post-3882-1226529376_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В принципе правильно, но следует учитывать что в LPM4 все генераторы выключены. Поэтому для того, чтобы успеть принять символ после фиксации фронта старт-бита, UART должен тактироваться от DCO со всеми вытекающими отсюда последствиями. Потому, что только DCO быстро "просыпается" (за 6 мкс примерно), а часовой и высокочастотный генераторы начинают нормально генерить только через сотни мс.

Да, это понятно. Я так и собиралась, спасибо.

Либо применяйте кристаллы MSP430 со встроенным BOR, который выполняет ту же самую функцию, что и внешний супервизор питания - формирует сигнал сброса при снижении напряжения ниже 1,7В. Кстати, кристаллы с BOR не столь требовательны (точнее совсем не требовательны) к скорости нарастания напряжения питания. Сам проверял :)

Плата уже разведена, все везде задокументировано :) Никаких супервизоров уже не вставишь. Но вот есть MSP430F169, кажется это вы его советовали - я смотрю, он абсолютно аналогичный 149-му, и корпус, и распиновка и все параметры, только еще + BOR+ DMA и SPI. Можно заменить без проблем. правильно? тем более, что и по цене разница всего рублей 100. Эх, жаль эти 149-е уже заказаны... :crying: но хорошо, что всего 4 штуки :)

Вообще - большое спасибо, что заметили этот факт пор BOR, я бы так и не обратила внимание, а потом было бы поздно. У меня, действительно, были несколько раз ситуации, когда проц зависал - передернешь питание, и все нормально. Эх, темная я еще... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...