реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> MSP430F2013 из eZ430-F2013 + IAR для начинающих, MSP430F2013 из eZ430-F2013 + IAR для начинающих
AlexandrM
сообщение Sep 18 2007, 06:10
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



Я программист и раньше писал для ПК, Psion, PalmOS, PocketPC. Сейчас очень хочу изучить МК от TI. Имеется eZ430-F2013, IAR и желание. Но никак не могу понять принципов программирования МК. Прошу помощи. Вот есть такие вопросы:
1. на борту памяти 128Б флеша 2К:
1.1. Программа прошивается в флеш?
1.2. Мне для работы будет доступно 2К минус размер программы?
2. Имеется 100Б параметров (типа номер, пользователь и т.д.) они должны быть записаны во флеш
2.1. Есть стартове значения, как их при прошивки записать во флеш или нужно при первом запуске программы инитить?
3. Таймер. Имею код:
Цитата
#include "msp430x20x1.h"

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //выключили WD
P1DIR |= 0x01; //Порт работает на выход

TACTL = TASSEL_1 + MC_1; //Используем ACLK и движение от 0 до TACCR0
TACCR0 = 1000; //Предел 1000
TACCTL0 = CCIE; //Включить прерывание

_BIS_SR(LPM0_bits + GIE); //Перейти в режим сна
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA0_ISR(void)
{
P1OUT ^=0x01; //Изменить состояние порта (как я понимаю в порт будет подавать/не подавать постоянно импульс)
}

3.1. Правильно ли я понял код?
3.2. Как сделать чтобы задержка была 1сек? Как вычислять эту цифру?
3.3. Генератор ACLK работает с одинаковой скорость в спящем режиме?
4. Как вычислять скорость выполнения каждой команды?
5. При отладке с использованием Z430-F2013 код прошивается или идет подобие эмуляции?
Пока все вопросы, надеюсь на ответы для человека с уровнем 0.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 18 2007, 07:56
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(AlexandrM @ Sep 18 2007, 10:10) *
Я программист и раньше писал для ПК, Psion, PalmOS, PocketPC. Сейчас очень хочу изучить МК от TI. Имеется eZ430-F2013, IAR и желание. Но никак не могу понять принципов программирования МК. Прошу помощи. Вот есть такие вопросы:
1. на борту памяти 128Б флеша 2К:
1.1. Программа прошивается в флеш?
1.2. Мне для работы будет доступно 2К минус размер программы?
2. Имеется 100Б параметров (типа номер, пользователь и т.д.) они должны быть записаны во флеш
2.1. Есть стартове значения, как их при прошивки записать во флеш или нужно при первом запуске программы инитить?
3. Таймер. Имею код:

3.1. Правильно ли я понял код?
3.2. Как сделать чтобы задержка была 1сек? Как вычислять эту цифру?
3.3. Генератор ACLK работает с одинаковой скорость в спящем режиме?
4. Как вычислять скорость выполнения каждой команды?
5. При отладке с использованием Z430-F2013 код прошивается или идет подобие эмуляции?
Пока все вопросы, надеюсь на ответы для человека с уровнем 0.


1.1 да во флешь. это пзу (аналог винчестера в ПК biggrin.gif )
1.2 что значит доступно? для чего. Для записипрограммы вам будет доступна вся флешь (в доке смотрите таблицу памяти). для переменных все ОЗУ. Программа при выполнении выполняется из флешь а не ОЗУ

2.1 Я правильно понял, что вамнадочто то записать во флешь потому что при последующем перепрограммировании вам нельзя это стирать? если так, то надо использовать Information Memory например - это спец область флеши для таких нужд. Если вам просто надо при программировании набор констант использовать, то пользуйте const.

3.1 Судя по коментам вроде да. Только фраза " в порт будет подавать/не подавать постоянно импульс" насмешила
3.2 Эта цифра зависит от частоты того генератора, которым тактируется таймер. В вашем случае ACLK. Как задавать частоту ACLK почитайте в доке (например можно от внешнего кварца, обычно именно так ACLK пользуют).
3.3 да.

