430_1. Программируем MSP430  ( Launchpad ) или "проще простого".


Если Вы хотите разобраться как работает MSP430Gxxx,
и  у  Вас есть время и желание,  то это нужно деалать.
Если   времени  нет,  то  нужно  выбрать  другой  путь.
На  данный момент,  есть оболочка програмир.  Energia,
которая  позволяет программировать быстро, используя
готовый код. Запрограммировать LCD display - 10 минут.
Сделать  многоканальный  вольтметр  -  еще  10 минут.
Вывести данные  и  сохранить на компьютере - еще 10.
Готовый вольтметр, который уже работает -  здесь.    .

 Часто, делая всякие радиоэлектронные устройства, задумываешься, что на микроконтроллере их можно сделать лучше, проще и намного скорее. И действительно, пробежавшись по Интернету можно найти много простых устройств, сердцем которых является микроконтроллер.

  Для разработки таких вещей требуется:

-микроконтроллер,
-программатор,
-компилятор,
-эмулятор микроконтроллера,
-знание языка Си или Ассемблера.

  Микроконтроллер и знание языка программирования  - не проблема. Но программатор, эмулятор и компилятор – это за деньги и не малые. Можно, конечно, скачать промышленный компилятор и немного его «подлечить», а программатор сделать самому. Но тогда очень тяжело разбираться с проблемами. То ли программа написана с ошибкой, то ли программатор «глючит», то ли компилятор с эмулятором не «вылечен» до конца. А о ситуации, когда все по отдельности работает, а вместе они не «дружат», так и вообще говорить не хочется. 

  Таким образом, если Вы хотите попробовать программировать микроконтроллеры, то вам понадобится комплект оборудования которое на 100% совместимое и которое на 100% нормально работает.

  Такой комплект есть. Он выпускается фирмой Texas Instruments под названием  «MSP430 Launchpad development kit». Этот комплект продается, исключительно, в учебных целях для популяризации микроконтроллеров TI (Texas Instruments).

   Упаковка и содержимое “MSP430 Launchpad development kit” на фотографии. Здесь есть ВСЕ (!!!) для того, что бы начать программировать, плюс кварцевый резонатор и два микроконтроллера  (MSP430G2553 и MSP430G2452). Программу, "Code Composer Studio V.5", можно скачать c  http://processors.wiki.ti.com/index.php/Download_CCS.  От Вас потребуется, только, начальные знания языка Си, и компьютер с USB портом.

       Ограничения:
- Для бесплатной версии ограничен размер скомпилированного кода до 16 кб.
- Вы не можете использовать этот комплект в коммерческих устройствах.

       Преимущества:
- Цена комплекта (включая 2 микроконтроллера) – вне конкуренции.
- Все начинает работать прямо из коробки.
- Напряжение питания – от 2,2 до 3,6 Вольт, с низким энергопотреблением.

       Недостаток:
- Сложное внутреннее устройство микроконтроллера.

  Недостаток этот, весьма условный. Если Вы только начинаете изучать микроконтроллеры, то для Вас это не имеет НИКАКОГО значения.

  Все, что Вам необходимо или может понадобиться, находится на странице "Getting Started with the MSP430 LaunchPad Workshop". Видеоролики (en) объясняют как все работает. Видео о "Code Composer Studio V.5" - ti.com/tool/ccstudio  Сборник рускоязычных материалов в архиве for_MSP.rar (narod.ru)


  То, что написано дальше имеет мало общего с программированием. Это, скорее, изучение микроконтроллера методом «реверс-инжиниринга» (Rverse Engineering). Предполагается, что у Вас есть “MSP430 Launchpad development kit” и Вы установили "Code Composer Studio V.5", с опциями «по умолчанию».


    Программируем и экспериментируем с “MSP430 Launchpad development kit”.

  Что бы «слить» первую программу в микроконтроллер, сделаем следующее.
1.     Заменим предварительно запрограммированный микроконтроллер MSP430G2553 на «чистый» MSP430G2452 и подключим «Launchpad» к компьютеру, через USB кабель.
2.1    Запускаем программу "Code Composer Studio V.5". Дальше, все в точности повторяет "видео урок 2" начиная с 06:47 мин.
2.2    CCS спросит о директории – создадим новую.
2.3    CCS  даст окно с настройкой проекта. Необходимо вписать название проекта (любое), выбрать тип микроконтроллера (MSP430G2452) и указать, что это пустой проект. Остальное «по умолчанию». Жмем «Finish»
2.4    Закрываем «TI Resource Explorer», дважды щелкаем на main.c в правой колонке «Project Explorer» и можно начинать программировать.

