Уже наверно поднадоел, но хочется чтоб всё же схема заработала.....
Исправил я программу. Инициализация проходит точно. Если до инициализации значение на порте 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 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.
А потом я их уже представлю ввиде нормальных значений)