Интеграция АЦП AD7705 c ПК через LPT порт

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Есть устройство, которое использует АЦП и подсоединяется к ПК
Вот схема устройства:
Рис 9.jpg
(150.69 КБ) 1289 скачиваний

Меня интересуют ноги LPT порта
Нога 2: Нужна для последовательного ввода данных в АЦП
Нога 3: Осуществляет сброс АЦП
Нога 4: Изменением уровня на 0 устанавливаем АЦП в режим чтения или записи
Нога 5: Тактирующие импульсы, если я правильно понимаю, то благодаря им идёт передача данных
Нога 9: ????Не могу понять. Зачем в данной схеме используется девятая нога... Помогите ответить на этот вопрос.
Так же у меня вопрос по микросхемам 74HC244N. Их используют, чтоб не сгорел LPТ порт? Инвертируют ли они сигнал на выходе?
Микросхему 1554 с какой целью может быть использована?)Тоже чтоб обезопасить LPT порт?)
Мне это нужно, как программисту, чтоб понять, как написать к устройству драйвер....
Пока попытки не удались успехом :(
Администрирую сайт и точка!)
Digikey
Встал на лапы
Сообщения: 90
Зарегистрирован: Пн мар 08, 2010 02:59:04

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение Digikey »

Нога 4: Изменением уровня на 0 устанавливаем АЦП в режим чтения или записи
Нет, это CS - выбор микросхемы. Во время операций чтения/записи (рис.16,17) сигнал должен иметь низкий уровень.

Нога 5: Тактирующие импульсы...
Да (рис.16,17)

Нога 9: ????Не могу понять.
Похоже, что по замыслу разработчиков устройства, это питание цифровой(интерфейсной) части схемы, т.е. там должна быть "1". Решение довольно сомнительное. Разные ЛПТ имеют разные выходные характеристики. (Вообще-то желательно составить список всех выводов к которым подключена цепь DVdd)

74HC244N, 1554 с какой целью использована?
74HC244N, 1554 - используются для повышения нагрузочной способности при работе на кабель.
74HC244N сигнал не нвертирует

...понять, как написать к устройству драйвер
можно взять готовые драйверы доступа к портам, например DLportIO от Scientific Software Tools, который используется в известной программе AVReAl. Ссылка есть здесь:
http://real.kiev.ua/old/avreal/ru/description.html

документ на АЦП: AD7705
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Спасибо Digikey!))
Сейчас приступлю к новым попыткам с новыми советами!)))
Администрирую сайт и точка!)
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Ну вот...Написал я программу для моего устройства, а оно всё равно слушаться не хочет
Может кто подскажет, что не так.
Ниже я приведу код программы и комментарии к фрагментам кода. Может, кто поможет.
Проверялось на Windows 98. К АЦП подключена батарейка через потенциометр. АЦП точно рабочий!
Программа писалась в DEV-C++. Тоже самое, что C++ только бесплатная!)
***************************************************************************************
Инициализация переменных
int i,j,data[7],status,CS=4,RESET=2,BUFF=128;


Процедура сброса:
void reset(void)
{
_Out32(888,128+4+8);
}

Функции для передачи информации в АЦП.
Их тут две. Одна нужна, для тактирования:
void sclkOut(int din, int reset, int cs, int buff)
{
Sleep(1);
int sclk=0;
_Out32(888,din+reset+cs+buff+sclk);
Sleep(1);
sclk=8;
_Out32(888,din+reset+cs+buff+sclk);
}
void write(void)
{
CS=0;
for(j=0;j<8;j++)
sclkOut(data[j],RESET,CS,BUFF);
Sleep(1);
CS=4;
_Out32(888,142);
}

