Уроки MSP430 LaunchPad. Урок 04: Застреваем в цикле

От переводчика. Нашел в рунете перевод только первых трех уроков из блога Scientific Instruments Using the TI MSP430, решил перевести остальное.

Первый урок этого цикла.
Второй урок и здесь.
Третий урок и здесь.

Теперь у нас есть все необходимое для написания программ под MSP430, поэтому, для начала, займемся периферией, которая делает микроконтроллер полезным. Давайте начнем программирование и отладку. Мы будем использовать MSP430G2211, который идет с LaunchPad (начиная с версии 1.5, с LaunchPad идут микроконтроллеры MSP430G2553 и MSP430G2452 – Прим. пер.). Если у вас нету LaunchPad, довольно просто переделать эту, первую, программу под любой микроконтроллер, который вы используете. Все, что необходимо, это светодиод, подсоединенный к одному из выводов порта ввода/вывода – GPIO (General Purpose I/O). (Соединяйте его через резистор, для уменьшения тока, идущего с вывода микросхемы, пары сотен Ом должно быть достаточно).

В предыдущем уроке упоминалась удобная форма записи битов BITx в заголовочном файле для каждого микроконтроллера. Раньше это было в общем файле серии (таком как msp430x2x01.h, вместо msp430g22001.h), но в последней версии Code Composer Studio (CCS), TI переместили все в специфические для модели файлы заголовков. Когда бы вы ни писали программы для вашего MSP микроконтроллера, убедитесь что подключили правильный заголовочный файл. Для этого урока, если вы не используете LaunchPad или G2211, замените заголовочный файл на подходящий вашему микроконтроллеру.

(В IAR описания в заголовочных файлах, в основном, совпадают с CSS, как и названия самих файлов. Но обычно, в программе под IAR, подключается один <msp430.h>, в котором, в зависимости от настроек компилятора, автоматически подключается заголовочный файл вашего микроконтроллера. В целом, большинство примеров этого курса, будут работать в IAR без переделки, или с минимальными изменениями. – Прим. пер.)

Итак, в начале любой программы по MSP430, мы должны написать такую строчку:

#include <msp430g2211.h>

Для простой программы, этого зачастую достаточно, и можно сразу начать писать функцию main(), и это именно наш случай, – программа «Привет мир!», которой для микроконтроллеров является мигалка. Мигалка, это простенькая программа, которая переключает светодиод с определенной периодичностью. Будет идеально, если для этого используются таймер, прерывания и т.п., но нам придется подождать до того момента, когда мы изучим эти виды функционала и периферии, что бы суметь так сделать. Простейший способ написать такую программу, – использование задержки в цикле. LaunchPad имеет красный светодиод соединенный с выводом P1.0 и зеленый светодиод на выводе P1.6. Мы будем использовать красный светодиод. Начнем же!

Начало нашего кода выглядит так:

#include <msp430g2211.h>

void main(void) {

} // main

К сожалению, есть еще один момент, который необходимо разъяснить, до того, как мы начнем делать что-то еще. MSP430 содержит специальное устройство, называемое «сторожевой таймер» (Watchdog Timer (WDT)). Его работа заключается в том, что бы сбрасывать (reset) микроконтроллер, если он завис (и сторожевой таймер досчитал до ноля). По умолчанию этот таймер включен. Хотя, можно использовать этот таймер вместо цикла задержки, в данный момент нам не нужен сброс микроконтроллера, поэтому нужно его отключить. (Позже мы рассмотрим, как можно использовать сторожевой таймер).

Сторожевой таймер (кратко WDT), имеет 16-битный регистр, называемый WDTCTL, но только младшие 8 бит используются для контроля. Старший байт используется для проверки безопасности: что бы ваш код случайно не изменил WDT, вы должны указать пароль. Это значение старшего байта, равное 0x5a (в старшем байте, полное же число 0x5a00), к счастью заголовочный файл уже содержит определение для этого значения WDTPW, проще запомнить его. Это значение добавляется к байту конфигурации, которую вы хотите вписать в WDTCTL. Для отключения сторожевого таймера, мы можем использовать определение WDTHOLD из заголовочного файла:

WDTCTL = WDTPW + WDTHOLD;

Привыкайте использовать эту строчку вначале всех ваших программ, но не забывайте о том, что сторожевой таймер может выполнять несколько полезных функций. Обсудим это, когда будем подробнее рассматривать WDT. (В IAR, при создании нового проекта, строчка отключения WDT, добавляется автоматически – Прим. пер.)

Хорошо, теперь мы отключили сторожевой таймер и можем продолжить написание кода. Нам нужно зажечь светодиод на P1.0, мы можем использовать, то, что прошли в последнем уроке:

P1OUT = 0;
P1DIR = BIT0;

Сейчас нам нужно переключить светодиод и сделать задержку на некоторое время. Я использую оператор for() для цикла, операторы цикла while() и do-while(), столь же эффективны. Нам нужен счетчик циклов, не забудем определить переменную для него в начале программы.

#include <msp430g2211.h>

