Начало работы с MSP430
Недавно приобрел отладочную плату для MSP430 микроконтроллеров LaunchPad, компании Texas Instruments. Цена платы всего лишь каких-то халявных 140 рублей (и это с быстрой FedEx доставкой из штатов), заказывал прямо на сайте ti.com, но можно купить где угодно, правда дороже.
Так как я работаю в Ubuntu Linux
, то встала проблема компиляции программ, пока что не получилось заставить работать студию CCS 5.1, поэтому пока решил использовать более легкую "артиллерию", а в частности легкий компилятор ассемблера naken430asm. Для заливки программы в микроконтроллер использую программу mspdebug
, которая есть в репозитории Ubuntu
. Также в репозитории есть пакет gcc-msp430
, так что можно писать программы без всякой студии и на си, но сейчас речь пойдет об ассемблере.
Итак, собрал naken430asm
из исходников:
$ ./configure
$ make
$ sudo make install
Установил mspdebug
:
$ sudo apt-get install mspdebug
Всё, теперь можно писать программы на ассемблере, перед этим почитайте README
файл в директории, откуда ставится naken430asm
.
Простая программа мигания светодиодами далась мне легко, а вот чтобы считать нажатие встроенной кнопки пришлось попотеть мозгами, в интернете все решения моей задачи просто не работали, зачастую код не содержал подключаемого файла, спрашивается, зачем тогда вообще публиковать свой код, если половина кода лишь у тебя одного в загашнике. Проблема тут еще видимо в том, что в комплекте идут уже новые микроконтоллеры в корпусах DIP20
- MSP430G2553
и MSP430G2452
, и у них другие первоначальные настройки. В итоге нашел выход из ситуации путем дизассемблирования уже установленной программы в первом микроконтроллере (он мигает двумя светодиодами, и перестает это делать при нажатии на кнопку), не зря я не стал стирать этот МК, а сразу стал тренироваться на втором пустом.
Дизассемблировал программу в первом микроконтроллере:
$ sudo mspdebug rf2500
(mspdebug) dis 0xf800
Аккуратно переписал какие адреса инициализируются значением 0x08
(как несложно догадаться, это порт P1.3
на котором висит наша кнопка 0123-1248). Смотрим в файле определений /usr/local/share/naken430asm/include/msp430x2xx.inc
что эти адреса значат.
После этого уже не составило труда написать нужную нам программу (код ниже). Компилируется программа так:
$ naken430asm blink.asm
Если всё нормально, то на выходе получаю файл out.hex
, который залить в пустой микроконтроллер (да что там кривить душой, и в не пустой тоже) можно так:
$ sudo mspdebug rf2500 "prog out.hex"
Через секунду отладочная плата оживает, светодиодом мигает, при нажатии на кнопку включает второй светодиод.
Первый шаг в изучении MSP430
сделан, далее в планах исследование сенсорных кнопок.
Исходный код blink.asm
:
.include "msp430x2xx.inc" ; Подключение файла /usr/local/share/naken430asm/include/msp430x2xx.inc
LED1 equ 0x01 ; Код светодиода 1
LED2 equ 0x40 ; Код светодиода 2
BUT1 equ 0x08 ; Код кнопки
org 0xfffe ; Reset
dw init ; Указываем адрес для перехода при сбросе
org 0xf800 ; Адрес размещения нашей программы
init:
mov.w #WDTPW+WDTHOLD, &WDTCTL ; Отключить сторожевой таймер - Watchdog/timer control
mov.b #LED1+LED2, &P1DIR ; Включить выходной порт только для встроенных светодидов
; Подготавливаем МК для считывания нажатия кнопки, без какой-то из этих директив не работает (информация взята из дизассембированного кода прошитого МК)
bic.b #BUT1, &P1DIR ; Очистить - Port P1 direction
bis.b #BUT1, &P1OUT ; Установить - Port P1 output
bis.b #BUT1, &P1REN ; Установить - Port P1 resistor enable
bis.b #BUT1, &P1IES ; Установить - Port P1 interrupt edge select
bic.b #BUT1, &P1IFG ; Очистить - Port P1 interrupt flag
bis.b #BUT1, &P1IE ; Установить - Port P1 interrupt enable
blink:
mov.w #30000, R15 ; Количество циклов перед переключением светодиода
xor.b #LED2, &P1OUT ; Меняем светимость светодиода 2 на обратную
scan:
dec.w R15 ; Уменьшаем значение R15 на 1
jz blink ; Если = 0, начать заново цикл свечения светодиода
bit.b #BUT1, &P1IN ; Проверяем нажатие кнопки
jnz off ; Если не нажата, то перейти к выключению светодиода, иначе перейти дальше, на включение светодиода
on:
bis.b #LED1, &P1OUT ; Включить светодиод 1
jmp scan ; Перейти на сканирование кнопки
off:
bic.b #LED1, &P1OUT ; Выключить светодиод 1
jmp scan ; Перейти на сканирование кнопки