TI MSP430 Launch Pad

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

uldemir писал(а):разумеется
Меня смущает разница в напряжении питания msp430 3.3 вольта и max232 5 вольт.
Типовая схема включения max232 для согласования уровней подойдёт?
Никакая контра не уйдёт от нас
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Боюсь, что не подойдет. Лучше что-то типа MAX3231
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

akl писал(а):Боюсь, что не подойдет. Лучше что-то типа MAX3231
Печаль.
MAX3223 подойдёт?
Никакая контра не уйдёт от нас
Контактная информация:
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Навскидку, да подойдёт. MAX3223
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Нужен ли в затвор IRLML2402 резистор, что бы управлять им с MSP430G2452 с напряжением питания 3.3 вольта?
Никакая контра не уйдёт от нас
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

Нужен - это предохранитель если ваш полевик вдруг на + дрейном закоротят - лучше чтоб резюк сгорел а не весь мк правда? ещё хорошим тоном есть ставить 100 килоом между сурсом и гейтом. при прошивке ноги мк в воздухе.

У меня тут другой вопрос - Играюсь с кодкомпозером и грейсом.

создал пустой с проект.
там нажа сконфигурить через грейс периферию и настроил все что мне надо было. в том числе прерывание 1 миллисекунда на таймере.

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

если пишу в маине до инклюда грейса - грейс не видит эту переменную
Если пишу в файле интеруптс сгенеренной грейсом(там есть такие строки - плейс глобал вариабз) - то в маине не вижу эту переменную.

Взял создал отдельный GVars.h и там написал обьявление этой переменной. и написал инклюднуть и в грейсовском интерупте и в маине - в итоге получились две РАЗНЫЕ переменные с одинаковым названием!!!!!!! КАК ТАК ТО? а как блин сделать глобальную переменную? Когда останавливаюсь в прерывании - адрес 204 а когда в меине - 205....
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

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

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

Проблему с глобальными переменными не решил но нашел способ обойти хоть и не особо удачный.
Вложения
2_VAMeter.rar
проект
(125.78 КБ) 685 скачиваний
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Создаю дерево меню, чтобы по дисплею, используя кнопки, "бегать" по нему.
В качестве элемента меню использую объект типа класс, в котором хранится массив дочерних объектов (массив указателей на те же объекты типа класс).
В 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
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Проблемы решил, поигравшись с параметром "Data16 heap size" в свойстве проекта (General options -> Stack/Heap).
Несколько дней полёт нормальный.
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

imho, ООП на МК это не очень хорошая идея
Никакая контра не уйдёт от нас
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

prinv писал(а):imho, ООП на МК это не очень хорошая идея
ОЗУ не хватит (6 килобайт) ?
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Кроме меню МК чем-то ещё заниматься будет? :))
Никакая контра не уйдёт от нас
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

prinv писал(а):Кроме меню МК чем-то ещё заниматься будет? :))
занимается.
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Даже интересно стало: сколько у вас в памяти занимает вся структура меню?
Никакая контра не уйдёт от нас
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

prinv писал(а):Даже интересно стало: сколько у вас в памяти занимает вся структура меню?
кода? IAR рапортует 14186 of code memory.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

VLeshka писал(а):кода? IAR рапортует 14186 of code memory.
Каков уровень оптимизации?? И сколько ОЗУ приходится?
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Psych писал(а):
VLeshka писал(а):кода? IAR рапортует 14186 of code memory.
Каков уровень оптимизации?? И сколько ОЗУ приходится?
Optimization - Low.

Во время отладки пытался проконтролировать вручную размер rootMenu - явно не могу (указатель указывает на 0x2790, а там голые цифры).
IAR рапортует после компиляции:
885 bytes of DATA memory (+260 absolute).
51 bytes of const memory.
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

При каком размере стека стало работать без ошибок?
Никакая контра не уйдёт от нас
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

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

При 160 позволял создавать 9 объектов типа класса [мною созданного]. При 320 (поставил сейчас) позволяет создавать 19 (проверял и простым созданием массива, и способом, приведённым мною здесь).
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Мне кажется, что я заблудился в трёх регистрах. История такова - пока жду недостающие детали для одной конструкции, решил на время подключить этот ланчпад, чтобы он генерил необходимые мне сигналы для проверки остальной схемы. И вот один из сигналов такой: необходимо залить 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 начинает шевелиться.
Ответить

Вернуться в «Разные вопросы по МК»