Начало работы с 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.

Простая программа мигания светодиодами далась мне легко, а вот чтобы считать нажатие встроенной кнопки пришлось попотеть мозгами, в интернете все решения моей задачи просто не работали, зачастую код не содержал подключаемого файла, спрашивается, зачем тогда вообще публиковать свой код, если половина кода лишь у тебя одного в загашнике. Проблема тут еще видимо в том, что в комплекте идут уже новые микроконтоллеры в корпусах DIP20MSP430G2553 и 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				; Перейти на сканирование кнопки

29 декабря 2011

msp430