Читаем с АЦП используя 13-ю ножку LPT порта, так как изображено на картинке, выводим результат(двоичный код) на экран и записываем в файл.
Функции две. Одна нужна, для тактирования:
void sclkRead(int reset,int cs,int buff)
{
int sclk=0;
Sleep(1);
_Out32(888,reset+cs+buff+sclk);
Sleep(1);
sclk=8;
_Out32(888,reset+cs+buff+sclk);
}
void read (void)
{
int output;
FILE *FOPEN(), *FP;
FP=fopen("file.txt","w");
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);
CS=0;
for (int t=0;t<1000;t++)
{
for(i=0;i<16;i++)
{
sclkRead(RESET,CS,BUFF);
output=(_Inp32(889) & 0x08);
if (output)
{printf("1");
fprintf(FP,"1");
}
else
{
printf("0");
fprintf(FP,"0");
}
Sleep(1);
}
printf("\n");
fprintf(FP,"\n");
}
Sleep(1);
CS=4;
_Out32(888,CS+RESET+BUFF);
printf("\n");
fclose(FP);
}


Сама программа с указанными функциями:
int main()
{
reset(); //Сброс АЦП
_Out32(888,142); //Устанавливаем, RESET=1 (3-я нога), CS=1 (4-я нога) ,SCLK=1 (5-я нога), BUFF=1 (9-а нога);
//Теперь как в примере с контроллером в документации посылаем в ацп последовательно 0x20
data[0]=0;
data[1]=0;
data[2]=0;
data[3]=0;
data[4]=0;
data[5]=0;
data[6]=1;
data[7]=0;
write();
//Теперь как в примере с контроллером в документации посылаем в ацп последовательно 0x0С
data[0]=0;
data[1]=0;
data[2]=1;
data[3]=1;
data[4]=0;
data[5]=0;
data[6]=0;
data[7]=0;
write();
//Теперь как в примере с контроллером в документации посылаем в ацп последовательно 0x10
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();
//Теперь как в примере с контроллером в документации посылаем в ацп последовательно 0x40
data[0]=0;
data[1]=0;
data[2]=0;
data[3]=0;
data[4]=0;
data[5]=0;
data[6]=1;
data[7]=0;
write();
//По идее инициализация АЦП завершена, теперь ждём пока DRDY (10-я ножка) не равно 0
status=_Inp32(889);
while (status & 0x01)
{
Sleep(1);
status=_Inp32(889);
}
//Если DRDY=0 (10-я ножка), то начинаем читать
read();
return EXIT_SUCCESS;
}
Последний раз редактировалось gorec_miki Ср май 26, 2010 19:53:23, всего редактировалось 1 раз.
Администрирую сайт и точка!)
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Кстати, программа выдавала мне следующий результат, может поможет:
1111111111111111
1111111111111111
1111111111111111
1111111111111111
......
1111111111111111
Администрирую сайт и точка!)
Аватара пользователя
Artemy
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Сб окт 04, 2008 00:23:25
Откуда: Санкт-Петербург

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение Artemy »

Тоже не так давно общался через LPT с AD7705. Ох и пришлось помучаться, чтобы получать от него внятные ответы.

У меня было всё подключено напрямую к LPT (но это на свой страх и риск) без всяких "повышателей" нагрузочной способности. Линия CS (со стороны АЦП ессесно) была пущена на землю, она нужна, чтобы выбирать микросхему в случае если их несколько. Линия RESET АЦП подтянута к "1", т.к. использовал программный сброс (подача определённого количества "1" на вход - см. даташит). Ну эт всё по желанию - так, чтоб глаза лишнее не мозолило.

Далее, в цикле опроса DRDY ставил счётчик срабатываний. Были случаи, когда на кухне чайник отключался, и АЦП зависал, да и вообще, от длинных линий, прикосновений рук тоже может. В случае переполнения счётчика - сброс, инициализация... т.е. всё сначала...

А для начала рекомендуется опробовать свою "пристроечку" к LPT без АЦП на предмет прохождения сигналов, т.е. просто подавать 1/0 в обе стороны, поморгать светодиодами, повыводить на монитор результаты нажатия кнопок. Потом уж подключать АЦП, пробовать прочитать/записать регистры.