3.1    Не думая о программировании, заменяем текст программы main.c на текст ниже (написано на Си).
3.2    Компилируем (жмем кнопку с «жуком») и программа «сливается» в микроконтроллер.
3.3    Жмем кнопку «Resume» или F8 и наблюдаем за миганием светодиода.

#include <msp430g2452.h>
int main(void) {
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= 0x01;
    for(;;) {
        volatile unsigned int i;
        P1OUT ^= 0x01;
        i = 10000;
        do i--;
        while(i != 0);    }}

  Напоминаю, что мы идем методом «реверс инжиниринга», поэтому качество программы, которую я «скопипастил» из Интернета, нас не интресует. Важно, что она работает. А наша задача выяснить почему.

  Минимальные знания языка программирования Си, позволяют наприсать следующие комментарии.

//**************************************************************************************

#include <msp430g2452.h>        //   Хэдер файл. Подключает файл msp430g2452.h в котором описаны
                                                      // WDTCTL, WDTPW, WDTHOLD, P1DIR, P1OUT и многое другое.
                                                      //  <...> указывает компилятору, что этот файл нужно искать в той дирректории,
                                                      // где все хэдер файлы сложены по умолчанию.

int main (void)                          //  Единственная функция в программе (
main), которая не требует параметров (void),
                                                  // и непонятно почему, должна возвращать занчение "int".
{
    WDTCTL = WDTPW + WDTHOLD;    //  Останавливаем "watchdog" таймер. Иначе программа будет стартовать
                                                            // и тут же сбрасываться по сигналу таймера.

    /* По умолчанию, после сброса, все порты конфигурируются на "вход".*/

    P1DIR |= 0x01;                //   Устанавливаем, с помощью оператора "ИЛИ" ( |= ) P1.0 как вЫход,
                                              //  P1DIR |= 1  (1 - десятичное число) делает то же самое.

    for(;;)                           //  Бесконечный цикл, условия которого всегда выполняются
                                         // и из которого программа никогда не выйдет.

{
    volatile unsigned int i;       //   Целая (int) переменная i, без знака (unsigned),                     
                                               // не требующая оптимизации (volatile).

    P1OUT ^= 0x01;        //   Операция "Исключающее ИЛИ" (^=) инвертирует нулевой бит
                                       // порта P1.0 .

    i = 10000;            //  Присваиваем начальное значение счетчику цикла.

      do i--;                     //  Цикл do-while. Уменьшаем значения счетчика на 1.

      while(i != 0);              //   Если i не равно нулю, то крутимся в цикле do-while.

}}                                 // Конец цикла for(;;) и функции main().

/* Копмилятор CCS V5, может очень неадекватно относиться к комментариям в программе, которые написаны на любом языке, кроме английского. Поэтому "копипастить" программы с русскими комментариями - "дурная примета". */

//**************************************************************************************

    С языком Си, и с синтаксисом команд,  все понятно. Непонятно, только, почему это работает. Ведь в микроконтроллере есть много дополнительных устройств, которые должны быть сконфигурированы, такие как АЦП, таймеры, компараторы, генераторы тактовых импульсов и тд.

   В это тяжело поверить, но после сброса «по питанию» микроконтроллер отключает все дополнительные модули,  кроме "watchdog" таймера, и все порты ввода-вывода переключаются на «вход»!  Генератор тактовых импульсов, без которого микропроцессору «не жить», переключается на внутренний генератор, с частотой около 1 МГц и микроконтроллер начинает выполнять программу.   /*Все внутренние модули, в MSP430, включаются и выключаются программно.*/


  На плате «Launchpad», кроме красного светодиода (подключен к Р1.0), есть зеленый светодиод (подключен к Р1.6). К последнему, удобно подключаться щупом осциллографа. Поэтому изменим программу, что бы оба светодиода мигали одновременно. Для этого, с портом Р1.6, поступим также как с Р1.0.  Включим на выход командой P1OUT |= 0x40 (40h = 0b01000000) и будем инвертировать, в цикле, состояние 6-го бита  командой P1OUT ^= 0x40.

#include <msp430g2452.h>
void main (void)  {
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= 0x01; P1DIR |= 0x40;
    for(;;) {
        volatile unsigned int i;
        P1OUT ^= 0x01; P1OUT ^= 0x40;
        i = 10000;
        do i--;
        while(i != 0);    }}

  Результат получился не такой как я ожидал. Непонятно как, но после компиляции, светодиоды могут мигать поочередно или вместе. При чем, нажатие кнопки “Reset” ничего не меняет.

  Повозившись какое то время, я не нашел никакого внятного объяснения этому факту. Логически, после назначения порта «на выход», в нем могут быть самые непредсказуемые значения, которые тут же попадают на ножку микросхемы. Поэтому, неплохо бы, сразу после назначения порта на выход, записать в него какое-нибудь начальное значение.

  Оператор P1OUT = 0x41, который добавлен в следующей программе, именно так и поступает. Он записывает в порт «P1OUT» шестнадцатиричное число “41” (0b01000001), которое устанавливает "нулевой" и "шестой" биты порта в “1”.  При этом, конечно, остальные биты порта устанавливаются в “0”, но в нашем случае это не имеет значения.

  Результат достигнут. Оба светодиода мигают одновременно. Конечно, вместо P1OUT = 0x41, было бы правильнее вставить P1OUT |= 0x41. Операция "ИЛИ" установила бы в “1” только биты “ноль” и  “шесть”, не изменяя значения остальных бит.

  Временно приостановимся с программированием. Можно часами «перемывать» применение одних и тех же операторов. Но это не интересно. К написанию программ мы еще вернемся. А сейчас хотелось бы обратить Ваше внимание на комментарии в теле программы.

     Ваши комментарии, в Вашей программе.

  Комментарии нужно писать даже в самых, казалось бы, простых программах. Если Вам кто то говорит, что комментарии нужны что бы через пол года можно было разобраться с программой – не верьте. С программой без комментариев тяжело разбираться уже на следующий день, а через пол года ее проще переписать заново. Помните, что компилятор эти комментарии игнорирует,  как и все, что после // и до конца строки, а так же между /* и */  (сколько бы строк это не заняло).


     А без программатора?

  Работая с «Launchpad» меня не покидало чувство некоторого подвоха. То есть, в программаторе микроконтроллер легко «прошивается» и выполняет программу (мигая светодиодами, к примеру). А что будет происходить, если вынуть микроконтроллер и поставить в реальную схему?

  Схема, «состряпанная» на скорую руку, на рисунке ниже.  Литиевая батарейка, через резистор R1 заряжает конденсатор C1, который зашунтирован диодом D1. Последний шунтирует схему в случае если перепутана полярность батареи, а R1 не дает ему сгореть. Резистор R2 поднимает напряжение на входе “Reset”, С2 его задерживает. Без C2 микроконтроллер будет, то же, запускаться, но через раз. Светодиоды D2,D3 через резисторы, подключены к выходам порта (P1.0, P1.6). 

#include <msp430g2452.h>
void main (void)  {
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= 0x01; P1DIR |= 0x40; P1OUT = 0x41;
    for(;;) {
        volatile unsigned int i;
        P1OUT ^= 0x01; P1OUT ^= 0x40;
        i = 10000;
        do i--;
        while(i != 0);    }}

MSP430G2553 простая программа.
MSP430G2553 работает автономно от 2,5V.

  Результат, как говорится, на фотографии. На отдельной плате, запрограммированная микросхема работает точно так же, как в программаторе. Кварцевый резонатор не наужен, тк микроконтроллер после сброса начинает работать от внутреннего генератора (около 1 МГц).  Частоту последнего можно легко поменять программно. Возможные значения 1, 8, 12 и 16МГц.

/*Если присмотреться к макетной плате, то в отличии от схемы, светодиоды подключены не к «плюсу питания», а «на землю». Для мигания светодиодами это значения не имеет. Оба варианта (“на плюс” и “на землю”) работают одинаково хорошо.*/


      Дальше.

  А дальше, остается проверить с какого напряжения микроконтроллер MSP430G2452 начинает работать, какой ток потребляет, и какую максимальную частоту можно получить (к примеру, если использовать его в качестве генератора прямоугольных импульсов). Так же, о стандартном «трюке» в программировании, который укорачивает программы и делает их более «читабельными».


 Дальше -->

8.06.2012  SKootS

_

Make a free website with Yola