My home clock as host for MSP430.


Any questions - e-mail below.
Key - CLOCK in subject.

 

  Простые микроконтроллеры от TI. Как их программировать и чего от них ожидать.

  Страница, логически разбита на 4 части:
     1. Как прошить микроконтроллер с минимальным расходом времени и денег;
     2. Как программировать, к примеру импульсы, и что от этого ожидать;
     3. Как уменьшить, и без того малое, энергопотребление;
     4. В качестве примера, отремонтировать электронно-механические часы, запрограммировав простой микроконтроллер.

  Будем программировать MSP430. Почему? Потому, что это просто. К тому же отечественный интернет привил мне ненависть к PIC16F84A, в общем то так же, как английский - к таймеру 555. Тот кто сам делал программатор на параллельный порт для "пиков", искал чем и как их программировать - поймет меня сразу.

  Недостаток только один, в том, что MSP430 LaunchPad Development kit с двумя микроконтроллерами в придачу, прийдется таки купить. На этом недостатки заканчиваются. В результате, кроме двух 16 битных микроконтроллеров, мы получаем:
 - несущую плату, которая работает как программатор и дебагер для всей MSP430 серии;
 - бесплатную оболочку для программирования CCS7.0, которая постоянно обновляется;
 - полный набор документации и примеры простых программ для каждого микроконтроллера;
 - и, после установки CCS7 и подключения USB к LaunchPad, все начинает работать, сразу.

  Конечно, еще необходимо знание языка Си, хотя бы на уровне 8-го класса средней школы. Остальное интуитивно понятно из фирменных примеров, которых ... более чем предостаточно.

  Устанока CCS7.0 (Code Composer Studio™) возможна только на Windows и сводится к положительному ответу на все вопросы. После запуска CCS необходимо создать новый проект, где указать имя проекта, тип микроконтроллера, и выбрать "CCS project with main.c" . И все. Экран будет похож на мой, только без остатков последней программы. Из всего разнообразия меню и кнопок нас будет интересовать только одна.



  Она компилирует Вашу программу и, если нет ошибок, то "сливает" ее в микроконтроллер.

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

 /*По умолчанию CCS загружает программу в микроконтроллер, но не запускает ее на исполнение.*/



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

/*CCS содержит много всяких "полезностей", 99,(9)% из которых Вы никогда не будете использовать*/

  С этого момента Вы, почти, профессионал в CCS. Вы  можете копипастить, компилировать любые проекты и делиться впечатлениями на форумах. Для 99% читателей - цель достигнута.

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

  Тут, я могу Вас огорчить. Программирование MSP430 основано не на магических знаниях которые люди получают в политехах и универах, а на простом чтении документации. К примеру, если Вы собрались программировать MSP430F2011, то на странице производителя есть АБСОЛЮТНО ВСЕ что Вам необходимо. Datasheet и Family User's Guide придется прочитать. Кроме того на странице "Technical documents" описаны многие вещи, которые позволяют не изобретать велосипед.

  К примеру, после чтения документации выясняется, что
MSP430, по умолчанию, работает на тактовой частоте ~1 МГц, все дополнительные модули откючены и все внешние порты в состоянии "вход". Исключением является только WDTimer, который регулярно сбрасывает процессор (каждые 32768 тактовых импульса).

  Бороться с этим можно поразному, но в данный момент,  проще отключить этот таймер.  WDTPW (пароль) и WDTHOLD это два 16 битных числа которые, после операции "или", записываются в регистр WDTCTL. Значения - в текстовом файле msp430.h


  Если запустить эту программу на исполнение, то микро контроллер пробежит по ней один раз и остановится. Это не интересно. Например, что бы озадачить микро контроллер, на время пока мы пьем чай перед телевизором, можно добавить цикл while(1), где "1" это условие, которое всегда выполняется.


  Но существует чувство некоторого подвоха, что контроллер, на самом деле, ничего не делает (хоть это и не так). Поэтому заставим его мигать светодиодом в цикле 'while'. Для этого нужно знать три простых оператора, которые нужно выучить как "Отче Наш":