Ещё при написании программы рекомендую начать с нижнего уровня, т.е. протокол SPI (например, OUT_high(), OUT_low(), CS_high(), CS_low(), DRDY_read()...), потом прийти к SPI_byte_read(), SPI_byte_write(...), а потом уже к AD7705_read_byte и т.д. Так будет проще перенести программу, например, на тот же PIC, подправив в коде минимум текста. Легче будет присоединить по тому же SPI что-то новое, так как нижний уровень у вас уже будет описан. Ну эт моё личное ИМХО...

Возвращаясь к AD7705, в своё время пригодился такой вот документ.
Digikey
Встал на лапы
Сообщения: 90
Зарегистрирован: Пн мар 08, 2010 02:59:04

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение Digikey »

void write(void)
{
CS=0;
for(j=0;j<8;j++)
sclkOut(data[j],RESET,CS,BUFF);
Sleep(1);
CS=4;
_Out32(888,142);
}

//Теперь как в примере с контроллером в документации посылаем в ацп последовательно 0x20
data[0]=0;
data[1]=0;
data[2]=0;
data[3]=0;
data[4]=0;
data[5]=0;
data[6]=1;
data[7]=0;

Данные в/из АЦП передаются в последовательности от Старшего(MSB) к Младшему(LSB) биту. (pdf рис.16,17)
Например, если нужно передать 0x20 = (MSB->)0010 0000 (<-LSB), то, т.к. write() читает data[i] от 0 до 7,
то в data[0] элемент должен содержать MSB, а data[7], соответственно, LSB. Т.е. так:

//Теперь как в примере с контроллером в документации посылаем в ацп последовательно 0x20
data[0]=0; // <-MSB
data[1]=0;
data[2]=1;
data[3]=0;
data[4]=0;
data[5]=0;
data[6]=0;
data[7]=0; // <-LSB

И т.д.

PS.
void reset(void)
{
_Out32(888,128+4+8);
Sleep(1);
}
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Спасибо ребят!) Приму к сведению!) О результатах сообщю позже!))Надеюсь, что больше вопросов не будет)
Администрирую сайт и точка!)
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Передача от старшего к младшему не помогла, и Sleep тоже....Пробовал и CS приравнять к 0, всё равно не слушается....
Главное результат выдаёт одни единицы, это с выхода DOUT. и DRDY=0;
Администрирую сайт и точка!)
Аватара пользователя
Artemy
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Сб окт 04, 2008 00:23:25
Откуда: Санкт-Петербург

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение Artemy »

А может на входе сигнал максимальный? Поэтому и единицы.
Раз DRDY == 0 значит готовы данные измерений к считыванию. После считывания двух байт он возвращается в "1" и так до следующего измерения.
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Обнаружил интересную деталь!)
Когда мы читаем с порта 0x379 (889), то
10 вывод соответствует 6 биту
11 вывод соответствует 7 биту
12 вывод соответствует 5 биту
13 вывод соответствует 4 биту
15 вывод соответствует 3 биту
первые три бита всегда 0
Вот по этой причине у меня DRDY был = 0, оказывается нужно было проверять 6 бит.
Администрирую сайт и точка!)
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Уже наверно поднадоел, но хочется чтоб всё же схема заработала.....
Исправил я программу. Инициализация проходит точно. Если до инициализации значение на порте 0x379 = 104 или 120, то после 40 или 56. Т.е. 6-бит порта 0x379 переходит в 0.
А вот программа:
Первые три переменные-счётчики
Массив 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);}

Функция создающая тактирующий импульс, посылающий бит информации

Код: Выделить всё

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);}

Функция записи в АЦП

Код: Выделить всё

void write(void)
{for(s=4;s<8;s++)
sclkOut(data[s],RESET,BUFF);//отправка старшего бита
for(s=0;s<4;s++)
sclkOut(data[s],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);}

Функция чтения с регистра данных

Код: Выделить всё

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");}

Функция в которую я заложил настройки задаваемые в 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;}

Программа со всеми перечисленными функциями:

Код: Выделить всё

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;}