4. одна АССЕМБЛЕРНАЯ команда выполняется за 1 такт, то есть 1/Fmclk c/ Но зачем вам это? Формировать задержки? это не так делается, а с помощью таймера.

5. прошивается

У Вас тяжелое наследие программирования ПК. Все кто в программирование МК приходит изПК так мучаются. Не переживайте... лечится biggrin.gif biggrin.gif biggrin.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 18 2007, 08:34
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AlexandrM @ Sep 18 2007, 12:10) *
1.1. Программа прошивается в флеш?

Да.
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
1.2. Мне для работы будет доступно 2К минус размер программы?

Для какой именно работы? Для внутрипрограммной записи во Flash? У MSP430F2013 четыре сектора по 512Байт в основной памяти Flash (старший сегмент правда не совсем 512Байт, см. в datasheet) и четыре сектора по 64 байта в области INFO (это тоже Flash). Перед записью во Flash ее нужно стереть. Стирать Flash можно только посекторно (целыми секторами). Если ваша программа будет использовать хотя бы один байт в секторе, то стирать/перезаписывать этот сектор вы уже не сможете (если только не исхитритесь). Для записи констант обычно используются (они для этого и предназначены) сегменты INFO.
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
2. Имеется 100Б параметров (типа номер, пользователь и т.д.) они должны быть записаны во флеш

Пишите в область INFO, как я уже и сказал выше.
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
2.1. Есть стартове значения, как их при прошивки записать во флеш или нужно при первом запуске программы инитить?

Это как вам будет удобно. Только советую сгруппировать константные параметры в структуру и обращаться к ним по указателю как к элементам структуры.
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
3. Таймер. Имею код:

3.1. Правильно ли я понял код?

В общем-то правильно. Только период перезагрузки таймера 1000+1, а не 1000. Состояние 0x0000 это тоже 1 такт. Чтобы период был ровно 1000 тактов в регистр TACCR0 нужно число 1000-1=999 записывать.
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
3.2. Как сделать чтобы задержка была 1сек? Как вычислять эту цифру?

Вычислять как отношение тактовой частоты к значению регистра перезагрузки. В вашем случае как F(ACLK)/(1000+1). Частота переключения выхода P1.1 будет Fout(P1.1)=F(ACLK)/(1000+1)/2
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
3.3. Генератор ACLK работает с одинаковой скорость в спящем режиме?

Да, т.к. его частота используется для тактирования таймера. А таймер работает (не остановлен).
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
4. Как вычислять скорость выполнения каждой команды?

