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