|
|
  |
MSP430 - вопросы от чайника, генератор опорного напряжения |
|
|
|
May 18 2008, 20:19
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ May 19 2008, 02:05)  Подскажите пожалуйста, генератор тактовой частоты запускается сразу после подачи питания или его надо сначала сконфигурировать? не могу найти регистр, который бы за это отвечал. Про какой их двух/трех генераторов вопрос? И про какой кристалл? DCO стартует сразу после подачи питания. LFXT с часовым кварцем тоже сразу, но колебания стабилизируются только через несколько сотен миллисекунд после включения. С высокочастотным кварцем LFXT сразу не стартует, для этого его нужно сконфигурировать. XT2 при подаче питания выключен. Для включения опять же нужно его сконфигурировать. FLL от часового кварца тоже по-моему запускается сразу, но вот тут на 100% не уверен, т.к. с кристаллами в которых есть FLL я не работал. Цитата(Daria @ May 19 2008, 02:05)  Тот же вопрос про генератор опорного напряжения. REF при включении питания выключен. И везде включается только отдельным битом в специальном регистре. И вообще ответы на ваши вопросы находятся в User's Guide семейства MSP430 и в datasheet конкретного кристалла. Цитата(Daria @ May 19 2008, 02:05)  Подскажите еще, пожалуйста, как в CCE 2.0 войти в режим симулятора, никак не могу понять. Вроде в свойствах проекта на режим отладки устанавливаю - "simulator", но при запуске debuge ничего не происходит. По CCE не подскажу, т.к. не использую эту среду разработки.
|
|
|
|
|
May 26 2008, 08:42
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ May 25 2008, 22:58)  Вам нужен готовый или схема для самостоятельного изготовления? Готовые - пожалуйста, в большом ассортименте в Терраэлектронике. А если хотите сами делать, то схемы оригинальных MSP-FET430PIF (LPT) и MSP-FET430UIF (USB) имеются в апликухе от производителя - slau138. Прошивку для MSP-FET430UIF где-то тут в форуме выкладывали. Большое спасибо
|
|
|
|
|
Jun 3 2008, 19:24
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Здравствуйте. Такой вопрос - запускаю таймер( в TACCRO записываю 50000), в обработчике прерываний посылаю на COM число 0хАА, передаю и принимаю на скорости 9600, число исправно приходит, но на каждом 30-м и 31-м шаге появлются какие-то лишние биты, получается 0хЕА и 0хСА. Есть варианты, почему это может происходить? Посылаю с вывода P3.4, при начальной конфигурации записываю P3SEL=Bit4, P3OUT=0(на всякий случай). На эмуляторе видно, что таймер работает и в буфере передачи только 0хаа. (Но достаточно долго наблюдать работу не получается, так как происходит переполнение стека - почему, кстати, оно происходит?) Я не считаю модуляцию, U0MCTL оставляю нулевым - может, в этом дело? Но нужно ли считать модуляцию при такой скорости? Частота тактирования 8МГц. Заранее спасибо, если кто ответит.
Сообщение отредактировал Daria - Jun 3 2008, 19:25
|
|
|
|
|
Jun 3 2008, 22:07
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Что-то полная путаница. При чем тут модуль TimerA, если для передачи вы пользуетесь модулем USART0? Вы бы хоть кусок кода привели. Как именно инициализируете модули, а особенно систему тактирования? Как выглядят обработчики прерываний? Что за кристалл вообще вы используете? В сообщениях выше вы "махнули рукой", а теперь снова не уточнив ничего мечетесь с вопросами. Насчет делителя и модуляции. 8000000/9600=833,3(3). Значение для делителя 0x0341, если представлять его как целое число в HEX формате. Если не использовать модулятор, то получается реальный битрейт 8000000/833=9603,8 и ошибка составляет меньше 0,05%. Для UART такая ошибка сущие мелочи. Так что думаю проблема у вас не там, где в программе приемо-передача, а как это обычно бывает у новичков, там где инициализация источников тактирования. Переполнения стека бывают чаще всего при использовании функций активно его использующих (типа printf/sprintf) и/или при неконтролируемом использовании вложенных прерываний.
|
|
|
|
|
Jun 4 2008, 04:38
|

Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-06-06
Из: Сарапула
Пользователь №: 18 275

