Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Коллеги, подскажите, плз, как в TI CCS начать новый ассемблерный проект? ЧТо-то потыкался, ничего, кроме C/C++ не предлагает. У AVR в любимой студии все прсто: давишь "новый проект" и тебе на выбор предлагают Atmel AVR Assembler или AVR GCC, а здесь его куда закопали?
Это я разжился таки Launch Pad'ом с 2553, второй чип, правда не пережил доставку, ноги обломали при транспортировке, CCS встала без вопросов, поморгать светодиодом из C-программы - все ОК, а вот до асма достучаться не могу...
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
prinv писал(а):
Empty Assembly-only Project не оно?
Да, блин! Не ожидал, что они это дело спрятали в GCC Project - перепробовал все из File - New, кроме GCC Projecr, был убежден, что это начало проекта именно на GCC, а не на асме!..
А как задать конкретный камень? Что-то обшарил всю папочку ti, никаких .h, .inc и т.п. не нашел..
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
А как заполнить таблицу векторов? В пустом проекте, предложенном CCS, есть только .sect ".reset" ; MSP430 RESET Vector .short RESET А дальше как? С АВР-ками я, обычно, делал так: viewtopic.php?f=57&t=72364&start=20 (последнее сообщение), все было нормально. А здесь (в 430) все материалы на один контроллер размазаны по доброму десятку ПДФ-ок, может я и смотрел нужную, но не обратил внимания, а выучить их все, ИМХО, нереально...
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Насчет десятка ПДФ-ок, Вы сильно округлили. Документов по каждой модели МК всего 2. Первый - это ДШ на семейство, где описаны общие для всего семейства сведения по периферии и т.п.. Второй - это долумент на конкретную модель, где, в частности, описана распиновка и другие сведения, характерные только для этой модели, например как включить альтернативные функции выводов. Ну и еще в Errata заглянуть не мешает, но это, как правило разовое явление.
Касательно векторов прерываний, для их программирования нужно лишь знать как они называются. Эти сведения имеются в INC файлах (в самом их конце) для каждой модели по ссылке в папке, что я приводил выше.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
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, и все. Так что за черная магия, при помощи которой все становится на свои места и где она описана?
Напоминаю, это асм, не Си. Здесь на каждый кусочек памяти (байт, слово, несколько слов) я сам должен что-то написать, из воздуха ничего не должно появляться!..
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
написал я программу для обслуживания прерывания 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 писал(а):
Так что за черная магия, при помощи которой все становится на свои места и где она описана?
в которой определено имя оффсета вектора прерывания ресета RESET_VECTOR и также сказано, что его значение равно 15 (0х0F). Это значение умноженное на 2 (MSP430F2553 использует 16-битные адреса), добавится к началу векторов таблицы прерываний в этом МК 0хFFE0 чтобы получить вектор ресета 0хFFE0 + 2*0x0F = 0xFFFE.
afz писал(а):
.sect появляется, как джинн из бутылки и, почему-то сразу попадает на 0xFFFC. Где это прописано?
Это прописано в файле lnk_msp430g2553.cmd из той-же папки. Вот выжимка оттуда, касательно распределения памяти в этой модели МК:
далее ниже определения адресов сегментов .bss, .data..., и в конце файла имена .int02, ... , .int14, .reset. Отсюда, в частности, следует, что адрес таблицы адресов обработчика прерывания начинается с 0xFFE0.
afz писал(а):
Напоминаю, это асм, не Си.
Понимаю. Но при программировании MSP430 на ассемблере в CCS или IAR можно использовать .h файлы для С. Короче, читайте сначала этот документ - там содержатся ответы по крайней мере на все заданные Вами пока здесь вопросы. http://www.ti.com/lit/ug/slau131j/slau131j.pdf
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Ser60 писал(а):
Понимаю. Но при программировании MSP430 на ассемблере в CCS или IAR можно использовать .h файлы для С.
Точее, для Си и для асма используется один и тот же набор .h- и, как выяснилось, .com-файлов.Так вот, набор файлов общий, а как возникают какие-то различия в сишной и ассемблерной нотации, используют условную компиляцию, по параметру __ASM_HEADER__.
Я до этого ни разу не имел дела с ГНУсью, а в нормальных асмах ВСЕ задается в исходнике, а не спрятано где-то в ключах и прочих невидимых хитростях. Тому же AVR: указал в начале исходника
.include <m8.inc>
и все, асм знает, что работаем с Мегой-8. А в этой ГНУси, блин, все через *опу. Поэтому-то я поначалу и не обратил внимания на файлы .com. То есть, конечно, я заглянул в парочку из них, но чего-то специфически ассемблерного там не обнаружил и решил, что эти файлы только для Си. Ну, и забыл про них. Более того, вчера вечером, сочиняя ответ и очередной набор вопросов, я таки нашел файл msp430g2553.com, заглянул в него и лишний раз убедился, что ничего специфически ассемблерного там нет. А вот файл lnk_msp430g2553.com, как оказалось, как раз для асма. Но он мне не попался под руку. Попадись он, так я бы, скорее всего, и сам бы разобрался. Но увы, сразу он мне не попался, откуда и наша дискуссия.
Честно скажу, читать его мне не хочется. С одной стороны, знаешь один ассемблер - считай, что знаешь все, а я их знал столько, что сейчас и не вспомнишь. Начиная с языка символического кодирования ЭВМ "Минск-22" и ассемблера Системы-360. С другой стороны, читать такие объемы английского текста ради того, чтобы прояснить несколько непонятных мест для меня чересчур, не осилю. Да и не особенно надо, все что меня интересовало, я уже выяснил, остальное же - асм, как асм. Ну, различает в именах малые и большие буквы, ГНУсная мерзость, но что делать - другого все равно нет...
Плюсик я нажал.
Кстати, как я понимаю, незаполненные вектора будут содержать 0xFFFF. А как ЦПУ на это отреагирует, если вдруг произойдет непредусмотренное прерывание? В смысле, не обидится ли на нечетный адрес команды? Или банально сочтет его тождественным ресету?
У любимой PDP-11 в этом пункте, помнится, было разночтение - "большие" машинки делали Trap to 4, если не врет мой склероз, а малые, в смысле LSI-11 (у нас - Э-60) просто игнорировали младший бит адреса. А как 430?
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
А как ЦПУ на это отреагирует, если вдруг произойдет непредусмотренное прерывание? В смысле, не обидится ли на нечетный адрес команды? Или банально сочтет его тождественным ресету?
Вопрос законный и правильный. В User's Guide на семейство имеется однозначный ответ на него, а также на вопрос "что будет если процессор встретит неподдерживаемую инструкцию". В первом случае произойдет ошибка доступа к флешу и управление передастся на вектор немаскируемого прерывания по адресу 0xFFFC. Если и там стоит неверный адрес, но программа зациклится. Во втором случае управление передастся по адресу вектора ресета 0xFFFE. В любом случае хорошая практика заполнять ВСЮ таблицу векторов прерывания, поставив в векторах неиспользованных прерываний адрес стандартного обработчика (Default Handler). В процессе отладки в нём можно просто разместить бесконечный цикл, а в реальном устройстве, например, организовать reset МК.
Минск-22, PHP-11? Да, помню такие во времена молодости Минск мы программировали на военке, а PHP-11 позже на работе. До этого в школе ещё помню работали на БЭСМ-4 в 8-ричных кодах и на перфокартах.
Если начинаете работать ма MSP430, может Вам больше понравится IDE от IAR. Оно проще, включая определения сегментов, хотя там определения имён тоже по нескольким файлам разбросаны, как и во многих других системах. Ничего в этом страшного нет - просто дело привычки, особенно для Вас с богатым опытом. В целом система IAR менее монстрообразная и работает быстрее. Ассемблерные программы в ней не имеют ограничения на длину прямо "из коробки" даже без всяких "таблеток".
Насчет чтения документации - без неё никуда. В том документе, что я выше советовал, внимательно читать Вам наверняка не всё нужно будет, может от силы страниц 50.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Ser60 писал(а):
Вопрос законный и правильный. В User's Guide на семейство имеется однозначный ответ на него, а также на вопрос "что будет если процессор встретит неподдерживаемую инструкцию". В первом случае произойдет ошибка доступа к флешу и управление передастся на вектор немаскируемого прерывания по адресу 0xFFFC. Если и там стоит неверный адрес, но программа зациклится. Во втором случае управление передастся по адресу вектора ресета 0xFFFE. В любом случае хорошая практика заполнять ВСЮ таблицу векторов прерывания, поставив в векторах неиспользованных прерываний адрес стандартного обработчика (Default Handler). В процессе отладки в нём можно просто разместить бесконечный цикл, а в реальном устройстве, например, организовать reset МК.
Ну, если ставить один обработчик на всех, то хватит и одного - 0xFFFC (NMI), незаполненные остальные вектора вызовут это самое NMI, и этого вполне достаточно. Если оно таки произойдет, то расписываем на все прерывания индивидуальные "ловушки" и вперед! А напрягаться заранее...
Ser60 писал(а):
Минск-22, PHP-11? Да, помню такие во времена молодости Минск мы программировали на военке, а PHP-11 позже на работе. До этого в школе ещё помню работали на БЭСМ-4 в 8-ричных кодах и на перфокартах.
В наших широтах БЭСМов не было. Совсем. Зато я застал в нашем политехе Минск-1. Ламповую!.. Поработать на ней, правда, не пришлось - когда у нас началось программирование, ее уже сдали на металлолом.
Ser60 писал(а):
Если начинаете работать ма MSP430, может Вам больше понравится IDE от IAR. Оно проще, включая определения сегментов, хотя там определения имён тоже по нескольким файлам разбросаны, как и во многих других системах. Ничего в этом страшного нет - просто дело привычки, особенно для Вас с богатым опытом. В целом система IAR менее монстрообразная и работает быстрее. Ассемблерные программы в ней не имеют ограничения на длину прямо "из коробки" даже без всяких "таблеток".
Да я так, радиолюбительствую. К 430-м я обратился, в основном из ностальгических соображений, вспомнить, как писал на асме для любимой PDP-11, очень ведь похоже. Посмотрел на Алиэкспрессе, эта платка меньше $12, этот самый G2553, вроде-бы, неплох, 16 МГц, два таймера А, которые мне понравились, ну и купил.
Если буду делать что-то серьезное, то платформой к этому будет не 430 - скорее уж какой нибудь STM32.
Ser60 писал(а):
Насчет чтения документации - без неё никуда. В том документе, что я выше советовал, внимательно читать Вам наверняка не всё нужно будет, может от силы страниц 50.
Даташиты? Безусловно. А вот описание асма, ИМХО, не нужно и даром - в основном все понятно, а ежели вдруг возникнет затык, конкретно это место и прочитаю.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Ну, если ставить один обработчик на всех, то хватит и одного - 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).
Нужен - это предохранитель если ваш полевик вдруг на + дрейном закоротят - лучше чтоб резюк сгорел а не весь мк правда? ещё хорошим тоном есть ставить 100 килоом между сурсом и гейтом. при прошивке ноги мк в воздухе.
У меня тут другой вопрос - Играюсь с кодкомпозером и грейсом.
создал пустой с проект. там нажа сконфигурить через грейс периферию и настроил все что мне надо было. в том числе прерывание 1 миллисекунда на таймере.
теперь вопрос. мне надо в обработчике этого прерывания сбрасывать некий флаг который из маина поднимается. тоесть надо чар в глобальной переменной.
если пишу в маине до инклюда грейса - грейс не видит эту переменную Если пишу в файле интеруптс сгенеренной грейсом(там есть такие строки - плейс глобал вариабз) - то в маине не вижу эту переменную.
Взял создал отдельный GVars.h и там написал обьявление этой переменной. и написал инклюднуть и в грейсовском интерупте и в маине - в итоге получились две РАЗНЫЕ переменные с одинаковым названием!!!!!!! КАК ТАК ТО? а как блин сделать глобальную переменную? Когда останавливаюсь в прерывании - адрес 204 а когда в меине - 205....
_________________ Что нас не убило сделало нас осторожней Не доверяйте русским лужам - это может быть вход в метро.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения