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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> ADUC824 + AD7734 как начать, Вопрос чайника, программирование ADUC824
FAUSTddd
сообщение Jun 1 2009, 03:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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.......
как тут все работает? может покажите как надо?
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
FAUSTddd
сообщение Jun 5 2009, 04:30
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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, не понятное число что и как проверить что это может означать?
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
mems
сообщение Jun 5 2009, 14:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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 - единичка там висит и не меняется.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 5 2009, 15:10
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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 в документации на АЦП
Go to the top of the page
 
+Quote Post
FAUSTddd
сообщение Jun 8 2009, 04:03
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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, как понизить уровень?
Go to the top of the page
 
+Quote Post
forever failure
сообщение Jun 8 2009, 04:46
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Цитата(FAUSTddd @ Jun 8 2009, 10:03) *
Ага вот только пришел на работу нашел этот рисунок.
1. CS Уровень высокий, к ADUC прикручен на ногу P3.5/T1, как понизить уровень?

Почитать датошыт. Про назначение ног и конфигурирование функции данной ноги - она должна быть запрграммирована как выход порта, а потом на неё дожно подать логический нолик.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 8 2009, 05:52
Сообщение #7


Гуру
******

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



Цитата(FAUSTddd @ Jun 8 2009, 07:03) *
CS Уровень высокий, к ADUC прикручен на ногу P3.5/T1, как понизить уровень?
Я Вам - удивляюсь... Понимаю, что - начинающий, но с этим разобраться то, наверное, могли бы...
P3.5= 0;
Go to the top of the page
 
+Quote Post
FAUSTddd
сообщение Jun 8 2009, 09:10
Сообщение #8


Участник
*

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



T1=0;
G(0x38); /* запрос на запись в регистр режима*/
G(0x42); /* запись  в регистр режима (однократное преобразование - 24 бита)*/
G(0x48); /* запрос на чтение их регистра данных */
while (WR); /* ждём готовности данных */

G(0x00); G(0x00); G(0x00); /* читаем данные */

Вроде так как все описано, чета не встает, готовности данных нету, осциллограф показывает, при одном reset высокое значение, при следующем нажатии низкое.
Go to the top of the page
 
+Quote Post
mems
сообщение Jun 8 2009, 11:33
Сообщение #9


Участник
*

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



Цитата(FAUSTddd @ Jun 8 2009, 13:10) *
Вроде так как все описано, чета не встает, готовности данных нету, осциллограф показывает, при одном reset высокое значение, при следующем нажатии низкое.

нужно сначала дождаться готовности данных, а потом давать запрос на чтение!

G(0x42); /* запись в регистр режима (однократное преобразование - 24 бита)*/
while (WR); /* ждём готовности данных */
G(0x48); /* запрос на чтение их регистра данных */
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 8 2009, 14:48
Сообщение #10


Гуру
******

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



1. Хорошо бы перед началом работы с АЦП его сбросить. Кстати, нога RESET АЦП куда подключена - к VDD? Тогда сброс осуществляется передачей нулевого байта, а затем 4-х байт FF.
2. Убедиться, что SPI настроен правильно. Сам я с ADUCами не работаю - проверить правильность настроек SPI не могу. Найдите в документации на ADUC что-то подобное рис. 2 и 3 из документации на АЦП. Сравните их. Убедитесь, что при Ваших настройках SPI данные выставлены на линии при перепаде на SCLK из низкого в высокий уровень.
3. Потренируйтесь в работе с АЦП "на кошечках". Сделайте программу, которая надёжно читает какой-либо "безопасный" регистр АЦП - например, Revision. Когда это получится приступайте к написанию программы измерений.
Go to the top of the page
 
+Quote Post
FAUSTddd
сообщение Nov 18 2010, 04:11
Сообщение #11


Участник
*

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



Здравствуйте уважаемые !!!

ADUC824+ad7734 работает на ура. Но столкнулся с еще одной проблемой, поэтому решил продолжить тему.
Сейчас задача такая, есть три канала на AD7734, нужна частота 1Кгц.

осуществляю так:
скорость передачи через уарт делаю максимальной 57600.
отключаю chop, время преобразования на АЦП уменьшаю до минимума 65мкс.
выставляю сингл режим на 1 канал АЦП запрашиваю-получаю полученные данные, отправляю по com-port
делаю на следующие 2а канала тоже самое, т.е. последовательно.

в итоге дискретизация получаетсяя 2мс, итого 800гц/5=160гц. а надо 1Кгц

т.е. как я понимаю основное время тратится на передачу данных как это обойти?
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Nov 22 2010, 06:55
Сообщение #12


Практикующий маг
******

Группа: Свой
Сообщений: 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 хватит если передачу данных и оцифровку делать параллельно (через прерывания). И скорей всего без небольшого буфера не обойтись.

Обойти никак.
Go to the top of the page
 
+Quote Post
FAUSTddd
сообщение Nov 22 2010, 12:06
Сообщение #13


Участник
*

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



800гц это максимальная частота, но чтобы отрисовать синусоиду нужно в пять раз больше данных, в общем чтобы отрисовать кривую типа синусоида, нужно 5 точек за период. скорость передачи через уарт делаю максимальной 57600. т.е. 115200 было бы дак хватило.

Цитата
И скорей всего без небольшого буфера не обойтись.

как это реализовать?
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Nov 22 2010, 14:54
Сообщение #14


Практикующий маг
******

Группа: Свой
Сообщений: 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кБит/с.

Реализовать можно на циклическом буфере- самый гибкий вариант, в сети можно найти алгоритмы. Либо сделать буфер-качели -т.е два одинаковых буфера, пока АЦП пишет во второй буфер, из первого читаете и пересылаете в уарт, потом буфера меняются местами: АЦП пишет в первый, а вы читаете из второго. И т.д.
Go to the top of the page
 
+Quote Post
FAUSTddd
сообщение Nov 23 2010, 11:40
Сообщение #15


Участник
*

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



Вообще тут ограничение у Адука на уарте пишут что 57600 максимум. насчет переходника еще не пробывал. но выставлять ведь как-то надо программно а там таймеры.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 06:58
Рейтинг@Mail.ru


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