Когда речь заходит о энергосбережении, то не вспомнить о контроллерах семейства MSP430 от TI просто невозможно. Это просто монстр минимального энергопотребления.
Производитель заявляет потребление:
Активный режим: 160 мкА при работе с частотой 1 МГц от питания 2.2 В
Ждущий режим: 0.7 мкА
Off Mode (RAM Retention): 0.1 мкА
Но сейчас не об этом.
Как создать первое приложение для MSP430
Давайте рассмотрим процесс создания приложения — моргалки диодом для MSP430 в IAR.
IAR можно скачать бесплатно с официального сайта. Есть два вида ограничений: 30 дневной триал или ограничение по размеру куда, тот или иной вариант выбирается при установке среды.
Итак, откройте IAR Workbench.
Создайте новый проект: Project — Create New Project — C — main
Перед вами откроется окно с начальным кодом.
Теперь необходимо выбрать конкретный контроллер, под который мы будем разрабатывать.
Я выбрал MSP430F1121 наугад. Он есть в Proteus (как и многие другие), что существенно облегчит жизнь тем, кто не хочет (или не может) тратить деньги на приобретение отладочных средств.
Перейдите в меню Project — Options — General Option и установите название контроллера в поле Device.
Если вы хотите промоделировать работу контроллера в Proteus, то задайте в настройках генерацию hex файла.
Войдите в меню Project — Options — Linker. Установите галочку Overrite Default и впишите название выходного файла (у меня main.hex), затем установите радио-кнопку Other и выберите Intel-extended.
Теперь перейдем к коду.
MSP430 устроен так, что его сторожевой таймер по умолчанию включен. Чтобы не вносить неразбериху в работу нашей (самой первой) программы, выключим его.
Нам нужно настроить один пин любого порта на вывод. Делается это методом очень похожим на метод используемый в контроллерах AVR.
Есть три регистра для каждого порта. Например для первого:
P1DIR — определяет направление ввода/вывода (1 — выход, 0 — вход).
P1IN — доступен только для считывания. Когда контакт настроен на вход из этого регистра вы можете считать состояние контакта (0 — GND, 1 — VCC).
P1OUT — доступен только для записи. Когда контакт настроен на выход, записав в этот регистр данные вы устанавливаете потенциал контакта (0 — GND, 1 — VCC).
Для простоты примера будем «моргать» первой ножкой первого порта.
Итак программа:
#include "io430.h" int main( void ) { // выключаем сторожевой таймер WDTCTL = WDTPW + WDTHOLD; unsigned int count; // будет нужна для задержки P1OUT = 0; // обнуляем регистр P1DIR |= 0x01; // настраиваем P1.0 как выход while(1) { P1OUT ^= 0x01; // переключаем состояние вывода P1.0 for(count=0; count<60000; count++){ /* задержка */ } } }
Как видите мы установили первый бит регистра P1DIR в 1, тем самым заявив, что P1.0 — работает как выход. После этого мы в бесконечном цикле переключаем первый бит регистра P1OUT при помощи исключающего или.
Откомпилируйте: Project — Make
При симуляции вы должны увидеть что-то вроде этого.