1   a |= 0x01;       //sets 'bit 0' in the variable a.    /*устанавливает бит в "1"*/
2   a &= ~0b00000001;//resets 'bit 0' in the variable a.  /*сбрасывает бит в "0"*/   
3   a ^= BIT0;       //invert 'bit 0' in the variable a. 
/*инвертирует бит*/        

  Просто выучить! Этот набор логических операторов Вы будете использовать "часто и густо".

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


 Все хорошо, но светодиод мигать не будет, так как по умолчанию все порты сконфигурирован на вход. Это легко исправить.


  Теперь светодиод мигает, но так быстро, что это можно рассмотреть только на осциллографе. Вторая осциллограмма показывает какой самый короткий импульс можно получить на почти бинарной операции "установить бит - сбросить бит" минуя  цикл while. Минимальное время - 3,8*10-6сек.



  MSP430 имеет три тактовых генератора Очень медленный ~ 10кГц, от кварцевого резонатора 32768 Гц (если Вы его установили) и основной генератор - от 0,1 до 25Мгц. Если Вам необходим прецизионный генератор, скажем 1 кГц, то это делается от кварцевого резонатора. При этом нужно термостабилизировать юнит на уровне 50"С, что легко делается на MSP430F2012, тк она имеет встроенный термометр. Но во многих случаях это не нужно. MSP430 имеет 4 набора калибровочных констант, которые позволяют легко установить, калиброванную до 1%, тактовую частоту 1, 8, 12 или 16MHz. Опять же, никакой магии. Все находится в примере кода: msp430x20x3_dco_calib.c , который поставляется TI.  Здесь мне самому интересно, что будет, если запустить процессор на калиброванно частоте 1MHz. В код мы добавляем, из примера:

 
  И на осциллографе получаем другую замечательную картинку, из которой следует, что:



частота (1&16MHz) достаточно точная и на замену бита микроконтроллер тратит 4 тактовых импульса.

  Вторая осциллограмма показывает, что самый коротки импульс, который Вы можете сформировать программно = 256 nsec (на тактовой частоте -
16MHz).

  Подведем короткий итог. Уже сейчас, если Вы знаете как рабтает оператор for(a=0;a=65536;a++), то Вы можете сделать замечательную приставку к дверному звонку своего соседа, который "доставал" Вас с самого детства. Она будет замыкать контакты звонка, один раз в сутки, скажем в 4 утра. Первые пару дней Вы будете просыпаться заранее, что бы убедиться, что Ваше "творение", таки,  работает ...

  Учитывая то, что в лучшем случае Вы загрузили
Datasheet и Family User's Guide, на первый попавший микроконтроллер, но даже не собираетесь их читать, то рассмотрим другой теоретический вопрос - как сделать так, что бы программу, которую Вы написали сегодня, можно было прочитать завтра.

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


  Это, конечно, немного больше работы, но за то, при коротком взгляде на "main" становится понятно, что программа делает.

  Недостаток только в том, что вызов подпрограммы берет дополнительное время. Осциллограмма показывает, что необходимо 14 тактов процессора (вместо 6-ти) что бы вернуться к обслуживанию светодиода.

  Теперь рассмотрим другую практическую ситуацию. В большинстве устройств микроконтроллер ничего не делает 99,9% времени. Он ждет события, которое может и не наступить, но ток (~0.4mA at 1MHZ) он потребляет. CR2032 хватит часов на 500. С другой стороны, калькуляторы от Texas Instruments, где в середине почти та же MSP430, работают 10 лет, от той же батарейки.

  Существует несколько способов решения проблемы. Первый - если Вам необходимо генерировать частоту, скажем 1 kHz, то эту работу может взять на себя внутренний таймер. CPU, при этом, можно отключить, как это сделано в примере: msp430x20x3_ta_10.c


 Так как на выходе P1.1 частота основного генератора /1000, то интересно проверить насколько точно он откалиброван. Осциллограммы для обоих случаев.



  Результат лучше, чем я ожидал. Статистика за 10 минут говорит что частота плавает в диапазоне от -0,2% до +0,5%, но в среднем она 1,001 kHz.

  OK. CPU мы отлючили, но основной генератор продолжает работать на частоте 1 MHz. Поэтому ток потребления, конечно упал, но только до 0,14mA.

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

  Как практический пример, если у Вас есть электронно-механические часы, в которых умерла электроника, то уже сейчас, Вы можете сделать генератор 1 Hz (на самом деле 0,5Hz), который будет двигать стрелки.

