Начало работы с 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                ; Перейти на сканирование кнопки
29 декабря 2011