Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: F1611-ADC12: JTAG: при пошаговом проходе в ADC12MEM0 cчитываются правильные значения (как на железе),если же не останавливать на ADC12CTL0 |= ADC12SC;
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
*Leo*
Что не так? Помогите плз малоопытному))

из main():

1) volatile float U[4];
//--------------------------- Конфигурация портов ---------------------------
.......
P6SEL |= 0xFF;
P6DIR = 0x00;
.......
2)
case cmCURRENT:
{
Counter=0;
SetADC_Current(); /// Настройка АЦП.
P2OUT &= ~UPRAKS1;
P2OUT |= ON1+ON2;
P2OUT &= ~ON3; ///
delay_ms(300); // (пробовал задержки и больше везде где можно, нужно только тут)
ADC12CTL0 |= ADC12SC; // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}

P2OUT |= ON3;
delay_ms(300);
ADC12CTL0 |= ADC12SC; // вкл. преобразование вручную // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}
// ADC12CTL0 &= ~ADC12SC;

P2OUT &= ~ON3;
P2OUT |= UPRAKS1; /// Вкл. акс.
delay_ms(300);
ADC12CTL0 |= ADC12SC; // вкл. преобразование вручную // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}

P2OUT |= ON3;
delay_ms(300);
ADC12CTL0 |= ADC12SC; // вкл. преобразование вручную // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}

P2OUT &= ~(UPRAKS1+ON1+ON2+ON3);
ResetADC();
..................................
}

ОБРАБОТКА ДАННЫХ С АЦП
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR (void)
{
...................

else if(Command_USB ==cmCURRENT)
{
U[Counter++] = ADC12MEM0;
}
...............
}

void SetADC_Current()
{
ADC12CTL0 = ADC12ON | SHT0_7 | ADC12OVIE | ADC12TOVIE; //SHT0_0;
ADC12CTL1 = ADC12SSEL_3 | SHP | CSTARTADD_0;
ADC12MCTL0 = INCH_3 | SREF_0 | EOS; /// канал 4 - единственный, INCH_3
ADC12IE = 0x01; //08; /// разрешить нужное прерывание
for (int i=0; i<0x3600; i++) // выполнить настройки
{}
ADC12CTL0 |= ENC;
}
rezident
Типовая ошибка. Определитесь работаете ли вы с АЦП по прерываниям, либо используете опрос флагов. Если второе, то не следует разрешать прерывания. Если первое, то будьте любезны корректно описать обработчик прерываний. Вот нафига зачем вы разрешили прерывания от АЦП по переполнению (бит ADC12OVIE) и по таймауту времени преобразования (бит ADC12TOVIE)? Вы же не используете режимы автоматического (конвейерного) преобразования, запуская ЦАП "вручную". Следовательно работа АЦП вам полностью подконтрольна и вы всегда успеете считать результат оцифровки до того, как будет запущен цикл нового преобразования, а указанные события прерываний возникать не должны. Кроме того, прерывания-то разрешены, а обработчика соответствующих состояний нету. Почитайте внимательно раздел 17.2.10 ADC12 Interrupts в User's Manual. У ADC12 есть 18 источников прерываний, которые идентифицируются в регистре ADC12IV, реализующем приоритеты и дополнительные векторы прерываний вдобавок к расшаренному вектору ADC12_VECTOR. Кстати, у вас даже символьное имя вектора неправильно указано.
*Leo*
Цитата(rezident @ Dec 22 2010, 02:26) *
Типовая ошибка. Определитесь работаете ли вы с АЦП по прерываниям, либо используете опрос флагов. Если второе, то не следует разрешать прерывания. Если первое, то будьте любезны корректно описать обработчик прерываний. Вот нафига зачем вы разрешили прерывания от АЦП по переполнению (бит ADC12OVIE) и по таймауту времени преобразования (бит ADC12TOVIE)? Вы же не используете режимы автоматического (конвейерного) преобразования, запуская ЦАП "вручную". Следовательно работа АЦП вам полностью подконтрольна и вы всегда успеете считать результат оцифровки до того, как будет запущен цикл нового преобразования, а указанные события прерываний возникать не должны. Кроме того, прерывания-то разрешены, а обработчика соответствующих состояний нету. Почитайте внимательно раздел 17.2.10 ADC12 Interrupts в User's Manual. У ADC12 есть 18 источников прерываний, которые идентифицируются в регистре ADC12IV, реализующем приоритеты и дополнительные векторы прерываний вдобавок к расшаренному вектору ADC12_VECTOR. Кстати, у вас даже символьное имя вектора неправильно указано.


Cпасиба за ответ!
Как-то всё обычно с последовательностями по прерываниям работал, а с одиночным вот помесь получилась)) Прерывания АЦП все запретил, ADC12OVIE и ADC12TOVIE убрал - остатки были от разного рода попыток.
Считываю pyfxtybz теперь в main() без всяких прерываний:
..........
delay_ms(300);
ADC12CTL0 |= ADC12SC;
while(ADC12CTL1&ADC12BUSY)
{}
U[Counter++] = ADC12MEM0;
....................
Всё успевало и успевает преобразовываться, только все равно значения в ~2 раза больше, если нет останова на ADC12CTL0 |= ADC12SC;
Сбрасывать вроде ничего дополнительно не надо.. Я что-то еще упустил?

(#define ADC_VECTOR ADC12_VECTOR - это в msp430x16x.h у меня стоит. )
rezident
Для единственного канала нет особой разницы какой из флагов (ADC12BUSY или ADC12IFGx) опрашивать, но я бы вам рекомендовал все же использовать соответствующий ADC12IFGx. Это так, между делом, замечание.
Поясните на цифрах, что значит значения в ~2 раза больше? У вас используется разница между AVCC и AVSS в качестве опоры. Какое входное напряжение или какой по уровню постоянной составляющей входной сигнал вы измеряете и какой код при этом получаете? Каково напряжение на выводе AVCC? AVSS соединен с DVSS?
*Leo*
Короче, дело оказалось не в АЦП. Хоть вначале и кривовато, но и сразу, и потом считывались
одинаково правильные значения. Причем верные и те, что пошагово, и те, что в ~2 раза больше непошаговые.
Ключевой строкой оказалась delay(...)!
P2OUT |= ON3;
delay_ms(300);
ADC12CTL0 |= ADC12SC;
while(ADC12CTL1&ADC12BUSY)
{}
U[Counter++] = ADC12MEM0;
Смысл в том, что значения АЦП снимаются для измерения токопотребления схемы,
в 4-х состояниях. Задержка нужна, для устаканивания очередного состояния.
И в том, что при останове на ADC12CTL0 |= ADC12SC проц. находится в простое, а при
обычном проходе напряжение не успевает упасть после режима с вычислительной нагрузкой
на процессор: delay() или цикл и т.п. Явно виден скачок при включении и выключении задержки.
В зависимости от тактовой частоты, разница получается в единицы миллиампер.
По напряжению на АЦП у меня при тактовой 8 МГц получались как раз
значения ~ в 2 раза отличающиеся. По току если: ~7 мА с нагруженным процом
и ~3 мА в простое. К примеру, при 4 МГц : вместо 7 мА 5 мА. И т.д.
Вот такие вот дела))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.