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

Re: TI MSP430 Launch Pad

Чт дек 04, 2014 07:07:06

Коллеги, подскажите, плз, как в TI CCS начать новый ассемблерный проект? ЧТо-то потыкался, ничего, кроме C/C++ не предлагает. У AVR в любимой студии все прсто: давишь "новый проект" и тебе на выбор предлагают Atmel AVR Assembler или AVR GCC, а здесь его куда закопали?

Это я разжился таки Launch Pad'ом с 2553, второй чип, правда не пережил доставку, ноги обломали при транспортировке, CCS встала без вопросов, поморгать светодиодом из C-программы - все ОК, а вот до асма достучаться не могу...

Re: TI MSP430 Launch Pad

Чт дек 04, 2014 07:09:29

Empty Assembly-only Project не оно?

Re: TI MSP430 Launch Pad

Чт дек 04, 2014 07:23:14

prinv писал(а):Empty Assembly-only Project не оно?

Да, блин! Не ожидал, что они это дело спрятали в GCC Project - перепробовал все из File - New, кроме GCC Projecr, был убежден, что это начало проекта именно на GCC, а не на асме!..

А как задать конкретный камень? Что-то обшарил всю папочку ti, никаких .h, .inc и т.п. не нашел..

Re: TI MSP430 Launch Pad

Чт дек 04, 2014 07:55:05

File -> New -> CCS Project и в открывшемся окне выбрать МК.
Include файлы в папке C:\ti\cccv6\ccs_base\msp430\include

Re: TI MSP430 Launch Pad

Пн дек 15, 2014 09:20:31

А как заполнить таблицу векторов? В пустом проекте, предложенном CCS, есть только
.sect ".reset" ; MSP430 RESET Vector
.short RESET
А дальше как? С АВР-ками я, обычно, делал так: viewtopic.php?f=57&t=72364&start=20 (последнее сообщение), все было нормально. А здесь (в 430) все материалы на один контроллер размазаны по доброму десятку ПДФ-ок, может я и смотрел нужную, но не обратил внимания, а выучить их все, ИМХО, нереально...

Re: TI MSP430 Launch Pad

Пн дек 15, 2014 16:36:58

Насчет десятка ПДФ-ок, Вы сильно округлили. Документов по каждой модели МК всего 2. Первый - это ДШ на семейство, где описаны общие для всего семейства сведения по периферии и т.п.. Второй - это долумент на конкретную модель, где, в частности, описана распиновка и другие сведения, характерные только для этой модели, например как включить альтернативные функции выводов. Ну и еще в Errata заглянуть не мешает, но это, как правило разовое явление.

Касательно векторов прерываний, для их программирования нужно лишь знать как они называются. Эти сведения имеются в INC файлах (в самом их конце) для каждой модели по ссылке в папке, что я приводил выше.

Re: TI MSP430 Launch Pad

Пн дек 15, 2014 17:36:59

Ser60 писал(а):Касательно векторов прерываний, для их программирования нужно лишь знать как они называются. Эти сведения имеются в INC файлах (в самом их конце) для каждой модели по ссылке в папке, что я приводил выше.

Да? Ну вот, написал я программу для обслуживания прерывания TA0CCR0, допустим, метка ее T00INT. Ну нашел я в msp430g2553.h что-то, относящееся к этому таймеру:

#ifdef __ASM_HEADER__ /* Begin #defines for assembler */
#define TIMER0_A0_VECTOR ".int09" /* 0xFFF2 Timer0_A CC0 */

И как это знание поможет мне занести в какую-то ячейку из диапазона 0xFFC0-0xFFFC адрес этой подпрограммы?
И вообще, что значит это самое .int09, равно, как и
.sect ".reset"
Где это все описано? Догадываюсь, что .sect переключает асм на какую-то секцию программы, но в нормальных асмах эти секции должны быть где-то первично объявлены (определены, декларированы...) а здесь этот .sect появляется, как джинн из бутылки и, почему-то сразу попадает на 0xFFFC. Где это прописано? Ни в msp430g2553.h, ни в msp430.h этого не делается, других вызовов .h-файлов, кроме cdecl msp430.h (точно эту строчку не помню, CCS у меня на работе стоит) нет. И в этом msp430.h единственное действие - вызов соответствующего .h-файла, в моем случае - msp430g2553.h, и все. Так что за черная магия, при помощи которой все становится на свои места и где она описана?

Напоминаю, это асм, не Си. Здесь на каждый кусочек памяти (байт, слово, несколько слов) я сам должен что-то написать, из воздуха ничего не должно появляться!..

Re: TI MSP430 Launch Pad

Вт дек 16, 2014 00:21:30

afz писал(а):написал я программу для обслуживания прерывания TA0CCR0, допустим, метка ее T00INT. Ну нашел я в msp430g2553.h что-то, относящееся к этому таймеру:
#ifdef __ASM_HEADER__ /* Begin #defines for assembler */
#define TIMER0_A0_VECTOR ".int09" /* 0xFFF2 Timer0_A CC0 */
И как это знание поможет мне занести в какую-то ячейку из диапазона 0xFFC0-0xFFFC адрес этой подпрограммы?


Очень просто:
Код:
.sect TIMER0_A0_VECTOR
.short T00INT


При этом линкер запишет адрес входа в Вашу ISR (T000INT) в таблице векторов прерываний по адресу TIMER0_A0_VECTOR. Определение адреса соответствующего имени TIMER0_A0_VECTOR находится в .h файле МК, определённого в настройках проекта.

afz писал(а):И вообще, что значит это самое .int09, равно, как и
.sect ".reset"
Где это все описано?

.reset - это просто алиас (другое имя) для адреса RESET_VECTOR, определенного в .h файле. Можете использовать какое Вам более нравится. Описание директив ассемблера можно найти в Help -> Help Contents и в открывшемся окне напечатать "assembler" и читать что нужно. Вы ранее работали с определениями сегментов? Если нет - почитайте документацию на CCS в help-е, в частности там найдете, что директива .sect - один из способов определения сегмента.

afz писал(а):Так что за черная магия, при помощи которой все становится на свои места и где она описана?


Вот выжимка из файла msp430g2553.h:
Код:
#ifdef __ASM_HEADER__ /* Begin #defines for assembler */
#define RESET_VECTOR            ".reset"                     /* 0xFFFE Reset [Highest Priority] */
#else
#define RESET_VECTOR            (15 * 1u)                  /* 0xFFFE Reset [Highest Priority] */
#endif

в которой определено имя оффсета вектора прерывания ресета RESET_VECTOR и также сказано, что его значение равно 15 (0х0F). Это значение умноженное на 2 (MSP430F2553 использует 16-битные адреса), добавится к началу векторов таблицы прерываний в этом МК 0хFFE0 чтобы получить вектор ресета 0хFFE0 + 2*0x0F = 0xFFFE.

afz писал(а):.sect появляется, как джинн из бутылки и, почему-то сразу попадает на 0xFFFC. Где это прописано?

Это прописано в файле lnk_msp430g2553.cmd из той-же папки. Вот выжимка оттуда, касательно распределения памяти в этой модели МК:
Код:
MEMORY
{
    SFR                     : origin = 0x0000, length = 0x0010
    PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0
    PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100
    RAM                     : origin = 0x0200, length = 0x0200
    INFOA                   : origin = 0x10C0, length = 0x0040
    INFOB                   : origin = 0x1080, length = 0x0040
    INFOC                   : origin = 0x1040, length = 0x0040
    INFOD                   : origin = 0x1000, length = 0x0040
    FLASH                   : origin = 0xC000, length = 0x3FE0
    INT00                   : origin = 0xFFE0, length = 0x0002
    INT01                   : origin = 0xFFE2, length = 0x0002
    INT02                   : origin = 0xFFE4, length = 0x0002
    INT03                   : origin = 0xFFE6, length = 0x0002
    INT04                   : origin = 0xFFE8, length = 0x0002
    INT05                   : origin = 0xFFEA, length = 0x0002
    INT06                   : origin = 0xFFEC, length = 0x0002
    INT07                   : origin = 0xFFEE, length = 0x0002
    INT08                   : origin = 0xFFF0, length = 0x0002
    INT09                   : origin = 0xFFF2, length = 0x0002
    INT10                   : origin = 0xFFF4, length = 0x0002
    INT11                   : origin = 0xFFF6, length = 0x0002
    INT12                   : origin = 0xFFF8, length = 0x0002
    INT13                   : origin = 0xFFFA, length = 0x0002
    INT14                   : origin = 0xFFFC, length = 0x0002
    RESET                   : origin = 0xFFFE, length = 0x0002
}

