TI MSP430 Launch Pad
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: TI MSP430 Launch Pad
В общем вот проект на CCS 6 под msp430g2553.
динамическая посегментная индикация + шим яркость каждого символа ну и пример чтения данных внутреннего термометра.
пинаут подключения индикатора сводится к дефайнам общих выводов каждого символа и последовательном переборе маской - там все понятно. я подключал к ланчпаду сегмент а к P1.1 и так далее просто вниз по плате.
Проблему с глобальными переменными не решил но нашел способ обойти хоть и не особо удачный.
динамическая посегментная индикация + шим яркость каждого символа ну и пример чтения данных внутреннего термометра.
пинаут подключения индикатора сводится к дефайнам общих выводов каждого символа и последовательном переборе маской - там все понятно. я подключал к ланчпаду сегмент а к P1.1 и так далее просто вниз по плате.
Проблему с глобальными переменными не решил но нашел способ обойти хоть и не особо удачный.
- Вложения
-
- 2_VAMeter.rar
- проект
- (125.78 КБ) 666 скачиваний
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
Re: TI MSP430 Launch Pad
Создаю дерево меню, чтобы по дисплею, используя кнопки, "бегать" по нему.
В качестве элемента меню использую объект типа класс, в котором хранится массив дочерних объектов (массив указателей на те же объекты типа класс).
В cpp на компьютере (у меня используется сbuilder) работает прекрасно, а в IAR при создании дерева меню, как будто не может выделить место под новый объект типа класс - хватает только на 9 пунктов меню, хотя места в RAM ещё предостаточно. В чём подвох?
Нашёл в интернете темы о [пере]выделении памяти, типа этой, но чую что могу пойти не туда. Help!
P.S.Launchpad MSP-EXP430F5529LP.
Код класса пункта меню:
Код создания дерева меню:
В качестве элемента меню использую объект типа класс, в котором хранится массив дочерних объектов (массив указателей на те же объекты типа класс).
В 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
Проблемы решил, поигравшись с параметром "Data16 heap size" в свойстве проекта (General options -> Stack/Heap).
Несколько дней полёт нормальный.
Несколько дней полёт нормальный.
Re: TI MSP430 Launch Pad
prinv писал(а):imho, ООП на МК это не очень хорошая идея
ОЗУ не хватит (6 килобайт) ?
Re: TI MSP430 Launch Pad
prinv писал(а):Кроме меню МК чем-то ещё заниматься будет?
занимается.
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: TI MSP430 Launch Pad
Даже интересно стало: сколько у вас в памяти занимает вся структура меню?
Никакая контра не уйдёт от нас
Re: TI MSP430 Launch Pad
prinv писал(а):Даже интересно стало: сколько у вас в памяти занимает вся структура меню?
кода? IAR рапортует 14186 of code memory.
Re: TI MSP430 Launch Pad
VLeshka писал(а):кода? IAR рапортует 14186 of code memory.
Каков уровень оптимизации?? И сколько ОЗУ приходится?
Re: TI MSP430 Launch Pad
Psych писал(а):VLeshka писал(а):кода? IAR рапортует 14186 of code memory.
Каков уровень оптимизации?? И сколько ОЗУ приходится?
Optimization - Low.
Во время отладки пытался проконтролировать вручную размер rootMenu - явно не могу (указатель указывает на 0x2790, а там голые цифры).
IAR рапортует после компиляции:
885 bytes of DATA memory (+260 absolute).
51 bytes of const memory.
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: TI MSP430 Launch Pad
При каком размере стека стало работать без ошибок?
Никакая контра не уйдёт от нас
Re: TI MSP430 Launch Pad
prinv писал(а):При каком размере стека стало работать без ошибок?
Сколько минимальный стек нужен мне для работы приведённого мною кода, не проверял, т.к. меню дальше будет раздуваться, и надо было знать доступное количество пунктов меню при новом значении (поставил 320).
При 160 позволял создавать 9 объектов типа класса [мною созданного]. При 320 (поставил сейчас) позволяет создавать 19 (проверял и простым созданием массива, и способом, приведённым мною здесь).
Re: TI MSP430 Launch Pad
Мне кажется, что я заблудился в трёх регистрах. История такова - пока жду недостающие детали для одной конструкции, решил на время подключить этот ланчпад, чтобы он генерил необходимые мне сигналы для проверки остальной схемы. И вот один из сигналов такой: необходимо залить 32-х разрядный сдвиговый регистр данными и выдать строб для параллельной записи (ну наподобие 595-го регистра).
В режиме ногодрыга всё работает. Но тут мне захотелось приключений и решил сделать через USI (кристалл msp430g2231). И тут оно работать перестало. Вернее работает не так как я хочу.
Регистр USI 16-ти разрядный. Значит, 32 бита мне нужно пересылать за два раза. Хотел сделать так:
загрузить младшую половину данных
загрузить счетчик = 16 (тут должен сняться запрос прерывания и данные должны побежать )
дождаться появления запроса прерывания (это прерывание замаскировано и вызываться не должно)
загрузить старшую половину данных
загрузить счетчик = 16 (опять запрос должен сняться)
дождаться запроса прерывания
дёрнуть ногодрыгом строб параллельной записи.
Проблема в том, что пока перед while не засунул 3 NOP-а - в регистрах была белиберда. Но, понизив скорость (изменил USIDIV) - снова белиберда.
Как правильно было бы решить данную задачу, чтобы она работала при любой тактовой скорости и не требовала втыкания NOPов.
SOLUTION:
Сам проблему и решил... Надо пользовать прерывания.
Хотя всё равно не понятно, почему опрос флага прерываний не даёт нужного эффекта. Вернее понятно, что запрос прерывания убирается не сразу после записи в регистр USICNT, а когда этот USI начинает шевелиться.
В режиме ногодрыга всё работает. Но тут мне захотелось приключений и решил сделать через 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
С новым годом!
Взял себе с работы домой девайс 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;", копирование в буфер usb не происходит (хотя в example код такой же - но и там контроль в watch параметра (unsigned int*)(0x1C80) показывает, что не работает).
Регистр ключа USBKEYPID ставил.
Бит UPLLEN в USBPLLCTL всегда enable.
Бит UBME (в EP_INPUT_1, USBIEPCNF_n) в регистре конфигурации endpoint-ов менять пытался - не даёт меняться даже с USBKEYPID. Не пойму почему.
Помогите пожста.
Взял себе с работы домой девайс 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. Не пойму почему.
Помогите пожста.
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: TI MSP430 Launch Pad
Тут вот мой товарищ в порядке восстановления своего владения "аглицкой мовой", как он сам выразился, перевел документ MSP430 IAR Assembler. Вот ссылка. https://yadi.sk/d/KbZE9WNDnPRxD
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Re: TI MSP430 Launch Pad
Подскажите пожалуйста, в чем может быть причина. Пользуюсь Energia.
есть датчик DS18B20 и PC соединенный через USB, необходимо принимать команды с PC, что-то делать и отправлять данные на PC.
Организовал протокол передачи n байт (на лаунчпаде и PC) без использования датчика все работает, т.е. принимает команду, моргает светодиодом, отправляет команду обратно на PC .
Но если я хоть раз пользуюсь любой функцией из One Ware, больше Лаунчпад ничего не принимает. Даже если loop цикл пустой и я общаюсь с датчиком только по факту приема команды от PC, а после в пустом цикле loop опрашиваю Serial.available() - жду следующий команду от РС, Лаунчпад ее больше не принимает(((
есть датчик DS18B20 и PC соединенный через USB, необходимо принимать команды с PC, что-то делать и отправлять данные на PC.
Организовал протокол передачи n байт (на лаунчпаде и PC) без использования датчика все работает, т.е. принимает команду, моргает светодиодом, отправляет команду обратно на PC .
Но если я хоть раз пользуюсь любой функцией из One Ware, больше Лаунчпад ничего не принимает. Даже если loop цикл пустой и я общаюсь с датчиком только по факту приема команды от PC, а после в пустом цикле loop опрашиваю Serial.available() - жду следующий команду от РС, Лаунчпад ее больше не принимает(((
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: TI MSP430 Launch Pad
Выкладываю заново. https://yadi.sk/d/Hfs9dZs8nPT4aafz писал(а):Тут вот мой товарищ в порядке восстановления своего владения "аглицкой мовой", как он сам выразился, перевел документ MSP430 IAR Assembler.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Re: TI MSP430 Launch Pad
При построении проекта, в окне 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???
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
Купил сие чудо http://www.ebay.com/itm/TI-MSP430-USB-B ... 0865942309 (пусть будет проклят иероглифический...) и не могу запустить.Есть даже инструкция на китайском http://download.eeworld.com.cn/detail/solarelec/180677 может я ошибаюсь,что инструкция подходит к этому программатору.Внутри стоит CH340G и микроконтроллер NXP.Драйвер CH340G поставил и прогу запустил,а дальше ничего непонятно как с ним работать.Кто сталкивался с этим программатором,помогите запустить