|
MSP430F2121 танцы продолжаются, SMCLK = 2 МГц и выше |
|
|
|
Jan 24 2008, 11:55
|
Участник

Группа: Участник
Сообщений: 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.
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Jan 24 2008, 12:30
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Grigorij @ Jan 24 2008, 13:55)  Вопрос в том, как настроить SMCLK, чтобы частота импульсов, снимаема с P1.4 была порядка 2 МГц? Очевидно надо что бы частота SMCLK была 2 МГц  Для этого можно поставить внешний кварц на 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. Работать с решистрами так же как и слюбыми другими решистрами устройств  А что именно не понятно?
Сообщение отредактировал gotty - Jan 24 2008, 12:40
|
|
|
|
|
Jan 24 2008, 12:42
|
Участник

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

|
Цитата(gotty @ Jan 24 2008, 15:30)  Очевидно надо что бы частота SMCLK была 2 МГц  Для этого можно поставить внешний кварц на 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?
|
|
|
|
|
Jan 24 2008, 12:46
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 24 2008, 13:28
|
Участник

Группа: Участник
Сообщений: 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 уже открыта и читается  . А что из себя представляет 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; //здесь вопросов нет Похоже вредно работать без обеда  . Мозги уже вообще не соображают.
|
|
|
|
|
Jan 24 2008, 13:47
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Grigorij @ Jan 24 2008, 15:28)  Т.е. на СИ это будет примерно так: Код BCSCTL1 = *((int *)CALBC1_16MHZ_); // ???????? DCOCTL = *((int *)CALDCO_16MHZ_); // ????????
BCSCTL2 = SELS + DIVS_2; //здесь вопросов нет Похоже вредно работать без обеда  . Мозги уже вообще не соображают. Можно и так, но проще наверное без лишних кастов и указателей: Код BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ;
Сообщение отредактировал gotty - Jan 24 2008, 13:48
|
|
|
|
|
Jan 24 2008, 14:51
|
Участник

Группа: Участник
Сообщений: 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-битные. Т.е. вопрос все еще остается открытым. Буду дальше думать.
|
|
|
|
|
Jan 24 2008, 15:03
|
Знающий
   
Группа: Свой
Сообщений: 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, да и по нечётным адресам слова начинаться не могут, да ещё подряд идущим  Обратите внимание что в моём сообщении CALBC1_16MHZ и CALBC1_16MHZ без подчёркивания в конце
Сообщение отредактировал gotty - Jan 24 2008, 15:04
|
|
|
|
|
Jan 24 2008, 15:12
|
Участник

Группа: Участник
Сообщений: 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, да и по нечётным адресам слова начинаться не могут, да ещё подряд идущим  Обратите внимание что в моём сообщении CALBC1_16MHZ и CALBC1_16MHZ без подчёркивания в конце "А вот слона то я и не заметил"  .....точно на сегодня хватит. Спасибо за помощь.
|
|
|
|
|
Jan 25 2008, 06:43
|
Знающий
   
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Jan 25 2008, 12:16
|
Участник

Группа: Участник
Сообщений: 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; Я обычно так и пишу.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|