далее ниже определения адресов сегментов .bss, .data..., и в конце файла имена .int02, ... , .int14, .reset. Отсюда, в частности, следует, что адрес таблицы адресов обработчика прерывания начинается с 0xFFE0.

afz писал(а):Напоминаю, это асм, не Си.

Понимаю. Но при программировании MSP430 на ассемблере в CCS или IAR можно использовать .h файлы для С. Короче, читайте сначала этот документ - там содержатся ответы по крайней мере на все заданные Вами пока здесь вопросы.
http://www.ti.com/lit/ug/slau131j/slau131j.pdf

Re: TI MSP430 Launch Pad

Вт дек 16, 2014 08:50:05

Ser60 писал(а):Понимаю. Но при программировании MSP430 на ассемблере в CCS или IAR можно использовать .h файлы для С.
Точее, для Си и для асма используется один и тот же набор .h- и, как выяснилось, .com-файлов.Так вот, набор файлов общий, а как возникают какие-то различия в сишной и ассемблерной нотации, используют условную компиляцию, по параметру __ASM_HEADER__.

Я до этого ни разу не имел дела с ГНУсью, а в нормальных асмах ВСЕ задается в исходнике, а не спрятано где-то в ключах и прочих невидимых хитростях. Тому же AVR: указал в начале исходника

.include <m8.inc>

и все, асм знает, что работаем с Мегой-8. А в этой ГНУси, блин, все через *опу. Поэтому-то я поначалу и не обратил внимания на файлы .com. То есть, конечно, я заглянул в парочку из них, но чего-то специфически ассемблерного там не обнаружил и решил, что эти файлы только для Си. Ну, и забыл про них. Более того, вчера вечером, сочиняя ответ и очередной набор вопросов, я таки нашел файл msp430g2553.com, заглянул в него и лишний раз убедился, что ничего специфически ассемблерного там нет. А вот файл lnk_msp430g2553.com, как оказалось, как раз для асма. Но он мне не попался под руку. Попадись он, так я бы, скорее всего, и сам бы разобрался. Но увы, сразу он мне не попался, откуда и наша дискуссия.

В общем, спасибо!
Ser60 писал(а):Короче, читайте сначала этот документ - там содержатся ответы по крайней мере на все заданные Вами пока здесь вопросы.
http://www.ti.com/lit/ug/slau131j/slau131j.pdf
Честно скажу, читать его мне не хочется. С одной стороны, знаешь один ассемблер - считай, что знаешь все, а я их знал столько, что сейчас и не вспомнишь. Начиная с языка символического кодирования ЭВМ "Минск-22" и ассемблера Системы-360. С другой стороны, читать такие объемы английского текста ради того, чтобы прояснить несколько непонятных мест для меня чересчур, не осилю. Да и не особенно надо, все что меня интересовало, я уже выяснил, остальное же - асм, как асм. Ну, различает в именах малые и большие буквы, ГНУсная мерзость, но что делать - другого все равно нет...

Плюсик я нажал. :)

Кстати, как я понимаю, незаполненные вектора будут содержать 0xFFFF. А как ЦПУ на это отреагирует, если вдруг произойдет непредусмотренное прерывание? В смысле, не обидится ли на нечетный адрес команды? Или банально сочтет его тождественным ресету?

