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

 
 
> MSP430F2121 танцы продолжаются, SMCLK = 2 МГц и выше
Grigorij
сообщение Jan 24 2008, 11:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Возникла очередная проблема.

В MSP430F2121 вывод P1.4 можно настроить на вывод частоты SMCLK. Если я правильно понимаю то после:

P1DIR = 0x10;
P1SEL = 0x10;

на P1.4 получим прямоугольные импульсы с частотой, равной SMCLK.

Вопрос в том, как настроить SMCLK, чтобы частота импульсов, снимаема с P1.4 была порядка 2 МГц?
А еще лучше поясните кто-нибудь как работать с DCOCTL, BCSCTL1, BCSCTL2, BCSCTL3, а по мозг упорно отказывается понимать User's Guide.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
msalov
сообщение Jan 24 2008, 12:30
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Grigorij @ Jan 24 2008, 13:55) *
Вопрос в том, как настроить SMCLK, чтобы частота импульсов, снимаема с P1.4 была порядка 2 МГц?

Очевидно надо что бы частота SMCLK была 2 МГц wink.gif Для этого можно поставить внешний кварц на 2,4,8,16 МГц, а потом делить частоту на 1,2,4,8 соответственно. Либо настроить частоту DCO на 2,4,8,16 МГц (откалибровавшись по низкочастотному кварцу), подлеить на 1,2,4,8 соответствено, и установить его как источник сигнала для SMCLK. Для частот 8 и 16 МГц, в инфо сегменте А распологаются значения RSELx и DCOx, которыйе надо просто записать куда надо например
Код
; Set DCO to 16 MHz:
MOV.B &CALBC1_16MHZ,&BCSCTL1; Set range
MOV.B &CALDCO_16MHZ,&DCOCTL; Set DCO step + modulation

Еще один вариант - настроить таймер на прерывание с частотой 4 МГц и в процедуре обработки прерывания - переключать состояние P1.4 програмно
Цитата(Grigorij @ Jan 24 2008, 13:55) *
А еще лучше поясните кто-нибудь как работать с DCOCTL, BCSCTL1, BCSCTL2, BCSCTL3, а по мозг упорно отказывается понимать User's Guide.
Работать с решистрами так же как и слюбыми другими решистрами устройств wink.gif А что именно не понятно?

Сообщение отредактировал gotty - Jan 24 2008, 12:40
Go to the top of the page
 
+Quote Post
Grigorij
сообщение Jan 24 2008, 12:42
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Цитата(gotty @ Jan 24 2008, 15:30) *
Очевидно надо что бы частота SMCLK была 2 МГц wink.gif Для этого можно поставить внешний кварц на 2,4,8,16 МГц, а потом делить частоту на 1,2,4,8 соответственно.


Этот вариант не походит. В плате уже стоит часовой кварц на 32 кГц и менять его нельзя.

Цитата(gotty @ Jan 24 2008, 15:30) *
Либо настроить частоту DCO на 2 МГц (откалибровавшись по низкочастотному кварцу), и установить его как источник сигнала для SMCLK


Это был бы идеальный вариант. Если я правильно понимаю, то DCO, в качестве источника сигнала для SMCLK выбирается в регистре BCSCTL2. А вот как правильно настроить DCO = 2 МГц я не знаю. Чутье подсказывает, что как-то попользовать регистр DCOCTL. И как я вычитал уже частота его работы будет D*(N+1)*32 кГЦ, но как задать D и N?
Go to the top of the page
 
+Quote Post
msalov
сообщение Jan 24 2008, 12:46
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Grigorij @ Jan 24 2008, 14:42) *
Этот вариант не походит. В плате уже стоит часовой кварц на 32 кГц и менять его нельзя.
Это был бы идеальный вариант. Если я правильно понимаю, то DCO, в качестве источника сигнала для SMCLK выбирается в регистре BCSCTL2. А вот как правильно настроить DCO = 2 МГц я не знаю.

Проще всего так
Код
; Set DCO to 16 MHz:
MOV.B &CALBC1_16MHZ,&BCSCTL1; Set range
MOV.B &CALDCO_16MHZ,&DCOCTL; Set DCO step + modulation
BIC.B #SELS,&BCSCTL2;  DCO источник для SMCLK по умолчанию
BIS.B #DIVS0|DIV1,&BCSCTL2; делить SMCLK на 8

