Цитата(dexter_khm @ Sep 2 2011, 16:54)

Вобщем модифицировал я пример "basic-adc-project" хотел сделать на первом канале АЦП срабатывание 5 диапазонов. Тоесть если значение в первом диапазоне то один раз мигнуть светодиодом, если во втором то два раза мигнуть. Вобщем все срабатывает только в итоге светодиод мигает вместо одного два раза, вместо 3 - 6 , вместо 5 - 10. Даже не знаю как так может быть
Глянте пожалуйста что не так????
Посмотрел на Ваш код.
В основном цикле программы у Вас идёт запуск преобразования, считывание, разбивка на диапазоны и потом моргание.
Первое что бросилось в глаза - после цикла while (l<b){} нет никакой паузы которая позволила-бы визуально отделить один процесс считывания показаний ацп с морганием от другого.
Второе - ИМХО просто ужасный код взятый из примера.
Когда сам разбирался с ацп в пример конечно заглядывал, но код доводил до более или менее вменяемого вида.
Получилось вот что:
Код
#ifndef adc_H
#define adc_H
#define ADCCLK 100000
#define ADCPRESCAL ((BOARD_MCK/(ADCCLK*2))-1)
#define VREF 3060 //mV
#define DELITEL_ADC 17 //(8.5*2) //коэф деления входного делителя
#define DELITEL_PSV 26 //(13*2) //коэф деления входного делителя
#endif //adc_H
Код
/*****************************************************/
//запуск преобразования АЦП
__thumb void ADCStartConvertion(void)
{
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
}
/*****************************************************/
/*****************************************************/
//конфигурирование АЦП
__thumb void ConfigureADC(void)
{
//запуск software, 10 бит, sleep mode, прескалер на 100 кГц
AT91C_BASE_ADC->ADC_MR = (ADCPRESCAL<<6)|AT91C_ADC_SLEEP_MODE;
//разрешаем каналы 4,5,6,7
AT91C_BASE_ADC->ADC_CHER = AT91C_ADC_CH7|AT91C_ADC_CH6|AT91C_ADC_CH5|AT91C_ADC_CH4;
//запускаем первое преобразование
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
}
/*****************************************************/
/*****************************************************/
//чтение канала АЦП
__thumb unsigned int ADCRead(unsigned int ch)
{
unsigned int res=0;
unsigned int delitel;
switch(ch)
{
case 0: res = AT91C_BASE_ADC->ADC_CDR6;
delitel = DELITEL_ADC;
break;
case 1: res = AT91C_BASE_ADC->ADC_CDR5;
delitel = DELITEL_ADC;
break;
case 2: res = AT91C_BASE_ADC->ADC_CDR4;
delitel = DELITEL_ADC;
break;
case 3: res = AT91C_BASE_ADC->ADC_CDR7;
delitel = DELITEL_PSV;
break;
}
//переводим показания ацп в мВ
return (res*VREF*delitel)>>11;
}
/*****************************************************/
Подключите 2 файла к проекту.
Напишите в код снизу и больше ничего не надо!!!
Код
void main(void)
{
ConfigureADC();
unsigned int adc_res;
while(1)
{
ADCStartConvertion();
pause(); //тут подождать немного на преобразование
adc_res = ADCRead(0);
//тут манипуляции с морганиями
pause(); //тут пауза чтобы отделить один процесс моргания от другого
}
}
Сообщение отредактировал mempfis_ - Sep 4 2011, 11:15