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

 
 
> MSP430 - вопросы от чайника, генератор опорного напряжения
Daria
сообщение May 18 2008, 20:05
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Здравствуйте.
Подскажите пожалуйста, генератор тактовой частоты запускается сразу после подачи питания или его надо сначала сконфигурировать? не могу найти регистр, который бы за это отвечал. Тот же вопрос про генератор опорного напряжения.
Подскажите еще, пожалуйста, как в CCE 2.0 войти в режим симулятора, никак не могу понять. Вроде в свойствах проекта на режим отладки устанавливаю - "simulator", но при запуске debuge ничего не происходит.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Jun 6 2008, 20:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 6 2008, 21:01
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Большое спасибо! Сделаю в точности так, как вы говорите. А изменяю длительность именно так - меняю TACCR0, компилируюсь, загружаю и смотрю smile.gif И никакой таинственной программы пока по сути нет - набрасываю просто куски, учусь smile.gif
Спасибо еще раз

Сообщение отредактировал Daria - Jun 6 2008, 21:03
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 8 2008, 17:22
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Здравствуйте, снова я smile.gif Опять проблемы
привожу весь свой маленький текст, чтобы не ругались потом. будто что-то скрываюsmile.gif
#include <msp430x14x.h>

void main(void)
{
int i, Vs, Vr;

WDTCTL = WDTPW + WDTHOLD;

P1SEL |= BIT6;
P3SEL = BIT4 + BIT5;
P6SEL = 0xF8;
P1DIR |= BIT5;
P1OUT = BIT5;

CCTL0 = OUTMOD_4 ;
TACCR0 = 65000;
BCSCTL1 = XTS + XT2OFF;
BCSCTL2 = SELM0;

do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i > 0; i--);
}
while ((IFG1 & OFIFG));

BCSCTL2 = SELM_3;

TACTL = TASSEL_1 + ID_3;

ADC12CTL0 = SHT0_12 + ADC12ON + REFON;
ADC12CTL1 = CSTARTADD0 + CSTARTADD1 + ADC12SSEL_1 + CONSEQ_1;
ADC12MCTL3 = INCH_3;

ADC12CTL0 |= ENC;


_BIS_SR(U0CTL & SWRST);

ME1 |= UTXE0 + URXE0;
U0CTL |= CHAR;
U0TCTL = SSEL0;
U0BR0 = 0xA0;
U0BR1 = 0x01;
U0MCTL = 0x00;
U0CTL &= ~SWRST;
IE1 |= URXIE0;
_BIS_SR(GIE);

i = 1;

TACTL |= MC_1 ;