Но следует помнить что частота DCO не так стабильна, как частота кварца - поэтому лучше отклалибровать частоту DCO по часовому кварцу
Можно ещё почитать Controlling the DCO Frequency of the MSP430x11x

Сообщение отредактировал gotty - Jan 24 2008, 12:53
Go to the top of the page
 
+Quote Post
Grigorij
сообщение Jan 24 2008, 13:28
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Цитата(gotty @ Jan 24 2008, 15:46) *
Проще всего так
Код
; Set DCO to 16 MHz:
MOV.B &CALBC1_16MHZ,&BCSCTL1; Set range
MOV.B &CALDCO_16MHZ,&DCOCTL; Set DCO step + modulation
BIC.B #SELS,&BCSCTL2;  DCO источник для SMCLK по умолчанию
BIS.B #DIVS0|DIV1,&BCSCTL2; делить SMCLK на 8

Но следует помнить что частота DCO не так стабильна, как частота кварца - поэтому лучше отклалибровать частоту DCO по часовому кварцу
Можно ещё почитать Controlling the DCO Frequency of the MSP430x11x


Про нестабильность DCO по сравнению с кварцем - это я помню и slaa074 уже открыта и читается smile.gif.

А что из себя представляет CALBC1_16MHZ? Пишу в IAR на СИ. Если посмотреть заголовочный файл msp430x21x1.h, то там CALDCO_16MHZ_ и CALDCO_16MHZ определено как:

Код
/************************************************************
* Calibration Data in Info Mem
************************************************************/

#ifndef __DisableCalData

#define CALDCO_16MHZ_         (0x10F8)  /* DCOCTL  Calibration Data for 16MHz */
READ_ONLY DEFC( CALDCO_16MHZ     , CALDCO_16MHZ_)
#define CALBC1_16MHZ_         (0x10F9)  /* BCSCTL1 Calibration Data for 16MHz */
READ_ONLY DEFC( CALBC1_16MHZ     , CALBC1_16MHZ_)


Я так понимаю 0x10F8 и 0x10F9 - это адрес ячейки Inf Memory, где находятся требуемые настройки. Т.е. на СИ это будет примерно так:

Код
BCSCTL1    = *((int *)CALBC1_16MHZ_);      // ????????
DCOCTL    = *((int *)CALDCO_16MHZ_);     // ????????

    
BCSCTL2    = SELS + DIVS_2; //здесь вопросов нет


Похоже вредно работать без обеда smile.gif . Мозги уже вообще не соображают.
Go to the top of the page
 
+Quote Post
msalov
сообщение Jan 24 2008, 13:47
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Grigorij @ Jan 24 2008, 15:28) *
Т.е. на СИ это будет примерно так:

Код
BCSCTL1    = *((int *)CALBC1_16MHZ_);      // ????????
DCOCTL    = *((int *)CALDCO_16MHZ_);     // ????????

    
BCSCTL2    = SELS + DIVS_2; //здесь вопросов нет


Похоже вредно работать без обеда smile.gif . Мозги уже вообще не соображают.

Можно и так, но проще наверное без лишних кастов и указателей:
Код
BCSCTL1    = CALBC1_16MHZ;
DCOCTL    = CALDCO_16MHZ;


Сообщение отредактировал gotty - Jan 24 2008, 13:48
Go to the top of the page
 
+Quote Post
Grigorij
сообщение Jan 24 2008, 14:51
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Цитата(gotty @ Jan 24 2008, 16:47) *
Можно и так, но проще наверное без лишних кастов и указателей:
Код
BCSCTL1    = CALBC1_16MHZ;
DCOCTL    = CALDCO_16MHZ;


Однако при таком присвоении IAR выдает предупреждение о том, что при присвоении CALBC1_16MHZ и CALDCO_16MHZ произойдет потеря данных, что в принципе понятно, т.к. если смотреть в даташите, то регистры BCSCTL1 и DCOCTL - 8 битный, а числа CALBC1_16MHZ и CALDCO_16MHZ из msp430x21x1.h - 16-битные. Т.е. вопрос все еще остается открытым. Буду дальше думать.
Go to the top of the page
 