Время (количество тактов) каждой команды указано в руководстве (User's Guide).
Цитата(AlexandrM @ Sep 18 2007, 12:10) *
5. При отладке с использованием Z430-F2013 код прошивается или идет подобие эмуляции?
Пока все вопросы, надеюсь на ответы для человека с уровнем 0.

Да, программный код прошивается во Flash.

P.S. еще добавлю, что за счет ортогональной фон-Неймановской архитектуры MSP430 программа может выполняться как из Flash, так и из ОЗУ. Но компиляторы обычно размещают программный код в основной Flash. Чтобы разместить программу в области INFO или загрузить в ОЗУ компилятор нужно поднастроить (задать опции в виде своих собственных сегментов).
Go to the top of the page
 
+Quote Post
AlexandrM
сообщение Sep 18 2007, 08:39
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



Цитата(jorikdima @ Sep 18 2007, 10:56) *
1.2 что значит доступно? для чего. Для записипрограммы вам будет доступна вся флешь (в доке смотрите таблицу памяти). для переменных все ОЗУ. Программа при выполнении выполняется из флешь а не ОЗУ

Вот есть 2К флеша с 0 по 2047 программа размером 512Б прошьется с Х адреса (с какого прошивается? как определить какая свободная?), т.е. с 512 по 2047 я могу использовать для хранения данных?

Цитата(jorikdima @ Sep 18 2007, 10:56) *
2.1 Я правильно понял, что вамнадочто то записать во флешь потому что при последующем перепрограммировании вам нельзя это стирать? если так, то надо использовать Information Memory например - это спец область флеши для таких нужд. Если вам просто надо при программировании набор констант использовать, то пользуйте const.

Это не константы это очень редко меняющиеся данные. Про Information Memory понял, ее там 256Б (получается 2К + 256Б реально имеется?). А если нужно больше 256Б хранить? Основная суть вопроса вот в чем, имеется:
- базовые параметры размером 300Б они нужны для работы (напр. Номер и Пользователь);
- размер программы 1748Б;
- итого вся память занята
как IAR сказать чтобы разместил Номер и Пользователь например сразу за кодом программы при прошивке, чтобы я мог его использовать так
void main
{
SN = ReadFlash(Addr_SN);
USer = ReadFlash(Addr_User);
}
если не размещаять при прошивке нужно записать во флеш стартовые данные
void main
{
SN = ReadFlash(Addr_SN);
User = ReadFlash(Addr_User);
if (SN == 0)
{
SN = 12345;
User = 09876;
}
}
но это как бы лишний код и памяти под него нет
итого:
можно ли при прошивки размещать некоторые данные во флеше по определенным адресам? и как?

Цитата(jorikdima @ Sep 18 2007, 10:56) *
3.2 Эта цифра зависит от частоты того генератора, которым тактируется таймер. В вашем случае ACLK. Как задавать частоту ACLK почитайте в доке (например можно от внешнего кварца, обычно именно так ACLK пользуют).

А без внешних как? Как узнать текущие насройки?

Цитата(jorikdima @ Sep 18 2007, 10:56) *
У Вас тяжелое наследие программирования ПК. Все кто в программирование МК приходит изПК так мучаются. Не переживайте... лечится

smile.gif

Цитата(rezident @ Sep 18 2007, 11:34) *
Вычислять как отношение тактовой частоты к значению регистра перезагрузки. В вашем случае как F(ACLK)/(1000+1). Частота переключения выхода P1.1 будет Fout(P1.1)=F(ACLK)/(1000+1)/2

Чувствую что глупый вопрос, но чему это F(ACLK) будет равно на этом чипе?
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 08:58
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(AlexandrM @ Sep 18 2007, 12:39) *
Вот есть 2К флеша с 0 по 2047 программа размером 512Б прошьется с Х адреса (с какого прошивается? как определить какая свободная?), т.е. с 512 по 2047 я могу использовать для хранения данных?


С какого места и как программа будет располагеться во флэш описывается в xcl-файле, который используется линковщиком (пример для 430x149):
// -------------------------------------------------------------------
// Information memory (FLASH)
// -------------------------------------------------------------------

-Z(CODE)INFO=1000-10FF
-Z(CODE)INFOA=1080-10FF
-Z(CODE)INFOB=1000-107F


// -------------------------------------------------------------------
// ROM memory (FLASH)
// -------------------------------------------------------------------

// Code

-Z(CODE)CSTART=1100-FFDF
-Z(CODE)CODE,TAIVINT=1100-FFDF


// Constant data

-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1100-FFDF


// Interrupt vectors
-Z(CONST)INTVEC=FFE0-FFFF

// -------------------------------------------------------------------


Там же описывается распределение RAM:
// -------------------------------------------------------------------
// RAM memory
// -------------------------------------------------------------------

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,HEAP+_HEAP_SIZE,UART_BUF=0200-0A00
-Z(DATA)CSTACK+_STACK_SIZE#

Цитата(AlexandrM @ Sep 18 2007, 12:39) *
Чувствую что глупый вопрос, но чему это F(ACLK) будет равно на этом чипе?


Еще раз - читайте документацию, это все там подробно и понятно написано. Конкретно по этому вопросу - раздел - "Basic Clock Module".
Например, в MSP430x1xx:
"ACLK: Auxiliary clock. The ACLK is the buffered LFXT1CLK clock source divided by 1, 2, 4, or 8." Это касается и Вашего вопроса насчет того можно ли его использовать без внешнего кварца - кварц на ХТ1 НУЖЕН для ACLK.

P.S. Конкретно под MSP430F2013 не стал скачивать документацию, проверьте сами совпадает ли написанное мной с описанием конкретно Вашего чипа, скорее всего да.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 18 2007, 09:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AlexandrM @ Sep 18 2007, 14:39) *
Вот есть 2К флеша с 0 по 2047 программа размером 512Б прошьется с Х адреса (с какого прошивается? как определить какая свободная?), т.е. с 512 по 2047 я могу использовать для хранения данных?

