430_3. MSP430, LaunchPad. Страница находится "в работе".


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


  Взято из «Getting started with the MSP430 LaunchPad – Initialization and GPIO.

  Msp430 – достаточно «мудрая» серия микроконтроллеров. Большинство их свойств унаследовано от микроконтроллеров Техас Инструмент (TI), которые широко применяются в калькуляторах. То есть, сверх низкое потребление энергии было доступно еще 30 лет назад. Наглядное подтверждение этого можно найти и сейчас. Я держал в руках калькулятор от TI, который через 10 лет продолжал работать от «родных» батареек.

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

  А именно:

   VLO – низкочастотный внутренний генератор (~10 кГц),

   LFXT1 – генератор с внешним кварцевым резонатором (как правило 32 кГц), и

   DCO – высокочастотный внутренний генератор ( ~ 1МГц). Последний можно «двигать» до 16 МГц, если необходимо.

***  Из  картинки  справа  видно,  что:

  - генератор с кварцевым резонатором (LFXT1) или низкочастотный внутренний генератор (VLO) работают на вспомогательный тактовый сигнал A-CLK.

  - внутренний высокочастотный генератор (DCO) – на дополнительный тактовый сигнал SM-CLK.

  - главный тактовый сигнал для процессора (M-CLK) может быть взят из A-CLK или SM-CLK.

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

  После включения питания или после сигнала «Reset» в микроконтроллере происходит следующее:

1.    + После включения питания (PUS) микроконтроллер будет в состоянии “Reset” до тех пор, пока напряжение питания не поднимется выше определенного уровня.
2.    + Ножка микроконтроллера «RST/NMI»  будет сконфигурирована как вход «RESET».
3.    + Все «Входы/Выходы» будут сконфигурированы на «Вход».
4.    + Тактовый генератор (CLOCK) будет работать от внутренней частоты 1 МГц.
5.    + Все внутренние модули и регистры будут сконфигурированы «по умолчанию».
6.    + “WatchDog” таймер будет сконфигурирован, и будет вызывать сигнал «RESET» каждые 32768 (2**15) импульсов тактового генератора (~32 мсек. при тактовой частоте равной 1 МГц).
7.    - Регистр статуса (SR) будет сброшен.
8.    - В программный счетчик (PC) будет загружено число 0FFFE, где находится вектор прерывания для «RESET». Если в микроконтроллере программы не окажется, то в PC будет занесено число 0FFFF, что вызовет остановку микроконтроллера.

  Если все оставить «по умолчанию», то программа начнет выполняться с тактовой частотой 1 МГц. Посмотрим, что нужно сделать программно.

1.    Инициализировать указатель стока “SP” на вершину оперативной памяти. "Си" компилятор это сделает без нашего участия.
2.    Программно переконфигурировать тактовый генератор, если необходима тактовая частота отличная от 1 МГц.
3.    Если нас не устраивает, что “WatchDog” таймер будет сбрасывать микроконтроллер каждые 32 мсек., то его придется подсторить, приостановить или вообще отключить.
4.    Сконфигурировать устройства ввода-вывода («по умолчанию» все «на вход»).
5.    Заставить программу делать что-нибудь полезное.

  Так или иначе, после включения питания, микроконтроллер начинает исполнение программы.

  Это позволяет писать очень простые программы на языке Си, которые сразу начинают работать. Потребуется только программа CCS v5, которую можно бесплатно скачать с сайта производителя. Эта интегрированная оболочка позволяет писать программы и «сливать» их в микроконтроллер через интерфейс установленный на плате LaunchPad. Последняя работает в качестве программатора для всех микросхем серии Msp430.

 

  Теперь настало время для экспериментов. В Code Composer Studio (CCS v.5) создадим новый проект (File –> New –> CCS Project, Project name – Simple_test_001, Family – MSP430, Variant – MSP430G2231, and Empty Project (with main.c). Finish. После этого программа main.c будет выглядеть так:

#include <msp430.h>
/* main.c */
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
return 0;
}


  Попробуем скомпилировать программу нажав кнопку "Debug". После этого можно нажать "Run", и "запустить" программу в микроконтроллере.

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

#include <msp430.h>
int main(void)
{ return 0; }


  * На плате, к выходам первого порта (P1.x) подключены два светодиода. Красный к P1.0, и зеленый к P1.6. С помощью P1DIR = 0x41 (0x41 - шестнадцатиричное, в двоичном коде 01000001) установим биты 0 и 6,
