roboforum.ru

Технический форум по робототехнике.

Включение DAC в LPC2148

Включение DAC в LPC2148

KIllJoy » 08 июн 2013, 23:39

Добрый вечер. Помогите найти ошибку в коде.

Код: Выделить всёРазвернуть
#include <lpc21xx.h>

#define STARTCAPTURE 0x07000000
#define STOPCAPTURE    0xF8FFFFF0
#define CHANNEL          0x00000008

void delay(int time){
   int i = 0, j = 0;
   for (i = 0 ; i < time; i++)
      for(j = 0; j < i; j++);
}

int getValue(){
   //Останавливаем АЦП
   ADCR &= STOPCAPTURE;
   ADCR |= CHANNEL;
   //Запускаем АЦП
   ADCR |= (1<<24);
   //Ожидаем сигнала готовности (думаю ошибка где-то здесь)
   while(!(ADDR & 0x80000000));
   return ((ADDR & 0x0000FFC0) >> 6);
}



void indicate(int value){
   if(value < 250){
      IO0SET |= 0x0FFFFFFF;
      IO0CLR |= 0x00000001;
   }
   else
      if(value < 500){
         IO0SET |= 0x0FFFFFFF;
         IO0CLR |= 0x00000002;
      }
      else
         if(value < 750){
            IO0SET |= 0x0FFFFFFF;
            IO0CLR |= 0x00000004;
         }
         else
            if(value < 1000){
               IO0SET |= 0x0FFFFFFF;
               IO0CLR |= 0x00000008;
            }
            else
            {
               IO0SET |= 0x0FFFFFFF;
               IO0CLR |= 0x00000010;
            }
}

int main(){
      int res = 0;
      IO0SET |= 0x0FFFFFFF;
      IO0DIR |= 0x0FFFFFFF;
      //Отключаем все лишнее
      PCONP |= (1 << 12);
      //Задаем альтернативную функцию AD0.3 (PIN30)
      PINSEL1 |= (1<<28);
      //10-bit точности, 12.0MHz / 3, Канал 3
      ADCR |= 0x00200208;
      
      while(1){
      res = getValue();
                //В зависимости от того, в каком диапазоне полученное значение, включаем соответствующий светодиод.
      indicate(res);
      delay (1000);     
   }
}

Если в дебагере ручками задавать значение и выставлять флаг готовности, то работает. При эмуляции в протеусе - нет.
Прошу помочь!


cron
Rambler\'s Top100 Mail.ru counter