У меня есть АЦП на микросхеме AD7705. АЦП подключается через LPT порт компьютера.Нажмите для просмотра прикрепленного файлаЗадача: написать программу, которая будет принимать информацию об исследуемом объекте и выводить на экран.
Используя документация Документация AD7705, я пришёл к выводу, что нужно провести инициализацию микросхемы, а дальше из регистра Данных считать результат.
Написал программу. Инициализация вроде осуществляется, так как DRDY=0, это 6-бит порта 0x379. Но вытащить из неё данные не получается.
Может вы подскажете, что не верно в моей программе:
Цитата
Массив data- данные для передачи в АЦП, status-результат на выводах порта 0x379, Массивы fHz и Mode - В них находтся конфигурация для CLOCK регистра и регистра управления. CS-выбор микросхемы обнулили, RESET-сброс,BUFF-питание цифровой части АЦП(9-нога на схеме, всё время высокий уровень)
Код
int i,s,j,data[8],status,fHz[8], Mode[8],CS=0,RESET=2,BUFF=128;
Цитата
Функция сброса микросхемы:
Код
void reset(void)
{_Out32(888,8);
Sleep(3);}
{_Out32(888,8);
Sleep(3);}
Цитата
Функция создающая тактирующий импульс, посылающий бит информации:
Код
void sclkOut(int din, int reset, int buff)
{Sleep(1);
_Out32(888,din+reset+128);
Sleep(1);
_Out32(888,din+reset+128+8);
Sleep(1);}
{Sleep(1);
_Out32(888,din+reset+128);
Sleep(1);
_Out32(888,din+reset+128+8);
Sleep(1);}
Цитата
Функция записи в АЦП:
Код
void write(void)
{for(s=4;s<8;s++)
sclkOut(data[s],RESET,BUFF);//отправка старшего бита
for(s=0;s<8;s++)
sclkOut(data[3],RESET,BUFF);//отправка младшего бита
Sleep(1);
_Out32(888,138);}//Устанавливаем SCLK=1 DIN=0 , BUFF=128, RESET=2
{for(s=4;s<8;s++)
sclkOut(data[s],RESET,BUFF);//отправка старшего бита
for(s=0;s<8;s++)
sclkOut(data[3],RESET,BUFF);//отправка младшего бита
Sleep(1);
_Out32(888,138);}//Устанавливаем SCLK=1 DIN=0 , BUFF=128, RESET=2
Цитата
Функция создающая тактирующий импульс для передачи бита информации с АЦП:
Код
void sclkRead(int reset ,int buff)
{Sleep(1);
_Out32(888,reset+buff);
Sleep(1);
status=_Inp32(889);//Число которое зависит от уровня
printf("%d ",status);
_Out32(888,reset+buff+8);}
{Sleep(1);
_Out32(888,reset+buff);
Sleep(1);
status=_Inp32(889);//Число которое зависит от уровня
printf("%d ",status);
_Out32(888,reset+buff+8);}
Цитата
Функция чтения с регистра данных
Код
void read (void)
{ data[0]=0; data[1]=0; data[2]=0; data[3]=1; data[4]=1;data[5]=1; data[6]=0; data[7]=0;
write();//Запись в коммуникационный регистр чтения из регистра данных
Sleep(1);
for(i=0;i<16;i++)
{ sclkRead(RESET,BUFF);
Sleep(2); }
printf("\n");}
{ data[0]=0; data[1]=0; data[2]=0; data[3]=1; data[4]=1;data[5]=1; data[6]=0; data[7]=0;
write();//Запись в коммуникационный регистр чтения из регистра данных
Sleep(1);
for(i=0;i<16;i++)
{ sclkRead(RESET,BUFF);
Sleep(2); }
printf("\n");}
Цитата
Функция в которую я заложил настройки задаваемые в CLOCK регистр и регистр управления соответственно.
Код
void InitialConfiguration(void)
{fHz[0]=0;fHz[1]=0;fHz[2]=1;fHz[3]=1;fHz[4]=0;fHz[5]=0;fHz[6]=0;fHz[7]=0;
Mode[0]=0;Mode[1]=0;Mode[2]=0;Mode[3]=0;Mode[4]=0;Mode[5]=0;Mode[6]=1;Mode[7]=0;}
{fHz[0]=0;fHz[1]=0;fHz[2]=1;fHz[3]=1;fHz[4]=0;fHz[5]=0;fHz[6]=0;fHz[7]=0;
Mode[0]=0;Mode[1]=0;Mode[2]=0;Mode[3]=0;Mode[4]=0;Mode[5]=0;Mode[6]=1;Mode[7]=0;}
Цитата
Программа со всеми перечисленными функциями:
Код
int main()
{ int q, go=1;
reset();//Сброс микросхемы
InitialConfiguration();//Инициализируем настройки для регистров CLOCK и управления
_Out32(888,138);
Sleep(1);
data[0]=0;data[1]=0; data[2]=0; data[3]=0; data[4]=0;data[5]=1;data[6]=0; data[7]=0;
write();//Запись в Коммуникационных регистр
for (q=0;q<8;q++)
data[q]=fHz[q];
write();//Запись в регистр CLOCK
data[0]=0;data[1]=0; data[2]=0; data[3]=0; data[4]=1;data[5]=0;data[6]=0; data[7]=0;
write();//Запись в Коммуникационных регистр
for (q=0;q<8;q++)
data[q]=Mode[q];
write();//Запись в регистр управления
Sleep(3);
do { status=_Inp32(889);//Вечный цикл для считывания данных
while (status & 0x40)//Проверка 6-го бита порта 0x379 (DRDY)
{Sleep(1);
status=_Inp32(889);}
read(); }//Если 6-й бит низкий уровень, то начинаем чтение.
while (go);
return EXIT_SUCCESS;}
{ int q, go=1;
reset();//Сброс микросхемы
InitialConfiguration();//Инициализируем настройки для регистров CLOCK и управления
_Out32(888,138);
Sleep(1);
data[0]=0;data[1]=0; data[2]=0; data[3]=0; data[4]=0;data[5]=1;data[6]=0; data[7]=0;
write();//Запись в Коммуникационных регистр
for (q=0;q<8;q++)
data[q]=fHz[q];
write();//Запись в регистр CLOCK
data[0]=0;data[1]=0; data[2]=0; data[3]=0; data[4]=1;data[5]=0;data[6]=0; data[7]=0;
write();//Запись в Коммуникационных регистр
for (q=0;q<8;q++)
data[q]=Mode[q];
write();//Запись в регистр управления
Sleep(3);
do { status=_Inp32(889);//Вечный цикл для считывания данных
while (status & 0x40)//Проверка 6-го бита порта 0x379 (DRDY)
{Sleep(1);
status=_Inp32(889);}
read(); }//Если 6-й бит низкий уровень, то начинаем чтение.
while (go);
return EXIT_SUCCESS;}
После всего этого микросхема мне выдает всё время только одно значение или 56 или 40, как я не меняю напряжение потенциометром. А по идее из-за изменения напряжения эти две цифры должны в определенной последовательности чередоваться
Вот как выглядит к примеру в моём случае:
Цитата
40 40 40 40 40 40 40 40 40 .....
Или
56 56 56 56 56 56 56 56 56 .....
Или
56 56 56 56 56 56 56 56 56 .....
Причем, если настройки регистров управления и CLOCK как в документации, то результат 40, а если их изменить, то возможен 56.
Как сделать так, чтоб программа правильно производило считывание данных???
Хотелось бы увидеть что-то подобное:
56 56 40 40 56 40 40 40 40 56 40 56 40 56 40 40
Т.е. 56-соответствует 1, 40 -0, на выходе DOUT.
А потом я их уже представлю ввиде нормальных значений)
Спасибо что дочитали до конца!) Надеюсь и ответы будут))