void main(void) {
    unsigned int count;
    WDTCTL = WDTPW + WDTHOLD;

    P1OUT = 0;
    P1DIR = BIT0;

    P1OUT |= BIT0;
    for (count = 0; count < 60000; count++);
    P1OUT &= ~BIT0;
    for (count = 0; count < 60000; count++);
} // main

Что случится, когда мы достигнем конца кода? На компьютере, мы просто выйдем в систему. На микроконтроллере же, он просто сделает шаг на следующий адрес для прочтения следующей команды. Там может оказаться все что угодно, начиная со случайного шума и заканчивая командами, оставшимися с записи предыдущего, более объемного кода. В любом случае, он продолжит весело скакать по адресному пространству, пока оно не закончится, а затем… я не знаю, на самом деле, что случится. Этого не должно произойти вообще, поэтому мы должны предотвратить всякую возможность выхода процессора за границы программы. Мы сделаем это, заключив код в бесконечный цикл. Обычно это плохая идея для компьютерной программы, но здесь, это необходимость.

#include <msp430g2211.h>

void main(void) {
    unsigned int count;
    WDTCTL = WDTPW + WDTHOLD;


    P1OUT = 0;
    P1DIR = BIT0;

    for (;;) {
        P1OUT |= BIT0;
        for (count = 0; count < 60000; count++);
        P1OUT &= ~BIT0;
        for (count = 0; count < 60000; count++);
    }
} // main

Опять же, возможно вам проще использовать для этого while (1), или что-то подобное.

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

Самый простой путь, записать это таким образом:

#include <msp430g2211.h>

void main(void) {
    unsigned int count;        // счетчик цикла
    WDTCTL = WDTPW + WDTHOLD;  // отключаем сторожевой таймер


    P1OUT = 0;                 // инициализация, отключаем светодиод
    P1DIR = BIT0;              // настраиваем вывод P1.0 на выход

    for (;;) {
        P1OUT ^= BIT0;         // переключаем светодиод на выводе P1.0
        for (count = 0; count < 60000; count++);  //задержка
    }
} // main

Теперь можно поиграться с длинной цикла задержки, что бы посмотреть, как меняется частота мигания светодиода. Я так же добавил несколько комментариев в код.

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

В следующем уроке, загрузим эту программу в наш G2211 и научимся, как использовать CCS для загрузки программ в LaunchPad.

Упражнение: Напишите программу как мигалка, но которая мигает по очереди то зеленым, то красным светодиодом на LaunchPad (зеленый светодиод на выводе P1.6). Затем модифицируйте программу таким образом, что бы мигание светодиодов превратилось в короткие вспышки, с задержкой между ними.

Оригинал статьи на английском: Tutorial 04: Stuck in a Loop

Следующий урок этого цикла: Урок 05: Загружаем программу
  • +15
  • 17 ноября 2012, 04:03
  • Tabke

Комментарии (13)

RSS свернуть / развернуть
Плюсую. Еще бы теперь это все собрать и оформить оффлайн версию в pdf, к примеру…
0
Как доперевожу, займусь.
+1
Да. Я уж тоже думал так же про свои уроки ( zhevak.wordpress.com/2012/11/13/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d0%bc-%d1%81-msp430-%d0%b2-linux-%d0%b5-lesson-5/ ). И вот что надумал.

Вообще в мире есть газеты, которые публикуют горячие новости (braking news), есть журналы и есть книги. Такая иерархия образовалась не на пустом месте, а годами оттачивалась при подаче всевозможной информации. Но то было на бумаге, нынче — век электронных средств. Но это сути не меняет — чем более длительного пользования продукт предполагается сделать, тем больше времени можно уделить его «шлифованию».

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

Свои уроки я, похоже, «передержал». Основной поток читающих эти уроки схлынул. Но почему-то все еще струится тоненький ручеек читателей.

А книжки — они нужны. По себе знаю. Делить PDF-ки из этих уроков надо однозначно!
0
ХЗ ХЗ ПДФка как и книга — мертва. А тут в комментах может быть больше инфы чем в записи.
0
Доброго, годного срача?
+1
Далеко не во всех темах срач. А только там где вбрасывают срач семена.
0
Там тоскливо, скучно и уныло. Это как правило темы — однодневки. Там нет зажигательной дискуссии, нет интересных оппонентов, да и самих комментариев маловато.
0
хм. противоречишь сам себе.
0
А ты наблюдал за ними годами, как я? Если взять, например, мои статьи по AVR, то комментарии приходят к разным статьям постоянно. Некоторые статьи (как например обращение к памяти на Си) я потом увеличил вдвое-втрое, вынеся многое из комментов. Но если бы я этого даже не сделал инфа бы осталась, пусть и не в столь удобном виде.
0
правильно
нужны видеоуроки
0
на кой они нужны?
0
Что бы не своими мозгами думать, а сидеть за монитором с попкорном, и потом в сообществе создавать посты-вопросы «как помигать светодиодом, посмотрел курс — не получается».
+1
видимо, да…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.