После всего этого микросхема мне выдает всё время только одно значение или 56 или 40, как я не меняю напряжение потенциометром. А по идее из-за изменения напряжения эти две цифры должны в определенной последовательности чередоваться
Вот как выглядит у меня к примеру:
40 40 40 40 40 40 40 40 40 .....
Или
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.
А потом я их уже представлю ввиде нормальных значений)
Последний раз редактировалось gorec_miki Сб май 29, 2010 17:04:37, всего редактировалось 2 раза.
Администрирую сайт и точка!)
Аватара пользователя
Artemy
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Сб окт 04, 2008 00:23:25
Откуда: Санкт-Петербург

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение Artemy »

Ну, для начала:

Код: Выделить всё

void reset(void)
{_Out32(888,8);
Sleep(3);}

8 - это 00001000 в двоичном представлении, т.е. 3 бит (от нуля считаем) ставишь в единицу, остальные - в нуль. RESET у тебя висит на 1 бите (3 пин) регистра 888 порта LPT. Вместо этого дрыгается SCLK - 3 бит (5 пин).

Во вторых:

Код: Выделить всё

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();//Запись в Коммуникационных регистр

Это как понять? Ты ЭТО хочешь впихнуть в маленький однобайтный регистр АЦП, думая что это всего восемь бит?

В третьих:
у тебя все переменные обозначены int, int - это два байта обычно. Все хорошо если бы работа велась только с младшим байтом, а старший висел бы балластом. Но подобной обработки что-то не видно. Так бы только понапрасну тратилась память, а если будешь к микроконтроллеру это все присоединять, то он бы не простил разбазаривание памяти. И не забывай, что регистры порта LPT однобайтные, и большинство регистров АЦП тоже, кроме data (2 байта), offset и gain (по 3 байта). Так что разберись с типами данных.

В четвертых:
научись работать с битами - установить, сбросить и считать - 3 основные операции.

В пятых:
с LPT и его битами данных работать лучше так:
1) считать весь регистр во временную переменную
2) выставить нужный бит
3) записать переменную в регистр порта
При этом не будут "портиться" соседние биты, что важно когда, например, надо передать данные в АЦП.

можно продолжить...
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Во первых
По поводу reset
А что плохого, что SCLK установил в 1. Сброс же всё равно прошёл из-за 0 на 3 пине LPT
Во вторых
Я отправляю 8 бит в коммуникационный регистр. Разве не правильно. Там же 8 бит.
А вот data[i] просто управляет уровнем на пине 2 (DIN)
Т.е если data[i]=1, то отправляем на порт 0x378 значение: data[i]+128+2+8(0) = 10001(0)011//т.е. отправляем 1
если data[i]=0, то отправляем на порт 0x378 значение: data[i]+128+2+8(0) = 10001(0)010//т.е. отправляем 0
В третьих
К контроллеру я не собираюсь пока ни чего подключать, всё делается на компьютере и думаю ему не будет плохо, если я воспользуюсь большей памятью чем надо)
То что в пятых
Но мой способ тоже ведь правильный. Если я делаю следующее 128+8+2+1 и получаю 10001011, когда мне нужно низкий уровень на SCLK то делаем так: 128+2+1 и получаю 10000011 и это всё идёт на 0x378. Так же убирая +1 можно отправить 0 на DIN. Разве не так. Просто пока мне так удобнее...Нет ещё привычки работать используя логические операции & или |.
Администрирую сайт и точка!)
Аватара пользователя
Artemy
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Сб окт 04, 2008 00:23:25
Откуда: Санкт-Петербург

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение Artemy »

Пардон, по поводу reset, что-то я забыл, что он сбрасывается нулём. :)

А разбираться с индусским кодом :)) тут вряд ли у кого-то есть время... Так что, уверен, в твоем "удобстве" есть где-то что-то, к чему ты невнимательно отнёсся. Имеешь ведь даташит и примеры кода, проверь "диалог" с АЦП вплоть до каждого бита на соответствие с тем алгоритмом в даташите. А потом уже будешь что-то своё к нему прикручивать.
gorec_miki
Родился
Сообщения: 14
Зарегистрирован: Чт апр 22, 2010 16:45:45
Контактная информация:

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение gorec_miki »

