|
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....... как тут все работает? может покажите как надо?
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Nov 23 2010, 13:00
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422

|
Приветсвую Вас. Есть к FAUSTddd дополнительные вопросы. Цитата(FAUSTddd @ Nov 18 2010, 07:11)  ...осуществляю так: скорость передачи через уарт делаю максимальной 57600. Какой у Вас кварц? При 11059200Гц, можно передавать на 230400 бод. Или Вы имели ввиду, что этой скорости хватит для передачи вашего потока? Цитата отключаю chop, время преобразования на АЦП уменьшаю до минимума 65мкс. выставляю сингл режим на 1 канал АЦП запрашиваю-получаю полученные данные, отправляю по com-port Попробуйте сначала запустить следующее преобразование, а в это время работать на вывод. Цитата в итоге дискретизация получаетсяя 2мс, итого 800гц/5=160гц. а надо 1Кгц Промеряйте все времена по этапам обработки. Должно все быстро быть.
|
|
|
|
|
Nov 29 2010, 11:30
|
Участник

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

|
Еще возник вопрос- почемуто при отправке 0А через уарт на компе получаю 0D 0A? Цитата Чтото не видел я такого ограничения в УАРТе. Какая максимальная скорость передачи может быть достигнута UART ADuC824? Ответ: Максимальная скорость передачи ADuC824 составляет 393 Кбод. В единицах скорости передачи ПК (целочисленное деление 115200) максимальная скорость передачи равна 57600 бод. Она достигается очисткой бита CD в регистре PLLCON и использованием значений –1 и –7 в регистрах RCAP2H и RCAP2L, соответственно. Цитата Какой у Вас кварц? При 11059200Гц, можно передавать на 230400 бод. Или Вы имели ввиду, что этой скорости хватит для передачи вашего потока? какой имеется ввиду кварц? адука или АЦП Цитата Попробуйте сначала запустить следующее преобразование, а в это время работать на вывод. попробую
Сообщение отредактировал FAUSTddd - Nov 29 2010, 11:58
|
|
|
|
|
Nov 30 2010, 17:15
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 29-06-09
Пользователь №: 50 730

|
Извините может я неправ Цитата 800гц/5=160гц. а надо 1Кгц но в даташите Optimized for fast channel switching - 18-bit p-p resolution (21 bits effective) at 500 Hz - 16-bit p-p resolution (19 bits effective) at 2 kHz - 14-bit p-p resolution (18 bits effective) at 15 kHz
|
|
|
|
|
Dec 1 2010, 06:45
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422

|
Цитата(FAUSTddd @ Nov 29 2010, 14:30)  какой имеется ввиду кварц? адука или АЦП ADUCа, мы же разбираем UART. Скорость может быть более 230 кбод (при 11.05092 Мгц кварце). Цитата Еще возник вопрос- почемуто при отправке 0А через уарт на компе получаю 0D 0A? Проверьте отсутствие стоп-бита.
Сообщение отредактировал ih_ - Dec 1 2010, 06:46
|
|
|
|
|
Dec 1 2010, 07:38
|
Участник

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

|
т.е. Watch crystal 32кГц поменять на кристалл 11Мгц? нужен четко 11.05092? и какой кварц его вид имеет значение или какие-то его параметры
а где проверить? в настройках приемной проги написано, стоп бит 1.
Сообщение отредактировал FAUSTddd - Dec 1 2010, 07:49
|
|
|
|
|
Dec 1 2010, 07:50
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112

|
Тут автор видимо не упомянул, что согласно даташиту сабжевый контроллер имеет на борту ПЛЛку и делитель частоты, и наружу у него торчат ноги для поключения _часового_ кварца (32768 Гц) и другие варианты выбора источника тактовой частоты не предусмотрены. Поэтому использовать кварц с частотой 11.05092 МГц весьма проблематично, если вообще возможно. Проверка ошибок фрейма/чётности/переполнения буфера в WinAPI: CODE bool frame_error = false; DWORD err; /* ... */ ReadFile (/*...*/); /* тут ваше чтение байта */ ClearCommError (handle, &err, 0); if (err & (CE_FRAME | CE_RXPARITY | CE_IOE | CE_OVERRUN)) frame_error = true; /* ошибка обнаружена */
|
|
|
|
|
Dec 1 2010, 09:58
|
Участник

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

