Работаем с MSP430 в Linux-е. Lesson 1

Если Вы думаете, что я сейчас буду описывать установку Linux на MSP430, то вынужден вас огорчить — нет! Linux — это достаточно крупная ОСь, и для её (или его) нормальной работы требуется 32-разрядные процессоры. Так что далее речь пойдет об обычном компе с установленным на нем Linux-ом, и о том, как в этом Linux-е писать программы для MSP430, компилировать и, наконец, заливать их в микроконтроллеры. Я специально не уточняю тип дистрибутива Linux, методика работы с MSP430 для всех дистрибутивов Linux практически одинаковая, хотя лично я использую дистрибутивы Ubuntu и Debian.

Еще одно вводное замечание. Я предполагаю, что у вас уже установлен на компе тулчейн для MSP430. Если это не так, то я рекомендую вам сначала прочитать

https://zhevak.wordpress.com/2012/05/27/toolchain-for-msp430/

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

Основная цель Первого урока состоит в том, чтобы вы смогли хоть что-то получить работающее. Под «что-то» я понимаю моргание светодиодом. Для сферы микроконтроллеров — это аналог комповой программы, которая выдает строку «Hello World!».

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

Один из подводных камней состоит в том, что вы должны хоть как-то уметь работать с компьютером. Но если вы сейчас читаете этот текст, то вы уже что-то умеете делать. Это хорошо.

Следующий камень — это умение хоть как-то работать в Линуксе. У меня нет планов научить вас Линуксу с нуля. Вы должны самостоятельно изучить эту тему. На просторах Интернета полным полно самых разнообразных знаний. Гуглите, и вам отломится огромный пласт информации на эту тему.

Третий камень — вы должны хоть как-то разбираться в языке программирования С. И тут я тоже предлагаю вам самостоятельно порыть Интернет.

В интернете полно ресурсов, где учат работе под Линуксом и программированию в С. Например, есть хороший ресурс

http://younglinux.info/

Я же попытаюсь научить вас тому, чего практически нет или оно описано в Интернете не на том уровне. Я попытаюсь научить вас  программировать микроконтроллеры msp430 в среде Linux.

Перед тем как начать большое дело, я обычно задаю людям свой любимый вопрос — «Как съесть слона?». Слон большой, за один раз не заглотить.

Но тем не менее съесть слона можно! И мы это сейчас начнем делать — понемножку, по кусочку, упорно орудуя ложкой и вилкой. Через год мы существенно продвинемся в этом вопросе. Вообще любая современная технология, чтобы в ней начать разбираться и хотя бы что-то получать на выходе, требует изучения примерно в 400 часов. Поэтому давайте настроимся на длительный забег и начнем уже есть нашего слона.

Итак, приступаем.

Для начала в домашнем директории создадим поддиректорий с незатейливым названием test, а в нем еще один поддиректорий msp430,  а в нем еще один — blink.

Такое развесистое дерево директориев сейчас не нужно, но мы сейчас с вами закладываем правильную структуру для своей работы. Мы строим фундамент нашей работы, поэтому правильный камень в основании нашей будущей Башни Знаний ой-как нужен!

В директории test предназначен для размещения поддиректориев для тестирования компьютерных программ (которые вы возможно тоже будете писать) для тестирования программ для других микроконтроллеров и так далее. Всё, что вы изучаете, всё, с чем вы будете знакомится, я рекомендую помещать сюда.

Директорий msp430 —  ну, тут уже по моему и так ясно — здесь будут размещаться поддиректории наших уроков и ваших самостоятельных упражнений с конкретными микроконтроллерами семейства msp430.

Для тех, кто не еще не очень знает как одним махом создавать сразу несколько вложенных поддиректориев, даю подсказку:

$ mkdir -p test/msp430/blink
$ cd test/msp430/blink

И вот, мы на месте. Теперь давайте создадим простой текстовый файл и сохраним его под именем blink.c. Вот его содержимое:

#include <msp430f2001.h>

int delay(int t)
{
  int i, s;

  s = 0;
  for (i = 0; i < t; i++)
    s += i;

  return s;
}

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR = 0xFF;

  while (1)
  {
    P1OUT = 0x40;
    delay(10000);
    P1OUT = 0x00;
    delay(10000);
  }
}

