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

 
 
 
Reply to this topicStart new topic
> MSP430FR4133 LPM, Прошу помощи
SasaVitebsk
сообщение Feb 10 2016, 14:07
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Очень редкие проекты у меня на MSP. А с режимами сна вообще дел не имел.
Немного повозился - понял, что там вообще свой подход к написанию проектов нужен. А он у меня не выработан. ((
Короче проект маленький. ОС не нужна не разу. Потребление - основное.
Периферии много задействовано. 3 ноги (прерывания), RTC, LCD, 2 таймера, ADC, USART и I2C. На постоянку только ноги, LCD и RTC. То есть LPM3.5.
Остальная периферия запускается разово. По даташиту на МК нашёл табл. 6-1 "Operating Modes (continued)", где указано что I2C и UART работают только в LPM0 (собственно эти узлы тактируются только SMCLK).
Остальная периферия может спать в LPM3.
Я сейчас в ячейке храню битовый список запущенных узлов. Чтобы знать в какой именно режим сна я имею возможность войти. Но у мне не совсем понятно с выходом из сна.
Приведу пример.
Я работаю с усартом. То есть нахожусь в LPM0. Тут приходит прерывание от ножки (геркон) я просыпаюсь выполняю работу запускаю таймер для задержки на дребезг и надо выйти в голову. То есть выйти из LPM0.
Но если я не работаю с UART, то мне надо выходить из прерывания по LPM3.
И я что-то недогоняю. Достаточно ли мне сделать __bic_SR_register_on_exit(LPM3_bits) и это решит проблему в обоих случаях. Или мне требуется анализировать из какого режима я попал в прерывание?
Go to the top of the page
 
+Quote Post
mcheb
сообщение Feb 10 2016, 14:54
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Вы хоть сами поняли, что у Вас происходит? Если Вы в LPM0, при чём здесь LPM3? Просто вышли по LPM3 и ничего не произошло.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 10 2016, 15:39
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Извиняюсь за бестактный вопрос.
У Вас есть работающий пример с LPM ?
msp430x54xA_LPM3_1.c Enters LPM3 (ACLK = LFXT1)
msp430x54xA_LPM3_2.c Enters LPM3 (ACLK = VLO)
msp430x54xA_LPM4.c Enters LPM4; LFXT1, REF0 disabled, SVS disabled
slac166m.zip - это для семейства F543xA.


PS - Вы не указали тип процессора.
Вот пример "украденный" из исходников FreeRTOS, serial.c

Код
    /*
     * UART Tx interrupt service routine.
     */
    #pragma vector=UART1TX_VECTOR
    __interrupt void vTxISR( void )
    {
    signed char cChar;
    portBASE_TYPE xTaskWoken = pdFALSE;
    
        /* The previous character has been transmitted.  See if there are any
        further characters waiting transmission. */
    
        if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWoken ) == pdTRUE )
        {
            /* There was another character queued - transmit it now. */
            U1TXBUF = cChar;
        }
        else
        {
            /* There were no other characters to transmit. */
            sTHREEmpty = pdTRUE;
        }

        /* Make sure any low power mode bits are clear before leaving the ISR. */
        __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );
    }
    /*-----------------------------------------------------------*/



Сообщение отредактировал k155la3 - Feb 11 2016, 06:18
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 11 2016, 07:29
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Прошу прощения. Просто сформулировать грамотно не могу.
Написал проект. В отладчике он работает. Если режимы сна отрубить - тоже. В готовом изделии - не хочет.
Особенность проекта (хотя я просто наверняка неправильно изначально его спроектировал) в том, что надо менять режимы сна.
Например. Спим в LPM3.5. Приходит прерывание от RTC, обрабатывается и, например раз в сутки надо замерить текущую температуру.
Для этого надо выйти из прерывания со сбросом режима сна подать питание на датчик температуры, зарядить таймаут на таймер 0 и заснуть уже в режиме LPM3.
Потому что если я засну в режиме 3.5, то таймер идёт лесом. Теоретически может одновременно придти несколько прерываний. В которых потребуется разная периферия и, соответственно, мне надо заснуть в таком режиме чтобы вся эта периферия работала.
Как выглядит типовой проект в таком случае? Я сейчас просто выделил байт в BACKMEM где храню флаги рабочей на данный момент периферии. И при засыпании анализирую этот байт.
Но похоже - что-то не так.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 11 2016, 07:45
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(SasaVitebsk @ Feb 11 2016, 11:29) *
Прошу прощения. Просто сформулировать грамотно не могу.
Написал проект. В отладчике он работает. Если режимы сна отрубить - тоже. В готовом изделии - не хочет.
....


Не понятно "в готовом изделии".
В отладчике в смысле debug (то что компилируется в файл mmm.d43) ?
или симулятор.

Например нечто такое:

main.c
-----
main()
{
InitAll();
. . . .
while(1)
{
GetPeriferialAll(); // загрузить состояние периферии
mode = AnalizeAll(); // проанализировать все переменные-флаги-порты итд
Run( mode ); // выполнить действия в зависимости от режима
if( mode == 1 ) Go_LPM2();
else
if( mode == 2 ) Go_LPM3();
else
. . . . . . .

}
}
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 11 2016, 11:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(k155la3 @ Feb 11 2016, 10:45) *
Не понятно "в готовом изделии".

Я отлаживаю с MSP-FET по моему. Короче JTAG отладчик.
Вот всё работатет. Отключаю этот отладчик, передёргиваю питание, и эта же прога работает не так. Причём произвольно не так. Может запустится - всё Ок. Может после прихода прерывания всё выровняться.
Я всё пересмотрел уже 10 раз. Весь мозг сломал. Ничего найти не могу.
Цитата
Например нечто такое:

Вот именно так я и делаю.
Я вот вижу, что нет атомарности при этом выборе. Например я проанализировал что у меня режим 3.5, и только в сон входить, а тут бах прерывание, из прерывания вышел, по факту уже режим изменился, но я это не анализирую и в сон ухожу.
sad.gif
Проанализировал. Получается, что, по видимому, менять режим сна надо именно в прерывании. Если это сделать в голове, то есть шанс войти не в тот режим сна.
То есть получается в голове совсем проги не должно быть. Как у них в примерах.
Вечером осмыслю - попробую.
PS: Вообще, похоже, один режим сна должен быть. Иначе очень сложно разрулить.
Go to the top of the page
 
+Quote Post
mcheb
сообщение Feb 11 2016, 15:27
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Цитата(SasaVitebsk @ Feb 11 2016, 15:04) *
Я отлаживаю с MSP-FET по моему. Короче JTAG отладчик.

В серийном изделии JTAG отладчика НЕТ. И отлаживать надо по BSL
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 12 2016, 05:06
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(SasaVitebsk @ Feb 11 2016, 13:29) *
Например. Спим в LPM3.5. Приходит прерывание от RTC, обрабатывается и, например раз в сутки надо замерить текущую температуру.
Для этого надо выйти из прерывания со сбросом режима сна подать питание на датчик температуры, зарядить таймаут на таймер 0 и заснуть уже в режиме LPM3.

Если у Вас МК вошёл в ISR, то естественно он уже не режиме сна, а в run-mode находится. Как это может быть непонятно??
Как всегда - у вопрошающего каша в голове...
И по выходу из ISR, можно вернуться в сон или продолжить выполнение фонового процесса с инструкции, следующей после той инструкции, что погрузила в сон.
Т.е. - именно инструкция выхода из прерывания, загружает значение в статусный регистр МК, содержащий биты сна.
Атомарный вход в сон:
Код
    __bic_SR_register(GIE);
    if (!(mainFL & (1 << MAIN_F_TASK_MEASURE | 1 << MAIN_F_TASK_RX)))
      if (keyboard == KBD_NONE) {
      mainFL |= 1 << MAIN_F_SLEEP;
      __bis_SR_register(LPM3 | GIE);
      __bic_SR_register(GIE);
    }
    mainFL &= ~(1 << MAIN_F_SLEEP);
    __bis_SR_register(GIE);

В mainFL содержатся флаги-требования обработки некоторых событий (MAIN_F_TASK_RX, MAIN_F_TASK_MEASURE). Эти флаги выставляются в ISR-ах (которые могут срабатывать в режимах сна, пробуждая МК, или в run-mode, если уже идёт какая-то обработка одного из событий).
После этого участка идёт код проверяющий эти флаги и обслуживающий их.
Есть также флаг MAIN_F_SLEEP - по нему ISR-ы определяют из какого режима они вызвались (если им это нужно).

Цитата(SasaVitebsk @ Feb 11 2016, 17:04) *
То есть получается в голове совсем проги не должно быть. Как у них в примерах.

Неправильно. Основную обработку лучше располагать в фоновом процессе.
Активация фонового процесса: срабатывает ISR, выставляет флаг в переменной запросов сервисов фонового процесса, выходит из ISR в run-mode.
Фоновый процесс построен в виде большого цикла - просматривает поочередно флаги в переменной запросов, если какой-то установлен - сбрасывает его и выполняет сервис, дальше - опять анализ переменной запросов.
Если переменная запросов ==0 - вход в сон.
Весь цикл:
Код
enum {MAIN_F_SLEEP, MAIN_F_TASK_MEASURE, MAIN_F_TASK_RX, ...};

while (1) {
  __bic_SR_register(GIE);
  if (!(mainFL & (1 << MAIN_F_TASK_MEASURE | 1 << MAIN_F_TASK_RX | ...))) {
    mainFL |= 1 << MAIN_F_SLEEP;
    __bis_SR_register(LPM3 | GIE);
    __bic_SR_register(GIE);
  }
  mainFL &= ~(1 << MAIN_F_SLEEP);
  __bis_SR_register(GIE);
  do {
    if (mainFL & 1 << MAIN_F_TASK_MEASURE) {
      __bic_SR_register(GIE);
      mainFL &= ~(1 << MAIN_F_TASK_MEASURE);
      __bis_SR_register(GIE);
      ... //сервис MAIN_F_TASK_MEASURE
    }
    if (mainFL & 1 << MAIN_F_TASK_RX) {
      __bic_SR_register(GIE);
      mainFL &= ~(1 << MAIN_F_TASK_RX);
      __bis_SR_register(GIE);
      ... //сервис MAIN_F_TASK_RX
    }
    ... //другие сервисы
  } while (mainFL & (1 << MAIN_F_TASK_MEASURE | 1 << MAIN_F_TASK_RX | ...));
}

В принципе, возможно запреты прерываний при модификации флагов mainFL возможно излишни, так как IAR эти операции генерит в виде одной инструкции чтения-модификации-записи (которая атомарна, как я понимаю, для контроллера прерываний).
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 15 2016, 11:38
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Прошу прощения. Писал ответ, но почему то не вижу его ...
Цитата(jcxz @ Feb 12 2016, 08:06) *
Если у Вас МК вошёл в ISR, то естественно он уже не режиме сна, а в run-mode находится. Как это может быть непонятно??
Как всегда - у вопрошающего каша в голове...

У меня нет каши в голове. Возможно не верно выразился.
За пример - спасибо. В принципе так и делаю. Правда чёто переклинило, прерывания не запрещал на момент разбора. Это исправил.
Цитата
Неправильно. Основную обработку лучше располагать в фоновом процессе.
Активация фонового процесса: срабатывает ISR, выставляет флаг в переменной запросов сервисов фонового процесса, выходит из ISR в run-mode.
Фоновый процесс построен в виде большого цикла - просматривает поочередно флаги в переменной запросов, если какой-то установлен - сбрасывает его и выполняет сервис, дальше - опять анализ переменной запросов.
Если переменная запросов ==0 - вход в сон.
...
В принципе, возможно запреты прерываний при модификации флагов mainFL возможно излишни, так как IAR эти операции генерит в виде одной инструкции чтения-модификации-записи (которая атомарна, как я понимаю, для контроллера прерываний).

В принципе всё так и было сделано...
...
Это халтурка, в общем-то. Плата сделана очень плохо. Плюс куча хомутов. А работаю вечером, когда уже устал.
...
На выходных сделал отладочный вывод. Выяснилось 2 проблемы. Первая - основная. Я разместил регистр флагов (там где формируется цепочка событий, которые потом в фоне обрабатываются), в неиспользуемом регистре LCDE LCDMхх. Он у меня не задействован был (ноги так разведены). Так вот эта память разрушалась почему-то. Причём в режиме, когда я подключён к MSP-FET всё нормально, когда стартую готовое изделие, что-то искажается. Память LCDBMхх при этом, абсолютно цела. Там хранятся некоторые данные, я их проверяю - всё достоверно. Как только вынес переменную флагов (у меня статус) в память BACKUP, то всё заработало. Интересно, что 2 изделия работало по-разному. Но в целом неправильно. Сейчас сделал отладку на индикатор и вылизал всё.
Всем спасибо, особенно jcxz.
===
Есть ещё вопрос, если несложно, отзовитесь, кто работал.
По LCDE контроллеру. Есть фича со стабилизацией контрастности. При этом сразу указываешь напряжение. Я так понимаю в таком режиме он потребляет больше? Хотелось бы услышать рекомендации от тех кто проводил эксперименты.
Да ещё один момент. Не вижу пока заявленного потребления в режиме LPM3.5. То что прибор находится в нём - гарантирую. Пока потребление даже больше чем на старом контролере MSP430f415. Он в LPM3 он в LPM3 работал. Индикатор тот же. Правда пока не подтверждённые данные. Тестером мерил .. ))
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 16 2016, 05:25
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(SasaVitebsk @ Feb 15 2016, 17:38) *
Да ещё один момент. Не вижу пока заявленного потребления в режиме LPM3.5. То что прибор находится в нём - гарантирую. Пока потребление даже больше чем на старом контролере MSP430f415. Он в LPM3 он в LPM3 работал. Индикатор тот же. Правда пока не подтверждённые данные. Тестером мерил .. ))

Я работал с немного другим МК (MSP430FR5739) тоже LPM3 (или LPM3.5 не помню точно). С потреблением всё ок - соответствует написанному.
Возможно Вы что-то забыли отключить внутри МК (какую-то периферию). Или утечка через какой-то GPIO. Отладчик надеюсь отключаете когда меряете потребление?
Сейчас сплю с XT1 ==32768, но и раньше с VLO было всё нормально.
Пока сплю, из периферии работает только один таймер от ACLK (ну и возможны прерывания от GPIO). ACLK тактируется XT1 с прескалером ==4.
Потребление - единицы мкА. А у Вас сколько?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 16 2016, 07:20
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Если у Вас программа работает с регулярным циклом,
то пожирателя энергии будет проще найти, если промониторить потребление тока за цикл.
Осцилограф синхнонизируете по началу цикла (дрыганог), сигнал берете с шунт-резистора (10-30 Ом),
включенного в минусовую цепь питания прибора.
Батарея(+) --- (+) прибора
Батарея(-) --- <резистор 10 Ом> ---- <A> ----- (+) прибора