|
Т.е. нельзя подрубить другой кристал? пробывал проверить ошибки, ошибок нету, пользуюсь Ткомпорт компанентой делфи, проверяю так... Код if Errors = [] then Exit; // inherited OnError(Errors); if ceFrame in Errors then Application.MessageBox('The hardware detected a framing error.', 'Îøèáêà', MB_ICONERROR+MB_OK); if ceOverrun in Errors then Application.MessageBox('A charachter buffer overrun has occured.'+#13+'The next charachter is lost.', 'Îøèáêà', MB_ICONERROR+MB_OK); if ceRxParity in Errors then Application.MessageBox('The hardware detected a parity error.', 'Îøèáêà', MB_ICONERROR+MB_OK); if ceBreak in Errors then Application.MessageBox('The hardware detected a break condition.', 'Îøèáêà', MB_ICONERROR+MB_OK); if ceIO in Errors then Application.MessageBox('An I/O error occured during communication with the device.', 'Îøèáêà', MB_ICONERROR+MB_OK); if ceMode in Errors then Application.MessageBox('The requested mode is not supported.', 'Îøèáêà', MB_ICONERROR+MB_OK); if ceRxOver in Errors then Application.MessageBox('An input buffer overflow has occured.', 'Îøèáêà', MB_ICONERROR+MB_OK); if ceTxFull in Errors then Application.MessageBox('The output buffer is full.', 'Îøèáêà', MB_ICONERROR+MB_OK); никаких ошибок нет Такое ощущение что порт сам его превращает, потому как на всех прогах, такая же ситуация добаляется OD когда идет ОА, как настроить можно компорт?
|
|
|
|
|
Dec 1 2010, 12:44
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422

|
Цитата(forever failure @ Dec 1 2010, 10:50)  Тут автор видимо не упомянул, что согласно даташиту сабжевый контроллер имеет на борту ПЛЛку и делитель частоты, и наружу у него торчат ноги для поключения _часового_ кварца (32768 Гц) и другие варианты выбора источника тактовой частоты не предусмотрены. Прошу прощения, что ввел автора в заблуждение. Кварц оставляем. Скорости более 230 кбод достижимы. И девяти битный режим как раз более предпочтителен, из-за меньшей ошибки на бит 32768*3*128/115200/9 = 12,1362962963. Цитата Такое ощущение что порт сам его превращает, потому как на всех прогах, такая же ситуация добаляется OD когда идет ОА, как настроить можно компорт? Попробуйте принять то, что отправляете. Возможно, если приведете код инициалицации PLL, UART и таймера под UART, что то пряснится. А еще лучше и код ПОП UART или код которым отправляете.
Сообщение отредактировал ih_ - Dec 1 2010, 12:48
|
|
|
|
|
Dec 1 2010, 14:16
|
Участник

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