Неверные адреса! Распределение памяти смотрите в datashseet конкретного кристалла. Для MSP430F2013 распределение памяти такое (см. правую колонку в аттаче).
Цитата(AlexandrM @ Sep 18 2007, 14:39) *
Это не константы это очень редко меняющиеся данные. Про Information Memory понял, ее там 256Б (получается 2К + 256Б реально имеется?). А если нужно больше 256Б хранить? Основная суть вопроса вот в чем, имеется:
- базовые параметры размером 300Б они нужны для работы (напр. Номер и Пользователь);
- размер программы 1748Б;
- итого вся память занята

Рекомендую для такого случая использовать внешнюю м/с EEPROM. Для уменьшения энергопотребления можно запитать ее прямо от вывода любого порта MSP430.
Цитата(AlexandrM @ Sep 18 2007, 14:39) *
как IAR сказать чтобы разместил Номер и Пользователь например сразу за кодом программы при прошивке, чтобы я мог его использовать так
void main
{
SN = ReadFlash(Addr_SN);
USer = ReadFlash(Addr_User);
}
если не размещаять при прошивке нужно записать во флеш стартовые данные
void main
{
SN = ReadFlash(Addr_SN);
User = ReadFlash(Addr_User);
if (SN == 0)
{
SN = 12345;
User = 09876;
}
}
но это как бы лишний код и памяти под него нет

Не понял, что за такая функция ReadFlash? Константы можно адресовать непосредственно, зачем еще функцию для этого писать? Еще раз повторяю, чтобы константы разместить в одном месте используйте структуру. Т.е. оформите данные как структуру констант.
Цитата(AlexandrM @ Sep 18 2007, 14:39) *
итого:
можно ли при прошивки размещать некоторые данные во флеше по определенным адресам? и как?

Можно. Читайте документ MSP430 C/C++ Compiler Reference Guide из состава IAR wink.gif
Цитата(AlexandrM @ Sep 18 2007, 14:39) *
Чувствую что глупый вопрос, но чему это F(ACLK) будет равно на этом чипе?

Поскольку вы не используете никаких процедур инициализации источников тактирования, то ACLK будет по-умолчанию от LFXT1CLK тактироваться, то бишь от часового кварца, который установлен на вашем EZ430.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
AlexandrM
сообщение Sep 18 2007, 09:41
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



Цитата(rezident @ Sep 18 2007, 12:03) *
Поскольку вы не используете никаких процедур инициализации источников тактирования, то ACLK будет по-умолчанию от LFXT1CLK тактироваться, то бишь от часового кварца, который установлен на вашем EZ430.


Подскажите как обойтись без внешних кварцев?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 18 2007, 09:53
Сообщение #8


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(AlexandrM @ Sep 18 2007, 13:41) *
Подскажите как обойтись без внешних кварцев?

не использовать ACLK. Использовать например MCLK или SMCLK

Вы наверно думаете, что в МК частоты ACLK и пр. уже заданы. Нет. Это не Пень4 smile.gif с 3.0 Ггц, тут формировать тактовую частоту надо самому, настраивая конфигурационные регистры. Читайте Basic Clock.
Go to the top of the page
 
+Quote Post
AlexandrM
сообщение Sep 18 2007, 10:45
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



А существует какой-нибудь примерник элементарных кусков кода с разяснениями?
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 11:13
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(AlexandrM @ Sep 18 2007, 14:45) *
А существует какой-нибудь примерник элементарных кусков кода с разяснениями?


Настроим DCO (смотрите "Digitally-Controlled Oscillator (DCO)" в мануале):
Код
  
u08 ucGIF = __get_interrupt_state();
__disable_interrupt();   // запрет прерываний