Ну нет так нет :(
Администрирую сайт и точка!)
Digikey
Встал на лапы
Сообщения: 90
Зарегистрирован: Пн мар 08, 2010 02:59:04

Re: Интеграция АЦП AD7705 c ПК через LPT порт

Сообщение Digikey »

Пожалуй есть смысл переписать Вашу программу более "прозрачно". Например как-нибудь так. Попробуйте!

Код: Выделить всё

typedef  unsigned char   BYTE;
typedef  unsigned short   WORD;

//=====
// OUTPUT pins definition
//=====
// LPT pin   |   0x378
// ----------+----------   
// DIN  (2)  |    D0
// Reset(3)  |    D1
// CS   (4)  |    D2
// CLK  (5)  |    D3
// Vcc  (9)  |    D7
//
#define _DIN  (1<<0)
#define _Res  (1<<1)
#define _CS   (1<<2)
#define _Clk  (1<<3)
#define _Vcc  (1<<7)

//=====
// INPUT pins definition
//=====
// LPT pin   |   0x379
// ----------+----------   
// DRDY (10) |    D6
// DOUT (13) |    D4
//
#define _DRDY  (1<<6)
#define _DOUT  (1<<4)

//--- Global var ---
BYTE  bLPT_Out;

//----------
void InitLPT()
{
   bLPT_Out = _Res + _CS + _Clk + _Vcc;
   _Out32(0x378, bLPT_Out);
   Sleep(50);
}
//----------
BYTE DRdyIsHigh()
{
   return ( _DRDY & _Inp32(0x379) );
}
//----------
void ResetADC()
{
   bLPT_Out &= ~_CS;
   _Out32(0x378, bLPT_Out); // put CS low   

   bLPT_Out &= ~_Res;
   _Out32(0x378, bLPT_Out); // put Res low
   Sleep(1);
   bLPT_Out |= _Res;
   _Out32(0x378, bLPT_Out); // put Res lhigh
   
    bLPT_Out |= _CS;
   _Out32(0x378, bLPT_Out); // put CS high
}
//----------
void WriteToReg(BYTE wr_data)
{
   BYTE i;
   
   bLPT_Out &= ~_CS;
   _Out32(0x378, bLPT_Out); // put CS low
   
   for(i=0; i<8; wr_data <<= 1, i++)
   {
      if(wr_data & 0x80)
         bLPT_Out |=  _DIN;
      else
         bLPT_Out &= ~_DIN;

      bLPT_Out &= ~_Clk;
      _Out32(0x378, bLPT_Out);
      Sleep(1);
     
      bLPT_Out |= _Clk;
      _Out32(0x378, bLPT_Out);
      Sleep(1);
   }
   
    bLPT_Out |= _CS;   
   _Out32(0x378, bLPT_Out); // put CS high     
}
//----------
WORD ReadData()
{
   BYTE i;
   WORD rd_data = 0;
   
   while(DRdyIsHigh());     // wait for DRDY to go low
   
   bLPT_Out &= ~_CS;
   _Out32(0x378, bLPT_Out); // put CS low
   
   for(i=0; i<16; i++)
   {
      bLPT_Out &= ~_Clk;
      _Out32(0x378, bLPT_Out);
      Sleep(1);
     
      bLPT_Out |= _Clk;
      _Out32(0x378, bLPT_Out);
      Sleep(1);

      rd_data <<= 1;
     
      if(_Inp32(0x379) & _DOUT)
         rd_data |=  1;
   }
   
    bLPT_Out |= _CS;   
   _Out32(0x378, bLPT_Out); // put CS high
   
   return rd_data;
}
//----------
int main()
{
   WORD cnt, result;
   
   InitLPT();
   ResetADC();

   WriteToReg(0x20);
   WriteToReg(0x0C);
   WriteToReg(0x10);
   WriteToReg(0x40);
   while(DRdyIsHigh());   // wait for DRDY to go low
     
   for(cnt=0; cnt<100; cnt++)
   {
      WriteToReg(0x38);
      result = ReadData();
      // fprint ...
   }
}
Ответить

Вернуться в «Интеграция с ПК»