|
Цитата Скорости более 230 кбод достижимы. И девяти битный режим как раз более предпочтителен, из-за меньшей ошибки на бит 32768*3*128/115200/9 = 12,1362962963. Каким образом достигается скорость 230 кбод? Код char G (unsigned char n) {
ISPI=0; SPIDAT=n; while(ISPI==0); return(SPIDAT); }
void main (void) {
#ifndef MONITOR51 unsigned int m,i; unsigned char c; ADCMODE=0x10; ADC1CON=0x20; PLLCON=0; RCAP2H=-1; RCAP2L=-7; //(достаточно близко к 57600 бод) TH2=0xFF; TL2=-7; SCON=0x52; T2CON=0x34; #endif // 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=0; // 1 + 1 so Fosc/64 SPR0=0; // T1=0; RI=0;
T0=0;T0=1;
G(0x30);G(0x82); G(0x31);G(0x82); G(0x32);G(0x82); G(0x33);G(0x82); P1 ^= 0x01; while(1){
if (RI) { while((c=getchar()) != '0') {G(0x38);G(0x3);RI=0;};
for (m=0;m<3;m++){ if (m==0) G(0x38); /* запрос на запись в регистр режима*/ if (m==1) G(0x39); if (m==2) G(0x3A); G(0x40); /* запись в регистр режима (однократное преобразование - 16 бита)*//* ждём готовности данных */ //G(0x42); /* запись в регистр режима (однократное преобразование - 24 бита)*//* ждём готовности данных */
while (INT1); if (m==0) G(0x48); if (m==1) G(0x49); /* запрос на чтение из регистра данных */ if (m==2) G(0x4A); putchar(G(0x00)); putchar(G(0x00));//putchar(G(0x00));
} //}
}} текст всей проги
Сообщение отредактировал FAUSTddd - Dec 1 2010, 15:26
|
|
|
|
|
Dec 2 2010, 04:47
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112

|
Цитата(Alexashka @ Dec 1 2010, 23:56)  Видимо АДУК настолько умен что сам добавляет код возврата каретки (0D)  ээээ.... То есть на адуке завелась новая форма жизни в виде искусственного интеллекта ? Ну и про 9 бит - а принимающая сторона способна такую посылку проглотить ? Да и 11 % отклонения по скорости - эт пожалуй за пределами возможностей последовательного порта. Но, если у автора принимающая программа крутится под виндой, есть ход конём на кривой кобыле: на адуке выставить нестандартное значение скорости, которое устраивает и на принимающей программе тоже в коде инициализации ком порта подставить полученное значение скорости.
|
|
|
|
|
Dec 2 2010, 06:34
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422

|
Цитата(FAUSTddd @ Dec 1 2010, 17:16)  текст всей проги Не совсем. А где putchar() и getchar()? Цитата Каким образом достигается скорость 230 кбод? Идея такая. Один отсчет таймера (TFx=1, в Вашем случае это TF2) - соответсвуйт 1 биту в порт UART. Формула CLK/baudRate/bits=TimerReloadValue, где: - CLK - частота на выходе PLL (у Вас 12582912 Гц, код "PLLCON=0"); - baudRate - Ваша скорость передачи; - bits - число бит на байт данных (у Вас 8 , код "SCON=0x52"); - TimerReloadValue - значение для перезагрузки таймера (у Вас 7, код "TL2=-7"). Пример расчета: 32768*3*128/115200/9 = 12,1362962963, где: - CLK=32768*3*128=12582912 Гц; - baudRate=115200 бод; - bits=9 бит; - TimerReloadValue=12 единиц. Цитата ...11%... Экперимент все поставит на свои места  Дополнения/рекомендации по Вашему коду: - код "SCON=0x52", заменить на "SCON=0x50", тк Вы устанавливаете биты RI и TI, а затем RI очищаете "RI=0"; - попробуйте отладить UART без SPI. Сейчас Вы отправляете в UART то, что принял SPI ("putchar(G(0x00));putchar(G(0x00))"), а принял он видимо "0x0D" и "0x0A". Из Вашего кода не видно, что Вы отправляете один байт "0x0A"; - инициалязация PLL. У Вас "PLLCON=0", попробуйте заменить на "PLLCON&=~0x43;while(!PLLCON|=0x40)". Надо проверять LOCK бит, иначе PLL дает частоту с большой погрешностью, видимо будут дополнительные проблемы. Цитата(из datasheet) In this mode, the PLL output can be 12.58MHz ± 20% - проверьте расчет перезагрузки таймера синхронизации UART (у Вас 7). А если подсчитать 32768*3*128/57600/8 = 27,307. Получаем 27. Замените Код RCAP2H=-1; RCAP2L=-7; //(достаточно близко к 57600 бод) TH2=0xFF; TL2=-7; на Код RCAP2H=-1; RCAP2L=-27; //(теперь очень близко к 57600 бод) TH2=-1; TL2=-27; Или -7 оставить, а снизить частоту PLL до 32768*3*32/57600/8 = 6,827 ("PLLCON=5")
Сообщение отредактировал ih_ - Dec 2 2010, 06:57
|
|
|
|
|
Dec 2 2010, 09:28
|
Участник

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

|
#include <aduc824.H> /* special function register declarations */ /* for the intended 8051 derivative */ #define XTAL 1572800 // CPU Oscillator Frequency
#include <stdio.h> /* prototype declarations for I/O functions */
#ifdef MONITOR51 /* Debugging with Monitor-51 needs */ char code reserve [3] _at_ 0x23; /* space for serial interrupt if */ #endif
это вся прога, путчары в конце. и их там 2а, теоретически там не может три байта прийти. Там скорее всего на компе както преобразуется, потому что приходит там нормально.
Спасибо попробую завтра на испытуемом.
Сообщение отредактировал FAUSTddd - Dec 2 2010, 09:50
|
|
|
|
|
Dec 7 2010, 11:12
|
Участник

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

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