реклама на сайте
подробности

 
 
> Микросхема AD7705 подсоединенная через LPT порт, Написание программы управления микросхемой для измерения напряжений.
gorec_miki
сообщение May 28 2010, 21:56
Сообщение #1





Группа: Участник
Сообщений: 4
Регистрация: 28-05-10
Пользователь №: 57 604



Здравствуйте форумчане. Я тут новичёк, по этому пишу в этом форуме) Надеюсь, что вы дадите мне ответ)
У меня есть АЦП на микросхеме 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.
А потом я их уже представлю ввиде нормальных значений)
Спасибо что дочитали до конца!) Надеюсь и ответы будут))
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение May 28 2010, 23:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Не обращая внимание на исходник? хотелось бы вначале понять схемотехнику вашего устройства и ошибки, которые она содержит.
Во-первых, нужно давать имена сигналам выведенным на разъемы. А частности это касается разъема LPT-порта. Чтобы понять правильность схемы требуется морщить лоб, вспоминая цоколевку этого разъема, или лезть за "справочником".
Во-вторых, поясните, от какого напряжения питания у вас запитан АЦП и для чего потребовалась такая смесь разнотипной логики? Если АЦП питается от 3В (AVdd это внешнее питание?), то для согласования уровней было бы достаточно одной 74HC244, запитанной от этого же напряжения. В крайнем случае две 74HC244 последовательно, первая от такого же напряжения что и АЦП, вторая от LPT-порта или от внешних 5В. И в первом и во втором случае требуются согласующие резисторы. В первом случае между входами/выходами 74HC244 и LPT-портом, во втором - между сигнальными выводами обеих м/с. Следует отметить, что современные интерфейсные м/с LPT-портов вполне нормально воспринимают сигналы 3В уровня, т.к. их собственные входные уровни TTLV. (VIN(H)>=2В).
В-третьих, реализуя синхронный интерфейс посредством "ногодрыгания" LPT-порта не следует забывать о буферизации потоков в самой ОС на ПК. Чтобы избежать влияния многочисленных программных буферов, следует выходной тактирующий сигнал (SCLK) ввести обратно в LPT-порт и считывать состояние на линии DOUT синхронно с его изменением уже на входе LPT-порта. Т.е. сигнал SCLK для АЦП один, а для ПК (LPT-порта) - два: один выходной, которым тактируются данные синхронного интерфейса АЦП, второй - входной, дублирующий сигнал на входе SCLK АЦП, своего рода loopback.
После того, как вы реализуете рекомендации (по крайней мере, по тактированию), можно будет приступить к рассмотрению вашей программы.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01357 секунд с 7
ELECTRONIX ©2004-2016