Перейти к содержанию
    

ADC msp430afe253

Доброе время суток господа форумчане.

 

Столкнулся с такой проблемкой - завести АЦП на контроллере MSP430AFE253.

В этом кристале на борту присутствует 24 битный сигма-дельта АЦП. Вот его то и хочу попользовать.

 

 

#include  <msp430afe253.h>

  unsigned int i,j;
  unsigned int pressure;                                           
  unsigned long int results[10];
  unsigned long int res_temp;
  unsigned int temp;  
  
  void main(void)
{
  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

//--------------------ADC-------------------------//

//adc_init;
  __MSP430_HAS_SD24_A3__;
  SD24INCTL0 |= SD24INCH0 + SD24INTDLY0;                                 //выбор первого (нулевого) канала и задержка
  SD24CTL |= SD24REFON + SD24SSEL0;                                         // внутренний опорник и такт
  SD24CCTL0 |= SD24UNI + SD24IE + SD24LSBACC + SD24SNGL;    // униполярность прерывания младший байт сингл конверт
  for (i = 0; i < 0x3600; i++)                                                            // задержка перед стартом внутреннего опорника
  {
    _NOP();  
    _NOP();  
    _NOP();  
  }
  
  while (1)
  {

     for (i = 0; i < 10; i++)            
       {
         SD24CCTL0 |= SD24SC;           //старт преобразований
    // сдесь втыкал задержки                                                   
         results[i] = (SD24MEM0)-10;     //сохранение результата в массив -10 использовано чтобы точно не было переполнения
         SD24CCTL0 &= ~SD24SC;       //стоп преобразований
       }
      
     for (i = 0; i < 10; i++)             
       {
         temp = temp + results[i];
       }     
     
    pressure = temp/10;       // здесь должны получить усредненные значения.

  }
}

 

 

теперь собственно проблема: в ячейке SD24MEM0 данные есть, но они не всегда записываются в переменную, а как то 1 раз из 5. пробовал делать и программную задержку до установки флага SD16IFG, и просто пропуск пары операций проца, и по прерываниям.

 

вторая проблема в том что данные в ячейке SD24MEM0 каждый раз разные и варьируются от 0x0000 до 0xFFFF даже если оба провода посадить на GND. данные в SD24MEM0 смотрел в при отладке, пользую IAR

 

третья проблема, если идти пошагово отладчиком, то при выполнении цикла какие то значения записываются и какой то результат получается, и он всегда разный, если же отправить процессор выполнять программу самому по кругу, то конечное значения всегда будет одно и то же, с какого бы места не запустилась программа, он первый раз получает какое то значение и после его не изменяет.

 

скажите в каком месте я дурак) заранее спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В коде нет проверки флага SD24IFG. Данные можно читать только когда данный флаг в "1". При чем тут SD16IFG?

В строчке temp = temp + results; судя по форматам данных (int = int + long int) будет происходить потеря данных

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...