|
ADUC824 + AD7734 как начать, Вопрос чайника, программирование ADUC824 |
|
|
|
Jun 1 2009, 03:24
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-06
Пользователь №: 22 340

|
Здравствуйте уважаемые. Я новичек в области программирования железа помогите плизз. Есть отладочная плата для АЦП AD7734, EVAL-AD7734, задача получать данные через RS-232 значения с 4ех каналов AD7734. Хочу программировать ADUC824 для получения этих данных. Скачал keil установил , взял пример HELLO, залил Код #ifndef MONITOR51 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */ #endif while (1) { P1 ^= 0x01; /* Toggle P1.0 each time we print */ printf ("Hello world\n"); /* Print "Hello World" */ } } но вместо ожидаемого Hello world, получаю в ASCII <NUL>?<NUL>?<NUL>?<NUL>?<NUL>?<NUL>........, в hex это выглядит как 3F 00 3F 00 3F 00 3F 00 3F 00....... как тут все работает? может покажите как надо?
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Jun 5 2009, 04:30
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-06
Пользователь №: 22 340

|
Разобрался с UART портом, не правильно выбирал частоту. Теперь проблема с передачей по SPI общение с AD7734, в датащите написано...что для передачи и приема данных используется SPIDAT, а флагом о приходе или отправке данных является ISPI, пишу так: Код void G (unsigned char n) { unsigned char i; SPE=1; SPIDAT=n; while(ISPI==0); i=SPIDAT; printf("%d",i); SPE=0; } В программе пишу: Код // CONFIGURE SPI... ISPI=0; // set at the end of SPI transfer WCOL=0; // collision error SPE =1; // SPI enable now SPIM=1; // MASTER MODE CPHA=1; // CLOCK PHASE SELECT both are 1 CPOL=1; // CLOCK POLARITY / for mode 3 SPR1=1; // 1 + 1 so Fosc/64 SPR0=0; //
G(0x38);G(0x42); //обращение к mode регистру, установка Single conversion mode G(0x08); // обращение к каналу данных В ответ получаю значения -256, не понятное число что и как проверить что это может означать?
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Jun 5 2009, 14:28
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-06-07
Из: Moscow
Пользователь №: 28 532

|
Цитата(FAUSTddd @ Jun 5 2009, 08:30)  G(0x38);G(0x42); //обращение к mode регистру, установка Single conversion mode G(0x08); // обращение к каналу данных[/code]
В ответ получаю значения -256, не понятное число что и как проверить что это может означать? насколько я помню, для этого АЦП нужно дождаться сигнала RDY, а уж потом читать данные, получаете вы 0xFF на линии SPI_MISO - единичка там висит и не меняется.
|
|
|
|
|
Jun 5 2009, 15:10
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(FAUSTddd @ Jun 5 2009, 07:30)  Код ..... G(0x38);G(0x42); //обращение к mode регистру, установка Single conversion mode G(0x08); // обращение к каналу данных В ответ получаю значения -256, не понятное число что и как проверить что это может означать? 1. На ноге CS АЦП должен быть низкий уровень - проверьте 2. После вывода G(0x38);G(0x42); нужно дождаться низкого уровня на RDY (как правильно сказал mems)
3. После этого необходимо передать G( 0x48); - чтение ведь!
4. Дальше нужно читать (в Вашем случае 3) байты data registers Всё это хорошо показано на рисунке 17 в документации на АЦП
|
|
|
|
|
Jun 8 2009, 04:03
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-06
Пользователь №: 22 340

|
Цитата(Палыч @ Jun 5 2009, 21:10)  1. На ноге CS АЦП должен быть низкий уровень - проверьте 2. После вывода G(0x38);G(0x42); нужно дождаться низкого уровня на RDY (как правильно сказал mems) 3. После этого необходимо передать G(0x48); - чтение ведь! 4. Дальше нужно читать (в Вашем случае 3) байты data registers
Всё это хорошо показано на рисунке 17 в документации на АЦП Спасибо за ответ!!! Ага вот только пришел на работу нашел этот рисунок. 1. CS Уровень высокий, к ADUC прикручен на ногу P3.5/T1, как понизить уровень?
|
|
|
|
|
Jun 8 2009, 04:46
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112

|
Цитата(FAUSTddd @ Jun 8 2009, 10:03)  Ага вот только пришел на работу нашел этот рисунок. 1. CS Уровень высокий, к ADUC прикручен на ногу P3.5/T1, как понизить уровень? Почитать датошыт. Про назначение ног и конфигурирование функции данной ноги - она должна быть запрграммирована как выход порта, а потом на неё дожно подать логический нолик.
|
|
|
|
|
Jun 8 2009, 09:10
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-06
Пользователь №: 22 340