// работаем от DCO, частоту на максимум:
  BCSCTL1 =
    RSEL0 |  RSEL1 | RSEL2  
    | XT2OFF;

  BCSCTL2 = 0;
  DCOCTL = DCO1 + DCO0 + DCO2;
  
  Init_timer_В();
  
__set_interrupt_state(ucGIF); // восстановление прерываний

В результате внутренний осциллятор будет настроен на частоту около 7 МГц, внешние кварцы не используются, ACLK - в этом случае не работает, таймеры нужна включать от SMCLK:

Код
void Init_timer_В(void)
{
  u08 ucGIF = __get_interrupt_state();
  __disable_interrupt();

  // Останов таймера
  TBCCR0 = 0;

        // настройка
      TBCTL =
        TBSSEL_2  // Timer B clock source select: SMCLK
        | ID_3    // Timer B input divider: /8
        | MC_1;   // Up to CCR0
        
        // используем только нулевой, остальные стоят
    TBCCTL0 = CM_0 | CCIS_2 | CCIE; // режим сравнения, вход захвата на землю, прерывание разрешено
        TBCCTL1 = 0;
    TBCCTL2 = 0;
    TBCCTL3 = 0;
    TBCCTL4 = 0;
    TBCCTL5 = 0;
    TBCCTL6 = 0;

  // ну сюда вписать то число тактов, которое вам надо    
  TBCCR0 = 0x1000; // Ft = F(SMCLK)/(1000+1)/2
  TBCCR1 = 0;
  TBCCR2 = 0;
  TBCCR3 = 0;
  TBCCR4 = 0;
  TBCCR5 = 0;
  TBCCR6 = 0;
  
  __set_interrupt_state(ucGIF);
}


Но! DCO весьма нестабильно - от внешних условий может колебаться на 10%. Подробнее - в документации на Ваш контроллер. Поэтому и точность измерения времени будет соответствующая. Я однажды допустил ошибку - назначил для тактирования UART SMCLK от DCO - померил, осцильником частоту, вписал ее для расчета бодрэйта - усе было ОК. На следующее утро не мог понять почему нет связи с прибором, которая накануне была... biggrin.gif
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 18 2007, 11:17
Сообщение #11


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(AlexandrM @ Sep 18 2007, 14:45) *
А существует какой-нибудь примерник элементарных кусков кода с разяснениями?

http://www.ti.com/litv/zip/slac015k
и вообще поройтесь на сайте ТИ, много интересного... аппликухи там..
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 11:21
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(jorikdima @ Sep 18 2007, 13:53) *
не использовать ACLK. Использовать например MCLK или SMCLK


MCLK - частота собственно ядра: "MCLK is used by the CPU and system." Использовать его для периферии (таймеров, UART, SPI) - нельзя.
"Читайте Basic Clock." (с)Ваше. smile.gif
Go to the top of the page
 
+Quote Post
AlexandrM
сообщение Sep 18 2007, 11:30
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



Цитата(jorikdima @ Sep 18 2007, 14:17) *
http://www.ti.com/litv/zip/slac015k
и вообще поройтесь на сайте ТИ, много интересного... аппликухи там..


Есть это все, мучаю исходники. Но озарение не приходит пока sad.gif .
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 18 2007, 11:33
Сообщение #14


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(Юрий Санвальд @ Sep 18 2007, 15:21) *
MCLK - частота собственно ядра: "MCLK is used by the CPU and system." Использовать его для периферии (таймеров, UART, SPI) - нельзя.
"Читайте Basic Clock." (с)Ваше. smile.gif

не готов отвечать за 2 семейство, так как работаю с 1. Что касается 1 семейства, то по крайней мере Ацп может тактироваться от MCLK. АЦП - перефирия.

Это не принципиально...
Цитата(AlexandrM @ Sep 18 2007, 15:30) *
Есть это все, мучаю исходники. Но озарение не приходит пока sad.gif .

что конкретно не получается? Про установку частоты куча примеров, да и выше привели.
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 11:38
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