порта P1, на выход.

#include <msp430.h>
int main(void)
{ P1DIR = 0x41;
return 0; }

  Бесконечный цикл "while(1) { P1OUT = 0; P1OUT = 0x41; }" будет записывать в порт значения 0 и 0x41 (01000001).

#include <msp430.h>
int main(void)
{ P1DIR = 0x41;
while(1) { P1OUT = 0; P1OUT = 0x41; }
return 0; }


  Компилируем и отправляем на исполнение. На выходе P1.6 можно наблюдать следующее.

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

volatile unsigned int i;
i = 100;
do
i--;
while(i != 0);


  Программа должна выглядеть следующим образом: >>

 #include <msp430.h>
volatile unsigned int i;
int main(void)
{
P1DIR = 0x41;
i = 100;               // i = 100, 1000, 2500
do
i--;
while(i != 0);

while(1) { P1OUT = 0; P1OUT = 0x41; }
return 0; }

  Цикл задержки формирует паузу в начале программы, которая хорошо видна на экране осциллографа.

  Сброс происходит каждые 30,7 мсек. Если бы тактовый генератор работал с частотой 1 МГц, то это происходило бы каждые 32,768 мсек. Разница небольшая, но попробуем ее устранить. Для этого необходимо настроить задающий генератор по калибровочным значениям находящимся в памяти микроконтроллера. Процедура, взятая из книжки, выглядит так.

void configureClocks()
{
      // Set system DCO to 8MHz
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;

}

  Эта подпрограмма заносит калибровочные константы в регистры микроконтроллера
BCSCTL1 и DCOCTL. Изменим для 1 МГц и портируем в нашу программу. >>
  #include <msp430.h>
  volatile unsigned int i;
  int main(void)
{     
// Set system DCO to 1MHz
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;

 
P1DIR = 0x41;   // Port P1. P1.0 & P1.6 - OUT.
  i = 100;               // i = 100, 1000, 2500
  do
  i--;
  while(i != 0);

 
while(1) { P1OUT = 0; P1OUT = 0x41; }
  return 0; }

  После калибровки задающего генератора (DCO) сброс происходит каждые 33,5 мсек. (29,8 Гц). То есть ошибка тактового генератора уменьшилась с + 6% до - 3% (по сравнению с 32,8 мсек).

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

  Метод стандартный.
1. Д
о начала функции main редупреждаем компилятор о том, что в программе будет использоваться подпрограмма void configureClocks(), которая не возвращает значение (void) и не требует параметров ().
2. После окончания функции
main, описываем подпрограмму void configureClocks().
3. Теперь можно вызывать функцию
configureClocks() из программы main.

#include <msp430.h>

void configureClocks()
;

int main(void)
{

configureClocks();

/* main body */

return 0;
}


void configureClocks()
{
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
}
 #include <msp430.h>
void configureClocks();
volatile unsigned int i;
int main(void)
{
configureClocks();  
// Set  DCO to 1MHz
P1DIR = 0x41;
  i = 100;               // i = 100, 1000, 2500
  do
  i--;
  while(i != 0);

while(1) { P1OUT = 0; P1OUT = 0x41; }
return 0; }

void configureClocks()
{
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
}
  Что бы закончить с конфигурированием Clocks добавим еще одну процедуру, которая будет конфигурировать низкочастотный генератор (VLO) на частоту около 12 кГц. При этом, кварцевый генератор будет отключен.
 #include <msp430.h>
void configureClock_H();
void configureClock_L();
volatile unsigned int i
;
int main(void)
{
configureClock_H();  
// Set  DCO to 1MHz
configureClock_L();   // Set  VCO to 12kHz
 P1DIR = 0x41;
  i = 100;               // i = 100, 1000, 2500
  do
  i--;
  while(i != 0);

while(1) { P1OUT = 0; P1OUT = 0x41; }
return 0; }

void configureClock_H()
{
   // Set system DCO
@ 1MHz
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ; }

void configureClock_L()
{
   // Set LFXT1 to the VLO @ 12kHz
BCSCTL3 |= LFXT1S_2; }

________________________________________________________________________________________________



 Дальше -->

12.06.2012  SKootS

_

Make a free website with Yola