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

 
 
> F1611-ADC12: JTAG: при пошаговом проходе в ADC12MEM0 cчитываются правильные значения (как на железе),если же не останавливать на ADC12CTL0 |= ADC12SC;, то значения ~ в 2 раза больше.
*Leo*
сообщение Dec 21 2010, 19:49
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 21-12-10
Пользователь №: 61 782



Что не так? Помогите плз малоопытному))

из 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;
}

Сообщение отредактировал *Leo* - Dec 21 2010, 19:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Dec 21 2010, 20:26
Сообщение #2


Гуру
******

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



Типовая ошибка. Определитесь работаете ли вы с АЦП по прерываниям, либо используете опрос флагов. Если второе, то не следует разрешать прерывания. Если первое, то будьте любезны корректно описать обработчик прерываний. Вот нафига зачем вы разрешили прерывания от АЦП по переполнению (бит ADC12OVIE) и по таймауту времени преобразования (бит ADC12TOVIE)? Вы же не используете режимы автоматического (конвейерного) преобразования, запуская ЦАП "вручную". Следовательно работа АЦП вам полностью подконтрольна и вы всегда успеете считать результат оцифровки до того, как будет запущен цикл нового преобразования, а указанные события прерываний возникать не должны. Кроме того, прерывания-то разрешены, а обработчика соответствующих состояний нету. Почитайте внимательно раздел 17.2.10 ADC12 Interrupts в User's Manual. У ADC12 есть 18 источников прерываний, которые идентифицируются в регистре ADC12IV, реализующем приоритеты и дополнительные векторы прерываний вдобавок к расшаренному вектору ADC12_VECTOR. Кстати, у вас даже символьное имя вектора неправильно указано.
Go to the top of the page
 
+Quote Post



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

 


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


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