AlexandrM, разрешите вопрос, почему именно MSP? Для какого применения хотите делать устройство? Я вот изучение микроконтроллеров в институте начинал с Atmel AVR, и хотя сейчас в основном работаю с LPC и MSP, но мне кажется что проще всего начать с какой-нибудь ATMEGA16 от Atmel, там все просто и линейно, нет кучи всяких разных клоков, спящих режимов и т.п. ИМХО конечно. Или выбрали MSP просто из-за наличия eZ430?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 18 2007, 11:39
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(AlexandrM @ Sep 18 2007, 14:30) *
Есть это все, мучаю исходники. Но озарение не приходит пока sad.gif .
Начните с моргания светодиодом. Потом поморгайте через таймер. И так постепенно дойдете до
Цитата
- итого вся память занята


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 11:42
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(jorikdima @ Sep 18 2007, 15:33) *
не готов отвечать за 2 семейство, так как работаю с 1. Что касается 1 семейства, то по крайней мере Ацп может тактироваться от MCLK. АЦП - перефирия.


Да, извиняюсь, это я мануал не вкурил до конца, оказывается АЦП от MCLK можно включить.
Go to the top of the page
 
+Quote Post
AlexandrM
сообщение Sep 18 2007, 12:25
Сообщение #18


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



Цитата(Юрий Санвальд @ Sep 18 2007, 14:38) *
AlexandrM, разрешите вопрос, почему именно MSP? Для какого применения хотите делать устройство? Я вот изучение микроконтроллеров в институте начинал с Atmel AVR, и хотя сейчас в основном работаю с LPC и MSP, но мне кажется что проще всего начать с какой-нибудь ATMEGA16 от Atmel, там все просто и линейно, нет кучи всяких разных клоков, спящих режимов и т.п. ИМХО конечно. Или выбрали MSP просто из-за наличия eZ430?


Прием передача по радиоканалу.
Изза того что хорошие отзывы о MSP430 + CC110x и наличия eZ430.

Цитата(Сергей Борщ @ Sep 18 2007, 14:39) *
Начните с моргания светодиодом. Потом поморгайте через таймер. И так постепенно дойдете до


Помигал smile.gif А вот на таймерах ничего не пойму:
Код
#include  <msp430x20x3.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 1000-1;
  TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode

  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT ^= 0x01;                            // Toggle P1.0
}


Вот недоходит мне что это за "1000-1". Читаю что ACLK = TACLK = 32768Hz но как вычислить чему равно должно быть CCR0 чтобы получилась 1 секунда.
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 12:41
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(AlexandrM @ Sep 18 2007, 16:25) *
Вот недоходит мне что это за "1000-1". Читаю что ACLK = TACLK = 32768Hz но как вычислить чему равно должно быть CCR0 чтобы получилась 1 секунда.


В этом примере "1000-1" - число тактов ACLK, досчитав до которого таймер выдаст прерывание и обнулится. Если ACLK у вас 32,768 кГц то, чтобы прерывание происходило каждую секунду CCR0 = 2*32768-1.
Go to the top of the page
 
+Quote Post
AlexandrM
сообщение Sep 18 2007, 13:16
Сообщение #20


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



Цитата(Юрий Санвальд @ Sep 18 2007, 15:41) *
В этом примере "1000-1" - число тактов ACLK, досчитав до которого таймер выдаст прерывание и обнулится. Если ACLK у вас 32,768 кГц то, чтобы прерывание происходило каждую секунду CCR0 = 2*32768-1.


Не обижайтесь sad.gif обясните почему * 2 какая связь 2*32768-1 и 1 секундой?

Сообщение отредактировал AlexandrM - Sep 18 2007, 13:23
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 13:42
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(AlexandrM @ Sep 18 2007, 17:16) *
Не обижайтесь sad.gif обясните почему * 2 какая связь 2*32768-1 и 1 секундой?


Насчет *2 это я ошибся wacko.gif надо "32768/2".
Смотрите: таймер считает импульсы ACLK, его частота 32,768 кГц, значит за секунду происходит 32768/2 =16384 импульсов. Т.е. если вы хотите, чтоб прерывание происходило через секунду, то в CCR0 нужно записать это число - 1 ("нулевой" такт тоже считается), за секунду счетчик дойдет до этого числа и случиться прерывание.