for(;;)
{

if (TACCTL0 & CCIFG)
{
if (P1OUT & BIT5)
{
ADC12CTL0 |= ADC12SC + ENC;
ADC12CTL0 &= ENC;
if (ADC12IFG)
{
Vr = ADC12MEM3;

TXBUF0 = ((Vr-Vs)/2 & 0xFF);



send_int(conv[j]);
}


TACCTL0 &= !CCIFG;
i++;
if (i >= 918 )
{
TACCR0 = 400;
P1OUT = 0;
i = 0;
}
if (i == 1)
{
P1OUT = BIT5;
ADC12CTL0 |= ADC12SC + ENC;
ADC12CTL0 &= ENC;
Vs = ADC12MEM3;


TACCR0 = 65000;

}
}
}
}
Чего, как я думаю, здесь делается - включаю таймер в режим переключения, в TACCR0 - 65000 тактов, вывод держу в единице, пока не поризойдет 918 переключений, затем переписываю счетчик на 400, переключаю вывод в ноль, после следующего переключения, снова в единицу, и снова переписываю счетчик в 65000 тактов. Т.е. хочу минуту держать вывод в единице, затем 400 мкс в нуле, и так все время работы. Вовремя коротких импульсов, считываю уровень с вывода P6.3, записываю как Vs, во время длинных - как Vr, потом считаю (Vr-Vs)/2 и посылаю на COM. То, что буфере один байт, а число получается двухбайтовым, я знаю smile.gif , посылаю пока младший байт, не в этом суть.
В ЧЕМ ПРОБЛЕМА - напряжения на P6.3 только положительные, нужно при преобразовании АЦП получать положительные и отрицательные числа. Формула преобразования АЦП по даташиту - 4095*(Vin - V-)/(V+- V-) Питание - 3,3 В. Опорное напряжение Vref+ = 1.5В. Как мне правильно сконфигурировать АЦП? CONSEQ_1 означает, что V- = 0, V+ = 3.3. Более подходящего варианта не вижу. Но как указать, что ноль переносится в 1,5? Или
каждый раз писать Vr - 4095*1.5/3.3 - извините за глупые вопросы, но вот непонятно 05.gif
И вообще, если кому-то вдруг не лень будет почитать текст - есть ли здесь ошибки при конфигурировании АЦП или USART?
Заранее огромное спасибо
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 9 2008, 21:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Jun 8 2008, 23:22) *
Здравствуйте, снова я smile.gif Опять проблемы
привожу весь свой маленький текст, чтобы не ругались потом. будто что-то скрываюsmile.gif
Текст программы пока комментировать не буду, лучше после уточнений приведу для сравнения свой вариант. Сделаю лишь несколько замечаний.
1. Не следует надеятся на значения регистров периферии, устанавливаемых состояниями POR/PUC. При инициализации их прописывайте явно значения, а не накладывайте маски.
2. Сначала обычно инициализируются функции всех пинов и система тактирования. Потом инициализируются периферийные модули, разрешается работа этих модулей, при необходимости прерывания. Затем устанавливается глобальный флаг прерываний и запускаются таймеры. Я обычно делаю в такой последовательности.
3. При склеивании отдельных битов в байт/слово, вместо операции + (сложение) следует использовать | (побитовое ИЛИ). Это позволяет избежать недоразумений при случайном дублировании одинаковых бит.
Цитата(Daria @ Jun 8 2008, 23:22) *
Чего, как я думаю, здесь делается - включаю таймер в режим переключения, в TACCR0 - 65000 тактов, вывод держу в единице, пока не поризойдет 918 переключений, затем переписываю счетчик на 400, переключаю вывод в ноль, после следующего переключения, снова в единицу, и снова переписываю счетчик в 65000 тактов. Т.е. хочу минуту держать вывод в единице, затем 400 мкс в нуле, и так все время работы.
Логичнее было бы использовать таймер в режиме переполнения Continious. А интервалы отсчитывать по прерыванию от регистра совпадения CCRx. При тактировании таймера частотой 1МГц для отсчета 60 секунд нужно 915 раз к текущему значению прибавлять максимальное число 65536 или просто 915 раз пропускать это суммирование. На 916-й раз добавить к текущему значению CCRx число 34560 и следующее прерывание от CCRx будет соответствовать 60с интервалу. Тут же в прерывании добавляем к текущему значению CCRx число 400 и опять-таки следующее прерывание будет соответствовать интервалу 400мкс. Затем по-новой игнорируем 915 раз в прерывании суммирование и т.д. А если еще задействовать аппаратное управление выходом TAx, то получиться совсем кошерно и точно. Ваш сигнал что-то реально переключает или используется в качестве индикации состояния? Допустимо ли его "переключательную" функцию переместить на пин, который может выполнять выходную функцию TAx? Например, на P1.1 или P1.2?
Цитата(Daria @ Jun 8 2008, 23:22) *
Вовремя коротких импульсов, считываю уровень с вывода P6.3, записываю как Vs, во время длинных - как Vr, потом считаю (Vr-Vs)/2 и посылаю на COM. То, что буфере один байт, а число получается двухбайтовым, я знаю smile.gif , посылаю пока младший байт, не в этом суть.
Опять-таки лучше было бы посылать не просто код, а преобразовывать его в символьную строку. Тогда результат можно наблюдать даже в виндусовом гипертерминале. А если напряжение вычислять не в абстрактных попугаях, а, например, в миллиВольтах, то для вычислений не понадобится даже плавающая арифметика и результат измерения будет достаточно точным.
Цитата(Daria @ Jun 8 2008, 23:22) *
В ЧЕМ ПРОБЛЕМА - напряжения на P6.3 только положительные, нужно при преобразовании АЦП получать положительные и отрицательные числа. Формула преобразования АЦП по даташиту - 4095*(Vin - V-)/(V+- V-) Питание - 3,3 В. Опорное напряжение Vref+ = 1.5В. Как мне правильно сконфигурировать АЦП? CONSEQ_1 означает, что V- = 0, V+ = 3.3. Более подходящего варианта не вижу. Но как указать, что ноль переносится в 1,5? Или
каждый раз писать Vr - 4095*1.5/3.3 - извините за глупые вопросы, но вот непонятно 05.gif
А вот здесь мне непонятно. Что за двуполярное напряжение? На вход АЦП можно подавать сигнал, который попадает в диапазон от Vref- до Vref+. Если Vref+ равно 1,5В, то входной сигнал не может быть выше 1,5В. Если же в качестве Vref используется питание, то не выше 3,3В. Вы можете сместить входной сигнал на половину питания или относительно любого другого напряжения, но в любом случае промасштабированный размах входного сигнала должен быть не ниже потенциала AGND и не выше потенциала AVCC. Это принципиальное условие для того, чтобы не вывести кристалл из строя.
А для учета смещения нужно ввести коэффициент в конечную формулу преобразования.
Vin=(VREFmax-VREFmin)/(ADCmax-ADCmin)*x+VREFmin-Vbias, где VREFmax - напряжение VREF+/VeREF+, VREFmin - напряжение VREF-/VeREF-, ADCmax - 4095, ADCmin - 0, x - код полученный от АЦП, Vbias - напряжение смещения относительно которого считается нуль. Если у вас Vbias = 1,5В, VREF+ = 3,3В, а VREF- = 0В, то расчетное напряжения Vin в диапазоне от 0В до 1,5В будет иметь отрицательные значения, а от 1,5В до 3,3В положительные значения. Хотя входное измеряемое напряжение будет все равно положительным относительно AGND.
Цитата(Daria @ Jun 8 2008, 23:22) *
И вообще, если кому-то вдруг не лень будет почитать текст - есть ли здесь ошибки при конфигурировании АЦП или USART?
После уточнения параметров задания с вашей стороны приведу свой вариант программы.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Daria   MSP430 - вопросы от чайника   May 18 2008, 20:05
- - rezident   Цитата(Daria @ May 19 2008, 02:05) Подска...   May 18 2008, 20:19
|- - Daria   Большое спасибо, вопрос был именно про LFXT А в ...   May 19 2008, 17:28
|- - rezident   Цитата(Daria @ May 19 2008, 23:28) А в ру...   May 19 2008, 18:13
|- - Daria   Цитата(rezident @ May 19 2008, 21:13) Ну ...   May 22 2008, 20:12
|- - Daria   А вот еще вопрос от чайника. Подскажите, если кто ...   May 25 2008, 19:27
- - rezident   Вам нужен готовый или схема для самостоятельного и...   May 25 2008, 19:58
|- - Daria   Цитата(rezident @ May 25 2008, 22:58) Вам...   May 26 2008, 08:42
|- - Daria   Здравствуйте. Такой вопрос - запускаю таймер( в TA...   Jun 3 2008, 19:24
- - rezident   Что-то полная путаница. При чем тут модуль TimerA,...   Jun 3 2008, 22:07
- - A R T   Цитата(Daria @ Jun 3 2008, 23:24) Здравст...   Jun 4 2008, 04:38
|- - Daria   Спасибо, следуя вашему совету, начинаю разбираться...   Jun 5 2008, 19:51
- - rezident   А у вас высокочастотный кварц 8Мгц куда подключен?...   Jun 6 2008, 01:08
|- - Daria   Цитата(rezident @ Jun 6 2008, 04:08) А у ...   Jun 6 2008, 20:02
|- - Daria   на строчку send_int не обращайте внимания, она ост...   Jun 8 2008, 18:50
||- - Daria   Нет, тут опять ошибки Vs вычисляется после P1OUT...   Jun 9 2008, 19:52
- - АДИКМ   Посылать по 6 бит никто не запрещает конечно, но в...   Jun 9 2008, 20:24
|- - Daria   Цитата(АДИКМ @ Jun 10 2008, 00:24) Посыла...   Jun 9 2008, 20:47
|- - АДИКМ   Цитата(Daria @ Jun 9 2008, 23:47) Проблем...   Jun 9 2008, 21:10
|- - Daria   Цитата(АДИКМ @ Jun 10 2008, 01:10) Расска...   Jun 9 2008, 22:00
- - АДИКМ   Как зовут магнитный датчик?   Jun 10 2008, 07:32
- - Kurt   Мне нравится с каким упорством девушка двигается к...   Jun 10 2008, 11:36
|- - Daria   Цитата(Kurt @ Jun 10 2008, 15:36) Мне нра...   Jun 10 2008, 20:19
|- - Kurt   Цитата(Daria @ Jun 11 2008, 02:19) С уп...   Jun 11 2008, 03:18
|- - Daria   Господа! Как ни странно, оно работает! ...   Jun 12 2008, 15:35
- - rezident   Да я не забыл про обещание. Просто пока нет времен...   Jun 12 2008, 19:18
|- - Daria   Цитата(rezident @ Jun 12 2008, 23:18) 1. ...   Jun 14 2008, 21:39
|- - Dog Pawlowa   Цитата(Daria @ Jun 15 2008, 00:39) Помоги...   Jun 15 2008, 09:37
|- - rezident   Цитата(Daria @ Jun 15 2008, 03:39) Помоги...   Jun 15 2008, 20:37
|- - Daria   Большое спасибо, rezident, теперь все получилось))   Jun 16 2008, 20:24
- - rezident   Я рад вашим успехам Кстати, если вам требуется ок...   Jun 16 2008, 20:30
|- - Daria   Цитата(rezident @ Jun 17 2008, 00:30) Я р...   Jun 17 2008, 19:48
|- - rezident   Цитата(Daria @ Jun 18 2008, 01:48) Зря ир...   Jun 18 2008, 16:28
|- - Daria   Здравствуйте, и снова вопросы много, много вопрос...   Jun 22 2008, 15:37
|- - rezident   Цитата(Daria @ Jun 22 2008, 21:37) ну, ил...   Jun 22 2008, 18:38
|- - Daria   Здравствуйте снова. Rezident, спасибо за подробный...   Jun 24 2008, 19:17
- - VAI   Цитатаприбавлять число 0.5f. если число положитель...   Jun 17 2008, 03:32
- - rezident   Daria, давайте все исходники (весь проект). Вариан...   Jun 24 2008, 20:13
- - Daria   Цитата(rezident @ Jun 25 2008, 00:13) Я б...   Jun 25 2008, 18:18
- - NoName   Цитата(Daria @ Jun 25 2008, 21:18) Функци...   Jun 26 2008, 14:11
- - Daria   Цитата(NoName @ Jun 26 2008, 18:11) Имеет...   Jun 26 2008, 18:44
- - rezident   Цитата(Daria @ Jun 27 2008, 00:44) Спасиб...   Jun 26 2008, 20:30
|- - Daria   Цитата(rezident @ Jun 27 2008, 00:30) 5 а...   Jun 28 2008, 20:14
- - NoName   Цитата(Daria @ Jun 26 2008, 21:44) Спасиб...   Jun 29 2008, 11:23
|- - Daria   Цитата(NoName @ Jun 29 2008, 15:23) Daria...   Jun 29 2008, 21:10
- - Dog Pawlowa   Цитата(Daria @ Jun 26 2008, 21:44) Спасиб...   Jun 30 2008, 06:50
- - Daria   Цитата(Dog Pawlowa @ Jun 30 2008, 10:50) ...   Jun 30 2008, 16:58
- - Т.Достоевский   Цитата(Daria @ Jun 30 2008, 20:58) ...Как...   Jul 1 2008, 00:33
- - Daria   Ау, rezident! Вы там вроде обещали... забыли и...   Jul 3 2008, 18:16
- - Daria   Снова я, здравствуйте Такой вопрос - контроллер...   Jul 15 2008, 19:37
- - NoName   Цитата(Daria @ Jul 15 2008, 22:37) Снова ...   Jul 16 2008, 09:33
- - Daria   Цитата(NoName @ Jul 16 2008, 13:33) вопро...   Jul 16 2008, 18:31


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

 


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


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