Это есть исходный текст программы, которая после компиляции превратится в коды микроконтроллера. Эти коды будут потом «залиты» в микроконтроллер. Я немного поясню что тут и зачем.

Функция delay() предназначена для создания задержки между включением и выключением светодиода. Без этой задержки светодиод будет моргать очень часто, и заметить его глазом не представляется никакой возможность. Моргания можно увидеть только осциллографом. Функция выполнена крайне брутально, по рабоче-крестьянской технологии. Но нам сейчас нет дела до красоты кода. Наша задача хоть как-то заставить работать наш код в микроконтроллере. Функция свою задачу выполняет — и этого нам сейчас достаточно!

Строка

  WDTCTL = WDTPW + WDTHOLD;

нужна для того чтобы отключить сторожевой таймер WDT (watchdog).

В отличие от других микроконтроллеров в msp430 WDT включается после сброса сам. И если его не выключить, то через некоторое время он перезагрузит МК. Это время меньше одной секунды. После перезагрузки МК снова начнет работать и снова будет перезагружен вотч-догом. И так до бесконечности. Не зная этого секрета, многие начинающие изучать семейство MSP430 не могут понять, почему, казалось бы, без ошибок написанная прога никак не хочет работать.

Команда

  P1DIR = 0xFF;

настроит все выводы порта P1 на выход.

На известной отладочной плате Lanchpad имеется пара светодиодов. Они подключены к битам «0» и «6». Мы будем моргать зеленым светодиодом, который подключен к порту P1 к линии 6.

Если посмотреть на схему LaunchPad, то можно увидеть, что светодиод будет гореть, когда соответствующий ему бит (линия) порта будет в единичном состоянии. Байт, в котором 6-ой бит установлен в единичное состояние, имеет значение 0x40.

Таким образом, команда

  P1OUT = 0x40;

включает зеленый светодиод, а команда

  P1OUT = 0x00;

выключает его. (Точнее, она выключает вообще все светодиоды.)

Как я уже говорил чуть выше, между включением и выключением светодиода вызывается функция «потери времени».

Конечно, в профессионально написанных программах такими функциями и не пахнет! Любой уважающий себя профи будет отправлять проц в спячку, когда тому нечего делать, и будет возвращать его из сна по какому-либо событию. Таким образом проц не будет выполнять пустой работы, а значит не будет потреблять электроэнергию.

Для МК msp430, которые позиционируются на рынке как самые малопотребляющие, отравлять проц в спячку — это особенно актуально! Иначе грош-цена такому разработчику, который не смог справится с МК, не смог его «уговорить» не кушать батарею. Но мы сейчас не будем отвлекаться на эти дела. Мы обязательно вернемся к этой теме через несколько уроков.

Итак. Текст программы у нас набран и сохранен в файле. Теперь нам нужно его откомпилировать и получить коды для заливки в МК. Для этого давайте выполним команду

$ msp430-gcc -mmcu=msp430f2001 blink.c

Если всё было сделано правильно, то в нашей директории должен появиться файл a.out, который мы зальем в МК. Не обращайте внимание на то, что файл имеет какое-то «левое» имя (a.out) и на его большой размер (почти 5 кБ). На самом деле — это самый нормальный объектный файл. Помимо кода, который будет помещен во флеш-память нашего микроконтроллера, в этом файле содержится много другой информации. Эта информация нам сейчас не нужна. А поскольку программатор умеет работать с такого рода файлами, то я пока не буду отвлекаться от темы. Я как-нибудь потом покажу, как из таких файлов доставать «чистые» коды для флеш-памяти МК.

Я должен признаться что мы опять с вами идем не совсем правильным путем. На практике этим путем никто не ходит. Ни один Джедай. Немного погодя я покажу вам настоящий Джедайский путь. А сейчас будем ходить пока так.

Но не стоит печалиться. Ведь наша текущая задача — хоть как-то достичь цели. Придти к цели хоть тушкой, хоть шкуркой. Хоть как! Мы потом с вами оптимизируем наш путь и станем Джедаями. А сейчас мы еще сосунки, офисные хомячки. Но ведь мы быстро растем, да?

