Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADUC824 + AD7734 как начать
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
FAUSTddd
Здравствуйте уважаемые. Я новичек в области программирования железа помогите плизз.
Есть отладочная плата для АЦП 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.......
как тут все работает? может покажите как надо?
FAUSTddd
Разобрался с 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, не понятное число что и как проверить что это может означать?
mems
Цитата(FAUSTddd @ Jun 5 2009, 08:30) *
G(0x38);G(0x42); //обращение к mode регистру, установка Single conversion mode
G(0x08); // обращение к каналу данных[/code]

В ответ получаю значения -256, не понятное число что и как проверить что это может означать?

насколько я помню, для этого АЦП нужно дождаться сигнала RDY, а уж потом читать данные, получаете вы 0xFF на линии SPI_MISO - единичка там висит и не меняется.
Палыч
Цитата(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 в документации на АЦП
FAUSTddd
Цитата(Палыч @ 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, как понизить уровень?
forever failure
Цитата(FAUSTddd @ Jun 8 2009, 10:03) *
Ага вот только пришел на работу нашел этот рисунок.
1. CS Уровень высокий, к ADUC прикручен на ногу P3.5/T1, как понизить уровень?

Почитать датошыт. Про назначение ног и конфигурирование функции данной ноги - она должна быть запрграммирована как выход порта, а потом на неё дожно подать логический нолик.
Палыч
Цитата(FAUSTddd @ Jun 8 2009, 07:03) *
CS Уровень высокий, к ADUC прикручен на ногу P3.5/T1, как понизить уровень?
Я Вам - удивляюсь... Понимаю, что - начинающий, но с этим разобраться то, наверное, могли бы...
P3.5= 0;
FAUSTddd
T1=0;
G(0x38); /* запрос на запись в регистр режима*/
G(0x42); /* запись  в регистр режима (однократное преобразование - 24 бита)*/
G(0x48); /* запрос на чтение их регистра данных */
while (WR); /* ждём готовности данных */

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

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

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

G(0x42); /* запись в регистр режима (однократное преобразование - 24 бита)*/
while (WR); /* ждём готовности данных */
G(0x48); /* запрос на чтение их регистра данных */
Палыч
1. Хорошо бы перед началом работы с АЦП его сбросить. Кстати, нога RESET АЦП куда подключена - к VDD? Тогда сброс осуществляется передачей нулевого байта, а затем 4-х байт FF.
2. Убедиться, что SPI настроен правильно. Сам я с ADUCами не работаю - проверить правильность настроек SPI не могу. Найдите в документации на ADUC что-то подобное рис. 2 и 3 из документации на АЦП. Сравните их. Убедитесь, что при Ваших настройках SPI данные выставлены на линии при перепаде на SCLK из низкого в высокий уровень.
3. Потренируйтесь в работе с АЦП "на кошечках". Сделайте программу, которая надёжно читает какой-либо "безопасный" регистр АЦП - например, Revision. Когда это получится приступайте к написанию программы измерений.
FAUSTddd
Здравствуйте уважаемые !!!

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

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

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

т.е. как я понимаю основное время тратится на передачу данных как это обойти?
Alexashka
Цитата(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 хватит если передачу данных и оцифровку делать параллельно (через прерывания). И скорей всего без небольшого буфера не обойтись.

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

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

как это реализовать?
Alexashka
Цитата(FAUSTddd @ Nov 22 2010, 15:06) *
800гц это максимальная частота, но чтобы отрисовать синусоиду нужно в пять раз больше данных, в общем чтобы отрисовать кривую типа синусоида, нужно 5 точек за период. скорость передачи через уарт делаю максимальной 57600. т.е. 115200 было бы дак хватило.


как это реализовать?

Тогда расчет не верный. Если нужно отрисовать синус частотой 800Гц нужно иметь 800*5=4000 частоту отсчетов, тогда на один канал нужно 4000*3*10=120000 бит/с.
А что больше 57600 никак? Помню на х51 контроллере и usb-com переходнике делал 230кБит/с.

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

Чтото не видел я такого ограничения в УАРТе.
задействуйте второй таймер и поставьте кварц с частотой кратной 115200*32, например 11,0592МГц. И можете полуычить вплоть до 230кБит (режим 1 или 3).
FAUSTddd
Еще возник вопрос- почемуто при отправке 0А через уарт на компе получаю 0D 0A?

Цитата
Чтото не видел я такого ограничения в УАРТе.

Какая максимальная скорость передачи может быть достигнута UART ADuC824?
Ответ: Максимальная скорость передачи ADuC824 составляет 393 Кбод. В единицах скорости
передачи ПК (целочисленное деление 115200) максимальная скорость передачи равна
57600 бод. Она достигается очисткой бита CD в регистре PLLCON и использованием
значений –1 и –7 в регистрах RCAP2H и RCAP2L, соответственно.
Цитата
Какой у Вас кварц? При 11059200Гц, можно передавать на 230400 бод. Или Вы имели ввиду, что этой скорости хватит для передачи вашего потока?

какой имеется ввиду кварц? адука или АЦП
Цитата
Попробуйте сначала запустить следующее преобразование, а в это время работать на вывод.
попробую
diglook
Извините может я неправ
Цитата
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

ih_
Цитата(FAUSTddd @ Nov 29 2010, 14:30) *
какой имеется ввиду кварц? адука или АЦП
ADUCа, мы же разбираем UART. Скорость может быть более 230 кбод (при 11.05092 Мгц кварце).
Цитата
Еще возник вопрос- почемуто при отправке 0А через уарт на компе получаю 0D 0A?
Проверьте отсутствие стоп-бита.
FAUSTddd
т.е. Watch crystal 32кГц поменять на кристалл 11Мгц? нужен четко 11.05092? и какой кварц его вид имеет значение или какие-то его параметры

а где проверить? в настройках приемной проги написано, стоп бит 1.
forever failure
Тут автор видимо не упомянул, что согласно даташиту сабжевый контроллер имеет на борту ПЛЛку и делитель частоты, и наружу у него торчат ноги для поключения _часового_ кварца (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; /* ошибка обнаружена */
FAUSTddd
Т.е. нельзя подрубить другой кристал?
пробывал проверить ошибки, ошибок нету, пользуюсь Ткомпорт компанентой делфи, проверяю так...

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

}    //}

}}


текст всей проги
Alexashka
Цитата(FAUSTddd @ Nov 29 2010, 14:30) *
Еще возник вопрос- почемуто при отправке 0А через уарт на компе получаю 0D 0A?

Видимо АДУК настолько умен что сам добавляет код возврата каретки (0D) biggrin.gif

Цитата(FAUSTddd @ Dec 1 2010, 17:16) *
Каким образом достигается скорость 230 кбод?

Вам же написали: 32768*3*128/115200/9 = 12,1362962963.

только ошибка великовата (11%) для ком-порта- боюсь комп ничего не будет принимать. Хотя если умножать на 127 (если это возможно, не помню уже способности PLL) то получилось бы почти ровно 12
forever failure
Цитата(Alexashka @ Dec 1 2010, 23:56) *
Видимо АДУК настолько умен что сам добавляет код возврата каретки (0D) biggrin.gif

ээээ.... То есть на адуке завелась новая форма жизни в виде искусственного интеллекта ?

Ну и про 9 бит - а принимающая сторона способна такую посылку проглотить ? Да и 11 % отклонения по скорости - эт пожалуй за пределами возможностей последовательного порта.

Но, если у автора принимающая программа крутится под виндой, есть ход конём на кривой кобыле: на адуке выставить нестандартное значение скорости, которое устраивает и на принимающей программе тоже в коде инициализации ком порта подставить полученное значение скорости.
ih_
Цитата(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%...
Экперимент все поставит на свои места smile.gif

Дополнения/рекомендации по Вашему коду:
- код "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")
FAUSTddd
#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
в общем поглядел на осциллографе посылку 0A. с уарта на провод компорта идет одна только 0A.
далее попробывал все программы которые мне известны для компорта (в том числе и гипертерменал от виндовс), все они выдают вместо 0A - 0D0A. грешу на драйвер компорта, не знаю в чем может быть прокол, подскажите плыззз.
ih_
Цитата(FAUSTddd @ Dec 7 2010, 14:12) *
...грешу на драйвер компорта, не знаю в чем может быть прокол, подскажите плыззз.
Вы внесли изменения в код?
XVR
Цитата(FAUSTddd @ Dec 7 2010, 14:12) *
в общем поглядел на осциллографе посылку 0A. с уарта на провод компорта идет одна только 0A.
Это правильно
Цитата
далее попробывал все программы которые мне известны для компорта (в том числе и гипертерменал от виндовс), все они выдают вместо 0A - 0D0A.
А это неправильно - это автоматическое преобразование символов 'конец строки'. Есть во всех терминалах (и включено по умолчанию), и может быть выключенно во всех вменяемых терминалах
Цитата
грешу на драйвер компорта, не знаю в чем может быть прокол, подскажите плыззз.
Драйвер не при чем, а вот ваш компонент на РС вполне может заниматься аналогичным вредительством - преобразовывать '\n' в '\r\n' (или наоборот). Если у него есть ручки управления - выставите ему бинарный режим работы (у него похоже стоит текстовый).
ih_
Цитата(FAUSTddd @ Dec 7 2010, 14:12) *
в общем поглядел на осциллографе посылку 0A. с уарта на провод компорта идет одна только 0A. ... в чем может быть прокол, подскажите плыззз.
0xA=0b1010. Скажите сколько миллисекунд между единицами в символе? Попробуйте пересчитать в боды (бит/с). И убедиться, что передаваемая скорость не соотвествует ожиданиям принимающей стороны. Попробуйте изменить интервал таймера, согластно моим предыдущим рекомендациям. Если нужно продвигаться в решинии, то опишите результат.
FAUSTddd
Цитата
ih:
RCAP2H=-1;
RCAP2L=-27; //(теперь очень близко к 57600 бод)
TH2=-1;
TL2=-27;


Пробывал выставить не работает. вернее все стопорится и ничего не идет через уарт. Буду дальше мучать. Вопрос: на приемном компорте сколько битов выставлять, и какую скорость?

Насчет 0D0А выяснилось, всетаки с уарта шло 2а байта, выяснилось путем пристального просмотра оссцилографа. Оказалось что проблема тревиальна и что putchar из библиотеки keil, добавляет этот 0D, решил проблему путем написания функции putchar и отказом от stdio.h.

ih_
Цитата(FAUSTddd @ Dec 10 2010, 10:24) *
Пробывал выставить не работает. вернее все стопорится и ничего не идет через уарт. Буду дальше мучать.
Извините, но мне не верится, что уменьшение скорости передачи приводит к ее останову
Цитата(FAUSTddd @ Dec 10 2010, 10:24) *
Вопрос: на приемном компорте сколько битов выставлять, и какую скорость?
Если не меняли инициализацию таймера, то "SCON=0x52" - это первый режим 8 бит. Скорость вычислите сами, формула была уже много раз.
Цитата(FAUSTddd @ Dec 10 2010, 10:24) *
Насчет 0D0А выяснилось, всетаки с уарта шло 2а байта, выяснилось путем пристального просмотра оссцилографа. Оказалось что проблема тревиальна и что putchar из библиотеки keil, добавляет этот 0D, решил проблему путем написания функции putchar и отказом от stdio.h.
Пристальность это хороше качество.
FAUSTddd
Добрый день уважаемые!
в общем решил бросить возиться со скоростью Уарта. Тогда получается другой выход работа с памятью, на Eval7734 есть 32кб внешней памяти, впринцыпе мало но расширяется до 16МБ.

Подскажите пожалуйста как с ней работать, с 32Кб. еепром освоил все просто а внешнюю ну никак не могу, не могу найти откуда ноги ростут. можно кусок кода для примера?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.