Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: TI MSP430 Launch Pad

Вт мар 03, 2015 18:09:25

В общем вот проект на CCS 6 под msp430g2553.

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

Проблему с глобальными переменными не решил но нашел способ обойти хоть и не особо удачный.
Вложения
2_VAMeter.rar
проект
(125.78 KiB) Скачиваний: 586

Re: TI MSP430 Launch Pad

Ср июн 10, 2015 10:33:29

Создаю дерево меню, чтобы по дисплею, используя кнопки, "бегать" по нему.
В качестве элемента меню использую объект типа класс, в котором хранится массив дочерних объектов (массив указателей на те же объекты типа класс).
В cpp на компьютере (у меня используется сbuilder) работает прекрасно, а в IAR при создании дерева меню, как будто не может выделить место под новый объект типа класс - хватает только на 9 пунктов меню, хотя места в RAM ещё предостаточно. В чём подвох?
Нашёл в интернете темы о [пере]выделении памяти, типа этой, но чую что могу пойти не туда. Help!
P.S.Launchpad MSP-EXP430F5529LP.

Код класса пункта меню:
Спойлер
Код:
//class VLMenuItem;
//класс объекта меню дисплея
class VLMenuItem
{
//меню состоит из:
// - указателя на функцию, выводящую данных (заголовок данных и данные)
// - указателя на меню родителя; =0 только у VLMenuMain::rootMenu
// - массива дочерних меню; порядок "сверху вниз"

public:
 
  VLMenuItem *menuItemParrent;            //указатель на родителя; когда =0, значит в корне
  TFunPtr FunctionShowInfo;        //указатель на функцию вывода информации пункта меню на экран

  VLMenuItem **subMenu;           //массив дочерних меню
  unsigned int subMenuCount;        //выделяемый размер массива дочерних меню
  int subMenuActiveIndex;             //индекс активного меню

  //          какой индекс subMenu используем, родитель,              связанная функция,        размер subMenu
  bool AddSubMenu( unsigned char fsubMenuIndex, VLMenuItem *fparentMenu, TFunPtr fFuncShowMenu, unsigned char fsubMenuCreateCount)
  {
    subMenu[fsubMenuIndex] = new VLMenuItem( fparentMenu, fFuncShowMenu, fsubMenuCreateCount);
    if (subMenuActiveIndex<0)
      subMenuActiveIndex=0;
    return(true);
  }

  //конструктор родитель меню          функция вывода меню   размер массива дочерних меню
  VLMenuItem( VLMenuItem *fparentMenu, TFunPtr fFuncShowMenu, unsigned char fsubMenuCreateCount)
  {
   //сохраняем принятые параметры
   menuItemParrent = fparentMenu;
   FunctionShowInfo = fFuncShowMenu;
   //и задаём по умолчанию
        subMenuCount = fsubMenuCreateCount;
        if (subMenuCount>0)
        {
          subMenu = new VLMenuItem*[subMenuCount];    
          for (unsigned int i_temp=0; i_temp<subMenuCount; i_temp++)
            subMenu[i_temp] = NULL;
        }
   subMenuActiveIndex = -1;
  }

private:
   

};


Код создания дерева меню:
Спойлер
Код:
typedef bool (*TFunPtr)(void);
TFunPtr pFun; // указатель на функцию, реализующую конкретную задачу

  //пустая функция
  bool NullFunc( void )  {    return( true );  }
  //пустая функция
  bool NullFunc2( void )  {    return( true );  }

  //указатель на активное меню, объект типа класс MenuItem
  VLMenuItem *currentMenu; //когда =NULL, показываем стартовую заставку
  //указатель на корневое меню, содержит всю структуру меню
  VLMenuItem *rootMenu;

  //создаёт всё дерево меню
  //rootMenu--->все входы АЦП12--->
  //         |                  |->   входы АЦП все
  //         |                  |-> вход АЦП 1
  //         |                  |-> вход АЦП 2
  //         |                  |-> вход АЦП 3
  //         |                  |-> вход АЦП 4
  //         |                  |-> вход АЦП 5
  //         |->дискр входы-------> дискр входы все
  //         |->UART-монитор------> монитор UART

    //корневое меню
    rootMenu = new VLMenuItem(NULL, NullFunc, 3);   

   //входы АЦП12 меню
    rootMenu->AddSubMenu( 0, rootMenu, NullFunc, 6);
    //входы все АЦП12
    rootMenu->subMenu[0]->AddSubMenu( 0, rootMenu->subMenu[0], NullFunc, 0);
    //вход1 АЦП12
    rootMenu->subMenu[0]->AddSubMenu( 1, rootMenu->subMenu[0], NullFunc, 0);
    //вход2 АЦП12
    rootMenu->subMenu[0]->AddSubMenu( 2, rootMenu->subMenu[0], NullFunc, 0);
    //вход3 АЦП12
    rootMenu->subMenu[0]->AddSubMenu( 3, rootMenu->subMenu[0], NullFunc, 0);
    //вход4 АЦП12
    rootMenu->subMenu[0]->AddSubMenu( 4, rootMenu->subMenu[0], NullFunc, 0);
    //вход5 АЦП12
    rootMenu->subMenu[0]->AddSubMenu( 5, rootMenu->subMenu[0], NullFunc, 0);
    //дискр входы меню
    rootMenu->AddSubMenu( 1, rootMenu, NullFunc, 1);
    //дискр входы
    rootMenu->subMenu[1]->AddSubMenu( 0, rootMenu->subMenu[1], NullFunc, 0);

    //монитор RS-485 меню
    rootMenu->AddSubMenu( 2, rootMenu, NullFunc, 1);
    //монитор RS-485
    rootMenu->subMenu[2]->AddSubMenu( 0, rootMenu->subMenu[2], NullFunc2, 0);

   //эксперимент
   currentMenu = rootMenu->subMenu[2]->subMenu[0];
   currentMenu->FunctionShowInfo(); //ok

Re: TI MSP430 Launch Pad

Пн июн 15, 2015 14:01:40

Проблемы решил, поигравшись с параметром "Data16 heap size" в свойстве проекта (General options -> Stack/Heap).
Несколько дней полёт нормальный.

Re: TI MSP430 Launch Pad

Пн июн 15, 2015 14:52:40

imho, ООП на МК это не очень хорошая идея

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 12:36:21

prinv писал(а):imho, ООП на МК это не очень хорошая идея

ОЗУ не хватит (6 килобайт) ?

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 12:37:56

Кроме меню МК чем-то ещё заниматься будет? :))

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 12:41:14

prinv писал(а):Кроме меню МК чем-то ещё заниматься будет? :))

занимается.

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 12:46:01

Даже интересно стало: сколько у вас в памяти занимает вся структура меню?

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 13:05:59

prinv писал(а):Даже интересно стало: сколько у вас в памяти занимает вся структура меню?

кода? IAR рапортует 14186 of code memory.

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 13:07:40

VLeshka писал(а):кода? IAR рапортует 14186 of code memory.

Каков уровень оптимизации?? И сколько ОЗУ приходится?

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 13:14:22

Psych писал(а):
VLeshka писал(а):кода? IAR рапортует 14186 of code memory.

Каков уровень оптимизации?? И сколько ОЗУ приходится?

Optimization - Low.

Во время отладки пытался проконтролировать вручную размер rootMenu - явно не могу (указатель указывает на 0x2790, а там голые цифры).
IAR рапортует после компиляции:
885 bytes of DATA memory (+260 absolute).
51 bytes of const memory.

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 13:21:23

При каком размере стека стало работать без ошибок?

Re: TI MSP430 Launch Pad

Вт июн 16, 2015 13:27:44

prinv писал(а):При каком размере стека стало работать без ошибок?

Сколько минимальный стек нужен мне для работы приведённого мною кода, не проверял, т.к. меню дальше будет раздуваться, и надо было знать доступное количество пунктов меню при новом значении (поставил 320).

При 160 позволял создавать 9 объектов типа класса [мною созданного]. При 320 (поставил сейчас) позволяет создавать 19 (проверял и простым созданием массива, и способом, приведённым мною здесь).

Re: TI MSP430 Launch Pad

Сб окт 17, 2015 15:47:32

Мне кажется, что я заблудился в трёх регистрах. История такова - пока жду недостающие детали для одной конструкции, решил на время подключить этот ланчпад, чтобы он генерил необходимые мне сигналы для проверки остальной схемы. И вот один из сигналов такой: необходимо залить 32-х разрядный сдвиговый регистр данными и выдать строб для параллельной записи (ну наподобие 595-го регистра).
В режиме ногодрыга всё работает. Но тут мне захотелось приключений и решил сделать через USI (кристалл msp430g2231). И тут оно работать перестало. Вернее работает не так как я хочу.

Регистр USI 16-ти разрядный. Значит, 32 бита мне нужно пересылать за два раза. Хотел сделать так:

загрузить младшую половину данных
загрузить счетчик = 16 (тут должен сняться запрос прерывания и данные должны побежать )
дождаться появления запроса прерывания (это прерывание замаскировано и вызываться не должно)
загрузить старшую половину данных
загрузить счетчик = 16 (опять запрос должен сняться)
дождаться запроса прерывания
дёрнуть ногодрыгом строб параллельной записи.

Код:

      USISR 
= shiftreg;
      USICTL1 = 0;
      USICNT = USI16B | 16;
      while (USICTL1 & USIIFG);

      USICTL1 = 0;
      USISR = shiftreg >> 16;
      USICNT = USI16B | 16;
      while (USICTL1 & USIIFG);
 
      LE 
= 1;
      __no_operation();
      __no_operation();
      __no_operation();
      LE = 0;
 

Проблема в том, что пока перед while не засунул 3 NOP-а - в регистрах была белиберда. Но, понизив скорость (изменил USIDIV) - снова белиберда.

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


SOLUTION:
Сам проблему и решил... Надо пользовать прерывания.

Код:
#pragma vector=USI_VECTOR
__interrupt void send_other_word (void) {
  USICTL1_bit.USIIFG = 0;
  flag.frame_event = 1;
}

где-то в main()
      flag.frame_event = 0;
      USISR = shiftreg;
      USICNT = USI16B | 16;
      while (!flag.frame_event);
      flag.frame_event = 0;

      USISR = shiftreg >> 16;
      USICNT = USI16B | 16;
      while (!flag.frame_event);

      LE = 1;
      __no_operation();
      __no_operation();
      __no_operation();
      LE = 0;


Хотя всё равно не понятно, почему опрос флага прерываний не даёт нужного эффекта. Вернее понятно, что запрос прерывания убирается не сразу после записи в регистр USICNT, а когда этот USI начинает шевелиться.

Re: TI MSP430 Launch Pad

Чт дек 31, 2015 14:25:34

С новым годом!
Взял себе с работы домой девайс MSP430F5529_LaunchPad, я теперь на работе работаю с ним.
Есть кто, кто может подсказать по работе с usb-портом на ланчпаде типа этого ?

Эмулирую стандартное hid-устройство типа datapipe.
Использую usb descriptor tool, для создания т.н. дескрипторов для моего usb-девайса.
Ланчпад корректно распознаётся моей операционной системой (Windows) как стандартное hid-устройство, без всяких вопросов и восклицательных знаков. :)
Usb-сниффер [связи компа с usb-девайсами] использую. Он показал, что ответа от моего девайса нет.

Написал на компе простенькую программу связи с моим usb-устройством, оно мой ланчпад находит. В качестве теста решил отправить на комп пару байтов.
Проблема в прошивке ланчпада. Для учёбы использовал example от ti.com. В ходе пошагового разбора, выяснил что проблема в процедуре копирования данных в usb-буфер (для отправки в хост компьютеру). Что интересно, в example тоже такая же проблема.

