Jump to content

    
Sign in to follow this  
Daria

MSP430 - вопросы от чайника

Recommended Posts

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

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

Подскажите еще, пожалуйста, как в CCE 2.0 войти в режим симулятора, никак не могу понять. Вроде в свойствах проекта на режим отладки устанавливаю - "simulator", но при запуске debuge ничего не происходит.

Share this post


Link to post
Share on other sites
Подскажите пожалуйста, генератор тактовой частоты запускается сразу после подачи питания или его надо сначала сконфигурировать? не могу найти регистр, который бы за это отвечал.
Про какой их двух/трех генераторов вопрос? И про какой кристалл? DCO стартует сразу после подачи питания. LFXT с часовым кварцем тоже сразу, но колебания стабилизируются только через несколько сотен миллисекунд после включения. С высокочастотным кварцем LFXT сразу не стартует, для этого его нужно сконфигурировать. XT2 при подаче питания выключен. Для включения опять же нужно его сконфигурировать. FLL от часового кварца тоже по-моему запускается сразу, но вот тут на 100% не уверен, т.к. с кристаллами в которых есть FLL я не работал.

Тот же вопрос про генератор опорного напряжения.
REF при включении питания выключен. И везде включается только отдельным битом в специальном регистре.

И вообще ответы на ваши вопросы находятся в User's Guide семейства MSP430 и в datasheet конкретного кристалла.

Подскажите еще, пожалуйста, как в CCE 2.0 войти в режим симулятора, никак не могу понять. Вроде в свойствах проекта на режим отладки устанавливаю - "simulator", но при запуске debuge ничего не происходит.
По CCE не подскажу, т.к. не использую эту среду разработки.

Share this post


Link to post
Share on other sites

Большое спасибо, вопрос был именно про LFXT :) А в руководстве я этого не нашла.

Share this post


Link to post
Share on other sites
А в руководстве я этого не нашла.
Ну если вы соблаговолите указать полное имя кристалла MSP430, то наверное я смогу "ткнуть пальцем" на то место, где об этом явно написано. :)

Share this post


Link to post
Share on other sites
Ну если вы соблаговолите указать полное имя кристалла MSP430, то наверное я смогу "ткнуть пальцем" на то место, где об этом явно написано. :)

Большое спасибо, но я уже :) не надо тыкать

Share this post


Link to post
Share on other sites

А вот еще вопрос от чайника. Подскажите, если кто наткнется на тему, какую-нибудь отладку, чтобы работала с IARом в режиме эмулятора, и позволяла бы программировать прямо на плате, т.к.. контроллер уже напаян. Вот какие запросы :)

Share this post


Link to post
Share on other sites

Вам нужен готовый или схема для самостоятельного изготовления? Готовые - пожалуйста, в большом ассортименте в Терраэлектронике. А если хотите сами делать, то схемы оригинальных MSP-FET430PIF (LPT) и MSP-FET430UIF (USB) имеются в апликухе от производителя - slau138. Прошивку для MSP-FET430UIF где-то тут в форуме выкладывали.

Share this post


Link to post
Share on other sites
Вам нужен готовый или схема для самостоятельного изготовления? Готовые - пожалуйста, в большом ассортименте в Терраэлектронике. А если хотите сами делать, то схемы оригинальных MSP-FET430PIF (LPT) и MSP-FET430UIF (USB) имеются в апликухе от производителя - slau138. Прошивку для MSP-FET430UIF где-то тут в форуме выкладывали.

Большое спасибо :)

Share this post


Link to post
Share on other sites

Здравствуйте. Такой вопрос - запускаю таймер( в TACCRO записываю 50000), в обработчике прерываний посылаю на COM число 0хАА, передаю и принимаю на скорости 9600, число исправно приходит, но на каждом 30-м и 31-м шаге появлются какие-то лишние биты, получается 0хЕА и 0хСА. Есть варианты, почему это может происходить? Посылаю с вывода P3.4, при начальной конфигурации записываю P3SEL=Bit4, P3OUT=0(на всякий случай). На эмуляторе видно, что таймер работает и в буфере передачи только 0хаа. (Но достаточно долго наблюдать работу не получается, так как происходит переполнение стека - почему, кстати, оно происходит?) Я не считаю модуляцию, U0MCTL оставляю нулевым - может, в этом дело? Но нужно ли считать модуляцию при такой скорости? Частота тактирования 8МГц.