GND осцилографа включена на минус батареи.
Сигнальный вход - на точку <A>.

Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 18 2016, 08:49
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Прошу прощения, за нерегулярность постов. 2 дня отсидел в командировке.
Ещё раз подтверждаю, что данные разрушаются в LCDM.. Причину не понимаю. Все косяки, которые я нашёл, чётко описаны в даташите. Короче не устраняют, а описывают. )) Ну хотя бы так.
По LCDE контроллеру перерыл всё не нашёл ничего подозрительного. Единственное, что нашёл, это многократное упоминание про "The LCD memory registers can also be accessed as word".
У меня там флаги были, но на uint16_t, то есть в моём понимании, я ничего не нарушил. Я попробую просмотреть листинг, может ли при этом компилятор побайтно обращаться в конструкции типа status.bit.
На текущий момент всё прекрасно работает. Вчера все тайминги вылизал и правильность включения/ отключения периферии.
===
2 jcxz, из не выключенной периферии может быть только что-то включенное по умолчанию. За используемой я слежу. Удобно, когда питание узлов МК где-то отдельно включается. Как, например, в ARM. ))
А здесь как-то всё разбросано по кристаллу. Закончу функционал, приступлю к вылизыванию по потреблению.
У меня по умолчанию (если не трогать ничего) работает только 32768, RTC, LCD и по 3 ногам прерывания. Прерывание по RTC - раз в минуту. Так что замерить можно на прямую. Сижу в LPM3.5. По даташиту должно быть порядка 2 мкА. Старый прибор был на f415. Жрал 7-12 мкА. На новом я вижу значение 14. Пока измерено тестером, так что за достоверность данных не ручаюсь. В ближайшее время измерю выложу достоверные данные.
2 k155la3. Спасибо опробую и Вашу методику. Хотя, понятно, что она оценочная. Осцилограф неточный прибор по напряжению
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 18 2016, 09:17
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(SasaVitebsk @ Feb 18 2016, 14:49) *
2 jcxz, из не выключенной периферии может быть только что-то включенное по умолчанию. За используемой я слежу. Удобно, когда питание узлов МК где-то отдельно включается. Как, например, в ARM. ))
А здесь как-то всё разбросано по кристаллу. Закончу функционал, приступлю к вылизыванию по потреблению.

У ARM нет включения/выключения - эти функции не включены в ядро. А у Cortex-ов разных производителей, не питание узлов обычно включается, а тактирование.
А здесь (в MSP430) удобнее сделано управление тактированием. Не нужно следить какой источник тактирует какой узел, не нужно составлять бит-карту подключенных к данному источнику тактирования периферийных узлов и отключать его при обнулении карты. Здесь всё это делается аппаратно - каждый источник тактирования сам отслеживает какие есть в данный момент активные запросы тактирования от каких периферийных узлов и, если таковых нет, сам отключается. И сам включается если появляется запрос тактирования от какой-то периферии. Достаточно только изначально проинитить все источники тактирования, которые где-либо будут использоваться, а в конфигурации каждой периферии правильно прописать какой источник тактирования использовать.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 22 2016, 13:02
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(mcheb @ Feb 11 2016, 18:27) *
В серийном изделии JTAG отладчика НЕТ. И отлаживать надо по BSL

Проясните пожалуйста. У меня отладчик MSP-FET USB-IF. Родной. В закладке я вижу, что есть и JTAG и SBW. Причём выбор автоматический. На плате у меня заведены сигналы JTAG 4 шт + Reset + test.
1) Что у меня ухудшится в плане отладки, если я заведу только SBW.
2) Я так понял, что для SBW мне нужны следующие ноги: Rst, Test, Usart Tx, Usart Rx? Непонятно нужны ли ещё ноги.
3) Какой прогой я смогу прошить контроллер и залочить его. MspFet мой кристалл не поддерживает.
4) Что делать в проекте с ногами JTAG, чтобы максимально защитить от взлома.

Прошлую прошивку считали китайцы. И поставляют на завод подделки. Причём открыто. Не могу утверждать что она была защищена должным образом. В этот раз попробуем защитится на всех уровнях. От китайцев поддержки никакой. Поэтому опять обратились к нам.
С уважением.
PS: Честно говоря, пока не понимаю. Раньше была прога MspFet. Мы ей пользовались. Сейчас абсолютно непонятно чем можно воспользоваться на замену.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:25
Рейтинг@Mail.ru


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