Только вы уверены что у вас там на плате есть внешний кварц (32768кГц обычно) для ACLK? по-моему его на плате просто нет: http://focus.ti.com/lit/ug/slau176b/slau176b.pdf
страница №10 там к XIN/XOUT ничего не подключено, есть только ВЧ-кварц на ХТ2.
Во втором семействе там вроде внутренний осциллятор есть, но может какие то особенности есть с его настройкой, я не знаю, т.к. не работал никогда 05.gif
Попробуйте переключить таймер на SMCLK, как это у меня в примере было (поменяйте только регистры под ваш контроллер), по идее он по умолчанию от DCO работает, так нормально все должно быть. Главное не сдаваться! smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 18 2007, 13:42
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Я же вам привел формулу. Период перезагрузки таймера равен частному от частоты тактирования и значения регистра, определяющего период перезагрузки (CCR0). Если нужен период мерцания 1Гц, то частота перезагрузки таймера нужна вдвое выше 2Гц, т.к. у светодиода будет два состояния: включен и выключен. При частоте тактирования ACLK=32768Гц значение для регистра CCR0 получается 32768Гц/2Гц-1=16384-1=16383. При частоте тактирования SMCLK=DCO (по-умолчанию без инициализации источников тактирования SMCLK около 1.1МГц) 1100000Гц/2Гц-1=550000-1=549999 Но это число больше разрядности таймера (макс. 65535). Поэтому при такой частоте тактирования 1Гц не получить. Нужно использовать предделители для SMCLK и TACLK. Предделитель SMCLK (1, 2, 4, 8) находится в регистре BCSCTL2, предделитель TACLK (1, 2, 4, 8) - в регистре TACTL. Вы в конце-концов User's Guide читали или нет?
Цитата
Блин больше все не люблю когда примеры не работают sad.gif
Вот пример, в итоге не происходит прерывания. sad.gif
В чем я не прав?

Вы правы, но не понимаете смысла инициализации WDTimer
Код
WDTCTL = WDT_MDLY_32;

Если вы загляните в хидер msp430x20x3.h, то там увидите строку
Код
#define WDT_MDLY_32         (WDTPW+WDTTMSEL+WDTCNTCL)                         /* 32ms interval (default)

которая означает, что WDTimer тактируется от SMCLK с предделителем 32768. И при значении SMCLK по-умолчанию (т.к. тактирование вы опять же не настроили) период прерываний от WDT получается 1.1МГц/32768=33,56Гц. А частота мерцаний светодиода получается около 17Гц. Т.е. вы просто не видите его мерцаний.
Go to the top of the page
 
+Quote Post
AlexandrM
сообщение Sep 18 2007, 13:50
Сообщение #23


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991



Цитата(Юрий Санвальд @ Sep 18 2007, 16:42) *
Насчет *2 это я ошибся wacko.gif надо "32768/2".
Смотрите: таймер считает импульсы ACLK, его частота 32,768 кГц, значит за секунду происходит 32768/2 =16384 импульсов. Т.е. если вы хотите, чтоб прерывание происходило через секунду, то в CCR0 нужно записать это число - 1 ("нулевой" такт тоже считается), за секунду счетчик дойдет до этого числа и случиться прерывание.


Извините если уже дастал но:
CCR0 = (32768 / 2)-1;
в результатет мигание индикатора приблизительно 27 сек.

Пожалуйста дайте рабочий код sad.gif Я что не попробую все не работает sad.gif
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 18 2007, 14:21
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(AlexandrM @ Sep 18 2007, 17:50) *
Извините если уже дастал но:
CCR0 = (32768 / 2)-1;
в результатет мигание индикатора приблизительно 27 сек.

Пожалуйста дайте рабочий код sad.gif Я что не попробую все не работает sad.gif