/* Мои часы, которые на фото, продолжают светиться даже ночью, благодаря источнику ... (белый мешочек, который под ними лежит). И, я их очень люблю. */



  Для часов нужен более точный источик частоты и меньшее потребление тока. Что бы это сделать достаточно изменить источник тактирования таймера на внутренний генератор от 32768 кварца и отключить основной тактовый генератор CPU - 1MHz.  Если Вы не начали читать документацию на MSP430 (в чем я уверен), то поможет пример программы msp430x20x3_ta_11.c



  Помимо того, что такой генератор выдает точную частоту 0,5Hz (которая определяется точностью кварцевого резонатора 32768 Hz), общий ток потребления уменьшился до 0,07mA. Это не рекорд, но для часов - очень приемлимо.

  Вторым способом, который описан везде, проблема пониженного энергопотребления,  решается "укладыванием" микроконтроллера в режим "sleep" с выходом из последнего, по прерыванию. В этом случае, наступившее событие вызывает прерывание, микроконтроллер просыпается, делает свою работу и снова засыпает. Таким образом можно легко сделать устройство (MSP430+CR2032) которое начнет звонить в дверь "любимому соседу" через 10 лет.

  MSP430 имеет 4-ре основных мода (LPM0-3) в режиме сна. Отличаются количеством отключенных тактовых генераторов и внутренних модулей. О них Вы прочитаете сами. Выбор необходимого режима это процесс творческий, не считая того момента, что Вы можете просто скопипастить реализацию, из готового примера от TI. Я выбираю последнее.

  Что бы "вогнать" микроконтроллер в режим самого низкого энергопотребления и при этом, что бы он продолжал генерировать импульсы (в данном случае - 256Hz), достаточно творчески переработать уже готовый пример msp430x20x3_wdt_02.c . В программе происходит следующее. Мы переводим WDT, который мы обычно отключаем в начале программы, в режим генерации прерываний. WDT_ADLY_1_9 это готовая конфигурация таймера (с расшифровкой на следующей строке) о которой можно прочитать в slau144j.pdf, на 347-й странице. Но можно этого и не делать ... как говорил классик.

  После этого включаем возможность прерывания и уводим микроконтроллер в режим сна - LPM3, о котором нужно прочитать на странице 39 того же документа. Все заканчивается именем и процедурой обработки прерывания.


  При общем токе потребления
~0,004mA, микроконтроллер просыпается 512 раз в секунду и генерирует сигнал 256Hz на выходе P1.0 (типичное потребление тока, для разных режимов LPM, в slau144j.pdf, на 38-й странице).

/* Если Вы измеряете ток потребления в таком режиме, то отключите щуп осциллографа. Последий потребляет 0,0002 - 0,004mA  */

  ОК. Ток потребления, Гейгер-Мюллер, 512 Герц, бла-бла-бла. Мне сейчас нужно восстановить мои любимые часы. Возможно Вам тоже, поэтому займемся этим, как практическим примером.

  Электроника, во весех таких часах, делает одно и тоже - формирует импульсы частотой 0,5Hz на двух выводах, которые подключены к катушке электродвигателя. Импульсы, длинной 50ms, сдвинуты между собой на одну секнду.



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

  В общем, имеем программный автомат, который по очереди выдает импульсы на выходы P1.0 и P1.1. Если делать все программно, то никакой документации читать не надо.


  Каждый раз, когда происходит прерывание (512 в секунду) добавляется 1 к счетчику прерываний (time_in_clicks). В зависимости от состояния последнего, формируются два импульса (50ms) для катушки электрдвигателя часов. Когда проходят две секунды (time_in_clicks == 1024) счетчик прерываний сбрасывается и цикл повторяется снова. Не элегантно, но очень просто.

  В последней программе меня раздражает не количество if-ов, а то, что все они исполняются каждый раз, не зависимо от значения переменной "time_in_clicks". Но это легко исправить.


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

/* Школьные часы работают по похожему принципу. Поэтому, уже сейчас, Вы можете начать думать как укоротить время уроков и удлиннить перемены между ними. */

  Обе программы работают ..., но это не совсем гуманно дергать CPU 512 раз в секунду только для того, что бы проверить совпадение с 1, 27,513, 539 и 1025. Правильно это делать раз в секунду. И это возможно.

  Если, таки, заглянуть в msp430f2011.pdf, page 6, то выяснится, что в середине MSP430F2011, "гуляет без дела" еще один таймер, который можно использовать.

  Идея и реализация программы следующая.
1. Как и раньше, просыпаться по WDT прерыванию, но теперь уже 1 раз в секунду.
2. Подпрограмма "Sub_for_switching_ ... выберет на каком выходе менять напряжение.
3. Включается второе прерывание, но уже по обычному таймеру, который будет считать 50 msec.
4. Когда пройдет 50msec, возникнет второе прерывание и сбросит все выходы в "0".
5. Эта история будет повторяться снова и снова.

  Конечно, документацию нужно читать. Творчески подойдя к примеру msp430x20x3_ta_01.c получаем то, что нам нужно.


/* Что бы реализовать это еще красивее у MSP430F2011 не хватает TACCR2. Но для других микроконтроллеров этой серии актуальным будет
slau144j.pdf, p.362, Fig.12-9 */

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



  При таком потреблении мощности ток, который необходим для работы двигателя часов (~1mA), кажется просто гигантским. Здесь ничего особенно не сделаешь, за исключением того, что можно вернуть часть энергии, запасенной в катушке, обратно.

  Программу надо немного поправить... и с двумя NiMH аккумуляторами, это будет работать лучше.



  Думаю, что цель достигнута.

--------- Not done yet. -----------


Jun.01,2018  SK_Lab

_

Make a free website with Yola