Заранее спасибо, если кто ответит.

Edited by Daria

Share this post


Link to post
Share on other sites

Что-то полная путаница. При чем тут модуль TimerA, если для передачи вы пользуетесь модулем USART0? Вы бы хоть кусок кода привели. Как именно инициализируете модули, а особенно систему тактирования? Как выглядят обработчики прерываний? Что за кристалл вообще вы используете? В сообщениях выше вы "махнули рукой", а теперь снова не уточнив ничего мечетесь с вопросами.

Насчет делителя и модуляции. 8000000/9600=833,3(3). Значение для делителя 0x0341, если представлять его как целое число в HEX формате. Если не использовать модулятор, то получается реальный битрейт 8000000/833=9603,8 и ошибка составляет меньше 0,05%. Для UART такая ошибка сущие мелочи. Так что думаю проблема у вас не там, где в программе приемо-передача, а как это обычно бывает у новичков, там где инициализация источников тактирования.

Переполнения стека бывают чаще всего при использовании функций активно его использующих (типа printf/sprintf) и/или при неконтролируемом использовании вложенных прерываний.

Share this post


Link to post
Share on other sites
Здравствуйте. Такой вопрос - запускаю таймер( в TACCRO записываю 50000), в обработчике прерываний посылаю на COM число 0хАА, передаю и принимаю на скорости 9600, число исправно приходит, но на каждом 30-м и 31-м шаге появлются какие-то лишние биты, получается 0хЕА и 0хСА. Есть варианты, почему это может происходить? Посылаю с вывода P3.4, при начальной конфигурации записываю P3SEL=Bit4, P3OUT=0(на всякий случай). На эмуляторе видно, что таймер работает и в буфере передачи только 0хаа. (Но достаточно долго наблюдать работу не получается, так как происходит переполнение стека - почему, кстати, оно происходит?) Я не считаю модуляцию, U0MCTL оставляю нулевым - может, в этом дело? Но нужно ли считать модуляцию при такой скорости? Частота тактирования 8МГц.

Заранее спасибо, если кто ответит.

Согласен с rezident. Ошибка UART-a скорее всего никак не связана с таймером. Прпробуйте отладить передатчик отдельно от таймера. От себя хочу посоветовать посмотреть, как происходит контроль бита четности на приемнике и передатчике, т.е. устанавливается ли он (и каким образом) передатчиком и контролируется ли он (и каким образом) приемником...

 

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

Share this post


Link to post
Share on other sites

Спасибо, следуя вашему совету, начинаю разбираться с начала.

Вот текст простенькой программки работы таймера, с которой все начиналось :)

#include <msp430x14x.h>

void main(void)

{

WDTCTL = WDTPW + WDTHOLD;

 

P1DIR = BIT5;

P1OUT = BIT5;

 

BCSCTL1 |= XTS;

BCSCTL2 |= SELM_3;

 

TACCTL0 = CCIE;

TACTL = TASSEL_1 + MC_1 + ID_3;

TACCR0 = 5000;

 

_BIS_SR(GIE);

}

 

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

P1OUT ^= 0x01;

 

}

Источник тактирования - резонатор 8МГц, выбираю режим "вверх"(MC_1), по идее таймер считает вверх до значения в TACCR0 и счетчик сбрасывается. в обработчике прерывания инвертирую выход P1.5.

В чем проблема - когда в TACCR0 записываю значения более 1000 тактов, картинка на осциллографе соответствует ожиданиям. Если же CCR0 меньше 500 тактов, то длительность задаваемых импульсов не соответствует длительности импульсов на экране осциллографа. С чем это может быть связано? Может, в этом режиме существует минимальное значение, которое можно записывать в TACCR0?

Вот пока такой вопрос :)

Edited by Daria

Share this post


Link to post
Share on other sites