При копировании данных в буфер usb (для отправки в usb-хост), буфер usb недоступен для записи.
Копирую туда (указателем), так не выдаёт ошибку и дальше идёт, и результата копирования ноль.
Если до команды:
Код:
USBCNF |= USB_EN;

использовать команду:
Код:
*((unsigned int*)(0x1C80)) = 0x1234;

то оно выполняется. После команды "USBCNF |= USB_EN;", копирование в буфер usb не происходит (хотя в example код такой же - но и там контроль в watch параметра (unsigned int*)(0x1C80) показывает, что не работает).

Регистр ключа USBKEYPID ставил.
Бит UPLLEN в USBPLLCTL всегда enable.
Бит UBME (в EP_INPUT_1, USBIEPCNF_n) в регистре конфигурации endpoint-ов менять пытался - не даёт меняться даже с USBKEYPID. Не пойму почему.

Помогите пожста.

Re: TI MSP430 Launch Pad

Ср янв 20, 2016 08:04:59

Тут вот мой товарищ в порядке восстановления своего владения "аглицкой мовой", как он сам выразился, перевел документ MSP430 IAR Assembler. Вот ссылка. https://yadi.sk/d/KbZE9WNDnPRxD

Re: TI MSP430 Launch Pad

Пт янв 29, 2016 09:44:01

Подскажите пожалуйста, в чем может быть причина. Пользуюсь Energia.
есть датчик DS18B20 и PC соединенный через USB, необходимо принимать команды с PC, что-то делать и отправлять данные на PC.
Организовал протокол передачи n байт (на лаунчпаде и PC) без использования датчика все работает, т.е. принимает команду, моргает светодиодом, отправляет команду обратно на PC .
Но если я хоть раз пользуюсь любой функцией из One Ware, больше Лаунчпад ничего не принимает. Даже если loop цикл пустой и я общаюсь с датчиком только по факту приема команды от PC, а после в пустом цикле loop опрашиваю Serial.available() - жду следующий команду от РС, Лаунчпад ее больше не принимает(((

Re: TI MSP430 Launch Pad

Ср мар 16, 2016 08:51:53

afz писал(а):Тут вот мой товарищ в порядке восстановления своего владения "аглицкой мовой", как он сам выразился, перевел документ MSP430 IAR Assembler.
Выкладываю заново. https://yadi.sk/d/Hfs9dZs8nPT4a

Re: TI MSP430 Launch Pad

Пн май 09, 2016 18:37:37

При построении проекта, в окне build выводит отчёт типа:

7 274 bytes of CODE memory
240 bytes of DATA memory (+ 23 absolute )
763 bytes of CONST memory (+ 136 absolute )


Хочу узнать, что значит (+ 23 absolute ).

Справочник IAR не знает, что это такое. Интернет тоже (если есть где-либо - поправьте!).

Решил копать через отчёты IAR. Настройкой в Linker -> Generate linker listing создал segment map в формате html.
Далее, в этом файле так же сухо приводится absolute в сокращении "abs" в таблице Module summary.

Зацепился за "Module summary" -> Перерыл официальные доки IAR, много всяких в инете скачал, НО: везде приводится одна и та же фраза "Module summary which lists the contribution (in bytes) from each module". Ни слова про absolute.

ТАК ЧТО ЖЕ ТАКОЕ ABSOLUTE???

Re: TI MSP430 Launch Pad

Вт июн 28, 2016 16:03:29

Купил сие чудо http://www.ebay.com/itm/TI-MSP430-USB-B ... 0865942309 (пусть будет проклят иероглифический...) и не могу запустить.Есть даже инструкция на китайском http://download.eeworld.com.cn/detail/solarelec/180677 может я ошибаюсь,что инструкция подходит к этому программатору.Внутри стоит CH340G и микроконтроллер NXP.Драйвер CH340G поставил и прогу запустил,а дальше ничего непонятно как с ним работать.Кто сталкивался с этим программатором,помогите запустить
Ответить