Ну я выше написал уже, что не работал со вторым семейством, реального кода для него у меня нет, но все эти вещи должны работать. Обратите внимание на мое замечание насчет ACLK, почитайте юзергид насчет внутреннего осциллятора, какая у него частота по умолчанию? И светодиод не самый лучший способ отладки, он может мигать с большой частотой и вы просто этого не увидите, осциллографа часом нету? Без него сложновато с МК работать. Но можно.


Посмотрел сам (стало интересно): http://focus.ti.com/lit/ds/symlink/msp430f2013.pdf

Ничего не понял (точнее почти ничего просто не написано в разделе "oscillator and system clock") sad.gif

Тут кто-нибудь работал со второй серией MSP? Какие там особенности есть в плане этого "the internal LF oscillator"?
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 18 2007, 15:29
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата
Тут кто-нибудь работал со второй серией MSP? Какие там особенности есть в плане этого "the internal LF oscillator"?

Да ничего там сложного. Все то же самое что и в серии 1xx за исключением наличия доп. встроенного низкочастотного DCO под названием VLO и возможности переключать номиналы встроенных нагрузочных конденсаторов на выводах XIN/XOUT. А для "просветления" нужно читать не столько datasheet MSP430F2013 сколько MSP430x2xx Family User's Guide wink.gif
Хм, кварца в EZ430 похоже действительно нету. Но при желании можно припаять.
А чтобы поморгать светодиодом на EZ430 с частотой 1Гц попробуйте такую программу. Накидал быстро, но вроде без ошибок smile.gif
Код
#include <msp430x20x3.h>

void main (void)
{ WDTCTL = WDTPW + WDTHOLD;                 // остановим WD_Timer
// ---------------------------------- Инициализация источников тактирования ACLK, MCLK, SMCLK
  DCOCTL = CALDCO_1MHZ;                     // выбор DCO_1MHz
  BCSCTL1 = CALBC1_1MHZ;                    // ACLK=XT2/2=1MHz,
  BCSCTL2 = SELM_0|DIVM_0|DIVS_3;           // MCLK=DCO/1=1МГц, SMCLK=DCO/8=125кГц
// ---------------------------------- Инициализация Port1
  P1OUT = 0;                                // Port 1 сбросим
  P1DIR = BIT0;                             // P1.0 как выход
// ---------------------------------- Инициализация Timer_A
  TACTL = TASSEL_2|ID_1|TACLR;              // выбрать источник тактирования SMCLK/2=62,5кHz
  TACCR0 = 31249;                           // значение регистра CCR0, таймер считает от 0 до CCR0
  TACCTL0 = CCIE;                           // прерывание от CCR0 разрешено
  TACTL |= MC_1;                            // режим Count_UP
//-----------------------------------
  _EINT();                                  // разрешим прерывания
  while(1)                                  // основной программный цикл
  { _NOP();
  }                                         // end while
}                                           // end main

#pragma vector = TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TimerA0_ISR(void)
{ P1OUT^=BIT0;                              // инвертируем состояние LED
}


P.S. Если вы уже умудрились стереть калиброванные константы для DCO, то строки
Код
  DCOCTL = CALDCO_1MHZ;                     // выбор DCO_1MHz
  BCSCTL1 = CALBC1_1MHZ;                    // ACLK=XT2/2=1MHz,

можно закоментарить. Частота моргания светодиода изменится, но незначительно.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 19 2007, 08:18
Сообщение #26


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



у автора нету кварца. А значит нет 32768!

Автор, решение проблемы временной задержки - тактирование таймера от SMCLK.

Честно говоря, СС1100 + MSP430 вам ПОКА не потянуть.
Go to the top of the page
 
+Quote Post
Tech
сообщение Sep 19 2007, 09:01
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 1-12-04
Пользователь №: 1 267



По MSP430 читать здесь:
http://www.compel.ru/library
http://www.gaw.ru/html.cgi/txt/app/micros/msp430/index.htm
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Sep 19 2007, 09:03
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Для AlexandrM:
Только что проверил код представленный rezident'ом, на eZ430 который есть у нас на фирме - все работает. Частоту мигания осциллографом не замерял, но визуально - 1с или очень близко. Значит и у вас все должно работать.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 10:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01675 секунд с 7
ELECTRONIX ©2004-2016