А у вас высокочастотный кварц 8Мгц куда подключен? К генератору XT1/LFXT что ли? Что за кристал-то в конце-концов у вас??? Это военная тайна или вы внучка-последовательница Зои Космодемьянской? И не нужно какой-то абстрактный пример приводить, приведите текст реальной программы, которую вы используете! Пускай он выглядит как угодно некузяво. В примере же вами приведенном как минимум имеется один недочет, связанный с алгоритмом инициализации системы тактирования. Но раз вы не желаете диалога, то читайте Chapter 4..2 Basic Clock Module Operation из MSP430x1xx Family User's Guide самостоятельно и с тщательным вниманием.

Share this post


Link to post
Share on other sites
А у вас высокочастотный кварц 8Мгц куда подключен? К генератору XT1/LFXT что ли? Что за кристал-то в конце-концов у вас??? Это военная тайна или вы внучка-последовательница Зои Космодемьянской? И не нужно какой-то абстрактный пример приводить, приведите текст реальной программы, которую вы используете! Пускай он выглядит как угодно некузяво. В примере же вами приведенном как минимум имеется один недочет, связанный с алгоритмом инициализации системы тактирования. Но раз вы не желаете диалога, то читайте Chapter 4..2 Basic Clock Module Operation из MSP430x1xx Family User's Guide самостоятельно и с тщательным вниманием.

Желаю я диалога, очень желаю! :) Никакая не тайна, просто по рассеянности все время забываю указать кристалл - MSP430F149, кварц подключен к XT1/LFXT, пример вполне конкретный - начиная разбираться, я закомментила все, кроме вот этого текста, который Вам привела. и вот такая ошибка, которую не могу понять. Тактовая частота 8МГц, делю на 8 (ID_3), получается, что один такт - 1 мкс, задаю длительности, и получаю, что при уменьшении с 500 на 400 длительность импульса на осциллографе изменяется совсем чуть-чуть, а при дальнейшем уменьшении - вообще не изменяется. А вот если задать 1000 и больше - то все нормально.

Вы же сами говорили не кидаться кучей вопросов, а разбираться с нуля. ну вот. Не ругайтесь на меня, пожалуйста :05: :)USART действительно вполне нормально инициилизирован, я проверяла без таймера, так что наверное все дело в этом. А руководство я читаю, вникаю, пыхчу, но вот никак пока не получается, может - не дано, а, может просто опыта нет - что такое контроллер - узнала только зимой :biggrin: бывают такие темные личности. :)

А, если Вам, действительно, не лень разбираться в моей проге - то обязательно приведу весь текст. со всей некузявостью, но он и сам пока небольшой :)

Edited by Daria

Share this post


Link to post
Share on other sites

При использовании высокочастотного кварца нужна определенная последовательность действий в процедуре инициализации модуля тактирования. По старту тактирование MCLK и SMCLK от DCO происходит. Нужно дождаться стабилизации колебаний кварцевого генератора и только потом переключить тактирование на него.

BCSCTL2=SELM_0|DIVM_0|DIVS_0;
BCSCTL1=DIVA_3|XTS|XT2OFF;
do
{ IFG1&=~OFIFG;
} while((IFG1&OFIFG)!=0);
BCSCTL2|=SELM_3;

После такой процедуры ACLK=XT1/8=1МГц, SMCLK=DCO≈1МГц, MCLK=XT1=8МГц. Кстати, ошибка из-за которой ваш UART принимает неправильно может быть локализована именно здесь.

Далее. Как именно вы меняете период TimerA при ваших наблюдениях? Изменяете значение TACCR0 в программе, компилируете, загружаете в кристалл и смотрите? Или это опять где-то в недрах вашей таинственной программы делается? Если первый вариант, но никаких чудес быть не должно.

TACTL=TASSEL_1|ID_0|TACLR; //TACLK=ACLK/1=1МГц
TACCTL0=CCIE;
TACCR0=4999; //период перезагрузки (4999+1)/1МГц=5мс
TACTL|=MC_1; //только сейчас можно запускать таймер

Сначала инициализируем все нужные регистры и только потом запускаем таймер. Период перезагрузки таймера и соответственно вызова прерываний по вектору TIMERA0_VECTOR будет 5мс, а период переключения выхода P1.0 соотвественно вдвое больше. Это если использовать указанный в вашем примере способ "ногодрыгания".

#pragma vector=TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TimerA_ISR (void)
{ P1OUT^=0x01;
}

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this