tag:blogger.com,1999:blog-73101682229383122732024-02-19T13:38:37.659+03:00Программирование под MSP430Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-7310168222938312273.post-80270526074644621122013-03-15T23:47:00.001+04:002013-03-15T23:47:28.511+04:00Лекция №06: Отладка приложения<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUMq-Nw03FZaP_lfTvmExgqliuV9oi1NLqDlHoAmqMVRcif2yUPCusDWCoDhzc4N4jPXTCak6GhaKc1slRq10HCpiQf8eRh4zMkJi5beJDXuNIBQsIrfdB1iFXxmwwX_oyUI3VERSEMw/s1600/debug.PNG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUMq-Nw03FZaP_lfTvmExgqliuV9oi1NLqDlHoAmqMVRcif2yUPCusDWCoDhzc4N4jPXTCak6GhaKc1slRq10HCpiQf8eRh4zMkJi5beJDXuNIBQsIrfdB1iFXxmwwX_oyUI3VERSEMw/s320/debug.PNG" width="320" /></a>Режим отладки приложения, это одна из наиболее полезных возможностей при разработке ваших проектов. Что-ж, пришло время рассмотреть её поближе. Запустите CSS, откройте в нём мигалку и запустите режим отладки, кликнув на старого-доброго жука. Только в этот раз, не надо запускать приложение. Не жмите треугольник. Ведь нам нужен именно режим отладки. Сделали? Отлично. Теперь на вашем экране должно быть примерно тоже, что и на картинке. По умолчанию, в режиме отладки, открывается 4 активных окна. С двумя из них, мы уже знакомы. Нижнее - различная информация о ходе работы IDE: сообщения компилятора, или информация о загруженном коде. Там много всякой ерунды :) Ну и среднее окно - собственно, это наш редактор. Его-то вы точно узнали.<br />
<br />
Что касается оставшихся двух окон, "Debug" и "Variables/Expressions/Registers". Тут на самом деле, тоже ничего сложного. Окно "Debug" показывает наше текущее положение в иерархии нашего проекта. Звучит не очень понятно, как и выглядит, но не забивайте себе голову. Просто напросто наша программа состоит всего из одного файла - main.c(ну не считая хидера), так что иерархии-то как таковой и нет вовсе. Поэтому выглядит не наглядно. Чуть позже вы всё поймете. Что касается второго окна, в нем отображаются текущие значения переменных используемых в коде и значения регистров нашего микроконтроллера.<br />
<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLtCAAZhaSYZfiAGiVufdZV1_KGXCX0gQeiRksu7UYwtL9PoCSfMsFoLYsOr6npDIeDzw4lkmC0W2-wSiDWQ9Fljx-hsKNfEprZISNIUO3AhSeGS9VT8X8wGLEzAyHIpZpmY84x15Q0qc/s320/IDE05.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLtCAAZhaSYZfiAGiVufdZV1_KGXCX0gQeiRksu7UYwtL9PoCSfMsFoLYsOr6npDIeDzw4lkmC0W2-wSiDWQ9Fljx-hsKNfEprZISNIUO3AhSeGS9VT8X8wGLEzAyHIpZpmY84x15Q0qc/s1600/IDE05.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Play/Pause/Stop</td></tr>
</tbody></table>
<div style="text-align: left;">
Обратите внимание коллекцию иконок в окне отвечающем за отладку. Тут вы можете увидеть ту самую кнопку запуска приложения, которую нажимали в конце предыдущей лекции. Помимо неё тут присутствует кнопка "Пауза"(которая, кстати, не активна до тех пор, пока не нажмёте кнопку запуска), следом за ней идёт кнопка останова. В общем, все как в вашем любимом аудио или видео плеере, до боли знакомые "Play", "Pause" и "Stop" Не хватает только клавиш перемотки :) Или... хватает? </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9pODKtb7CrIniqIK3-IjN98NLRA804siP64wxZQPyBHBKuqLvymdT1JoYiEpq_ihdAcWcJHkhE7DzLhn2P2Va4QyBzJVaQVNe1NiZvLDQZxEiLsQYIpLkPcOXhyphenhyphen4v5vHuKthUIguwd6E0/s320/IDE06.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9pODKtb7CrIniqIK3-IjN98NLRA804siP64wxZQPyBHBKuqLvymdT1JoYiEpq_ihdAcWcJHkhE7DzLhn2P2Va4QyBzJVaQVNe1NiZvLDQZxEiLsQYIpLkPcOXhyphenhyphen4v5vHuKthUIguwd6E0/s320/IDE06.jpg" /></a>Теперь о клавишах перемотки. Их есть у нас :) По крайней мере, ближайшие аналоги. Взглянем на следующее изображение. На нём изображен целый ряд иконок со стрелочками. Пока что, нас интересует только первая из них. Она называется "Step Into" что по русски звучит как "С шагом в ...". Именно эту кнопку сегодня мы и будем использовать. Причем крайне активно. Сразу после ряда иконок со стрелочками, есть кнопка на которой изображён процессор с двумя вращающимися стрелками. Эта кнопка сбрасывает наш MSP430 и возвращает отладчик в начало кода.</div>
<br />
<br />
<h1>
Примеры</h1>
<div>
<br /></div>
<div>
Прежде чем мы приступим к отладке нашего кода, давайте внесём в код некоторые изменения. К примеру, в цикле, где организована задержка, поменяем число 60000 на 6. Особо догадливые, наверное, уже поняли зачем это, если вы не из их числа, то наберитесь немножко терпения. Скоро все станет очевидно. Итак, после того как вы внесёте изменения в код, скомпилируйте и залейте в микроконтроллер обновленную версию мигалки.</div>
<div>
<i><br /></i></div>
<div>
<i>Примечание переводчика: в оригинальной статье на скриншотах есть какая-то волшебная кнопка которая автоматически в режиме отладки компилирует измененный код и загружает новую версию приложения в MSP430. В своей CCS я этой кнопки в упор не вижу, поэтому буду благодарен если вы мне её покажете. Если у вас её тоже нет, - действуйте по старинке. Останавливайте отладку, и заново загружайте код в МК. Good Luck, sugarcubes :3</i></div>
<div>
<i><br /></i></div>
<div>
Ну что-ж, пришло время для использования нашей заветной кнопочки "перемотки", она же "Step Into". Когда вы её нажимаете, управление передается следующей строке вашего кода. Клик - строка. Клик - строка. Все просто и очень удобно. Таким образом вы можете пошагово проследить выполнение программы. В самом начале отладки, курсор должен стоять на строке в которой вы выключаете сторожевой таймер. Заметьте, то что эта строка выделена, вовсе не значит, что она выполнилась. Скорей наоборот, она выполнится тогда и только тогда, когда вы перейдете к следующему участку кода. Кстати, вы уже заметили, что переменная count уже появилась в окне Variables? Нет? Так вот она там есть :) CCS загружает эту информацию автоматически, ещё до начала отладки. Эта переменная, кстати, скорее всего имеет какое-нибудь совершенно случайное значение. Оно и верно, ведь переменная-то ещё не инициализирована.<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9seflvgx6h8qzbneioo94XFRF4bAASsy9CLR1iBv1QjsfeAS47l97ZajG7wPHKb-GAjhcBR1Rv-YJjYrvBPLfMMXaau1Ug5-DsxI8YExSFuXRI7czCyI8IVjWsd_frHsLLMsQbSWVDkTY/s320/IDE08.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9seflvgx6h8qzbneioo94XFRF4bAASsy9CLR1iBv1QjsfeAS47l97ZajG7wPHKb-GAjhcBR1Rv-YJjYrvBPLfMMXaau1Ug5-DsxI8YExSFuXRI7czCyI8IVjWsd_frHsLLMsQbSWVDkTY/s320/IDE08.jpg" /></a>Прежде чем мы "выполним" строку меняющую значение регистра WDTCTL, давайте взглянем на ещё одно крайне полезное окно. Кликните на менюшку View->Registers и вы увидите ещё одно окно, в котором содержатся все регистры вашего устройства. (Это КРАЙНЕ полезная фича, обучаться работе с регистрами нашего микроконтроллера с помощью неё - просто сказка) Найдите в этом списке регистр Watchdog_Timer. Раскройте его и увидите тот самый регистр который вы вот-вот измените - WDTCTL. Отладчик показывает, что в данный момент, значение регистра WDTCTL - 0x6900 (помните, что префикс 0x означает шестнадцатеричные данные). Раскройте и этот регистр, чтобы посмотреть на значения конкретных битов. Как вы видите, все они обнулены при включении нашего микроконтроллера. Это означает то, что при таких настройках, сторожевой таймер будет выполнять свои прямые обязанности, а именно - сбрасывать наш МК с определенным интервалом. Нужно ли нам это? Сейчас - нет. Как мы исправим наше положение? Правильно - нажмем 'Step Into' чтобы внести изменения в наш регистр.<br />
Классно, правда? Значение WDTHOLD изменилось на 1(а само поле пожелтело, сигнализируя о том, что за этот такт в регистре что-то изменилось) а сам WDTCTL теперь равняется 0x6980. Ничего не настораживает? Хорошо если да. Особо внимательные из вас должны помнить, что WDTCTL для изменения требует константу 0x5A(WDTPW), в то время как при попытке чтения этих битов, возвращаемое значение всегда 0x69. Вот такие пироги.<br />
<br />
<i><span style="color: #3d85c6;">(Кстати, хотите выполнить форсированный сброс вашего микроконтроллера? Легко! Просто напишите с виду безобидную строку WDTCTL = WDTCTL. Ведь правая часть этого выражения, подразумевает чтение значений, а чтение первых восьми битов этого регистра всегда возвращает 0x69, в то время как запись(левая часть) требует 0x5A. Таким образом, получается то, что WDTPW записывается неверный. Ну, а когда наш MSP430 получает некорректный пароль, он моментально сбрасывается. Мало ли чего)</span></i><br />
<br />
Попробуйте, найдите регистры первого порта(P1) и выполните следующие две строчки кода. Посмотрите, как изменяются значения регистров. Завораживает =) Теперь, "курсор" отладчика должен стоять на строке который переключает состояние светодиода. То есть включает если он выключен, и выключает если включен. Всё просто. Кстати, гляньте ещё разок на переменную count, она всё ещё содержит случайное значение. Настало время для знаменательного момента - жмём ещё раз F5(Step Into) и ... он загорелся! Сейчас курсор отладчика располагается на строке с циклом for который выполняет нашу задержку. Жмём F5 и проходим первую итерацию цикла. Тут-то переменная count наконец-то инициализирована. Как мы видим, она принимает значение 0. F5. Переменная count теперь 1. Таким образом, мы жмём F5 до тех пор(теперь прикиньте, если бы там до сих пор стояло 60000), пока не выйдем из цикла, перейдя на следующую итерацию вышестоящего for, где мы снова переключаем значение регистра P1OUT и выключаем светодиод. В любой момент времени, вы можете нажать кнопку Run и сложить управление на плечи MSP430. Чтобы тот мигал самостоятельно, без вашего вмешательства. Есть один нюанс - вы этого не заметите. Этот микроконтроллер достаточно быстр, чтобы ваш глаз попросту не заметил его подмигиваний с задержкой в 6 тактов :)<br />
<br />
Как видите, отладчик - крайне полезная вещь, но вам следует помнить, что он не всегда сможет вам помочь. MSP430 спроектирована для взаимодействия с окружающим миром. Отладчик, останавливая часики внутри нашего микроконтроллера, к сожалению не способен останавливать время нашей вселенной. Это влечёт некоторые нестыковки при попытке отладки приложений взаимодействующих с чем-то в режиме реального времени. В следующих лекциях, мы изучим то, как можно производить отладку приложений зависящих от тактов окружающего мира, но это будет потом :) Надеюсь, я смог вас убедить в том, что отладка это крайне удобная процедура не только для отлова ошибок, но и для обучения. Для визуализации того, что происходит внутри микроконтроллера, когда выполняется та или иная строка кода.<br />
<br />
Собственно, друзья, теперь наших знаний вполне достаточно для того, чтобы писать свои собственные несложные программы, загружать их в микроконтроллер, вылавливать ошибки, с помощью отладчика, в общем-то, это уже довольно много! Поздравляю вас :)<br />
Совсем скоро, мы начнём более углублённое изучение этого микроконтроллера. Ну, а пока что - побалуйтесь, попробуйте написать более сложные мигалки :)<br />
<br />
<i><span style="color: #990000;">Домашнее задание: попробуйте отладить код из лекции №04. Ведёт ли он себя так, как вы ожидали? Не забудьте изменить условие в цикле задержки, чтобы не жать F5 шестьдесят тысяч раз :) Убедитесь, что программа работает в точности так, как вы запланировали. </span></i><br />
<br />
<i><span style="font-size: x-small;">Перевёл и дополнил: <a href="https://plus.google.com/100706352058867746787" target="_blank">Александр Мошкин</a></span></i><br />
<i><span style="font-size: x-small;">Оригинал статьи: <a href="http://mspsci.blogspot.ru/2010/07/tutorial-06-getting-bugs-out.html" target="_blank">Tutorial 06. Getting the Bugs Out</a></span></i><br />
<i><span style="font-size: x-small;">Следующая лекция:</span></i><br />
<i><span style="font-size: x-small;">Предыдущая лекция: <a href="http://msp430-ru.blogspot.ru/2013/03/05.html" target="_blank">Лекция №05. Загружаем программу</a></span></i><br />
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com0tag:blogger.com,1999:blog-7310168222938312273.post-24721490779814489462013-03-15T19:43:00.001+04:002013-03-15T23:49:01.946+04:00Лекция №05: Загружаем программу<div dir="ltr" style="text-align: left;" trbidi="on">
<i>Примечание: мною было решено внести некоторые изменения в процесс перевода. Теперь я буду не просто переводить лекции, а адаптировать их под нынешние реалии. Нет никакого резона писать о микроконтроллерах и приложениях трёхлетней давности. Поэтому:</i><br />
<i>Приложение: Code Composer Studio <b>5.3.0</b></i><br />
<i>Микроконтроллер: <b>msp430g2553</b>. Enjoy.</i><br />
<br />
В этой лекции мы поучимся пользоваться приложением от TI, под названием Code Composer Studio. Это IDE(интегрированная среда разработки) основанная на open-source проекте Eclipse.<br />
Eclipse это замечательный инструмент, и вам непременно понравится использовать его для программирования вашего микроконтроллера :)<br />
<a href="http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_(MSP-EXP430G2)?DCMP=launchpad&HQS=Other+OT+launchpadwiki" target="_blank">Wiki от TI</a> содержит <a href="http://processors.wiki.ti.com/index.php/CCS_for_LaunchPad" target="_blank">ссылку на загрузку</a> данного программного обеспечения. Для того чтобы загрузить его, вам потребуется регистрация на TI, но это отнюдь не минус - пользуясь вашим аккаунтом, вы можете получать бесплатные примеры кода прямо от Texas Instruments. Да и скорее всего, вы уже там <a href="http://msp430-ru.blogspot.ru/2012/10/msp430_10.html" target="_blank">зарегистрированы</a>, так что в этом особой проблемы не будет.<br />
CCS в данном случае - совершенно бесплатна для вас. При запуске, вам будет предложено несколько вариантов лицензирования этого приложения, среди которых, имеется бесплатный - с ограничением на длину кода. Ограничение это составляет аж 16кб. Но стоит огорчаться, для нашего микроконтроллера это <b>в самый раз</b> :) Так что, вы можете со спокойной совестью пользоваться ограниченной версией CCS абсолютно бесплатно, не испытывая никакого дискомфорта. Даже кряк искать не надо ;) Впрочем, когда мы приступим к программированию и отладке, вы сами убедитесь в том, насколько малы наши приложения.<br />
<br />
После установки CCS - запустите его. Студия спросит вас о том, где бы вы хотели расположить ваше рабочее пространство(воркспейс). Воркспейс это просто напросто директория в которой будут храниться все ваши проекты. Не больше и не меньше. Кстати говоря, позаботьтесь о том, чтобы в пути к дистрибутиву CCS не было кириллицы. Впрочем, вас об этом предупредят. Вы всегда можете изменить расположение вашего рабочего пространства, кликнув в меню <span style="font-family: Times, Times New Roman, serif;">'File -> Switch Workspace -> ...'</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<i>Примечание: я использую англоязычную версию CCS в силу того что я понятия не имею, есть ли вообще в миру русскоязычная. Да и знать не хочу, честно говоря. Привыкайте к английскому ;)</i><br />
<i><br /></i>
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwV0Jto8mlFe3Vwy-g7A-WWGTU_pZqWE0upV8TsO7AMAEutisgoVlexjkKqToXu0AMi7LCFWyGJq7VccxzdwwMkN8DL0w6VRf5tf-Jh_Pi83IAPVQ7psO13S8xJEtxuwmeC4Zr_ucSeg/s1600/start_screen.PNG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="Стартовый экран" border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwV0Jto8mlFe3Vwy-g7A-WWGTU_pZqWE0upV8TsO7AMAEutisgoVlexjkKqToXu0AMi7LCFWyGJq7VccxzdwwMkN8DL0w6VRf5tf-Jh_Pi83IAPVQ7psO13S8xJEtxuwmeC4Zr_ucSeg/s320/start_screen.PNG" title="" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Стартовый экран CCS 5.3.0</td></tr>
</tbody></table>
Для начала, выберите в качестве воркспейса что-нибудь типа<span style="font-family: Times, Times New Roman, serif;"> 'Мои документы/MSP430 LaunchPad'</span><br />
<span style="font-family: Times, Times New Roman, serif;">Как только вы закончите, перед вами появится стартовый экран, прямо как на этой картинке. Вы, конечно же, можете сразу же кликнуть на 'New Project', но все таки, если вы начинающий - стоит обратить внимание на ролик 'Getting Started'. Я его, кстати, так и не посмотрел, так как он мне почему-то предложил установить Adobe Flash Player, который у меня и так есть. Поэтому о содержании оного, мне остается лишь догадываться(да и лень вообще-то). Так что, в какой-то степени - вам повезло! Смотрите и наслаждайтесь :) Скорее всего, там вам дадут некоторые базовые понятия о данной IDE. </span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYX9L8FR0yLkpZzYpdOflcy9AOwvswrZYZZXO86Boc7lCSD-JeS_LvUncPec-Thq2w0UfmePDXeyqtRkieRqc8qNmbzFtlDue_Gh3CKLAbN9DyS30TtbwjxWGACpUhAXi_orrJ49IdDQ/s1600/main.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYX9L8FR0yLkpZzYpdOflcy9AOwvswrZYZZXO86Boc7lCSD-JeS_LvUncPec-Thq2w0UfmePDXeyqtRkieRqc8qNmbzFtlDue_Gh3CKLAbN9DyS30TtbwjxWGACpUhAXi_orrJ49IdDQ/s320/main.PNG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Code Composer Studio</td></tr>
</tbody></table>
<span style="font-family: Times, Times New Roman, serif;">Как только вы почувствуете что вы готовы, и вас не смущает новое для вас программное окружение - закройте стартовый экран(вы всегда можете вернуться в него по меню Help->Welcome to CCS). Теперь вы в наедине с IDE. По началу, приложение не блещет разнообразием, выглядит довольно пустовато, согласитесь(честно говоря, скриншот был сделан уже после того как я поработал с IDE, поэтому не знаю как он выглядит изначально, но думаю - пустовато :Р), но не отчаивайтесь, скоро вам вообще места хватать не будет. Ну что же, приступим к созданию нашего первого проекта(Woo-Hoo!). Кликаем на 'File->New->CC Project' и введите имя вашего проекта. Не пишите "test" или подобную ерунду, имя программы должно отражать его суть. Кстати говоря, к названиям я предпочитаю добавлять суффикс, который показывал бы, для какой конкретно модели микроконтроллера расчитана данная программа. К примеру для нашей мигалки, это выглядит так: blinky_g2553. В пункте Output File выберите "Executable", остальные пункты подгоните подстать вашему микроконтроллеру, например: Family: MSP430, Variant: MSP430Gxxx Family, MSP430G2553. В пункте Connection обычно уже выставлено то что надо, при условии подключенной платы LaunchPad к вашему компьютеру. Жмём "Finish" и готово!</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijnwVkQXG2KkZIXugc3cm8-Qz1AaIj15-hbhNVRK0Myhn-S5u5fZB2v1Somzav8TESnu-UNmmgzc2Qn7Q_8qs_MtSBnF49zyvgQVLlxqYk7P7KM5OZmGZ4JloWTmPZ_bSHE0cbetY_Zw/s1600/blinky.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijnwVkQXG2KkZIXugc3cm8-Qz1AaIj15-hbhNVRK0Myhn-S5u5fZB2v1Somzav8TESnu-UNmmgzc2Qn7Q_8qs_MtSBnF49zyvgQVLlxqYk7P7KM5OZmGZ4JloWTmPZ_bSHE0cbetY_Zw/s320/blinky.PNG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Исходный код мигалки ;)</td></tr>
</tbody></table>
<span style="font-family: Times, Times New Roman, serif;">Вот и наш редактор кода! Растяните окна так как вам удобно, и введите исходный код нашей мигалки. Ввели? Отлично. Теперь пришло время скомпилировать наш код. Вообще говоря, вовсе не обязательно компилировать вашу программу перед тем как загружать её в микроконтроллер. Но лучше всё таки побороть лень, и сделать это. Зачем? Ну, вам же будет проще, если все возможные ошибки вылезут наружу <b>ДО </b>того как вы приступите к отладке вашего приложения, не так ли?:) Для того чтобы скомпилировать программу, вам следует найти иконку с молотком и нажать на неё. Всё просто. Если вы не допускали ошибок по ходу написания программы, компиляция пройдет как по маслу. Кстати об этом. Вы наверное заметили, что при компиляции программы, внизу CCS появляется два дополнительных окна - "Console" и "Problems" так вот, если вы допустили какие-то ошибки в исходном коде, в окошке "Problems" компилятор на них укажет. Во втором же окне, отображается просто информация о ходе сборки. Ничего важного для нас там, пока что нет. </span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijHEgO5I4T4J_Pfudb0FSQBK57w469sCKH4CcJLD2zuVpsWVXKR15YtjY3zpaFd7D_APwmfxAsdlHjAkIqyTcajkc_M44BTBFsfjgZK3-DeCoM6Y-N289frUFenTXy8P_P0qmQG1L9Lw/s1600/debug.PNG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijHEgO5I4T4J_Pfudb0FSQBK57w469sCKH4CcJLD2zuVpsWVXKR15YtjY3zpaFd7D_APwmfxAsdlHjAkIqyTcajkc_M44BTBFsfjgZK3-DeCoM6Y-N289frUFenTXy8P_P0qmQG1L9Lw/s320/debug.PNG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Отладка нашей мигалки</td></tr>
</tbody></table>
<span style="font-family: Times, Times New Roman, serif;">Окей, всё хорошо, ошибок нет, код скомпилирован. Хватит дурить, пора заливать код в наш MSP430! Подключите ваш LaunchPad в USB порт. Если при установке CCS драйвера установились корректно и без ошибок, тогда просто кликните на иконку с жуком. Она рядом с молотком :) После нажатия, главное окно CCS полностью поменяется, заполнится всякими пока ещё непонятными окошечками и надписями. Впрочем, некоторые из них уже нам знакомы. Но сейчас не об этом. В общем, если питания поступающего от USB хватает, если драйвера установлены, то все должно пройти без заминки. Если же возникли какие-то проблемы, попробуйте переустановить CCS(или Windows) другого решения проблем в этой ОС я просто не знаю ;) Ладно, ближе к делу. Обратите внимание на окно с заголовком "Console". Там информация о нашей мигалке:</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">MSP430: Loading complete. Code Size - Text: 180 bytes Data: 2 bytes.</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: inherit;">Это информация о загруженных в микроконтроллер данных. Обратите внимание - всего 182 байта. На MSP430G2553 доступно 16кБ. Подсчитайте, сколько таких мигалок туда влезет ;)</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Вот вы нажали на "жучка" и затаив дыхание, с глуповатой улыбкой уставились на ваш LaunchPad. Ждёте что он замигает? Ха - нет. По крайней мере, не сразу. Дело в том, что наш отладчик останавливает выполнение программы сразу же после того как было подано питание(Power Up Reset, аббр.: PUC). В середине нашей CCS мы видим, что строка с кодом </span><br />
<span style="font-family: inherit;"><b><span style="color: #990000;">void</span></b> main(<span style="color: #990000;">void</span>) {</span><br />
выделена другим цветом. Так отображается то место в коде, на котором в данный момент остановлено выполнение программы. Возможно вас это несколько обескуражит, но это КРАЙНЕ полезная вещь. Что это такое и с чем это едят, мы рассмотрим в другой лекции. Сейчас же, все что нам надо, это наконец заставить мигать чёртов светодиод! Сказано - сделано :) Жмём зелёный треугольничек(или F8) и наслаждаемся. Треугольничек отключит режим отладки и передаст управление в руки MSP430. Yay! Наша мигалка работает. Мигать она должна с интервалом что-то около секунды. Кстаати, вот ещё что:<br />
Если ваша мигалка вовсе не мигалка, а просто горящий светодиод, то вы немного ошиблись в коде. Держу пари, что для переменной count вы указали тип int, а не unsigned int как было сказано. В знаковом int'е просто напросто нет такой цифры - 60000, он не сможет до неё досчитать. Поэтому нужен беззнаковый - unsigned int.<br />
<br />
Спасибо за внимание ;)<br />
<br />
<br />
<span style="font-size: x-small;"><i>Перевёл и дополнил: <a href="https://plus.google.com/u/0/100706352058867746787" target="_blank">Александр Мошкин</a> </i></span><br />
<span style="font-size: x-small;"><i>Оригинал статьи: <a href="http://mspsci.blogspot.ru/2010/07/tutorial-05-loading-program.html" target="_blank">Tutorial 05. Loading the Program</a> </i></span><br />
<span style="font-size: x-small;"><i>Следующая лекция: <a href="http://msp430-ru.blogspot.ru/2013/03/06.html" target="_blank">Лекция №06. Отладка приложения</a></i></span><br />
<span style="font-size: x-small;"><i>Предыдущая лекция: <a href="http://msp430-ru.blogspot.ru/2012/11/04.html" target="_blank">Лекция №04. Крутимся в цикле</a></i></span></div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com5tag:blogger.com,1999:blog-7310168222938312273.post-60187613805383836812013-03-09T15:04:00.000+04:002013-03-15T18:13:08.354+04:00Без паники<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
В общем, к сожалению, я вам наврал. Сегодня я ничего не буду переводить. Потому что следующие статьи включают в себя активное использование IDE. Я - гентушник, у меня тулчейн скомпилирован + вим, мне этого хватает. Но для понимания всего остального, придется качать ИДЕ. Так как винда у меня есть только на работе, переводами я заниматься буду только тут :) Так что, возможно, продолжение будет где-то через трое суток. </div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com3tag:blogger.com,1999:blog-7310168222938312273.post-16817879777804798662013-03-08T14:56:00.000+04:002013-03-15T17:16:08.053+04:00Между делом<div dir="ltr" style="text-align: left;" trbidi="on">
Забавно складывается жизнь. Сейчас я вынужден читать свои же переводы, чтобы освоить азы. Я уже все забыл, что переводил. Чёртова прокрастинация :3 Возможно, что для кого-то будет хорошей новостью то, что я все таки продолжу переводить статьи. Да, я знаю, что на изиэлектрониксе их уже перевели, но: переводами этими я занимаюсь больше для себя, нежели для вас :) Мне так проще понять, так как когда переводишь, приходится очень глубоко вникать в написанное. Читая русские тексты, все несколько не так.<br />
Большое спасибо тем, кто внес замечания по переводу, с завтрашнего дня я немножко причешу предыдущие статьи и приступлю к переводу следующей. Которая, кстати, довольно скучная, так как там рассматриваются IDE которыми я вообще не пользуюсь.<br />
Ещё раз приношу свои извинения за ещё большую задержку. До скорой встречи. </div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com4tag:blogger.com,1999:blog-7310168222938312273.post-64958236718297691602012-11-30T16:45:00.002+04:002013-03-15T19:48:37.963+04:00Лекция №04: Крутимся в цикле<div dir="ltr" style="text-align: left;" trbidi="on">
<i>Прим. переводчика: Прошу прощения, за огромную задержку. Было слишком много дел, да и редакторша подвела. В общем, отныне статьи выкладываться будут без редактирования, а почему - не удивляйтесь, если встретите в тексте какие-нибудь глуповатые словообороты или лишние запятые. Так что извините: чем богаты тем и рады.</i>
<br />
<br />
Теперь, когда наших знаний достаточно для того чтобы написать нашу первую программу для MSP430, мы с вами поучимся их писать. Писать нашу первую программу, мы будем под микроконтроллер MSP430G2211 который поставляется с платой LaunchPad. Если же, вы не используете эту плату, то ничего страшного, эта программа настолько проста, что никаких проблем с этим возникнуть не должно. Единственное условие - это подключенный светодиод к одной из ножек GPIO<i>(англ.: <b>G</b>eneral </i>
Purpose I/O - система ввода/вывода общего назначения), а это - ножки нашего микроконтроллера. Подключите светодиод через резистор(пары сотен Ом, должно хватить) чтобы избежать возможности подачи слишком большого напряжения.
<br />
Владельцам LaunchPad’а же, ничего подключать не надо, на этой плате имеются все необходимые элементы.
<br />
<br />
В наших предыдущих лекциях, мы упоминали короткие имена BITx которые содержатся в специальном заголовочном файле для нашего устройства. Имя его совпадает с именем указанным на вашем микроконтроллере. К примеру - “msp430g2211.h”, так что если вы используете какой-либо другой микроконтроллер, просто укажите вашу маркировку.
<br />
Получается, что первая строчка любой программы для MSP430 должна выглядеть примерно(зависит от микроконтроллера) так:
<br />
<br />
<span style="color: #a64d79;">#include <msp430g2211.h></span>
<br />
<br />
Обычно, это единственная строка которая требуется для того чтобы приступить к написанию “тела” основной программы. По крайней мере, для написания нашей первой программы, кроме неё уж точно ничего не требуется. Что же будет делать наша первая программа? Мы просто будем мигать нашими светодиодами. Это своеобразный “Hello world!” в программировании микроконтроллеров. Назовём эту программу “мигалкой”. Наша мигалка это простая программа, которая включает и выключает светодиод с заданным интервалом времени. Эта самая мигалка, поможет нам научиться использовать таймеры, прерывания и тому подобные вещи но, немного терпения: сначала нам надо рассмотреть более простой способ достичь того же функционала, пусть и несколько “грязновато”. Способ этот, самый простой из всех возможных: использовать “пустой” цикл чтобы имитировать необходимую нам паузу между включением и выключением светодиода. На нашей плате LaunchPad зеленый светодиод подключен к P1.0, а красный - к P1.6. Для начала, мы помигаем только зеленым. Приступим!<br />
Начинаться наш код будет с таких строк:
<br />
<br />
<span style="color: #a64d79;">#include <msp430g2211.h>
</span><br />
<br />
<b><span style="color: #990000;">void</span></b> main(<span style="color: #990000;">void</span>) {
<br />
<br />
} <i><span style="color: #6aa84f;">// main
</span></i><br />
<br />
Прежде чем мы продолжим, хотелось бы напомнить про специальный сторожевой таймер(<i>англ.: <b>W</b>atch<b>D</b>og <b>T</b>imer</i>), в одной из предыдущих статей я достаточно подробно описал то, зачем он нужен и что делает, поэтому не буду заострять на нём внимание, просто освежу ваши воспоминания: этот таймер с определенным интервалом сбрасывает микроконтроллер в начальное состояние.
<br />
По умолчанию, этот таймер включается вместе с нашим микроконтроллером. Так как нам не надо никаких сбросов, нам придется его отключить(как работать с этим таймером, чтобы получать необходимую нам задержку, мы поучимся позже).
<br />
<br />
У WDT имеется 16-битный настроечный регистр, названый WDTCTL(<i>англ.: <b>W</b>atch<b>D</b>og <b>T</b>imer <b>C</b>on<b>T</b>ro<b>L</b></i>) но только первые 8 бит этого регистра, содержат биты управления этим таймером, остальные, верхние 8 бит, использованы в целях безопасности - если вы хотите изменить настройки WDT вам придется предоставить “пароль”, верхние 8 бит и являются этим самым паролем, а именно: 0x5A(вообще, так как наш регистр все же 16-битный, то было бы правильнее написать - 0x5A00). Именно такое значение должно быть установлено в верхние биты этого регистра, чтобы избежать случайных записей в связи какими-нибудь сбоями. Не стоит пугаться - в наш заголовочный файл уже включено короткое имя для нашего пароля - WDTPW(<i>англ.: <b>WDT</b> <b>P</b>ass<b>W</b>ord</i>), для выключения сторожевого таймера, аналогично имеется короткое имя - WDTHOLD. Получается, что для того чтобы выключить наш надоедливый таймер, нам всего-то надо указать в настроечном регистре “кодовую фразу” и притормозить таймер:
<br />
<br />
WDTCTL = WDTPW + WDTHOLD;
<br />
<br />
Бит WDTHOLD можно рассматривать как логическое состояние “таймер остановлен”. То есть, если этот бит равен 1(истина), то таймер остановлен, если же 0(ложь) - таймер работает. Вышеуказанной строчкой, мы его “остановили” установив в этот бит значение 1.
<br />
Вам следует взять в привычку начинать все ваши первые программы с этой строки, чтобы избежать каких-либо осложнений, но имейте ввиду, WDT обладает очень полезным функционалом и не раз вам поможет в будущем, но на данной стадии обучения он нам совершенно не нужен, так что выключайте его с первых строк.
<br />
<br />
Окей, сторожевой таймер выключен, теперь мы можем продолжить написание нашего кода. Мы хотим зажечь светодиод на P1.0, из предыдущей лекции мы уже знаем как это сделать:
<br />
<br />
P1OUT = 0;<br />
P1DIR = BIT0;<br />
<br />
Теперь наша задача, заставить светодиод включаться и выключаться по истечению заданного интервала времени. В качестве примера, я буду использовать цикл for, хотя если вы желаете, вы можете написать любой цикл, будь то for, while или do-while. Кроме того, нам необходима переменная-счетчик для цикла, так что не забудьте определить её в начале вашего кода:<br />
<br />
<span style="color: #a64d79;">#include <msp430g2211.h></span><br />
<br />
<span style="color: #990000;"><b>void</b></span> main(<span style="color: #990000;">void</span>) {<br />
<span style="color: #990000;">unsigned int</span> count;<br />
WDTCTL = WDTPW + WDTHOLD;<br />
<br />
P1OUT = <span style="color: #b45f06;">0</span>;<br />
P1DIR = BIT0;<br />
<br />
P1OUT |= BIT0;<br />
<span style="color: #990000;">for</span> (count = <span style="color: #b45f06;">0</span>; count < <span style="color: #b45f06;">60000</span>; count++);<br />
P1OUT &= ~BIT0;<br />
for (count = <span style="color: #b45f06;">0</span>; count < <span style="color: #b45f06;">60000</span>; count++);<br />
<br />
} <i><span style="color: #6aa84f;">//main </span></i><br />
<br />
Что же произойдет когда микроконтроллер дойдет до последней строчки кода? Компьютер бы просто завершил программу, а вот микроконтроллер будет просто считает следующий адрес, выполнит следующую инструкцию, где может быть вообще что угодно. Скорее всего, там будут мусорные данные которые остались от предыдущих программ, которые превосходили по объему нашу. В любом случае, микроконтроллер будет считывать и считывать, пока не дойдет до самого конца адресного пространства выделенного под нашу программу и тогда … ну, я понятия не имею что тогда. Так или иначе, это совсем не то на что мы расчитывали при написании нашей программы, так что не помешало бы предотвратить подобное поведение. Сделаем мы это, заключив наш код в бесконечный цикл который будет выполнять наш код снова и снова, пока подача питания не прекратится. Вообще - довольно дурной тон, писать подобные конструкции, но пока что, нам не до манер, мы просто хотим поскорее сделать нашу мигалку:<br />
<br />
<span style="color: #a64d79;">#include <msp430g2211.h></span><br />
<span style="color: #a64d79;"><br /></span>
<b><span style="color: #990000;">void</span></b> main(<span style="color: #990000;">void</span>) {<br />
<span style="color: #990000;">unsigned int</span> count;<br />
WDTCTL = WDTPW + WDTHOLD;<br />
<br />
P1OUT = <span style="color: #b45f06;">0</span>;<br />
D1DIR = BIT0;<br />
<br />
<span style="color: #990000;">for</span> (;;) {<br />
P1OUT |= BIT0;<br />
for (count = <span style="color: #b45f06;">0</span>; count < <span style="color: #b45f06;">60000</span>; count++);<br />
P1OUT &= ~BIT0;<br />
for (count = <span style="color: #b45f06;">0</span>; count < <span style="color: #b45f06;">60000</span>; count++);<br />
}<br />
} <i><span style="color: #6aa84f;">// main</span></i><br />
<br />
Как и прежде, вместо этого цикла вы можете использовать цикл while(1) или что-нибудь подобное, как вам удобнее. <br />
<br />
Вот наша мигалка и готова! Светодиодик загорается, ждёт, затухает, снова ждёт, а потом возвращается к первому шагу, на котором он снова загорается и … и так до бесконечности.<br />
Вот более “чистый” код, тут используются те самые битовые операции из предыдущей лекции:<br />
<br />
<span style="color: #a64d79;">#include <msp430g2211.h></span><br />
<br />
<b><span style="color: #990000;">void</span></b> main(<span style="color: #990000;">void</span>) {<br />
<span style="color: #990000;"> unsigned int</span> count; <i><span style="color: #6aa84f;">// счетчик цикла</span></i><br />
WDTCTL = WDTPW + WDTHOLD; <i><span style="color: #6aa84f;">// выключаем сторожевой таймер</span></i><br />
<br />
P1OUT = <span style="color: #b45f06;">0</span>; <i><span style="color: #6aa84f;"> // инициализируем начальное значение светодиода как 0</span></i><br />
P1DIR = BIT0; <span style="color: #6aa84f;"><i>// P1.0 в режим вывода</i></span><br />
for (;;) {<br />
P1OUT ^= BIT0; <i><span style="color: #6aa84f;">// изменить состояние светодиода как P1.0</span></i><br />
for (count = <span style="color: #b45f06;">0</span>; count < <span style="color: #b45f06;">60000</span>; count++); <i><span style="color: #6aa84f;">// ждём</span></i><br />
}<br />
}<br />
<br />
Теперь, для того чтобы изменить частоту мигания, вам всего-то достаточно изменить “длину” цикла. К примеру, вместо 60000 написать 30000, тогда мигалка будет мигать в два раза быстрей. <br />
Как вы заметили, некоторые строки кода снабжены комментариями. Да, согласен, в программах подобной сложности, они возможно и не нужны, так как код сам по себе очевиден, но в любом случае, вам следует взять в привычку комментировать свои исходные коды. Это считается хорошим тоном, да и вообще, не раз вам поможет. <br />
<br />
<span style="color: #990000;">Упражнения: Напишите программу, которая мигает поочередно красным и зеленым светодиодом. Затем, модифицируйте её так, чтобы они мигали независимо друг от друга.
</span><br />
<br />
<i><span style="font-size: x-small;">Перевод: <a href="https://plus.google.com/u/0/100706352058867746787" target="_blank">Александр Мошкин</a></span></i><br />
<i><span style="font-size: x-small;">Оригинал статьи: <a href="http://mspsci.blogspot.ru/2010/07/tutorial-04-stuck-in-loop.html" target="_blank">Tutorial 04: Stuck in a Loop</a></span></i><br />
<span style="font-size: x-small;"><i>Следующая лекция: <a href="http://msp430-ru.blogspot.ru/2013/03/05.html" target="_blank">Лекция №05. Загружаем программу.</a></i></span><br />
<span style="font-size: x-small;"><i>Предыдущая лекция: <a href="http://msp430-ru.blogspot.ru/2012/10/03.html" target="_blank">Лекция №03. Жонглируем битами.</a></i></span><br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com7tag:blogger.com,1999:blog-7310168222938312273.post-36554097884123823612012-10-10T17:03:00.004+04:002012-10-10T17:03:49.330+04:00MSP430. Где купить. <div dir="ltr" style="text-align: left;" trbidi="on">
Все до безобразия просто. Переходим на сайт https://estore.ti.com, ищем там "MSP430 LaunchPad Value Line Development kit" жмем "Купить", регистрируемся, оплачиваем и ждём.<br />
Стоит эта радость всего-то 4 с копейками доллара, доставка FedEx'ом включена в стоимость.<br />
За эти четыре доллара вы получаете:<br />
<ul style="text-align: left;">
<li>Отладочную плату с USB-кабелем</li>
<li>Два микроконтроллера</li>
<li>Кварцевый генератор</li>
<li>Коннекторы для контактов на отладочной плате</li>
<li>И самое приятное - наклейки.</li>
</ul>
Все это упаковав в красивую коробочку вам отправят одной из лучших почтовых служб. Ко мне все это прямиком из техаса доехало за 5 дней, живу я совсем не в Москве, можно даже сказать - в глубинке. Почте России остается только завидовать.<br />
В общем, все в ваших руках. Минимум расходов - максимум удовольствия :)</div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com2tag:blogger.com,1999:blog-7310168222938312273.post-41109831030600149022012-10-10T14:14:00.002+04:002013-03-15T19:51:09.469+04:00Лекция №03: Жонглируем битами<div dir="ltr" style="text-align: left;" trbidi="on">
Теперь, когда мы с вами знаем, что такое регистры и за что они отвечают, самое время изучить механизм управления “переключателями”(изменения значений битов). Изучим мы этот механизм, разбирая реальную задачу. У нас имеется светодиод, одна нога которого соединена с P1.4(четвертый пин первого порта), а вторая - с “землей”(Vss). Если на P1.4 не подано напряжение, то ничего не происходит, но стоит только его подать, как светодиод тут же загорается. Исходя из того, что светодиод подключен к P1.4, становится очевидно: чтобы достичь желаемого результата, нам необходимо что-то сделать с четвертыми битами регистров, которые относятся к P1(Порту 1). Следует понимать, что, когда мы говорим “четвертый бит”, на самом деле он не является четвертым, так как нумерация битов начинается с 0, так что технически этот бит - пятый. <br />
<br />
Перед тем как мы приступим к манипуляциям с нашими регистрами, стоит немного узнать о том, как 8-битные данные могут быть представлены. Вы, конечно же, можете использовать обычные цифры десятичной системы, к которым вы так привыкли, но, к сожалению, могут возникнуть проблемы с представлением 8-битных чисел в этой системе, потому что удобнее всего работать с 8-битными числами в системах счисления, основание которых кратно 8.<br />
<br />
Проще писать эти значения в двоичной системе счисления: есть 8 цифр, каждая из них может принимать лишь два значения - 1 или 0. Чтобы отличать двоичные числа от десятичных, мы можем использовать префикс 0b(<i>b - <b>b</b>inary(двоичный)</i>) к примеру - 0b10.<br />
<br />
Ещё одна частоиспользуемая система счисления - шестнадцатеричная(<i>англ.: he<b>x</b>adecimal</i>). Эта система довольно удобна, так как любое 8-битное значение может быть представлено в виде двух символов, каждый из которых может принимать
значение от “0” до “9” или от “a” до “f”. В качестве префикса для записи значений в этой системе счисления принят - 0x(hexadecimal), таким образом, число 2 в шеснадцатеричной системе будет выглядеть как 0x02, число 12 - 0x0c, становится очевидно, что сиволы a-f соответствуют числам 10-15 соответственно. 16-битные же значение в этой системе счисления после префикса содержат 4 цифры - ровно в два раза больше, нежели 8-битные, к примеру - 0x14da. В микроконтроллере MSP430 довольно много различных 16-битных значений, поэтому шестнадцатеричная система будет очень удобна. (Я прошу прощения, если у вас возникла путаница из-за того, что в своей предыдущей статье я использовал символ h после числа, для обозначения шестандцатеричных данных. Дело в том, что в документации TI в качестве обозначения шестнадцатеричного числа используется именно эта нотация, но тем не менее, мы все равно будем писать 0x, так как в текстах наших программ необходимо писать именно
так. )<br />
Помимо этих двух систем, вы можете использовать восьмеричную(с префиксом 0o), но, честно говоря, я ещё не встречал людей, которые так делают. <br />
<br />
Ну что-ж, самое время разбавить сухую теорию небольшими практическими упражненями.<br />
<br />
Использование двоичной системы счисления, как нельзя лучше помогает увидеть и понять, какие конкретно биты вы используете, какие из них «включены», какие «выключены», в общем ничего лучше и придумать нельзя. Однако, тут есть и подводные камни — при написании программного кода, вам пришлось бы вручную прописывать все значения этих регистров, а это ой как много писанины. Почему фраза «пришлось бы» в сослагательном наклонении? Потому что программисты из «Texas Instruments», изрядно нам в этом помогли написав для нас специальные заголовочные файлы, в которых всем нужным нам для работы адресам в памяти, уже назначены имена. Таким образом, при написании программы на языке C, нам достаточно подключить этот заголовочный файл, написав в самом начале программы соответствующую строчку(к примеру - #include <msp430g2001.h>). Эти заголовочные файлы, включают в себя короткие имена двоичных значений в которых все биты кроме значащих обнулены. К примеру, вместо того чтобы писать 0b00000100, мы можем написать BIT2, что, согласитесь, значительно быстрее и наглядней. Короткое имя BIT2 показывает нам что это набор из 8 бит, в котором все биты кроме значащего, в нашем случае — второго, равны нулю. Кстати говоря, нумерация битов не только начинается с нуля, но и считать и начинать считать их нужно с конца. Подобного рода короткие имена, есть в любом заголовочном файле и существуют для любого битового набора, начиная с BIT0(0b00000001) и заканчивая BIT7(0b10000000). А теперь, приступим!<br />
<br />
Первое, что вам надо сделать для решения задачи со светодиодом - обозначить P1.4 как output, так мы сможем подавать напряжение через эту ножку к нашему светодиоду. Чтобы это сделать, вам необходимо установить значение 1 в четвертый бит регистра P1DIR. Существует три способа это сделать. <br />
<br />
<h1>
1. Явное присваивание</h1>
<br />
Если мы точно знаем, какое двоичное или шестнадцатеричное(да хоть десятичное) значение необходимо установить в нужный нам регистр, мы можем сделать это напрямую обратившись к регистру и установив необходимые биты. К примеру, строка<br />
<br />
P1DIR = 0b00010000;<br />
<br />
установит 1 в четвертый бит регистра P1DIR, а все остальные биты примут значение 0. Этот метод довольно неплох, для того, чтобы задать начальные значения регистров, с которыми по ходу программы будет работать наш процессор. Но если вы продолжите подобным образом изменять значения в последующем программном коде, у вас могут возникнуть проблемы, так как не всегда знаешь, какие биты вам нужно менять, а какие нет, какие уже изменили свое значение, что нужно сохранить, а что можно отбросить. Использование данной конструкции подобно лому - просто и наверняка. Что может быть проще, чем явное указание значения каждого бита? Но с такой же легкостью этот метод просто напросто “отключит” все остальные биты регистра, установив в них 0, так как вы сами ему это сказали. Только есть проблема: далеко не факт, что для корректной работы программы вам нужно их отключать. Существуют методы для более гибкого контроля этих значений. Их мы и рассмотрим чуть ниже. Кстати говоря, напоминаю об использовании коротких имен. Вышеуказанная строчка кода эквивалентна следующей:<br />
<br />
P1DIR = BIT4;<br />
<br />
Так как BIT4 является “именем” 8-битного значения 0b00010000<br />
<br />
<h1>
2. Сложение и вычитание</h1>
<br />
Если же вы точно не знаете, какое значение нам необходимо установить или вам необходимо просто поменять значение лишь одного бита, вы можете использовать обычное сложение. Да-да, просто сложение. Вам необходимо к регистру P1DIR прибавить этот бит(в следующем примере, символом “:” я обозначу те биты, значение которых нам неизвестно): 0b:::0:::: + 0b:::1:::: = 0b:::1::::<br />
Таким же точно образом, мы можем изменить значение нашего регистра P1DIR просто написав следующее:<br />
<br />
P1DIR += <span style="color: #b45f06;">0b00010000</span>;<br />
<br />
*(Смущает конструкция “+=”? Ничего страшного, в примечаниях к статье описано, что это за конструкция и как она работает)<br />
Проблемы при использовании данного метода могут возникнуть, если вы попытаетесь установить значение 1 в бит, который был “включен” и до вас, тогда этот бит не только обернется в ноль, так ещё и следующий за ним бит изменит свое значение на 1(если конечно он уже не “включен”, тогда с ним произойдет то же самое, что и с предыдущим. Попробуйте поскладывать столбиком двоичные числа, вы поймете почему так происходит). То есть, ошибившись в данной операции, вы измените “направление” отнюдь не той
ножки, которой хотели, но это приведет ошибкам в работе вашей программы. Так что использовать этот метод стоит очень внимательно. Кстати, эти операции так же применимы и к коротким именам. Т.е. конструкция<br />
<br />
P1DIR += BIT4;
<br />
или<br />
P1DIR -= BIT4;<br />
<br />
будет работать без каких-либо проблем. <br />
<br />
<h1>
3. Логические операторы & и |</h1>
<br />
Во избежание проблем, связанных со сложением и вычитанием, мы можем воспользоваться логическими операциями. Предположим, у нас есть битовое значение “x”(x может быть как 1, так и 0, на данный момент это не так важно, так как мы рассматриваем общий случай). Логические операции И(and - &) и ИЛИ(or - |) позволяют нам указать точное значение для данного бита, независимо от
того, в каком он сейчас состоянии. Таким образом, операция & возвращает значение 1 только в том случае, если ОБА её операнда имеют значение 1. Получается, что x & 0 = 0, и абсолютно не важно, какое в данный момент имеет значение бит “x”. Логическая
операция | вернет нам единицу, если хотя бы один из операндов уже равен единице - x | 1 = 1 в независимости от состояния бита “x”. Отсюда же следует, что - x | 0 = x, ведь если бит “x” имеет значение 1, то логическая операция ИЛИ вернет вам туже самую единицу, ну а если “x” равен 0, то в числе операндов единица не значится, а из этого следует, что оператор возвращает тот же
ноль, коим и является бит “x”. Каков же тогда будет результат операции P1DIR | 0b00010000? Биты 0-3 и 5-7 останутся неизменными(помните? | 0 никак не влияет на второй операнд), чего не скажешь про 4-й бит, он как раз таки однозначно примет значение 1(он, конечно же, может и так был единицей, но после этой операции, он <b>точно</b> станет равен 1). Теперь небольшой пример с операцией &: P1DIR &= 0b11101111. После выполнения данной операции четвертый бит в данном регистре обнулится, так как один из операндов равен нулю, а все остальные биты останутся неизменными. Почему? Потому что, как уже говорилось ранее, чтобы операция вернула 1, нужно чтобы оба операнда были 1, таким образом, если биты регистра изначально были равны единице, то они и останутся единицей, в противном случае, они как нулями были, так нулями и останутся. Да, и в этих операциях короткие имена наших битов будут работать. Чтобы больше не повторяться, запомните, что они вообще везде будут работать. <br />
<br />
<span style="color: #b45f06;">Домашнее задание №1: Вы можете встретить программный код, в котором для выполнения одной и той же задачи, используются разные методы - иногда это a + b, а иногда а | b. Подумайте, почему в некоторых случаях эти операции эквивалентны и в каких ситуациях вы бы НЕ стали использовать тот или иной способ. </span><br />
<br />
<h1>
4. Логический оператор ^</h1>
<br />
Да-да, знаю. Я говорил что их три, а сам описываю уже четвертый. Но их на самом деле три. Эту логическую операцию, более правильно было бы описать в третьем блоке, просто я для удобства выделил её “особняком” так как она все-таки, пусть немного, но отличается от двух вышеописанных. Итак, операция эта называется <b>ИСКЛЮЧАЮЩЕЕ ИЛИ</b>(XOR - <b>^</b>). Если вы волею судеб оказались не знакомы с этим оператором, то, скорее всего, понять его суть будет несколько сложнее, чем все предыдущее,
вместе взятые. Попробуем оттолкнуться от примеров из формальной логики, вероятно, так будет немного проще. Исключающее ИЛИ ведет себя идентично обычному ИЛИ за исключением одного лишь случая: когда оба бита являются единичными, эта функция возвращает нам
ноль. Как же нам в этом разобраться? Представим, что “поднятый” бит символизирует о том, что наступило какое-то событие. Теперь представим, что оба операнда имеют значение 1. В случае обычного ИЛИ вам предоставляется выбор между двумя событиями, которые без всяких проблем могут существовать одновременно - вы можете выбрать или первое событие, или второе, суть одна - вы выбираете единицу. С исключающим же ИЛИ, все несколько сложнее: вам предоставляется выбор между двумя событиями, которые ну никак не могут произойти одновременно. Т.е. сложившаяся жизненная ситуация попросту неразрешима и вы лишаетесь выбора. Так как
выбрав одно, вы исключаете возможность второго. То есть, выбирая единицу, вы исключаете из вариантов выбора единицу. Таким образом, единицу вы выбрать просто не можете. Тогда вам не остается ничего другого, кроме как ничего не делать - 0. Если вы не поняли о чем речь, то вам следует сесть и глубоко поразмыслить. Понимание таких вещей довольно важно. Если у вас все-таки совсем никак не получается осмыслить это, могу посоветовать лишь одно - поискать более доступное разъяснение исключающего ИЛИ в интернете. <br />
Приведу табличку иллюстрирующую работу с оператором ^:<br />
<br />
<br />
<div dir="ltr">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="25"></col><col width="24"></col><col width="26"></col></colgroup><tbody>
<tr style="height: 0px;">
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">a</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">b</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">^</td>
</tr>
<tr style="height: 20px;">
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">0</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">0</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">0</td>
</tr>
<tr style="height: 0px;">
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">0</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">1</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">1</td>
</tr>
<tr style="height: 0px;">
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">1</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">0</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">1</td>
</tr>
<tr style="height: 0px;">
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">1</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">1</td>
<td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;">0</td>
</tr>
</tbody>
</table>
</div>
<br />
<br />
Так зачем же нужен этот оператор и почему я не описал его вместе с его собратьями & и |? А потому что, если два его брата нужны для того, чтобы напрямую устанавливать в конкретный бит конкретное значение, то этот нужен для того, чтобы это значение изменить на противоположное. Как щёлкнуть выключателем: щёлк - x = 1, щёлк ещё раз x = 0. Все, как видите, довольно просто и, что не менее важно, достаточно удобно. <br />
Ну и, следуя традиции, приведу конкретный пример:<br />
<br />
P1DIR ^= <span style="color: #b45f06;">0b00010000</span>;<br />
<br />
Щёлк - и четвертый бит нашего регистра изменил свое значение на противоположное. Всё просто! <br />
<br />
Теперь в нашей программе надо инициализировать нашу ножку(P1.4) как output. Для этого мы пишем: <br />
<br />
P1DIR = BIT4;<br />
<br />
(Того же самого мы бы достигли используя логический оператор вместо присваивания: P1DIR |= BIT4;)<br />
Значение, содержащееся в бите регистра P1OUT, может быть как единицей, так и нулём, но мы на всякий случай обнулим это значение, написав следующую строку:<br />
<br />
P1OUT = 0;
<br />
<br />
(Вообще это не очень хороший тон, было бы куда лучше, если бы вы проинициализировали начальное состояние этого регистра ДО того как назначаете какую-либо ножку в режим “вывода”) <br />
Теперь, когда все биты, включая бит нашей ножки, обнулены, светодиод, разумеется, выключен. Чтобы его включить необходимо ввести следующую строку:<br />
<br />
P1OUT |= BIT4;<br />
<br />
Чтобы снова выключить:<br />
<br />
P1OUT &= ~BIT4; <br />
<br />
(префикс ~ перед значением инвертирует все биты в этом значении. Все единицы становятся нулями, а все нули единицами)<br />
Чтобы “пощёлкать выключателем”:<br />
<br />
P1OUT ^= BIT4;<br />
<br />
В качестве последнего примера, демонстрирующего мощь остальных методов жонглирования состояниями битов, давайте зажжем ещё и второй светодиод, который расположился на ножке P1.6:<br />
<br />
Для начала назначим первоначальные состояния наших ножек как “выключены” и укажем им output-направление:<br />
<br />
P1OUT = <span style="color: #990000;">0</span>;<br />
P1DIR = BIT4 + BIT6;<br />
<br />
(Сложение двух битовых значений 0b000<b>1</b>0000 и 0b0<b>1</b>000000 в сумме дает 0b0<b><span style="color: #990000;">1</span></b>0<span style="color: #990000;"><b>1</b></span>0000. Как видите, все до безобразия просто)<br />
Теперь мы можем включать и выключать их по отдельности:<br />
<br />
P1OUT |= BIT4; // P1.4 включен<br />
P1OUT &= ~BIT4; // P1.4 выключен<br />
P1OUT |= BIT6; // P1.6 включен<br />
P1OUT &= ~BIT6; // P1.6 выключен<br />
<br />
Или вместе:<br />
<br />
P1OUT |= BIT4 + BIT6; // включить оба<br />
P1OUT &= ~(BIT4 + BIT6); // выключить оба<br />
<br />
И, наконец, “пощёлкать” ими одновременно:<br />
<br />
P1OUT ^= BIT4 + BIT6; // вкл/выкл оба<br />
<br />
<span style="color: #b45f06;">Домашнее задание №2: Напишите программу, которая бы зажигала два светодиода подключенные к P1.3 и P1.7. Начальное состояние светодиода на P1.3 должно быть “Выкл”, а на P1.7 - “Вкл”, после этого, напишите строчку “переключатель”, которая бы одновременно меняла состояние обоих светодиодов.</span><br />
<br />
<br />
* += это сокращенный оператор языка С. Запись x += 1 эквивалентна следующей записи: x = x + 1; её можно трактовать как: “С этого момента значением x является текущее значение x, увеличенное на единицу”. <br />
<br />
<br />
<span style="font-size: x-small;"><i>Оригинал статьи:</i> <i><a href="http://mspsci.blogspot.com/2010/07/tutorial-03-flipping-bits.html" target="_blank">Tutorial 03: Flipping Bits</a></i></span><br />
<span style="font-size: x-small;"><i>Перевод:</i> <i><a href="https://plus.google.com/u/0/100706352058867746787" target="_blank">Александр Мошкин</a></i></span><br />
<i><span style="font-size: x-small;">Коррекция: <a href="https://plus.google.com/u/0/114240981960930374446" target="_blank">Алёна Ступникова</a></span></i><br />
<span style="font-size: x-small;"><i>Следующая лекция: <a href="http://msp430-ru.blogspot.ru/2012/11/04.html" target="_blank">Лекция №04. Крутимся в цикле</a></i></span><br />
<span style="font-size: x-small;"><i>Предыдущая лекция: <a href="http://msp430-ru.blogspot.ru/2012/10/02-msp430.html" target="_blank">Лекция №02. MSP430 Города и регистры.</a></i></span></div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com2tag:blogger.com,1999:blog-7310168222938312273.post-17145379867490862822012-10-09T17:39:00.001+04:002013-03-15T14:32:07.909+04:00Лекция №02: MSP430. Города и регистры.<div dir="ltr" style="text-align: left;" trbidi="on">
Большинство статей, посвященные MSP430, что мне довелось видеть, почти с первых строк рассказывали об архитектуре процессора, адресации памяти, шинах данных и прочих технических штуках, которые, к сожалению, человеку без опыта в области электроники, довольно тяжело понять. В этой статье я
попытаюсь объяснить вам азы, необходимые для начала работы с этим
семейством микроконтроллеров(далее МК), без всяких заумных вещей типа
биполярных соединений и тому подобного. Глубокие технические знания были
бы очень полезны в тонкой настройке разрабатываемой системы или в
программировании на ассемблере, но и элементарных знаний языка С
достаточно, чтобы начать вполне комфортную и продуктивную работу.<span style="background-color: transparent; color: #85200c; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Одна
из особенностей, которая выделяет микроконтроллеры MSP430 из основной
массы, - это фон-Неймановская архитектура: все данные, которыми может
оперировать процессор, расположены в одном адресном пространстве.
Остальные же микроконтроллеры отличаются в этом плане: их данные могут
располагаться в различных адресных пространствах, что повышает
эффективность, но изрядно усложняет работу с ними, а нам этого ой как не
хочется. Чтобы быстро понять, о чем речь, можно представить себе
микроконтроллер как город: в фон-Неймановских городах(как MSP430) все
люди живут в одном городе и имеют свой собственный, уникальный адрес. Ну
а, к примеру, в Гарвардской архитектуре городов несколько, поэтому
адреса могут повторяться. Таким образом, если вы захотите отправить
письмо по определенному адресу, сначала вам придется уточнить город.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Память</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Адресное
пространство MSP430 включает в себя область для хранения
непосредственно самой программы, область для хранения данных,
необходимых этой программе, оперативную память и прочую важную
информацию, которую мы с вами рассмотрим чуть позже. Сегодня же всю вашу
неуёмную тягу к знаниям мы будем удовлетворять изучением адресов в
памяти, которые называются “регистрами”. Эти адреса как различные
коммунальные и социальные службы (такие как почта или ЖКХ) в нашем
небольшом MSP430-городке. В нашем же микроконтроллере регистрами
контролируются различные функции процессора и периферии. Представьте
себе помещение с множеством разных переключателей и кнопочек, от которых
зависит включат ли завтра в вашем районе отопление или горячую воду -
это и будут наши регистры. Как и любые другие выключатели, они имеют
всего лишь два состояния - “включено” и “выключено”, говоря компьютерным
языком - 1 и 0. В микроконтроллере же состояние регистров определяет
как будет себя вести та или иная периферия, за что будет отвечать та или
иная ножка вашего МК, что произойдет при наступлении определенного
события, и так далее, и тому подобное. Регистры в MSP430 сгруппированы в
3 секции: </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">1) Регистр специальных функций </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ: special function registers (SFR))</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">прим.
переводчика.: подобные аббревиатуры следует запоминать, или хотя бы
записывать, в дальнейшем, они будут использоваться достаточно часто</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">)</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">2) 8-битные регистры, для различной периферии процессора(для хранения “настроек” периферии которым, достаточно лишь 8 бит)</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">3) 16-битные регистры(то же самое, только выделяется 16 бит). </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">В
качестве примера, давайте взглянем на самого маленького представителя
семейства MSP430, а именно - на микроконтроллер MSP430G2001. Откройте
следующие документы: </span><a href="http://www.ti.com/litv/pdf/slau144i"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;">описание серии x2xx</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> и </span><a href="http://www.ti.com/litv/pdf/slas695g"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;">спецификации G2x01</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: #0b5394; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Заметьте,
что вышеуказанные ссылки могут быть несуществующими, такое случается,
если “Texas Instruments” делает обновление документации. Проще всего
отыскать эти документы, перейдя на </span><a href="http://ti.com/"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;">официальный сайт TI</span></a><span style="background-color: transparent; color: #0b5394; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">
и найти блок “Search by Part Number”. Для того, чтобы найти
документацию по серии G2x01, достаточно ввести любую маркировку, которая
попадает под эту маску, к примеру msp430g2001.</span><br />
<span style="background-color: transparent; color: #0b5394; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: #0b5394; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Давайте взглянем на четвертую часть первой главы</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(Address Space)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> описания серии x2xx</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: family guide)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">,
которая иллюстрируют нам карту нашего “городка” семейства x2xx. Как вы
видите, регистры SFR расположены, начиная с адреса 0h и заканчивая Fh
(символ h указывает на то, что адрес написан в шестнадцатеричной системе
исчисленgия; в десятеричной же они бы выглядели как 0 и 15). Следующими
идут 8-битные регистры; их адреса начинаются с 010h и заканчиваются
адресом 0FFh (в десятичной системе: с 16 по 255), затем, с адреса 0100h
по 01FFh идут 16-битные регистры. Вы, наверное, заметили огромное пустое
место между областями оперативной и флэш памяти</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(прим.:
не путайте flash-память с USB-накопителями или другими внешними
накопительными устройствами, в данном случае, флэш-память - это
“перепрограммируемая память”)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">.
Описание данной серии микроконтроллеров показывает нам те области
памяти, которые относятся ко всему семейству x2xx, чтобы увидеть точные
значения для какого-либо конкретного микроконтроллера, вам необходимо
обратиться к спецификации этого чипа, называемой </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">даташитом(англ.: datasheet - привыкайте к этому названию, везде используется именно оно)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Одиннадцатая
страница даташита предоставляет нам карту распределения памяти, которая
соответствует всем микроконтроллерам серии G2x01 и G2x11. Взглянув на
столбик с G2001, можно увидеть, что сначала идут служебные регистры
периферии(SFR, 8-bit, 16-bit) затем идут 128 бит оперативной памяти.
Адресное пространство, начиная с адреса 0201h и заканчивая 10FEh,
пустое, после него мы видим 256-бит памяти, именуемые служебной областью
памяти(эта область памяти хранит в себе калибрационные данные и прочие
важные значения,которые необходимо сохранить, если питание к устройству
перестало поступать. Обычно эти данные недоступны для перезаписи, но это
не значит,что это невозможно при реальной необходимости, но это
отдельная история, заслуживающая отдельной лекции). В итоге мы имеем 512
байт памяти для программного кода и, в довершение всему, память,
которая выделена под векторы прерываний(но об этом тоже в другой
лекции).</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Регистры</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Теперь
мы с вами видим как выглядит изнутри наш “G2001-городок”,
следовательно, нам следовало бы разобраться, как работать с теми самыми
“домами с переключателями”, которые мы описали выше. Регистры в
микроконтроллере MSP430 - это специальные секции в памяти, с помощью
которых он конфигурируется и которые сообщают нам, когда случается
что-то важное. Страница номер 10 нашего даташита показывает, какие
регистры специальных функций(SFR) доступны в нашем G2001. Как мы видим, у
этого устройства есть только четыре регистра спец. функций,
расположенных по адресам с 0h по 3h: регистр разрешения прерываний 1 </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">I</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nterrupt </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">E</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nable 1(IE1))</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">, регистр разрешения прерываний 2(</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">IE2</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">), и два регистра флагов прерываний IFR1 и IFR2 </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">I</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nterrupt </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">F</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">la<b>G</b> </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;">R</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">egister)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">.
Каждый адрес указывает на 1 байт в памяти, а в одном байте, как нам
известно, - 8 бит. Помните наши “дома с переключателями”? Так вот,
каждый бит в регистре выполняет роль одного переключателя. Таким
образом, сам регистр является домом, а каждый его бит - переключателем,
который имеет два состояния 0(выкл) и 1(вкл). Каждый из этих битов очень
важен, состояние каждого из них так или иначе влияет на работу
микроконтроллера и его поведение в целом. Страница 10 также показывает
нам какие биты в этих регистрах доступны на нашем G2001.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">В
данном случае, в регистре IE1 нам доступны только 0, 1, 4 и 5 бит, в то
время как в IFG1 нам доступны все биты с 0 по 5. В даташите содержится
полная информация о том, какое имя носит каждый из этих бит и какую
функцию он выполняет. К примеру, нулевой бит в регистре IE1 называется
WDTIE - разрешение прерываний сторожевого таймера</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">W</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">atch</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">D</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">og </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">T</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">imer </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">I</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nterrupt </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">E</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nable)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">.
По умолчанию этот бит имеет значение 0, но если мы изменим его и
установим в него 1, то мы позволим сторожевому таймеру “поднимать” флаг
прерывания в регистре IFG1(бит под номером 0, если быть точнее), тем
самым вызывая прерывание(как уже говорилось, что такое прерывания мы
рассмотрим позже). Проще говоря, этот бит указывает нашему MSP430, может
ли сторожевой таймер сигнализировать процессору о том, что нужно что-то
сделать, или же он используется в обычном режиме. Тут, наверное, стоило
бы пояснить, что такое сторожевой таймер и что есть “обычный” его
режим. Сторожевой таймер необходим для того чтобы сбрасывать процессор в
то состояние, в котором он был на момент подачи питания. Сбрасывает он
его регулярно, с определенным интервалом. Зачем же это нужно? Если во
время работы программы происходит какой-то сбой, то сторожевой таймер
сбрасывает эту программу, чтобы она снова смогла работать. Разумеется,
его можно отключить. Когда мы переводим сторожевой таймер в интервальный
режим, то он вместо того, чтобы сбрасывать нашу программу, просто
напросто посылает процессору сигнал. Как обрабатывать этот сигнал и что
делать процессору при получении этого сигнала - это решение ложится на
плечи программиста. Обычно это используется для того, чтобы совершать
какие-либо цикличные действия. К примеру, в самом элементарном случае
поморгать светодиодом, чем мы с вами вскоре и займемся. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Теперь
взглянем на 14 страницу нашего даташита. Эта таблица предоставляет нам
всю информацию о существующих периферийных “устройствах”, адреса их
регистров и их имена. Кстати говоря, внизу таблицы расположена
информация и о SFR, которые мы не раз упоминали в данной статье. Таким
образом, когда вы захотите использовать какую-либо периферию вашего
микроконтроллера, эта таблица будет вашей отправной точкой для того
чтобы узнать какие именно “домики с переключателями” вам необходимо
посетить, чтобы быть уверенным, что все ваши регистры настроены
правильно. Сегодня мы с вами подробнее рассмотрим регистры
предназначенные для порта 1(Port P1) и порта 2(Port P2), так как они
являются основными элементами которые необходимы для работы с нашим
микроконтроллером. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Порты это основные устройства ввода/вывода доступные на микроконтроллере, ввод/вывод производится через ножки(</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">англ.: pin</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">)
вашего МК. Распиновку вашего устройства вы можете посмотреть на третьей
странице даташита. Под портом обычно подразумевается набор из 8 пинов
микроконтроллера. Но пинов у порта может быть и меньше, это бывает, если
ножек просто напросто не хватает до полного набора. Распиновка,
изображенная в даташите, показывает нам, что G2001 имеет полный набор из
8 ножек для порта 1(c P1.0 по P1.7) и две ножки для порта 2(с P2.6 по
P2.7). Каждый регистр каждого порта имеет бит, который соотносится с
соответствующей ножкой микроконтроллера. К примеру, P1.4 контролируется
4-м битом каждого регистра, который принадлежит порту 1(P1). Давайте
познакомимся поближе с регистрами, которые предлагает нам
микроконтроллер.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">PxIN</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Входной регистр, значения которого находятся в режиме “только для чтения”</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: read-only)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">. Если направление ножки было выбрано как “входящее”</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">IN</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">put),</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">
то значение этого регистра будет сообщать вам, подано ли в данный
момент напряжение на эту ножку или же нет. Следует понимать, что чтение
значения регистра PxIN возвращает вам данные по всем ножкам
соответствующего порта за раз. Не стоит так же забывать и то, что это
цифровая технология, поэтому каждый считанный бит может быть только в
двух состояниях: 1 или 0. Эти значения показывают нам, какое напряжение
подано на ножку: Vss(если значение 0) или же Vcc(если значение 1),
значение 0 принимается в том случае, если поданное напряжение ниже 1.8
вольт(Vss < 1.8В), ну а значение 1 принимается в том случае, если
поданное напряжение попадает в рамки между 1.8 и 3.6 вольт(1.8В <=
Vcc <= 3.6В). Во избежание нанесения ущерба вашему устройству </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">НИКОГДА</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">
не пытайтесь напрямую подавать напряжение выше верхнего порога Vcc.
Если говорить в двух словах - Vcc это вольтаж, а Vss - земля. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">PxOUT</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Выходной регистр, доступный для записи. Когда определенный пин вашего микроконтроллера установлен в “режим вывода”</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">OUT</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">put),</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">
вы можете подавать на него напряжение, просто установив
соответствующему биту в этом регистре значение 1. Так же как и в
регистре PxIN при значении 0 на ножку подается напряжение с Vss, если 1 -
Vcc.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">PxDIR</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Регистр направления</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">DIR</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">ection)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">,
определяет пин в режим ввода, если в соответствующем бите данного
регистра установлено значение 0 и в режим вывода, если 1. В самом начале
вашей программы следует указать все направления пинов, которые вы
планируете использовать. Разумеется, это не значит, что вы не можете
изменить эти значения где-нибудь в середине программы. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">PxIE, PxIES, и PxIFG</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Следующие три регистра, которые имеются у наших портов: регистр разрешения прерываний</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">I</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nterrupt </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">E</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nable (IE))</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">, контрольный регистр прерываний</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">I</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nterrupt </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">E</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">dge </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">S</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">elect (IES))</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> и регистр флагов прерываний</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">I</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nterrupt </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">F</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">la</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">G</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> (IFG))</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">.
Мы рассматриваем эти три регистра вместе, так как работа с любым из
этих регистров, предполагает работу с двумя оставшимися, они неразрывны
друг с другом. Что такое прерывание? В настоящий момент вам достаточно
будет просто представить, что это некое сообщение, посылаемое
процессору, при получении которого он приостанавливает все свои дела и
начинает выполнять те действия, которые предписаны на выполнение при
получении оного. Как только он завершит обработку прерывания, процессор
как ни в чем не бывало возвращается к своей предыдущей работе и
продолжает выполнение основной программы. Чтобы разрешить определенному
пину вашего порта генерировать прерывания, вы просто
“поднимаете”(устанавливаете значение 1) соответствующий этой ножке бит в
регистре разрешения прерываний(PxIE где x - номер порта). Контрольный
регистр прерываний(PxIES) содержит в себе контрольные биты(edge-bits), с
которыми сравнивается текущее состояние регистра PxIN. Проще говоря,
если у вас есть ножки, которые в регистре PxDIR назначены в
input-режим(битам, соответствующим ножкам назначено значение 0), то
регистр PxIN сравнивается по битам со всеми значениями регистра PxIES и
если случается так, что значения соответствующих битов в этих регистрах
имеют разное значение, то следующее, что делает процессор - это
проверяет, разрешены ли для этих ножек прерывания - сравнивает с
регистром PxIE,- и если прерывания разрешены - генерируется прерывание, а
это, в свою очередь, ни что иное как “поднятие” соответствующих битов в
регистре PxIFG(регистр флагов прерываний).</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Ещё
раз вкратце: прерывание для определенной ножки вашего микроконтроллера
считается сгенерированным, если в регистре PxIFG поднят флаг(бит принял
значение 1) который своим порядковым номером соответствует этой ножке.
Биты регистр PxIE определяют, какие вообще ножки вашего микроконтроллера
имеют право поднимать эти флаги, если в регистре PxIE бит с порядковым
номером 0 имеет значение 0, то эта ножка попросту не имеет доступа к
регистру PxIFG, а следовательно, не может генерировать прерывания. В
регистре PxIES хранятся контрольные значения. Процессор сравнивая
регистры PxIN и PxIES генерирует прерывания для ножек, значения битов
которых в этих регистрах разнятся. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><br /></span>
<span style="background-color: transparent; color: red; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">В силу того что я не очень хорошо разбираюсь в подобных нюансах, при переводе я допустил несколько грубых ошибок. Особенно это касается регистра PxIES. В комментариях есть более правильно объяснение того, за что отвечает этот регистр. К сожалению, я пока ещё сам его не понял. Так что, как только все прояснится, обещаю внести поправки в статью. Пока - довольствуемся комментарием :)</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">PxSEL</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Если
снова взглянуть на третью страницу нашего даташита, где изображена
распиновка нашего микроконтроллера, можно заметить, что каждая ножка
имеет несколько функций, которые разделены слэшем. Этот регистр выбора</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">SEL</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">ection Register) </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">определяет,
какую функцию тот или иной пин будет выполнять. Функция, которую та или
иная ножка выполняет по умолчанию, указана первой - так мы можем
заметить, что все ножки первого порта(P1) по умолчанию настроены просто
на ввод и вывод(I/O - </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">I</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">nput/</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">O</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">utput),
в то время как ножки P2 по умолчанию подключены к кварцевому
генератору. Изменение битов в PxSEL поменяет основную функцию
соответствующей ножки. Все это мы рассмотрим позднее, сейчас же наша
основная задача - научиться использовать стандартные функции, которые
предопределены в этом регистре.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">PxREN</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Регистр включения резисторов</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">(англ.: </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">R</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">esistor </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">EN</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">able register)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">
- очень удобная функция портов. Иногда необходимо вручную подать
напряжение или же напротив, прекратить подачу оного. К примеру если вы
подключите к вашему микроконтроллеру какую-нибудь кнопку. Регистр
включения резисторов предоставляет вам эту возможность. Когда бит,
соответствующий вашей ножке в этом регистре “поднят”, подача может
регулироваться установкой этого же бита в регистре PxOUT в 1 или 0. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Ну
что же, мы рассмотрели некоторые доступные нам “переключатели”,
поэтому, чтобы закрепить пройденное, в следующей статье мы рассмотрим
как их использовать при написании нашей программы и загрузке её на наше
устройство.</span><br />
<br />
<br />
<br />
<span style="font-size: x-small;"><i><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><i>Оригинал статьи:</i> <i><a href="http://mspsci.blogspot.com/2010/07/tutorial-02-msp430-township-and.html">Tutorial 02: The MSP430 Township and Registers</a></i></span></i></span><br />
<span style="font-size: x-small;"><i><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><i>Перевод:</i> <i><a href="https://plus.google.com/u/0/100706352058867746787" target="_blank">Александр Мошкин</a></i></span></i></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><i><span style="font-size: x-small;">Коррекция: <a href="https://plus.google.com/u/0/114240981960930374446" target="_blank">Алёна Ступникова</a></span> </i> </span></div>
Anonymoushttp://www.blogger.com/profile/07897325351893785351noreply@blogger.com6