Каждый раз, когда приходится настраивать очередной периферийный модуль MSP430, мы сталкиваемся с рядом сложностей. К таким сложностям можно отнести незнание списка регистров конкретного модуля, отличительные особенности конкретного микроконтроллера или плохое понимание англоязычных документаций. В любом из перечисленных случаев Grace может стать полезным.
После установки CCS выбираем Project→New CCS Project, в облати Project templates and examples выбираем Empty Project→Empty Grace (MSP430) Project, в области Device не забудьте указать микроконтроллер из списка.
Как только появится экран «Grace — Welcome», нажимаем клавишу Device Overview. Перед Вами появится следующая картинка.
Кликнув по конкретному устройству на ней, Вы перейдёте к его настройке, которую можно производить в нескольких режимах. Режимы могут отличаться для разных устройств, но обычно это Basic User, Power User и Registers. Basic User
Совет: в datasheet к микроконтроллеру не всегда содержится полная информация об интересующем устройстве, про все регистры и параметры обычно можно прочитать в файле MSP430xxxx Family User’s Guide, который можно скачать на сайте Texas Instruments.
Поскольку для работы я уже привык использовать Workbench, после завершения настройки, все конфигурационные данные требуется перенести туда. Для этого нажимаем Project→Build All, находим в папке проекта директорию /src/csl/, в ней и находятся все *.c файлы с конфигурацией каждого устройства.
- #include «msp430f2274.h»
- #include <string>
- void UARTWriteString(string str);
- bool watchdogReset = true;
- void main(void)
- {
- WDTCTL = WDT_MRST_32; // Watchdog автоматически
- // перезапустит систему через 32ms.
- BCSCTL1 = CALBC1_1MHZ; // Устанавливаем тактовую частоту Basic Clock System.
- DCOCTL = CALDCO_1MHZ; // Устанавливаем тактовую
- // частоту Digital Controlled Oscillator.
- P3SEL = BIT4 + BIT5; // Выбираем функцию P1.4/P1.5 как TXD/RXD для UART.
- UCA0CTL1 |= UCSWRST; // Этот бит блокирует работу прерываний от UART и работу
- // сдвигового регистра чтобы не мешать
- // настройке (грубо говоря отключает UART).
- UCA0CTL1 |= UCSSEL_2; // Наш UART будет работать от
- // SMCLK (Sub-main clock), тоесть от 1MHZ.
- UCA0BR0 = 0x68; // Делитель частоты для SMCLK (1000000 / 9600).
- UCA0BR1 = 0x00;
- UCA0MCTL = 0x04; // Определяет маску модуляции.
- // Это помогает минимизировать ошибки.
- UCA0CTL1 &= ~UCSWRST; // Включаем UART обратно.
- P1DIR |= BIT0; // Настройка светодиодов.
- P1DIR |= BIT1;
- P1OUT &= ~BIT0;
- P1OUT &= ~BIT1;
- UARTWriteString(«—Привет, Хабр!—«);
- unsigned char data;
- while(true)
- {
- while (!(IFG2&UCA0RXIFG)) // Проверка готовности буфера приёма.
- if(watchdogReset)
- WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
- data = UCA0RXBUF;
- if(data == 0x01)
- {
- UARTWriteString(«—Погасить зеленый светодиод.—«);
- P1OUT &= ~BIT1;
- }
- else if(data == 0x02)
- {
- UARTWriteString(«—Зажечь зеленый светодиод.—«);
- P1OUT |= BIT1;
- }
- else if(data == 0x03)
- {
- UARTWriteString(«—Переключить состояние красного светодиода.—«);
- P1OUT ^= BIT0;
- }
- else
- {
- UARTWriteString(«—Принятые данные не соответствуют.—«);
- watchdogReset = false;
- }
- }
- }
- void UARTWriteString(string str)
- {
- int strSize = str.length();
- for(int i = 0; i < strSize; i++)
- {
- WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
- while (!(IFG2&UCA0TXIFG)); // Проверка готовности буфера отправки.
- UCA0TXBUF = str[i];
- }
- }
Небольшое видео, которое позволит понять что именно делает пример.
В отличии от предыдущих статей, я постарался дать внятные комментарии прямо в коде программы. Не вижу смысла в этот раз пояснять каждый использованный в коде регистр. Хочу лишь обратить внимание на некоторые аспекты.
Я надеюсь, что эта статья оказалась полезна тебе, читатель.
habr.com
Немного отвлечемся от микроконтроллеров STM32 и сегодня займемся устройствами от Texas Instruments – контроллерами MSP430. И эта статья будет посвящена так называемому быстрому старту с этими девайсами. Все опыты и эксперименты будут ставиться на недорогой отладочной платке – MSP430 LaunchPad.
Итак, открываем коробку с платой и достаем все, что нам понадобится. На данном этапе нам нужна лишь сама плата и USB-кабель для подключения ее к компьютеру. Смело втыкаем шнур в USB-разъем и ждем пока заботливый Windows установит нам необходимые драйвера. Но тут есть одна неприятность – драйвер MSP430 Application UART надо найти и установить самим. Не вопрос! Идем на официальный сайт Texas Instruments и качаем IDE (я остановил свой выбор на IAR Embedded Workbench for MSP430). Архив скачан, распаковываем и идем в диспетчер устройств. Там находим наш девайс и указываем вручную пути к файлам драйвера, которые находятся в скачанном архиве в папке Drivers. В случае успеха отладочная плата будет определяться в диспетчере устройств следующим образом:
Первый этап позади, теперь необходимо установить IAR Embedded Workbench. С этим никаких сложностей возникнуть не должно 😉
Запускаем IAR и создаем новый проект. Для этого идем в Project->Create New Project. В появившемся окне выбираем следующее:
В результате получаем пустой проект, в который уже включен файл main.c. Теперь мы можем переходить к написанию собственного кода. Давайте по традиции начнем с портов ввода-вывода. На отладочной плате есть пользовательская кнопка и парочка светодиодов – а точнее два, красный и зеленый. Давайте так – если кнопка нажата горит зеленый, иначе красный ) Но перед тем как писать программу, посмотрим, какие же регистры отвечают в MSP430 за порты ввода-вывода. Итак, начинаем!
Регистр PxDIR (P1DIR, P2DIR..)
Каждый бит этого регистра отвечает за режим работы соответствующего вывода микроконтроллера. Если в регистре бит равен 0, то ножка контроллера является входом, если бит равен 1 – выходом. Пусть, например, второй бит регистра P1DIR равен 1. Что это значит? А то, что вывод P1.1 работает в режиме выхода.
Регистр PxREN
А этот регистр отвечает за включение/отключение подтяжки вверх/вниз. Тут больше и сказать то нечего.
Регистр PxOUT
А вот здесь поинтереснее 😉 Если вывод у нас работает в режиме выхода, то биты этого регистра отвечают за уровень сигнала на ножке контроллера. Пусть у нас P1.3 работает как выход. Если мы выставим четвертый бит регистра P1OUT в 1, то на выводе P1.3 появится сигнал высокого уровня (логическая единица), если 4-ый бит P1OUT равен 0, то и сигнал на ножке контроллера низкого уровня.
Другое дело, если пин работает как вход. В этом случае биты этого регистра отвечают за подтяжку вывода. Вот небольшой примерчик, чтобы сразу все стало понятно. Пусть P1.0 – вход. Если нулевой бит P1OUT = 1, то подтяжка вверх, если нулевой бит равен 0, подтяжка вниз. Все очень логично )
Следующий регистр – PxIN
Тут все просто – биты этого регистра соответствуют уровню сигнала на соответствующих пинах микроконтроллера. На входе – 1, в регистре – 1, на входе 0, и в регистре – 0. Каждому выводу, например, порта 1 (P1.0, P1.1…) соответствует свой бит регистра P1IN.
Регистры PxSEL и PxSEL2 отвечают за альтернативные функции выводов при использовании какой-либо периферии микроконтроллера.
Кроме всего вышеперечисленного, каждый пин портов 1 и 2 может работать в режиме внешнего прерывания. То есть при изменении сигнала на каком-либо выводе программа ускачет на обработку прерывания. Но мы пока не будем на этом останавливаться, а перейдем уже наконец-то к написанию кода программы ) Осталось лишь разобраться, что куда подключено на нашей отладочной плате:
#include "io430.h" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; // Выводы P1.0 и P1.6 работают в качестве выходов P1DIR = BIT6 | BIT0; // Обнуляем значение регистра P1OUT и все светодиодики гаснут P1OUT = 0x00; // Как видно из схемы кнопка у нас замыкает вывод на землю, // поэтому активируем для вывода P1.3 подтяжку вверх P1REN |= BIT3; P1OUT |= BIT3; while(1) { // Проверяем состояние кнопки if ((P1IN & BIT3) == 0) { // Зажигаем зеленый, гасим красный, если нажата P1OUT |= BIT6; P1OUT &= ~BIT0; } else { // Не нажата - гасим зеленый, зажигаем красный P1OUT |= BIT0; P1OUT &= ~BIT6; } } return 0; } |
Осталось совсем немного – а именно настроить наш проект и отладчик. Идем в настройки проекта и выбираем наш контроллер:
В этом же окне идем во вкладку Debugger и выбираем FET Debugger вместо Simulator. Теперь мы готовы прошивать программу в контроллер!
В итоге при нажатии на кнопку мы должны увидеть горящий зеленый светодиод, а если кнопка не нажата, то горит красный. На этом, собственно, и все, с быстрым стартом для MSP430 мы разобрались!
microtechnics.ru
Здесь я расскажу о том, что вам необходимо для использования Code Composer Studio (CCS). CCS – это среда программирования, или интерактивная среда разработки (Interactive Development Environment (IDE)). Она базируется на Eclipse, – проекте с открытыми исходниками. Eclipse прекрасная среда для редактирования, вам будет на удивление легко писать программы для MSP430. Википедия TI, посвященная LaunchPad содержит линк на скачку CСS, там необходима регистрация, но потом, ее можно будет использовать для получения бесплатных семплов от TI, так что зарегестрируйтесь. CCS свободна к использованию вплоть до 16Кб кода. Это звучит как не очень много, но не забывайте, что MSP430 идущие с LaunchPad не имеют больше 2Кб под программы! (С LaunchPad версии 1.5 идут микроконтроллеры с 16Кб и 8Кб флеш-памяти, но это тоже не выходит за рамки ограничений бесплатной версии. – Прим. пер.). Код, получающийся при программировании MSP430, очень эффективный и плотный, он не занимает много места. Что бы понять, сколько места займет ваш код, мы используем отладчик, включенный в CСS.
После установки CСS, запустите его, и он задаст вопрос о рабочем пространстве (workspace). Рабочее пространство, это просто папка, в которой хранятся ваши проекты. Вы можете всегда поменять ее, просто выберете опцию [Change Workspace] в меню [File]. Пока используйте простой путь, такой как “~/My Documents/MSP430 LaunchPad”. Как закончите с этим, появиться приветственная страница как на картинке выше. Вы можете сразу попасть в рабочую среду, кликнув на кубике в верхнем правом углу. Но, в начале, лучше выбрать иконку с надписью
Положим, вы закончили со всем этим, и разобрались в интерфейсе. Закрывайте приветственную страницу (можно снова ее вызвать опцией [Welcome] в меню [Help]) и заходите в интерактивный редактор. Для начала, нужно всего лишь создать новый проект. Select File → New → CCS Project, и назовите свой проект, как-нибудь понятно для вас. Мне нравится включать в название программы имя конкретной модели микроконтроллера, для которой она пишется. Для мигалки, я назвал проект blinky_G2211. Нажимаем [Next], и убеждаемся что проект именно для MSP430 (скорее всего это единственный вариант, т.к. вы установили версию CCS только для MSP430). Жмем [Next]. Нечего делать на следующей странице, так что снова жмем [Next]. На последней странице нужно выбрать модель нашего микроконтроллера. Убедитесь что [Output Type] выбран как “Executable”, и выберите MSP430G2XXX в фильтре [Device Variant]. Фильтр позволяет вам выбирать подсемейства MSP430, уменьшая число вариантов, что бы легче было найти свою модель. После фильтрации, найдите и выберите MSP430G2211 в поле [Device Variant]. Остальные опции можно оставить по умолчанию. Напомню, перед тем как продолжить, убедитесь в правильном выборе вашего микроконтроллера, т.к. для каждой модели необходим свой компилятор.
Нажмите [Next], в последний раз, и откроется окно редактирования нового проекта. Проект создает подкаталоги в своей папке, где хранятся все необходимые файлы, для загрузки в микроконтроллер. Для начала нам необходим код программы. Выбираем File → New → Source File и вводим имя исходника с расширением “.c” (CСS будет выдавать предупреждение, пока вы не введете расширение “.c” для файла). Имя описательного характера неплохо для больших проектов с множеством файлов, а для начала имя “main.c” будет хорошим выбором. Нажимаем [Finish] и открывается окно, в котором можно вводить код вашей программы. Введите код мигалки, и не забудьте хорошо откомментировать то, как она работает. Убедитесь, что у вас есть одна пустая строка в конце кода, иначе CСS будет выдавать предупреждение.
Если кто-то знает, как от этого избавиться, дайте мне знать. А пока, просто будьте в курсе этой особенности.
Я изменил размер окна редактирования. Мне нравится, когда у редактора 80 столбцов (стандарт окон терминала). Таким образом, я стараюсь избегать чрезмерно длинных строчек кода. Вы можете настраивать размер окна, как вам угодно. Хорошо, у нас есть код, нужно его откомпилировать. Технически, не обязательно компилировать программу, пока мы не собираемся загружать её в MSP430, но это полезно сделать, т.к. во время компиляции вылезают все наши ошибки. Кнопка [Build Active Project] компилировать текущий проект, справа от [Print] печать, откомпилирует ваш проект. Или можно выбрать в меню Project → Build Active Project. Если вы не наделали орфографических ошибок, ваш код должен откомпилироваться без проблем. Компилятор открывает внизу два новых окна, [Console] консоль, показывает команды компилятора и их результаты, [Problems] проблемы, выдает список ошибок и замечаний. Код из предыдущего урока должен откомпилироваться без ошибок.
Итак, мы убедились, что наш код будет работать, давайте загрузим его в микроконтроллер! Втыкайте ваш LaunchPad в USB. Если драйвера уже установлены, кликните в кнопку [Debug] отладка (она похожа на жука) или, по другому, в меню Target → Debug Active Project. Отладчик меняет окна, убедитесь, что ваш код откомпилирован после последних изменений и проверьте соединение LaunchPad с компьютером. Если питания на плате нету, CCS не сможет ее обнаружить. Если все в порядке, код загрузится в микроконтроллер и появится окно отладчика. Обратите внимание на нижнее окно, там видно размер кода, загруженного в MSP430. Мигалка показывает: Text: 86 bytes Data: 2 bytes. Мигалка, не особо сложная программа, но все-равно можно видеть, как мало места она занимает. Тех 2 Кб места для программ, которые есть в ваших G2211 и G2231 должно хватить для всего, что вы можете с ними сделать. (Ну-ну, ага. – Прим. пер.)
Если вы надеялись увидеть, как весело замигал ваш светодиод, вы будете разочарованы. Отладчик останавливает микроконтроллер в состоянии, сразу после сброса по включению питания (Power Up Reset или еще PUC). В среднем окне, вы можете увидеть подсвеченную строку вашего кода: void main(void) { Это окно, демонстрирует позицию в коде, на которой находится выполнение программы в микроконтроллере. Позже мы изучим возможности этого подхода, а пока просто кликните на зеленую стрелку [Run] пуск, с левой стороны окна отладчика. Это отключит контроль тактового генератора отладчиком, и позволит микроконтроллеру работать в нормальном режиме. Светодиод должен мигать примерно раз в секунду.
Итак, наконец-то вы можете видеть мигающий диод, поздравляю, вы закончили ваш первый проект на MSP430! Тем не менее, прочтите следующий урок. Если вы не можете заставить ваш код работать, отладчик может показать вам место, где вы допустили ошибку. Для выхода из отладчика, нажмите [Terminate All] остановить всё, это иконка рядом с иконкой [Run] пуск.
Оригинал урока на английском: Tutorial 05: Loading the Program
Предыдущий урок этого цикла: Урок 04: Застреваем в цикле
Следующий урок этого цикла: Урок 06: Избавляемся от ошибок
we.easyelectronics.ru
В этой лекции мы поучимся пользоваться приложением от TI, под названием Code Composer Studio. Это IDE(интегрированная среда разработки) основанная на open-source проекте Eclipse.
Eclipse это замечательный инструмент, и вам непременно понравится использовать его для программирования вашего микроконтроллера 🙂
Wiki от TI содержит ссылку на загрузку данного программного обеспечения. Для того чтобы загрузить его, вам потребуется регистрация на TI, но это отнюдь не минус — пользуясь вашим аккаунтом, вы можете получать бесплатные примеры кода прямо от Texas Instruments. Да и скорее всего, вы уже там зарегистрированы, так что в этом особой проблемы не будет.
CCS в данном случае — совершенно бесплатна для вас. При запуске, вам будет предложено несколько вариантов лицензирования этого приложения, среди которых, имеется бесплатный — с ограничением на длину кода. Ограничение это составляет аж 16кб. Но стоит огорчаться, для нашего микроконтроллера это в самый раз 🙂 Так что, вы можете со спокойной совестью пользоваться ограниченной версией CCS абсолютно бесплатно, не испытывая никакого дискомфорта. Даже кряк искать не надо 😉 Впрочем, когда мы приступим к программированию и отладке, вы сами убедитесь в том, насколько малы наши приложения.
После установки CCS — запустите его. Студия спросит вас о том, где бы вы хотели расположить ваше рабочее пространство(воркспейс). Воркспейс это просто напросто директория в которой будут храниться все ваши проекты. Не больше и не меньше. Кстати говоря, позаботьтесь о том, чтобы в пути к дистрибутиву CCS не было кириллицы. Впрочем, вас об этом предупредят. Вы всегда можете изменить расположение вашего рабочего пространства, кликнув в меню ‘File -> Switch Workspace -> …’
Примечание: я использую англоязычную версию CCS в силу того что я понятия не имею, есть ли вообще в миру русскоязычная. Да и знать не хочу, честно говоря. Привыкайте к английскому 😉
Стартовый экран CCS 5.3.0 |
Code Composer Studio |
Исходный код мигалки 😉 |
Отладка нашей мигалки |
Спасибо за внимание 😉
Перевёл и дополнил: Александр Мошкин
Оригинал статьи: Tutorial 05. Loading the Program
Следующая лекция: Лекция №06. Отладка приложения
Предыдущая лекция: Лекция №04. Крутимся в цикле
msp430-ru.blogspot.com
Оригинал статьи: Tutorial 02: The MSP430 Township and Registers
Перевод: Александр Мошкин
Коррекция: Алёна Ступникова
msp430-ru.blogspot.com
Сегодня мы разберём приведённую на прошлой паре… э-э-э, блин, привычка однако… программу.
Кто желает, может скачать новый IAR (текущая версия набора 5.20, среда разработки Embedded Workbench — 6-й версии), без необходимости заполнения анкеты как на сайте www.iar.com. Самый свежий. При этом, официально бесплатный, правда с ограничением в 4 Кб кода. Для наших уроков это не проблема — данного объёма вполне хватит.
Заходим по ссылке http://focus.ti.com/docs/toolsw/folders/print/iar-kickstart.html и жмём кнопку «Download».
Предупреждение! Размер скачиваемого архива значителен — около 200 Мб!
А пока я жду заказанного MSP430F249, оговорюсь — рассматриваем 149-й (вернее серию 1xx). Моделька помладше версией ядра, но по ногам они 1 к 1 и совместимы снизу вверх. Кстати, оба контроллера — старшие модели в своём классе.
Приведу текст программы ещё раз:
#include "msp430.h" ; подключаем заголовочный файл
NAME main ; имя модуля
PUBLIC main ; установить видимость модуля из других
; Определение констант
ArrLn EQU 16 ; длина массива
; Вектора прерываний
RSEG INTVEC
ORG RESET_VECTOR ; вектор сброса
DC16 init
RSEG CSTACK ; объявление сегмента стека
RSEG CODE ; объявление сегмента кода
init:
MOV #SFE(CSTACK), SP ; инициализация регистра стека
main: ; начало основной части
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; запрет сторожевого таймера
SortMain:
; Переписать из ПЗУ в ОЗУ массив данных
mov #ArrLn, R4 ; инициализируем счётчик количества данных
mov #RamArr, R5 ; установим R5 как указатель на данные в ОЗУ
mov #RomArr, R6 ; установим R6 как указатель на данные в ПЗУ
MoveRomToRam:
mov @R6+, 0(R5) ; копирование слова
add #2, R5 ; продвинем указатель
dec R4 ; уменьшим счётчик
jnz MoveRomToRam ; если не ноль, то повторим
BasicCycle:
JMP $ ; jump to current location '$'
; определение данных в ОЗУ
RSEG DATA16_N
RamArr:
DS16 ArrLn
; определение данных в ПЗУ
RSEG DATA16_C
RomArr:
DC16 101, 11, 25, 657, 567, 217, 5732, 896, 123, 5467, 12, 65, 2345, 23, 98, 2398
END
Первые три строки — как и в прошлом уроке.
Следом определяем константу длины массива в элементах, чтобы потом пользоваться символьным именем вместо изменения конкретной цифры в куче мест. Да и удобнее сделать так, если вдруг прийдется поменять тип хранимых элементов. То же самое можно сделать как «#define ArrLn 16«, если вам стиль C больше по душе.
; Вектора прерываний
RSEG INTVEC
ORG RESET_VECTOR ; вектор сброса
DC16 init
Далее объявление сегмента стека «RSEG CSTACK«. Стек располагается в конце ОЗУ и растёт вверх.
После него объявление сегмента кода программы «RSEG CODE«. С этого места и начинается наша программа. По умолчанию, сегмент кода начинается с начала ПЗУ, если нет сегментов данных в нём. Если есть — то после них.
Кстати, RSEG означает «перемещаемый сегмент» (relocatable).
Команда
MOV #SFE(CSTACK), SP
заносит адрес стека в регистр-указатель. Директива SFE служит для вычисления адреса конца сегмента (любого).Следующая команда
MOV.W #WDTPW+WDTHOLD,&WDTCTL
запрещает сторожевой таймер, записывая в его управляющий регистр предусмотренную для этого комбинацию бит.Перед тем как рассматривать код дальше, обратим внимание на конец текста программы. Там располагаются определения данных в ОЗУ и ПЗУ.
RSEG DATA16_N
RamArr:
DS16 ArrLn
Здесь определяются данные в ОЗУ. Директивой «RSEG DATA16_N» определяем сегмент неинициализируемых 16-ти разрядных данных для статических и глобальных переменных. По умолчанию располагаются в начале ОЗУ. Директивой «DS16 ArrLn» определяем массив 16-ти разрядных слов в количестве ArrLn. Метка RamArr нужна для обращения к этим данным с помощью символьного имени без необходимости указания абсолютного адреса (чтобы не высчитывать его вручную, да и менять состав данных так легче и меньше будет семантических ошибок).
RSEG DATA16_C
RomArr:
DC16 101, 11, 25, 657, 567, 217, 5732, 896, 123, 5467, 12, 65, 2345, 23, 98, 2398
Здесь мы определяем данные в ПЗУ. Директивой «RSEG DATA16_С» определяем сегмент постоянных 16-ти разрядных данных. Обратите внимание на разницу в именых сегментов. По умолчанию располагаются в начале ПЗУ. Директивой «DC16 ArrLn» определяем массив 16-ти разрядных слов со значениями, указанными в перечислении следом. При компиляции эти значения будут занесены в ПЗУ. Ну и не забываем метку.Вернемся к коду.
SortMain:
mov #ArrLn, R4
mov #RamArr, R5
mov #RomArr, R6
Теперь перенесём данные из ПЗУ в ОЗУ.
MoveRomToRam:
mov @R6+, 0(R5)
add #2, R5
dec R4
jnz MoveRomToRam
Последней командой
jmp $
зацикливаем код ($ — ссылка на счётчик команд, т.е. на текущее положение), дабы не улететь в сияющие чистотой дали пустого FLASH’а.На следующей… паре, мы рассмотрим режимы адресации и структуру памяти, а пока вам для затравки полная версия программы сортировки.
Ну а я поехал кататься на свежекупленном Т-34-85 :-), бо глаза от буковок разбегаются, а мозг требует засадить бронебойным кому-нибудь в боеукладку. До завтра!
#include "msp430.h" ; #define controlled include file
NAME main ; module name
PUBLIC main ; make the main label vissible
; outside this module
; Constant definition
ArrLn EQU 16
ORG 0FFFEh
DC16 init ; set reset vector to 'init' label
RSEG CSTACK ; pre-declaration of segment
RSEG CODE ; place program in 'CODE' segment
init: MOV #SFE(CSTACK), SP ; set up stack
main: ; main program
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
SortMain:
; Переписать из ПЗУ в ОЗУ массив данных
mov #16, R4
mov #RamArr, R5
mov #RomArr, R6
MoveRomToRam:
mov @R6+, 0(R5)
add #2, R5
dec R4
jnz MoveRomToRam
SortingInit:
mov #(ArrLn-1), R4
mov #RamArr, R6
Sorting:
mov R4, R5
mov R6, R7
Sort1:
add #2, R7
cmp 0(R6), 0(R7)
jge Sort1NonSwap
mov 0(R6), R8
mov 0(R7), 0(R6)
mov R8, 0(R7)
Sort1NonSwap:
dec R5
jnz Sort1
add #2, R6
dec R4
jnz Sorting
BasicCycle:
JMP $ ; jump to current location '$'
; RAM definition
RSEG DATA16_N
RamArr:
DS16 ArrLn
; ROM definition
RSEG DATA16_C
RomArr:
DC16 101, 11, 25, 657, 567, 217, 5732, 896, 123, 5467, 12, 65, 2345, 23, 98, 2398
END
we.easyelectronics.ru
Позвольте представить вам учебный курс по микроконтроллерам MSP430.
Хочу сразу предупредить — данный тип МК несколько тяжеловат для рядового пользователя. Его используют в основном профессиональные разработчики, но… Я хочу сделать его доступным для всех. Так, что смотрим и не боимся.
Да, и ещё — традиционно я тяготею к ассемблерным типам языков, так что начнём с них. Потом будет и С.
Как уже говорил глубокоуважаемый _YS_, данный тип контроллеров построен по Фон-Неймановской архитектуре, т.е. имеет одну адресную ось. Деления на память программ и данных нет, просто они располагаются по разным адресам. Чуть позже приведу разбивку.
Мануалы пока читать не будем, просто покажу основное.
Контроллер 16-ти разрядный, в составе ядра есть 16 регистров, четыре из которых специального назначения (R0 или PC — счетчик команд, R1 или SP — указатель стека, R2 или SR — регистр состояния, R3 или CG — генератор констант). Остальные (R4-R15) доступны как регистры общего назначения. Есть одна отличная вещь — любой регистр может быть указателем.
Пока сведений достаточно.
С чего начать? Со среды программирования, ибо первые шаги можно делать не имея аппаратуры.
Внимание! Кто захочет начать с аппаратуры — запомните! Контроллер питается от напряжения 3,3 вольта, 5 вольт для него смертельны! Будьте осторожны.
Итак, среда разработки. Во всём мире профессионалы пользуются программами фирмы IAR Systems — www.iar.com.
Не будем изобретать велосипед, последуем их рекомендациям. С официального сайта можно скачать 30-дневную бесплатную версию. Заморочка в том, что прийдётся заполнить длинную форму личных данных. Кто не боится — вперёд!
После установки и запуска мы видим (у меня 4-я версия, текущая на официальном сайте — 5-я, но отличий немного):
Посмотреть на Яндекс.Фотках
Жмём кнопку «Создать новый проект в текущем рабочем пространстве» («Create new project in current workspace»).
Смотрим на окошко и выбираем «asm/asm».
Посмотреть на Яндекс.Фотках
Нажимаем «Ok» сохраняем файл проекта в нужное нам место. Рекомендую, каждый проект сохранять в отдельный каталог.
Получаем следующее:
Посмотреть на Яндекс.Фотках
Комментирую полученный код.
#include "msp430.h"
NAME main ; module name
PUBLIC main ; make the main label vissible
; outside this module
ORG 0FFFEh
DC16 init ; set reset vector to 'init' label
RSEG CSTACK ; pre-declaration of segment
RSEG CODE ; place program in 'CODE' segment
init: MOV #SFE(CSTACK), SP ; set up stack
mov #1, R1 - поместить 1 в R1,
а
mov 1, R1 - поместить значение из ячейки памяти с адресом 1 в R1
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
JMP $ ; jump to current location '$'
; (endless loop)
Ну и не забываем «END» в конце программы, также как и у PIC в MPLAB. После этого волшебного слова программа заканчивается.
Что сейчас делает наша программа? Почти ничего. Давайте наполним её смыслом. А в качестве примера сделаем сортировку случайных чисел.
Задача следующая:
1. Имеем данные в ПЗУ (набор из 16 случайных чисел).
2. Переместим данные из ПЗУ в ОЗУ.
3. Отсортируем данные в ОЗУ.
Для начала настроим проект.
Выберем тип контроллера. Открываем меню «Projects->Options»:
Посмотреть на Яндекс.Фотках
Появится вот такое окошко, где мы и выберем тип контроллера.
Посмотреть на Яндекс.Фотках
Далее выберем тип отладчика:
Посмотреть на Яндекс.Фотках
Счастливые владельцы аппаратного эмулятора могут выбрать «FET Debugger», ну а нам пока сойдет и «Simulator».
Для начала настроек достаточно. Жмём «Ok».
Далее, вставляем вместо всего в окошке текста следующий код (пока без самой сортировки):
#include "msp430.h" ; подключаем заголовочный файл
NAME main ; имя модуля
PUBLIC main ; установить видимость модуля из других
; Определение констант
ArrLn EQU 16 ; длина массива
; Вектора прерываний
RSEG INTVEC
ORG RESET_VECTOR ; вектор сброса
DC16 init
RSEG CSTACK ; объявление сегмента стека
RSEG CODE ; объявление сегмента кода
init: MOV #SFE(CSTACK), SP ; инициализация регистра стека
main: ; начало основной части
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; запрет сторожевого таймера
SortMain:
; Переписать из ПЗУ в ОЗУ массив данных
mov #ArrLn, R4 ; инициализируем счётчик количества данных
mov #RamArr, R5 ; установим R5 как указатель на данные в ОЗУ
mov #RomArr, R6 ; установим R6 как указатель на данные в ПЗУ
MoveRomToRam:
mov @R6+, 0(R5) ; копирование слова
add #2, R5 ; продвинем указатель
dec R4 ; уменьшим счётчик
jnz MoveRomToRam ; если не ноль, то повторим
BasicCycle:
JMP $ ; jump to current location '$'
; определение данных в ОЗУ
RSEG DATA16_N
RamArr:
DS16 ArrLn
; определение данных в ПЗУ
RSEG DATA16_C
RomArr:
DC16 101, 11, 25, 657, 567, 217, 5732, 896, 123, 5467, 12, 65, 2345, 23, 98, 2398
END
Разберём по частям. Но для начала научимся запускать программу на выполнение.
Скомпилируем проект — пункт меню «Project -> Make» или значок на панели инструментов:
Появится окошко «Messages», в котором отражен процесс компиляции. В случае успеха (а данный текст должен нормально скомпилироваться) появится сообщение об этом.
Далее жмем «Project -> Debug» или кнопку:
Должен запуститься собственно отладчик. IAR поддерживает два набора окон — раздельно для редактирования и отладки.
Закроем лишнее. Структура проекта при отладке не нужна, окно «Disassembly» используется редко, да и «Messages» не нужно.
А вот регистры и память хотелось бы видеть. Жмём «View -> Registers» и два раза «View -> Memory». Перетаскиваем окошки в нужные углы и получаем картинку (на мой вкус, можете сделать по своему):
Посмотреть на Яндекс.Фотках
В окошках «Memory» выбираем типы памяти «RAM» и «Flash», так будет удобнее просматривать. Также, в каждом окшке памяти щёлкаем правой кнопкой и выбираем из контекстного меню «2x Units» (для просмотра 16-ти разрядных данных) и «Data Coverage -> Enable» (будет показано обращение к текущим ячейкам — удобно).
К отладке готовы!
С помошью кнопки F10 (не входить в подпрограммы) или F11 (входить в подпрограммы) проходим по шагам и любуемся результатом. Техника нам подвласна!
На сегодня всё, а завтра продолжим разбор программы.
Просьба — прокомментируйте. Понравилось, не понравилось, не слишком ли тяжело для понимания, что хотелось бы ещё в этом уроке, а также что хочется на будущие. Жду откликов.
Спасибо за внимание.
we.easyelectronics.ru