+Quote Post
msalov
сообщение Jan 24 2008, 15:03
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Grigorij @ Jan 24 2008, 16:51) *
Однако при таком присвоении IAR выдает предупреждение о том, что при присвоении CALBC1_16MHZ и CALDCO_16MHZ произойдет потеря данных, что в принципе понятно, т.к. если смотреть в даташите, то регистры BCSCTL1 и DCOCTL - 8 битный, а числа CALBC1_16MHZ и CALDCO_16MHZ из msp430x21x1.h - 16-битные. Т.е. вопрос все еще остается открытым. Буду дальше думать.

Изходя из
Код
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define CALDCO_16MHZ_         (0x10F8)  /* DCOCTL  Calibration Data for 16MHz */
READ_ONLY DEFC( CALDCO_16MHZ     , CALDCO_16MHZ_)
#define CALBC1_16MHZ_         (0x10F9)  /* BCSCTL1 Calibration Data for 16MHz */
READ_ONLY DEFC( CALBC1_16MHZ     , CALBC1_16MHZ_)

В моём понимании преобразуется в
Код
__no_init volatile unsigned char CALDCO_16MHZ @ 0x10F8;
__no_init volatile unsigned char CALBC1_16MHZ @ 0x10F9;

что не может быть длинной в слово так как char, да и по нечётным адресам слова начинаться не могут, да ещё подряд идущим smile.gif

Обратите внимание что в моём сообщении CALBC1_16MHZ и CALBC1_16MHZ без подчёркивания в конце

Сообщение отредактировал gotty - Jan 24 2008, 15:04
Go to the top of the page
 
+Quote Post
Grigorij
сообщение Jan 24 2008, 15:12
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Цитата(gotty @ Jan 24 2008, 18:03) *
Изходя из
Код
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define CALDCO_16MHZ_         (0x10F8)  /* DCOCTL  Calibration Data for 16MHz */
READ_ONLY DEFC( CALDCO_16MHZ     , CALDCO_16MHZ_)
#define CALBC1_16MHZ_         (0x10F9)  /* BCSCTL1 Calibration Data for 16MHz */
READ_ONLY DEFC( CALBC1_16MHZ     , CALBC1_16MHZ_)

В моём понимании преобразуется в
Код
__no_init volatile unsigned char CALDCO_16MHZ @ 0x10F8;
__no_init volatile unsigned char CALBC1_16MHZ @ 0x10F9;

что не может быть длинной в слово так как char, да и по нечётным адресам слова начинаться не могут, да ещё подряд идущим smile.gif

Обратите внимание что в моём сообщении CALBC1_16MHZ и CALBC1_16MHZ без подчёркивания в конце


"А вот слона то я и не заметил" smile.gif.....точно на сегодня хватит. Спасибо за помощь.
Go to the top of the page
 
+Quote Post
msalov
сообщение Jan 25 2008, 06:43
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Grigorij @ Jan 24 2008, 15:28) *
Код
BCSCTL2    = SELS + DIVS_2; //здесь вопросов нет

Прошу прощения не заметил. Бит SELS надо очистить (SELS=1 - выбор XT2/XT1/VLO как источник SMCLK), а DIVS_2 указывает деление на 4, а не на 8, если только вы не передумали и решили сделать частоту 4 МГц. И ещё, лучше для установки/сброса битов использовать логические операции, а не операции присваивания.
то есть надо так
Код
BCSCTL2 &= ~SELS;
BCSCTL2 |= DIVS_3;
Go to the top of the page
 
+Quote Post
Grigorij
сообщение Jan 25 2008, 12:16
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Цитата(gotty @ Jan 25 2008, 09:43) *
Прошу прощения не заметил. Бит SELS надо очистить (SELS=1 - выбор XT2/XT1/VLO как источник SMCLK), а DIVS_2 указывает деление на 4, а не на 8, если только вы не передумали и решили сделать частоту 4 МГц.


Да я решил сделать частоту 4 МГц, поэтому и написал DIVS_2.

Цитата(gotty @ Jan 25 2008, 09:43) *
И ещё, лучше для установки/сброса битов использовать логические операции, а не операции присваивания.
то есть надо так
Код
BCSCTL2 &= ~SELS;
BCSCTL2 |= DIVS_3;


Я обычно так и пишу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 13:31
Рейтинг@Mail.ru


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