gorec_miki 0 28 мая, 2010 Опубликовано 28 мая, 2010 · Жалоба Здравствуйте форумчане. Я тут новичёк, по этому пишу в этом форуме) Надеюсь, что вы дадите мне ответ) У меня есть АЦП на микросхеме 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);} Функция создающая тактирующий импульс, посылающий бит информации: 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<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);} Функция чтения с регистра данных 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. А потом я их уже представлю ввиде нормальных значений) Спасибо что дочитали до конца!) Надеюсь и ответы будут)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 28 мая, 2010 Опубликовано 28 мая, 2010 · Жалоба Не обращая внимание на исходник? хотелось бы вначале понять схемотехнику вашего устройства и ошибки, которые она содержит. Во-первых, нужно давать имена сигналам выведенным на разъемы. А частности это касается разъема LPT-порта. Чтобы понять правильность схемы требуется морщить лоб, вспоминая цоколевку этого разъема, или лезть за "справочником". Во-вторых, поясните, от какого напряжения питания у вас запитан АЦП и для чего потребовалась такая смесь разнотипной логики? Если АЦП питается от 3В (AVdd это внешнее питание?), то для согласования уровней было бы достаточно одной 74HC244, запитанной от этого же напряжения. В крайнем случае две 74HC244 последовательно, первая от такого же напряжения что и АЦП, вторая от LPT-порта или от внешних 5В. И в первом и во втором случае требуются согласующие резисторы. В первом случае между входами/выходами 74HC244 и LPT-портом, во втором - между сигнальными выводами обеих м/с. Следует отметить, что современные интерфейсные м/с LPT-портов вполне нормально воспринимают сигналы 3В уровня, т.к. их собственные входные уровни TTLV. (VIN(H)>=2В). В-третьих, реализуя синхронный интерфейс посредством "ногодрыгания" LPT-порта не следует забывать о буферизации потоков в самой ОС на ПК. Чтобы избежать влияния многочисленных программных буферов, следует выходной тактирующий сигнал (SCLK) ввести обратно в LPT-порт и считывать состояние на линии DOUT синхронно с его изменением уже на входе LPT-порта. Т.е. сигнал SCLK для АЦП один, а для ПК (LPT-порта) - два: один выходной, которым тактируются данные синхронного интерфейса АЦП, второй - входной, дублирующий сигнал на входе SCLK АЦП, своего рода loopback. После того, как вы реализуете рекомендации (по крайней мере, по тактированию), можно будет приступить к рассмотрению вашей программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gorec_miki 0 29 мая, 2010 Опубликовано 29 мая, 2010 · Жалоба LPT порт 0x378 Пин Бит Имя сигнала X2: 0 DIN X3: 1 RESET X4: 2 CS X5: 3 SCLK X6: 4 ---- X7: 5 ---- X8: 6 ---- X9: 7 Питание цифровой части АЦП назвал BUFF LPT порт 0x379 Пин Бит Имя сигнала X10 6 DRDY X13 4 DOUT Остальные не используются (первые три бита порта 0x379 всё время=0) Устройство у меня заводское. Может схема тут изображена не совсем верно, так как вытащена из дипломной работы, но вроде верно. Можно проверить тут: Документация АЦП соединён только через LPT. Раньше был блок питания, но его сняли и с заводской программой схема всё равно работает и выводит результаты на экран. Смесь разнотипной логики объяснить не могу, так как эта схема от Analog Devices А вот на счёт тактирования я не совсем понял. Я думал, что тактирующие импульсы нужны только для АЦП. А как реализовать для LPT порта не имею представления....Я просто проверяю значение на порте 0x379 когда идёт тактирование при чтении с АЦП. При каждом такте(понижение и повышения уровня на SCLK) я проверяю значение. Разве это не одно и тоже ведь проверка идёт синхронно с импульсами которые идут на АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gorec_miki 0 29 мая, 2010 Опубликовано 29 мая, 2010 (изменено) · Жалоба Заметил ошибку, когда вписывал код в форум: void write(void) {for(s=4;s<8;s++) sclkOut(data,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 Вместо "8" там "4" Вместо "3" там "s" Программа всё равно работает не верно... Изменено 29 мая, 2010 пользователем gorec_miki Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Один вопрос - что такое _Out32? Я так понимаю, что это из какого то драйвера. Вы его не забыли проинициализировать? И один совет - RTFM по поводу логических и битовых операций. Массивы data[] fHZ[] и пр - это жесть, не надо так делать! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvs157 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба У Вас операционная система какая? Windows NT-2K-XP-Vista-7 или MSDOS-Win95-win98-Milenium? Если первые - то прямой доступ к LPT системой запрещен. Если хотите управлять ногами LPT - то нужен специальный драйвер. http://logix4u.net/Legacy_Ports/Parallel_P...2000/NT/XP.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба ИМХО изначыльно "бег в мешке". Куда проще AD7705 + МК с UART + преобразователь ТТЛ в RS232 далее в PC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 23 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба ИМХО изначыльно "бег в мешке". Ну почему, всего-то написать вменяемую процедуру отправки и приёма байта по SPI через параллельный порт. Дальше можно уже обсуждать по теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sysmaster 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба ИМХО изначыльно "бег в мешке". Куда проще AD7705 + МК с UART + преобразователь ТТЛ в RS232 далее в PC. Вообщето на сайте AD есть программы и схемы отладочных плат для аналогичных ацп с подключением по LPT.Сам начинал с тестирования ad7719 под LPT до подключения к микроконтроллеру.Хотя бы схему оттуда передерите чтоб на неё не грешить. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gorec_miki 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Ребята всем спасибо, задачу я выполнил!) Для LPT использую inpout32.dll и тут всё работает. Но возник новый вопрос...Когда я начал снимать данные, то у меня, как и в заводской программе, максимальное значение из регистра АЦП data соответствовало минимальному значению напряжения на потенциометре. Например 1B=31200, 5B=23044. А я думал, что 0В=00000, 0,1В=00123, 5В=12003 и т.д. Т.е. чем больше напряжение на потенциометре, с которого мы измеряем, то тем больше и результат, а не наоборот. Почему так происходит?(в заводской так же) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться