- Код: Выделить всё • Развернуть
- #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);
 }
 }
Если в дебагере ручками задавать значение и выставлять флаг готовности, то работает. При эмуляции в протеусе - нет.
Прошу помочь!