|
Цитата(Daria @ Jun 3 2008, 23:24)  Здравствуйте. Такой вопрос - запускаю таймер( в TACCRO записываю 50000), в обработчике прерываний посылаю на COM число 0хАА, передаю и принимаю на скорости 9600, число исправно приходит, но на каждом 30-м и 31-м шаге появлются какие-то лишние биты, получается 0хЕА и 0хСА. Есть варианты, почему это может происходить? Посылаю с вывода P3.4, при начальной конфигурации записываю P3SEL=Bit4, P3OUT=0(на всякий случай). На эмуляторе видно, что таймер работает и в буфере передачи только 0хаа. (Но достаточно долго наблюдать работу не получается, так как происходит переполнение стека - почему, кстати, оно происходит?) Я не считаю модуляцию, U0MCTL оставляю нулевым - может, в этом дело? Но нужно ли считать модуляцию при такой скорости? Частота тактирования 8МГц. Заранее спасибо, если кто ответит. Согласен с rezident. Ошибка UART-a скорее всего никак не связана с таймером. Прпробуйте отладить передатчик отдельно от таймера. От себя хочу посоветовать посмотреть, как происходит контроль бита четности на приемнике и передатчике, т.е. устанавливается ли он (и каким образом) передатчиком и контролируется ли он (и каким образом) приемником... Механизм переполнения стэка примерно такой: когда вызывается подпрограмма (в т.ч. обработки прерывания) регистр состояния проца, адрес возврата и передаваемые подпрограмме переменные (если они есть) закидываются в стек, после окончания подпрограммы они оттуда удаляются. Если в процессе выполнения подпрограммы снова происходит вызов подпрограммы (более приоритетное прерывание или вложенная подпрограмма), происходит то же самое (регистр состояния и пр. закидывается в стек) и размер стека увеличивается. Если и дальше производить вызовы подпрограмм рано или поздно данные, загружаемы в стек, попадут в облать переменных или "кучи" и будут модифицированы случайными значениями, которые в свою очередь будут испольованы как регистр состояния или адрес возврата при выходе из подпрограммы.
--------------------
Сделал трэш - разбудил Ктулху!!!
|
|
|
|
|
Jun 5 2008, 19:51
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Спасибо, следуя вашему совету, начинаю разбираться с начала. Вот текст простенькой программки работы таймера, с которой все начиналось #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? Вот пока такой вопрос
Сообщение отредактировал Daria - Jun 5 2008, 19:55
|
|
|
|
|
Jun 6 2008, 20:02
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Jun 6 2008, 04:08)  А у вас высокочастотный кварц 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 и больше - то все нормально. Вы же сами говорили не кидаться кучей вопросов, а разбираться с нуля. ну вот. Не ругайтесь на меня, пожалуйста  :)USART действительно вполне нормально инициилизирован, я проверяла без таймера, так что наверное все дело в этом. А руководство я читаю, вникаю, пыхчу, но вот никак пока не получается, может - не дано, а, может просто опыта нет - что такое контроллер - узнала только зимой  бывают такие темные личности. А, если Вам, действительно, не лень разбираться в моей проге - то обязательно приведу весь текст. со всей некузявостью, но он и сам пока небольшой
Сообщение отредактировал Daria - Jun 6 2008, 20:06
|
|
|
|
|
Jun 6 2008, 20:45
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
При использовании высокочастотного кварца нужна определенная последовательность действий в процедуре инициализации модуля тактирования. По старту тактирование 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; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|