У любимой PDP-11 в этом пункте, помнится, было разночтение - "большие" машинки делали Trap to 4, если не врет мой склероз, а малые, в смысле LSI-11 (у нас - Э-60) просто игнорировали младший бит адреса. А как 430?

Re: TI MSP430 Launch Pad

Вт дек 16, 2014 18:21:10

afz писал(а):А как ЦПУ на это отреагирует, если вдруг произойдет непредусмотренное прерывание? В смысле, не обидится ли на нечетный адрес команды? Или банально сочтет его тождественным ресету?

Вопрос законный и правильный. В User's Guide на семейство имеется однозначный ответ на него, а также на вопрос "что будет если процессор встретит неподдерживаемую инструкцию". В первом случае произойдет ошибка доступа к флешу и управление передастся на вектор немаскируемого прерывания по адресу 0xFFFC. Если и там стоит неверный адрес, но программа зациклится. Во втором случае управление передастся по адресу вектора ресета 0xFFFE. В любом случае хорошая практика заполнять ВСЮ таблицу векторов прерывания, поставив в векторах неиспользованных прерываний адрес стандартного обработчика (Default Handler). В процессе отладки в нём можно просто разместить бесконечный цикл, а в реальном устройстве, например, организовать reset МК.

Минск-22, PHP-11? Да, помню такие во времена молодости :beer: Минск мы программировали на военке, а PHP-11 позже на работе. До этого в школе ещё помню работали на БЭСМ-4 в 8-ричных кодах и на перфокартах.

Если начинаете работать ма MSP430, может Вам больше понравится IDE от IAR. Оно проще, включая определения сегментов, хотя там определения имён тоже по нескольким файлам разбросаны, как и во многих других системах. Ничего в этом страшного нет - просто дело привычки, особенно для Вас с богатым опытом. В целом система IAR менее монстрообразная и работает быстрее. Ассемблерные программы в ней не имеют ограничения на длину прямо "из коробки" даже без всяких "таблеток".

Насчет чтения документации - без неё никуда. В том документе, что я выше советовал, внимательно читать Вам наверняка не всё нужно будет, может от силы страниц 50.

Re: TI MSP430 Launch Pad

Вт дек 16, 2014 19:47:03

Ser60 писал(а):Вопрос законный и правильный. В User's Guide на семейство имеется однозначный ответ на него, а также на вопрос "что будет если процессор встретит неподдерживаемую инструкцию". В первом случае произойдет ошибка доступа к флешу и управление передастся на вектор немаскируемого прерывания по адресу 0xFFFC. Если и там стоит неверный адрес, но программа зациклится. Во втором случае управление передастся по адресу вектора ресета 0xFFFE. В любом случае хорошая практика заполнять ВСЮ таблицу векторов прерывания, поставив в векторах неиспользованных прерываний адрес стандартного обработчика (Default Handler). В процессе отладки в нём можно просто разместить бесконечный цикл, а в реальном устройстве, например, организовать reset МК.

Ну, если ставить один обработчик на всех, то хватит и одного - 0xFFFC (NMI), незаполненные остальные вектора вызовут это самое NMI, и этого вполне достаточно. Если оно таки произойдет, то расписываем на все прерывания индивидуальные "ловушки" и вперед! А напрягаться заранее...
Ser60 писал(а):Минск-22, PHP-11? Да, помню такие во времена молодости :beer: Минск мы программировали на военке, а PHP-11 позже на работе. До этого в школе ещё помню работали на БЭСМ-4 в 8-ричных кодах и на перфокартах.

В наших широтах БЭСМов не было. Совсем. Зато я застал в нашем политехе Минск-1. Ламповую!.. Поработать на ней, правда, не пришлось - когда у нас началось программирование, ее уже сдали на металлолом.
Ser60 писал(а):Если начинаете работать ма MSP430, может Вам больше понравится IDE от IAR. Оно проще, включая определения сегментов, хотя там определения имён тоже по нескольким файлам разбросаны, как и во многих других системах. Ничего в этом страшного нет - просто дело привычки, особенно для Вас с богатым опытом. В целом система IAR менее монстрообразная и работает быстрее. Ассемблерные программы в ней не имеют ограничения на длину прямо "из коробки" даже без всяких "таблеток".

Да я так, радиолюбительствую. К 430-м я обратился, в основном из ностальгических соображений, вспомнить, как писал на асме для любимой PDP-11, очень ведь похоже. Посмотрел на Алиэкспрессе, эта платка меньше $12, этот самый G2553, вроде-бы, неплох, 16 МГц, два таймера А, которые мне понравились, ну и купил.

Если буду делать что-то серьезное, то платформой к этому будет не 430 - скорее уж какой нибудь STM32.
Ser60 писал(а):Насчет чтения документации - без неё никуда. В том документе, что я выше советовал, внимательно читать Вам наверняка не всё нужно будет, может от силы страниц 50.
Даташиты? Безусловно. А вот описание асма, ИМХО, не нужно и даром - в основном все понятно, а ежели вдруг возникнет затык, конкретно это место и прочитаю.

Re: TI MSP430 Launch Pad

Ср дек 17, 2014 02:35:58

afz писал(а):Ну, если ставить один обработчик на всех, то хватит и одного - 0xFFFC (NMI), незаполненные остальные вектора вызовут это самое NMI, и этого вполне достаточно.

Не совсем так. Дело в том, что если вектор прерывания явно не прописан в программе, то по его адресу в таблице векторов стоит 0xFFFF. У MSP430 в регистр PC можно только загрузить чётный адрес, т.е. в бите 0 у него всегда 0. Поэтому, адрес обработчика прерывания 0xFFFF в таблице изменится при загрузке в PC на 0xFFFE, т.е. на адрес RESET-a. После ресета можно анализировать флаги прерывания в SFR по адресу 0х0002 (IFG1) и FCTL3 чтобы разобраться что именно привело к ресету.

Кроме того, следует иметь в виду, что NMI прерывание, хоть оно и не маскируемое, но по умолчанию не разрешено. Разрешение прерываний от событий по вектору 0хFFFC находится в SFR по адресу 0x0000 (IE1). Не маскируемое оно только в том смысле, что его нельзя запретить битом GIE в регистре SR (R2).

Re: TI MSP430 Launch Pad

Сб янв 10, 2015 22:03:48

При подключении хардварного UART 2553 к физическому com-порту необходимо согласование уровней сигнала (MAX232 и т.п.)?

Re: TI MSP430 Launch Pad

Сб янв 10, 2015 22:40:43

разумеется

Re: TI MSP430 Launch Pad

Пн янв 12, 2015 08:03:39

uldemir писал(а):разумеется

Меня смущает разница в напряжении питания msp430 3.3 вольта и max232 5 вольт.
Типовая схема включения max232 для согласования уровней подойдёт?

Re: TI MSP430 Launch Pad

Пн янв 12, 2015 08:57:45

Боюсь, что не подойдет. Лучше что-то типа MAX3231

Re: TI MSP430 Launch Pad

Пн янв 12, 2015 09:06:11

akl писал(а):Боюсь, что не подойдет. Лучше что-то типа MAX3231

Печаль.
MAX3223 подойдёт?

Re: TI MSP430 Launch Pad

Пн янв 12, 2015 09:55:55

Навскидку, да подойдёт. MAX3223

Re: TI MSP430 Launch Pad

Ср фев 18, 2015 07:58:36

Нужен ли в затвор IRLML2402 резистор, что бы управлять им с MSP430G2452 с напряжением питания 3.3 вольта?

Re: TI MSP430 Launch Pad

Вс мар 01, 2015 12:07:30

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

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

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

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

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

Взял создал отдельный GVars.h и там написал обьявление этой переменной. и написал инклюднуть и в грейсовском интерупте и в маине - в итоге получились две РАЗНЫЕ переменные с одинаковым названием!!!!!!! КАК ТАК ТО? а как блин сделать глобальную переменную? Когда останавливаюсь в прерывании - адрес 204 а когда в меине - 205....
Ответить