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

 
 
> Тема избитая, но всеже... ацп12 некорректно работает,
aag
сообщение Jul 12 2008, 06:22
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 8-04-06
Из: Новосибирск
Пользователь №: 15 939



Потребовалось в нужный момент времени по команде произвести измерения напряжений с восьми каналов.

Измерения проходят успешно, но почему-то при первом запуске ацп происходит зацикливание и дальше постоянно происходит прерывание sad.gif Что не так?

Инициализация ацп:
Код
//---------------------------------------------------------------------------
void InitADC()
{
    ADC12CTL0 = ADC12ON | SHT0_4 | MSC; //источник опоры внешний
    ADC12CTL1 = CSTARTADD_0 | SHP | CONSEQ_1;
  
    ADC12MCTL0 = SREF_1 | INCH_0;
    ADC12MCTL1 = SREF_1 | INCH_1;
    ADC12MCTL2 = SREF_1 | INCH_2;
    ADC12MCTL3 = SREF_1 | INCH_3;
    ADC12MCTL4 = SREF_1 | INCH_4;
    ADC12MCTL5 = SREF_1 | INCH_5;
    ADC12MCTL6 = SREF_1 | INCH_6;
    ADC12MCTL7 = SREF_1 | INCH_7 | EOS;
  
    ADC12IE = 0x80; // прерывание от последнего канала
    ADC12CTL0 |= ENC;
}
//---------------------------------------------------------------------------
void ADC_Start()
{
    ADC12CTL0 |= ADC12SC;
}
//---------------------------------------------------------------------------
// Прерывание:
#pragma vector=ADC12_VECTOR
OS_INTERRUPT void ADC12ISR (void)
{
    OS::TISRW ISRW;
  
    ef_adc.SignalISR();
    //тут стоит брейкпоинт, и почему-то после первого запуска ацп
    //постоянно попадаю сюда :(
}
//---------------------------------------------------------------------------
//фрагмент кода, откуда должно запускаться ацп:

...
    ADC_Start();
    ef_adc.Wait(); //ждать окончания преобразования
    
    int SenseA = ADC12MEM0;
    int SenseB = ADC12MEM1;
....


Вопрос то состоит в том, почему ацп не останавливается после первого измерения с восьми каналов? 01.gif
Флаг ADC12SC при этом сбрасывается - проверял.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VAI
сообщение Jul 12 2008, 08:13
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



А что, если Вам в прерывании прочитать ADC12MEM-ы и скопировать из в какой-либо массивчик?
Я делаю так:
Код
#pragma vector=ADC_VECTOR
__interrupt void ADC12_isr( void )
{
unsigned short *adc_mem_ptr;
int a;

  adc_mem_ptr = (unsigned short *)&ADC12MEM0;
  for ( a = 0; a < adc_cnt; a++ )    
    x_adc_t[a] += *adc_mem_ptr++;                // сохраним результаты АЦП во временный массив
}

Я OS не использую, но инициализирую почти так-же:
Код
/* --- adc_ini() ------------------------------------------------------------------------------------------ **
*  Инициализация каналов АЦП
* -------------------------------------------------------------------------------------------------------- */
static void adc_ini( void )
{
  P6SEL = BINARY( 11111111 );
  P6DIR = BINARY( 00000000 );

  ADC12CTL0 = ADC12ON                                             // АЦП включено
            | SHT0_2                                              // время установленияния для ADC12MEM0…ADC12MEM7
            | SHT1_3                                              // время установленияния для ADC12MEM8…ADC12MEM15
            | MSC                                                 // обрабатываем последовательность каналов
            | REFON + REF2_5V                                     // опорное напряжение 2.5В включено
          ;

  ADC12CTL1 = CSTARTADD_0
            | SHP                                                 // Сигнал SAMPCON берется с таймера защёлки.
            | ADC12SSEL_3
            | ADC12DIV_1
            | CONSEQ_1                                            // один цикл измерения последовательности каналов
          ;

  ADC12MCTL0 = INCH_2  + SREF_1;
  ADC12MCTL1 = INCH_0  + SREF_1;
  ADC12MCTL2 = INCH_3  + SREF_1;
  ADC12MCTL3 = INCH_1  + SREF_1;

  ADC12MCTL4 = INCH_4  + SREF_1;
  ADC12MCTL5 = INCH_6  + SREF_1;
  ADC12MCTL6 = INCH_5  + SREF_1;
  ADC12MCTL7 = INCH_7  + SREF_1 + EOS;

// -----------------------------------------------------------------------------------------------------------------
  ADC12IE = 1 << ( adc_cnt - 1 );     // Enable ADC12IFG.x - разрешим прерывание от последнего канала
  Enable_conversions();                    // { ADC12CTL0 |= ENC; }
}

А запуск преобразования делаю по прерыванию от таймера.
Никаких проблем нет, прерывание от АЦП вызывается однократно после каждго запуска преобразования


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post



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

 


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


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