|
MSP430F2013 из eZ430-F2013 + IAR для начинающих, MSP430F2013 из eZ430-F2013 + IAR для начинающих |
|
|
|
Sep 18 2007, 11:39
|

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

|
Цитата(AlexandrM @ Sep 18 2007, 14:30)  Есть это все, мучаю исходники. Но озарение не приходит пока  . Начните с моргания светодиодом. Потом поморгайте через таймер. И так постепенно дойдете до Цитата - итого вся память занята
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 18 2007, 11:42
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(jorikdima @ Sep 18 2007, 15:33)  не готов отвечать за 2 семейство, так как работаю с 1. Что касается 1 семейства, то по крайней мере Ацп может тактироваться от MCLK. АЦП - перефирия. Да, извиняюсь, это я мануал не вкурил до конца, оказывается АЦП от MCLK можно включить.
|
|
|
|
|
Sep 18 2007, 12:25
|
Участник

Группа: Новичок
Сообщений: 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)  Начните с моргания светодиодом. Потом поморгайте через таймер. И так постепенно дойдете до Помигал  А вот на таймерах ничего не пойму: Код #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 секунда.
|
|
|
|
|
Sep 18 2007, 12:41
|
Частый гость
 
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Sep 18 2007, 13:16
|
Участник

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

|
Цитата(Юрий Санвальд @ Sep 18 2007, 15:41)  В этом примере "1000-1" - число тактов ACLK, досчитав до которого таймер выдаст прерывание и обнулится. Если ACLK у вас 32,768 кГц то, чтобы прерывание происходило каждую секунду CCR0 = 2*32768-1. Не обижайтесь  обясните почему * 2 какая связь 2*32768-1 и 1 секундой?
Сообщение отредактировал AlexandrM - Sep 18 2007, 13:23
|
|
|
|
|
Sep 18 2007, 13:42
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(AlexandrM @ Sep 18 2007, 17:16)  Не обижайтесь  обясните почему * 2 какая связь 2*32768-1 и 1 секундой? Насчет *2 это я ошибся  надо "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. Во втором семействе там вроде внутренний осциллятор есть, но может какие то особенности есть с его настройкой, я не знаю, т.к. не работал никогда Попробуйте переключить таймер на SMCLK, как это у меня в примере было (поменяйте только регистры под ваш контроллер), по идее он по умолчанию от DCO работает, так нормально все должно быть. Главное не сдаваться!
|
|
|
|
|
Sep 18 2007, 13:42
|
Гуру
     
Группа: Свой
Сообщений: 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Гц. Т.е. вы просто не видите его мерцаний.
|
|
|
|
|
Sep 18 2007, 13:50
|
Участник

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

|
Цитата(Юрий Санвальд @ Sep 18 2007, 16:42)  Насчет *2 это я ошибся  надо "32768/2". Смотрите: таймер считает импульсы ACLK, его частота 32,768 кГц, значит за секунду происходит 32768/2 =16384 импульсов. Т.е. если вы хотите, чтоб прерывание происходило через секунду, то в CCR0 нужно записать это число - 1 ("нулевой" такт тоже считается), за секунду счетчик дойдет до этого числа и случиться прерывание. Извините если уже дастал но: CCR0 = (32768 / 2)-1; в результатет мигание индикатора приблизительно 27 сек. Пожалуйста дайте рабочий код  Я что не попробую все не работает
|
|
|
|
|
Sep 18 2007, 14:21
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(AlexandrM @ Sep 18 2007, 17:50)  Извините если уже дастал но: CCR0 = (32768 / 2)-1; в результатет мигание индикатора приблизительно 27 сек. Пожалуйста дайте рабочий код  Я что не попробую все не работает  Ну я выше написал уже, что не работал со вторым семейством, реального кода для него у меня нет, но все эти вещи должны работать. Обратите внимание на мое замечание насчет ACLK, почитайте юзергид насчет внутреннего осциллятора, какая у него частота по умолчанию? И светодиод не самый лучший способ отладки, он может мигать с большой частотой и вы просто этого не увидите, осциллографа часом нету? Без него сложновато с МК работать. Но можно. Посмотрел сам (стало интересно): http://focus.ti.com/lit/ds/symlink/msp430f2013.pdfНичего не понял (точнее почти ничего просто не написано в разделе "oscillator and system clock") Тут кто-нибудь работал со второй серией MSP? Какие там особенности есть в плане этого "the internal LF oscillator"?
|
|
|
|
|
Sep 18 2007, 15:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата Тут кто-нибудь работал со второй серией MSP? Какие там особенности есть в плане этого "the internal LF oscillator"? Да ничего там сложного. Все то же самое что и в серии 1xx за исключением наличия доп. встроенного низкочастотного DCO под названием VLO и возможности переключать номиналы встроенных нагрузочных конденсаторов на выводах XIN/XOUT. А для "просветления" нужно читать не столько datasheet MSP430F2013 сколько MSP430x2xx Family User's Guide  Хм, кварца в EZ430 похоже действительно нету. Но при желании можно припаять. А чтобы поморгать светодиодом на EZ430 с частотой 1Гц попробуйте такую программу. Накидал быстро, но вроде без ошибок  Код #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, можно закоментарить. Частота моргания светодиода изменится, но незначительно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|