|
T1=0; G(0x38); /* запрос на запись в регистр режима*/ G(0x42); /* запись в регистр режима (однократное преобразование - 24 бита)*/ G(0x48); /* запрос на чтение их регистра данных */ while (WR); /* ждём готовности данных */
G(0x00); G(0x00); G(0x00); /* читаем данные */
Вроде так как все описано, чета не встает, готовности данных нету, осциллограф показывает, при одном reset высокое значение, при следующем нажатии низкое.
|
|
|
|
|
Jun 8 2009, 11:33
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-06-07
Из: Moscow
Пользователь №: 28 532

|
Цитата(FAUSTddd @ Jun 8 2009, 13:10)  Вроде так как все описано, чета не встает, готовности данных нету, осциллограф показывает, при одном reset высокое значение, при следующем нажатии низкое. нужно сначала дождаться готовности данных, а потом давать запрос на чтение! G(0x42); /* запись в регистр режима (однократное преобразование - 24 бита)*/ while (WR); /* ждём готовности данных */ G(0x48); /* запрос на чтение их регистра данных */
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Nov 18 2010, 04:11
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-06
Пользователь №: 22 340

|
Здравствуйте уважаемые !!!
ADUC824+ad7734 работает на ура. Но столкнулся с еще одной проблемой, поэтому решил продолжить тему. Сейчас задача такая, есть три канала на AD7734, нужна частота 1Кгц.
осуществляю так: скорость передачи через уарт делаю максимальной 57600. отключаю chop, время преобразования на АЦП уменьшаю до минимума 65мкс. выставляю сингл режим на 1 канал АЦП запрашиваю-получаю полученные данные, отправляю по com-port делаю на следующие 2а канала тоже самое, т.е. последовательно.
в итоге дискретизация получаетсяя 2мс, итого 800гц/5=160гц. а надо 1Кгц
т.е. как я понимаю основное время тратится на передачу данных как это обойти?
|
|
|
|
|
Nov 22 2010, 06:55
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Цитата(FAUSTddd @ Nov 18 2010, 07:11)  Здравствуйте уважаемые !!!
ADUC824+ad7734 работает на ура. Но столкнулся с еще одной проблемой, поэтому решил продолжить тему. Сейчас задача такая, есть три канала на AD7734, нужна частота 1Кгц.
в итоге дискретизация получаетсяя 2мс, итого 800гц/5=160гц. а надо 1Кгц
т.е. как я понимаю основное время тратится на передачу данных как это обойти? Что такое 800/5 не понял. Если Вы передаете по ком-порту 3х-байтные слова * 3канала, то минимально-требуемая скорость такая: 1000*3*3*10=90000 бит/с. Но это не учитывая задержки на подготовку байтов, оцифровку и чтение АЦП. Но скорее всего скорости 115200 хватит если передачу данных и оцифровку делать параллельно (через прерывания). И скорей всего без небольшого буфера не обойтись. Обойти никак.
|
|
|
|
|
Nov 22 2010, 12:06
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-06
Пользователь №: 22 340

|
800гц это максимальная частота, но чтобы отрисовать синусоиду нужно в пять раз больше данных, в общем чтобы отрисовать кривую типа синусоида, нужно 5 точек за период. скорость передачи через уарт делаю максимальной 57600. т.е. 115200 было бы дак хватило. Цитата И скорей всего без небольшого буфера не обойтись. как это реализовать?
|
|
|
|
|
Nov 22 2010, 14:54
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Цитата(FAUSTddd @ Nov 22 2010, 15:06)  800гц это максимальная частота, но чтобы отрисовать синусоиду нужно в пять раз больше данных, в общем чтобы отрисовать кривую типа синусоида, нужно 5 точек за период. скорость передачи через уарт делаю максимальной 57600. т.е. 115200 было бы дак хватило.
как это реализовать? Тогда расчет не верный. Если нужно отрисовать синус частотой 800Гц нужно иметь 800*5=4000 частоту отсчетов, тогда на один канал нужно 4000*3*10=120000 бит/с. А что больше 57600 никак? Помню на х51 контроллере и usb-com переходнике делал 230кБит/с. Реализовать можно на циклическом буфере- самый гибкий вариант, в сети можно найти алгоритмы. Либо сделать буфер-качели -т.е два одинаковых буфера, пока АЦП пишет во второй буфер, из первого читаете и пересылаете в уарт, потом буфера меняются местами: АЦП пишет в первый, а вы читаете из второго. И т.д.
|
|
|
|
|
Nov 23 2010, 11:40
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-06
Пользователь №: 22 340

|
Вообще тут ограничение у Адука на уарте пишут что 57600 максимум. насчет переходника еще не пробывал. но выставлять ведь как-то надо программно а там таймеры.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|