И у нас остался последний шаг — залить код в МК. Подцепляем к компу отладочную плату Launchpad и выполняем команду:

 $ mspdebug rf2500 "prog a.out"
 

Получилось? Светодиод заморгал? Поздравляю!!!

Если нет, задавайте вопросы. Будем разбираться.

В следующем уроке будем изучать как все, что мы сейчас делали, делать это правильно, по науке. Будем оттачивать наши умения. Путь к совершенству никогда коротким не бывает.

Так, как съесть слона?

Advertisements

20 responses to “Работаем с MSP430 в Linux-е. Lesson 1

  1. Здравствуйте!

    Насколько я понимаю Си (а я его понимаю не то чтобы очень — пока не сильно углублялся), Вы в примере в цикле for фигурные скобки забыли:)

    • Спасибо за Ваше внимание.

      Позвольте небольшой ликбез.

      Начнем с того, что в языке С имеется несколько базовых понятий.

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

      В языке С под понятием выражение подразумеваются следующие конструкции:

        x
        2 * x + 3
        x = y = z = 0
        printf(«abc»)

      Заметьте, выражение не имеет на конце точки с запятой. Когда выражение заканчивается точкой запятой, возникает новое понятие — оператор.

      Существует также понятие составного оператора — это ничто иное как фигурные скобочки и множество, заключенных в них других операторов. Вот типовой пример составного оператора:

      {
        a = 123;
        b = 456;
        c = x + y / 2;
      }
      

      Вообще составной оператор рассматривается как отдельный простой оператор.

      Идем далее.

      Часто встречаются случаи, когда согласно логике в программе нужно разместить несколько операторов, но синтаксис позволяет разместить только один оператор. Например:

      if (a < 10)
        b = 15;
        c = 20;
      

      В этой конструкции выражение c = 20 не относится к оператору условия, и будет выполняться всякий раз независимо от выражения a. То есть согласно правилам синтаксиса было бы правильнее писать так:

      if (a < 10)
        b = 15;
      c = 20;
      

      Но нам не это надо. Нам нужно чтобы при условии, что a < 10, выполнялись оба выражения. В этом случае мы можем объединить оба оператора в один составной:

      if (a < 10)
      {
        b = 15;
        c = 20;
      }
      

      Поскольку Вы затронули вопрос о цикле for, давайте рассмотрим его чуть подробнее. Цикл имеет следующую структуру:

      for (выражение_1; выражение_2; выражение_3) оператор_4

      , где
      выражение_1; — оператор инициализации переменной (-ых) до начала цикла. Здесь обычно задают начальное значение переменной цикла. Переменная цикла — это такая переменная, назначение которой — управлять циклом. Иначе говоря, переменная цикла должна изменяться от какого-то начального значения до какого-то конечного. Этот оператор выполняется всего один раз — перед началом цикла.

      выражение_2; — при значении выражения равной «истина» цикл совершит еще одну итерацию (круговорот). Если выражение имеет значение «истина», цикл будет продолжаться. Но как только этот выражение_2 станет ложным, цикл прекратится, и управление будет отдано на оператор, который стоит сразу за оператор_4. Обычно в этом выражении производится сравнение переменной цикла с заданным конечным значением, но это совсем не обязательное требование. Оператор выражение_2; выполняется каждый раз перед началом выполнения новой итерации, другими словами — перед тем как совершится новый виток.

      выражение_3; — это оператор выполняется после завершения очередного витка. Обычно здесь производится изменение переменной цикла.

      оператор_4 — это ничто иное как тело цикла. Этот оператор выполняется на каждом витке.

      Теперь — ВНИМАНИЕ! Вместо оператора оператор_4 в программах обычно указывается составной оператор, состоящий из нескольких простых. Но тогда, когда по логике программы требуется один простой оператор, то его можно писать сразу. Обрамление же его в фигурные скобочки только лишь логически (то есть — на откомпилированном коде никак не отражается!) делает его «вложенным» в составной оператор. В этом случае составной оператор будет состоять всего из одного вложенного оператора.

      Такое вполне допустимо, и особенно приветствуется, когда есть вероятность, что придется к одиночному оператору дописать еще что-нибудь.

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

      А вообще, руководствуйтесь принципом — писать так, чтобы было понятно не только Вам и не только сейчас. Чем меньше всяких закорючек, тем легче читается программа. (Оцените легкость восприятия программ на Python-е и на Pascal-е.)

      • Ох, большое спасибо за столь подробное объяснение:) Буду знать)

        Хотя для себя, скорее всего, всё равно продолжу оформлять «про запас». Лично мне кажется, что так код будет выглядеть более единообразно.

        По поводу восприятия программ на питоне знаю не понаслышке — как раз с него и решил «съехать» и попробовать что-нибудь более низкоуровневое:)

      • Я тоже иногда оформляю «про запас». Не часто, но делаю.

        «Съезжать» совсем не надо! Питон — очень хороший язык верхнего уровня, а нижний — Вы чем-нибудь С-подобным прикроете. Таким образом, любые проблемы, от нижнего уровня до верхнего, у Вас не будут вызывать шока. (Мне кажется, что Вы все-таки хотели сказать не «съехать», а изучить еще один инструмент.)

  2. Вложенности комментариев, видимо, уже не хватает и на ту ветку движок отвечать не даёт)

    Да, не вполне корректно выразился — хотелось бы именно расширить кругозор:)

    Если можно, то задам ещё один вопрос, т.к. в работе с электроникой и программировании на таком уровне совсем новичок: как можно получать данные с этого контроллера при работе через отладочную плату? Можно ли получать данные по USB? Или нужно ковырять UART и уже его как-то мострячить к COM или USB-порту?

    Также не совсем понятно значение выражения:

    «Команда
    1 P1DIR = 0xFF;
    настроит __все выводы порта P1 на выход.__»

    Что за порт и на какой выход?

    Прошу простить за глупые вопросы и буду рад, если поможете разобраться:)

    И, конечно, с нетерпением жду продолжения курса:)

    • 1.
      как можно получать данные с этого контроллера при работе через отладочную плату? Можно ли получать данные по USB? Или нужно ковырять UART и уже его как-то мострячить к COM или USB-порту?

      Я вынужден задать встречный вопрос — что Вы подразумеваете под «получать данные»?

      Попробую предположить, что Вас интересует обычная (штатная) работа Вашей программы в микроконтроллере. И Вам нужно чтобы Ваша прога могла передать кое-какие данные в комп. Желательно, чтобы можно было воспользоваться возможностями отладочной платы. Наверняка имеется ввиду отладочная плата Launchpad.

      Отвечаю — да, можно! На плате имеются две пары пинов (джамперов), которые подписаны TxD и RxD. Старыая версия платы содержит небольшую ошибку — чтобы передача данных смогла осуществится нужно соединить контакты крестообразно (по диагонали). В новая версия этот баг устранен — там можно воспользоваться обычными джамперами.

      Так или иначе, Ваш МК сможет передавать информацию в комп и принимать из компа. Поскольку, плата соединяется с компом через USB-соединение, и учитывая, что в Линуксе «все есть файл», Вам нужно вместо устройства последовательного порта /dev/ttyS0 указать USB-устройство /dev/ttyUSB0.

      Если Вы написали свою (комповую) прогу, то вопрос обмена информации с МК исчерпан. Если у Вас другая ситуация, и Вы хотите хоть как-нибудь получить или отобразить данные, пришедшие с МК, на экране, то Вы можете воспользоваться программой minicom. В крайнем случае, можно тупо копировать поток с порта на экран с помощью команды

      Что за порт и на какой выход?
      $ cat /dev/ttyUSB0

      Вообще, вариантов масса! Я не могу ответить на неконкретный вопрос.

      2.
      Что за порт и на какой выход?

      Под портом (в контексте МК) подразумевается либо механизм МК, который позволяет передавать информацию изнутри МК наружу, либо в обратном направлении. Иначе говоря, порту принадлежит определенный (конкретный) физический вывод (ножка микросхемы). Иногда под портом имеется ввиду одна ножка (или один бит), иногда — восемь ножек (восемь бит, или байт). А у МК типа ARM7 и Cortex — может быть даже 12 или 16 бит.

      Так вот. Если порт сконфигурирован «на выход», то программно изменяя его состояние (то есть — записывая в него то «единицу», то «ноль»), мы увидим эти изменения на ножке МК. В частности, команда P1DIR = 0xFF; как раз и «разворачивает» все биты порта P1 в направлении «на выход». Если порт ориентирован на вход, то мы можем передавать информацию микроконтроллеру извне, изменяя напряжение на ножке МК. При этом МК должен периодически считывать состояние порта.

      Я Вам настоятельно рекомендую зайти на сайт gaw.ru и почитать там по микроконтроллерам. Ну и про Гугл не забывайте.

  3. Добрый день!
    В коменте выше Вы написали что из платы Launchpad можно читать данные командой cat /dev/ttyUSB0.
    Я подключил плату к компу, появился порт /dev/ttyACM0. При запуске команды cat /dev/ttyACM0 пишет ошибка ввода-вывода 😦
    комп Ubuntu Linux 11.04, в MSP430 выдает в консоль значения температуры —

    Serial.begin(9600);
    sensorValue = analogRead(TEMPSENSOR);
    Serial.print((sensorValue*0.0625)+3);
    Serial.print(«\n»);

    Каким образом все таки прочитать данные в UBUNTU ??

    • День добрый, Евгений!

      Я не совсем понял, откуда был выхвачен кусок кода, который Вы привели… Очень похоже на Ардуину, ну да ладно! Правда не совсем понимаю каким местом, специфичный для AVR код прилеплен к MSP430. Ну да ладно!

      Я так же не совсем понял, какую ошибку ввода вывода Вы получаете… Было бы неплохо, если бы Вы закопипастили сообщение терминала. Ну да ладно!

      Угадывать я не очень умею, так что извиняйте, если что не так!

      Смею предположить, что у Вас элементарно не хватает прав в системе (в Линуксе) для работы с портом. Чтобы выяснить этот вопрос, выполните сначала команду:

      $ ll /dev/ttyACM0

      обратите внимание, кому «принадлежит» порт. Например, у меня на компе порт принадлежит root-у и группе dialout. Но также может оказаться группа plugdev.

      Далее, выполните вторую команду:

      $ groups

      и посмотрите, в какие группы входит Ваш аккаунт. Более конкретно — входите ли Вы в группу порта. Вы уже поняли, что для работы с портом необходимо входить в его группу. Если этого нет, то Вам будет совершенно законно отказано в операциях с портом.

      Это не Шindows, это — Линукс! Здесь права на пользование системными ресурсами раздаются под строгим контролем. Поэтому вирусня систему не грызет, и свалить систему обычному юзеру (без выхода на уровень root-а) не получится — пусть хоть что делает! Но пока он не имеет прав root-а система будет жить. Максимум, что может хомячок — это вспороть себе брюхо и испоганить свою учетную запись и свой домашний директорий. Другие пользователи и сама система от урода не пострадают. Root-же всемогущ и бесмертен. Только он волен завалить всю вселенную одной командой. Но разработчики предполагают, что «богами» системы являются адекватные люди, а не хомячки.

      Так что на секунду станьте богом и назначьте хомячку-юзеру маленький кусочек прав — только работать с USB-портом. Для этого Вам нужно выполнить следующую команду, которая добавит Ваш аккаунт в группу:

      $ sudo addgroup $USER dialout

      К сожалению, я не совсем четко представляю, что там у Вас происходит. Ситуация походит на ту, когда пациент пришел к доктору и говорит:
      — Док, у меня в животе что-то болит. Что это может быть?
      — Э-э… дык… это, батенька, раздевайтесь!

      Для того, чтобы поставить правильный диагноз, слишком мало данных. А Вы меня пытаетесь соблаговолить вырезать у Вас аппендикс дистанционно. Нормально так, да!? Такое, конечно, возможно, но только тогда, когда исход операции не волнует ни пациента, ни доктора.

      • Евгений

        Добрый день!
        Благодарю за подробный ответ, постараюсь более понятно обрисовать ситуацию..
        Кусок приведенного кода — это исходник программы из компилятора Energia — http://energia.nu/ — Arduino-подобный компилятор для MSP430.
        Самое интересное что код работает и на Windows-машине выдает в консоль данные температуры..
        На сервере же с Ubuntu никак не могу заставить прочитать эти данные 😦
        Все команды набираю под root —
        Успешно определяется в USB —
        lsusb
        Bus 005 Device 011: ID 0451:f432 Texas Instruments, Inc. eZ430 Development Tool
        Пытаюсь прочитать данные —
        stty -F /dev/ttyACM0 raw speed 9600
        stty: /dev/ttyACM0: Input/output error

        cat /dev/ttyACM0
        cat: /dev/ttyACM0: Input/output error

      • ага! Уже лучше. Уже что-то вырисовывается. Но все равно для меня остается еще много не выясненного.

        1. Скажите, Вы уже создали файл /etc/udev/rules.d/46-TI_launchpad.rules ?
        2. Покажите мне, что Вам сообщает dmesg.
        3. Установите minicom, попробуйте с его помощью принять поток данных.

        Могу еще как вариант предложить написать свою прогу, которая принимает данные из /dev/ttyACM0 и отправляет их на стандартный выход в том или ином формате. Меняя параметры свой проги Вы быстрее разберетесь, что у Вас не работает.

      • Евгений

        1. cat /etc/udev/rules.d/46-TI_launchpad.rules
        ATTRS{idVendor}==»0451″, ATTRS{idProduct}==»f430″, MODE=»660″, GROUP=»plugdev»
        ATTRS{idVendor}==»0451″, ATTRS{idProduct}==»f432″, MODE=»660″, GROUP=»plugdev»
        2. dmesg сообщает много всего —
        [2680407.216151] usbcore: registered new interface driver usbserial
        [2680407.216192] USB Serial support registered for generic
        [2680407.216244] usbcore: registered new interface driver usbserial_generic
        [2680407.216251] usbserial: USB Serial Driver core
        [2680407.226029] USB Serial support registered for TI USB 3410 1 port adapter
        [2680407.226072] USB Serial support registered for TI USB 5052 2 port adapter
        [2680407.226137] usbcore: registered new interface driver ti_usb_3410_5052
        [2680407.226144] ti_usb_3410_5052: v0.10:TI USB 3410/5052 Serial Driver
        [2680421.058522] tty_port_close_start: tty->count = 1 port count = 0.
        [2680526.520233] usb 5-2: USB disconnect, address 4
        [2680632.904097] usb 5-2: new full speed USB device using uhci_hcd and address 6
        [2680633.117124] cdc_acm 5-2:1.0: This device cannot do calls on its own. It is not a modem.
        [2680633.117316] cdc_acm 5-2:1.0: No union descriptor, testing for castrated device
        [2680633.117365] cdc_acm 5-2:1.0: ttyACM0: USB ACM device
        [2680643.173984] generic-usb 0003:0451:F432.0005: usb_submit_urb(ctrl) failed
        [2680643.174186] generic-usb 0003:0451:F432.0005: timeout initializing reports
        [2680643.174687] generic-usb 0003:0451:F432.0005: hiddev0,hidraw1: USB HID v1.01 Device [Texas Instruments Texas Instruments MSP-FET430UIF] on usb-0000:00:1d.3-2/input1
        [2680659.199956] tty_port_close_start: tty->count = 1 port count = 0.
        [2680686.375889] tty_port_close_start: tty->count = 1 port count = 0.
        [2680720.456126] usb 5-2: USB disconnect, address 6
        [2680721.192038] usb 5-2: new full speed USB device using uhci_hcd and address 7
        [2680721.404910] cdc_acm 5-2:1.0: This device cannot do calls on its own. It is not a modem.
        [2680721.405105] cdc_acm 5-2:1.0: No union descriptor, testing for castrated device
        [2680721.405148] cdc_acm 5-2:1.0: ttyACM0: USB ACM device
        [2680731.461774] generic-usb 0003:0451:F432.0006: usb_submit_urb(ctrl) failed
        [2680731.461920] generic-usb 0003:0451:F432.0006: timeout initializing reports
        [2680731.462318] generic-usb 0003:0451:F432.0006: hiddev0,hidraw1: USB HID v1.01 Device [Texas Instruments Texas Instruments MSP-FET430UIF] on usb-0000:00:1d.3-2/input1
        [2682124.978936] tty_port_close_start: tty->count = 1 port count = 0.
        [2682144.146903] tty_port_close_start: tty->count = 1 port count = 0.
        [2682673.658890] tty_port_close_start: tty->count = 1 port count = 0.
        [2712568.368134] usb 5-2: USB disconnect, address 7
        [2712575.800042] usb 5-2: new full speed USB device using uhci_hcd and address 8
        [2712576.014010] cdc_acm 5-2:1.0: This device cannot do calls on its own. It is not a modem.
        [2712576.014202] cdc_acm 5-2:1.0: No union descriptor, testing for castrated device
        [2712576.014248] cdc_acm 5-2:1.0: ttyACM0: USB ACM device
        [2712586.069895] generic-usb 0003:0451:F432.0007: usb_submit_urb(ctrl) failed
        [2712586.070085] generic-usb 0003:0451:F432.0007: timeout initializing reports
        [2712586.070497] generic-usb 0003:0451:F432.0007: hiddev0,hidraw1: USB HID v1.01 Device [Texas Instruments Texas Instruments MSP-FET430UIF] on usb-0000:00:1d.3-2/input1
        [2722361.146276] tty_port_close_start: tty->count = 1 port count = 0.
        [2734468.550865] tty_port_close_start: tty->count = 1 port count = 0.

        3. minicom установил, но похоже он также не открывает порт, хотя может я не разобрался как его настраивать:(
        4. Запустил файлик на перле —
        #!/usr/bin/perl

        use strict;
        use warnings;

        use POSIX;
        use Fcntl;

        die(«Usage: $0 \n») unless $#ARGV == 0;

        my $TTS = $ARGV[0];
        my $input;

        # somehow sysopen hangs if it’s not opened in NONBLOCK mode
        sysopen($input, $TTS, O_RDONLY | O_NOCTTY | O_NONBLOCK)
        || die(«Couldn’t open \»$TTS\»: $!»);

        { # Set back to blocking mode
        my $flags = fcntl($input, F_GETFL, 0)
        || die(«Couldn’t get current flags»);
        fcntl($input, F_SETFL, $flags & ~O_NONBLOCK)
        || die(«Couldn’t set current flags»);
        }

        select((select(*STDOUT), $| = 1)[0]); # autoflush on
        while( sysread $input, my $new, 255 ) {
        print $new;
        }
        выдает ошибку такую же
        > /home/script/read_serial.pl /dev/ttyACM0
        Couldn’t open «/dev/ttyACM0»: Input/output error at /home/script/read_serial.pl line 15.

      • Ага-а!!! Ну вот теперь картина полная.

        У Вас получилось так, что внутреннее ПО Лончпада не «отпускает» свой основной режим, и все команды, которые приходят с компа он пытается понять как команды для управления таргетом (процом, в который залито Ваше ПО), а все, что приходт из таргета, — игнорируется. Вам нужно просто закончить сессию отладки, то есть сказать внутреннему программному обеспечению (которое залито в msp430f1612), что «типа всё, хорош впахивать! 17:00 — рабочий день закончился!»

        Для этого нужно дать команду

        $ mspdebug rf2500 exit

        Возможно, Вам придется перед этим выдернуть и заново подключить Лончпад к USB.

        Затем, вы традиционно выполняете свои команды:

        $ stty 9600 -F /dev/ttyACM0
        $ cat /dev/ttyACM0

        или, если Вы используете Миником, то:

        $ minicom -b 9600 -D /dev/ttyACM0

        Отпишитесь, если все получиться. По нашим следам идет еще толпа народа.

  4. root@bt:~# mspdebug rf2500 exit
    MSPDebug version 0.18 — debugging tool for MSP430 MCUs
    Copyright (C) 2009-2011 Daniel Beer
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    Trying to open interface 1 on 006
    Initializing FET…
    FET protocol version is 30394216
    Configured for Spy-Bi-Wire
    Set Vcc: 3000 mV
    Device ID: 0x2553
    Device: MSP430G2553
    Code memory starts at 0xc000
    Number of breakpoints: 2
    root@bt:~# stty 9600 -F /dev/ttyACM0
    stty: /dev/ttyACM0: Input/output error
    root@bt:~# cat /dev/ttyACM0
    cat: /dev/ttyACM0: Input/output error
    root@bt:~#

    • н-н, да… Тупик. 😦
      Вы загнали меня в угол, я не знаю, что Вам еще посоветовать.
      Попробую выкроить время поставить Energia и воспроизвести Вашу ситуацию у себя на компе.

  5. Ув. zhevak!
    Столкнулся со сходной с Евгением проблемой.
    Не могли бы вы привести вывод команды «lsmod», возможно, что мне необходимо специальный драйвер для этой платы, хотелось бы это проверить.

  6. К вопросу о фигурных скобках и циклах. : ) Если мне не изменяет память, MISRA C рекомендует ставить фигурные скобки всегда, вне зависимости от количества следующих операторов.

  7. Да. Спасибо, что подняли этот вопрос.

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

    Казалось бы, можно опустить скобки, которые не есть необходимы для правильности кода. Код будет правильный в обоих случаях — со скобками и без. На самом деле, скобки — это правильный камушек в фундаменте программы (проекта), который ожидается, что в последствие будет расти. И чтобы себе не усложнять жизнь, когда проект разрастется до больших размеров, и будет уже сложно его сопровождать (править баги, дописывать функционал и т.д.), нужно заранее позаботится о чистоте его кода.

    • А еще скобки значительно уменьшают шансы выстрелить себе в ногу, используя в цикле или условном операторе какой-нибудь хитрый и не совсем корректный макрос…

  8. Здравстуйте и спасибо Вам, zhevak!

    Я пытаюсь подружить MSP-FET430UIF с Code::Blocks (с msp430-gcc и mspdebug для компиляции и прошивки соответственно).
    Использовал Ваши инструкции и теперь хотя бы дошел до того, что mspdebug пытается подключиться к FET, но не выходит :(.

    $ sudo mspdebug uif -d /dev/ttyACM0 msp430-temp.elf
    MSPDebug version 0.19 — debugging tool for MSP430 MCUs
    Copyright (C) 2009-2012 Daniel Beer
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    Trying to open UIF on /dev/ttyACM0…
    Initializing FET…
    uif: read error: Connection timed out
    fet: open failed
    Trying again…
    Initializing FET…
    uif: read error: Connection timed out
    fet: open failed

    Помогите (ссылками на инструкции или советом) разобраться, пожалуйста.
    Спасибо!

    • Извините, в данный момент я не имею под руками MSP430 и программаторов. Поэтому могу только теоретически попытаться помочь.

      Согласно Вашей команде:

      $ sudo mspdebug uif -d /dev/ttyACM0 msp430-temp.elf

      Вы пытаетесь достучаться к микроконтроллеру по интерфейсу SBW. Но вы ничего не сказали про микроконтроллер. Возможно он не поддерживает этот интерфейс, а работают только по JTAG.

      Может вообще оказаться банальная вещь — в цепи сброса микроконтроллера установлен конденсатор на 10 нФ и более, сигнал через который программатор не в состоянии прокачать.

      Если есть осциллограф, то посмотрите на ножках микроконтроллера TEST/SBWTCK и RST/SBWDIO сигналы. Сравните их с сигналами, описанными в документации.

      Но мне кажется, что скорее всего необходимо на 14-контактном разъеме JTAG просто подтянуть контакт 8 (цепь SBWTCK) к контакту 7 (TCK) резистором в 200-300 Ом. Пожалуй, начните-ка с этого совета!

      По крайней мере, по сообщениям от программатора видно, что между компом и программатором связь есть, а между программатором и микроконтроллером — отсутствует.

      Пробуйте сначала свои действия выполнить в консоли, то есть без использования к C::B. Когда у Вас всё заработает, тогда, если хотите, можете автоматизировать свои действия с помощью C::B.

      Он ведь по сути ничего сверхъестественного не делает. Просто переводит процесс управления из разряда консольных команд в разряд «программирую мышкой». (Виндовс, к стати, это еще и скрывает и напускает туману, типа «тут всё сложно и всё покрыто мраком. Так что юзайте что дают и даже не пытайтесь что-либо понять. Короче, типичная таблетка Отупина для пользователя-хомячка.)

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s