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

 
 
> проблема с уарт Mega64, атипичная проблема с передачей по UART
CrazyAlex
сообщение Jun 4 2007, 06:45
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 57
Регистрация: 11-01-05
Из: Пермь
Пользователь №: 1 881



не могу понять в чем дело:

устройство: Мега->485->Adam->PC

софт: iccAVR6.31a, AVRstudio, jtag ice mk2 (не совсем софт), на PC самописный модбас-мастер (проверен временем), а также терминалка.

протокол модбас RTU, чтение регистров (03) идет на ура, запись (06) в регистр значение 511 - все отвечает правильно. запись значения 512 - вместо ответа какая-то хрень, число байт хрени совпадает с числом байт в ответе. причем эта самая хрень каждый раз разная. хотя запрос один и тот же.

смотрю в авр студии.
пакет приходит, регистр меняется на нужное значение, формируется в буферном массиве frame1 ответ (правильный ответ).
Портится на этапе UDR1=frame1[0], UDR1=frame1[outbytecnt]. т.е. в UDR1 или пишется что-то не то, или в нем самом портится..., т.е. PC принимает совсем не то что я записываю в UDR.
Если поставить точку останова на UDR1=frame1[0], и потом по шагам, то все отвечает нормально.

Исходники прилагаю.

Уже мозг сломал. Подскажите кто-нибудь где копать???
Прикрепленные файлы
Прикрепленный файл  m64uart.ZIP ( 14.07 килобайт ) Кол-во скачиваний: 48
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Laksus
сообщение Jun 6 2007, 05:19
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Я не уверен, но по моему, ожидание отправки байта происходит,
а после окончания отправки группы байт бит TXC вроде-бы остается сброшен.
Да и если бы проблема была в отсутствии ожидания,
то число байт, наверное, отличалось бы от ожидаемого.

Хотя я бы для отправки байтов использовал прерывание UDRE,
а TXC для отключения передатчика, но, по моему, должно работать и так.
______________________

Я глубоко конечно не разбирался, но первая мысль при чтении
Цитата
причем эта самая хрень каждый раз разная. хотя запрос один и тот же.

А не результат ли это работы АЦП? Типа какой-нибудь шум, наводки.

И еще, а Вы пробовали делать ресет. А потом посылать запросы.
То есть, отличаются ли первые, вторые и тд ответы после сброса,
или только первый от второго, второй от третьего (после сброса)?
_________________________________________
Общий совет - надо упрощать пока не пропадет ошибка.
Если Вы, автор, не разберетесь, то постороннему тем-более трудно.


============================================================

Это не по теме, но может Вам будет интересно.
-----------------------------------------------------------

Код
93:        unsigned int tmp=0;
+00000474:   24AA        CLR     R10              Clear Register
+00000475:   24BB        CLR     R11              Clear Register
97:        tmp=ADCL;            //Read 8 low bits first (important)
+00000476:   B0A4        IN      R10,0x04         In from I/O location
+00000477:   24BB        CLR     R11              Clear Register
98:        tmp|=(int)ADCH << 8; //read 2 high bits and shift into top byte
+00000478:   B025        IN      R2,0x05          In from I/O location
+00000479:   2433        CLR     R3               Clear Register
+0000047A:   2C32        MOV     R3,R2            Copy register
+0000047B:   2422        CLR     R2               Clear Register
+0000047C:   28A2        OR      R10,R2           Logical OR
+0000047D:   28B3        OR      R11,R3           Logical OR
100:       sum[adc]=sum[adc]-(sum[adc]>>8)+tmp;

Это, конечно, не ошибка

но, по моему, так красивше
Код
93:        unsigned int tmp=0;
+00000474:   24AA        CLR     R10              Clear Register
+00000475:   24BB        CLR     R11              Clear Register
99:        tmp= ADC;/// А нормальный компилятор должен знать порядок чтения байт
+00000476:   B0A4        IN      R10,0x04         In from I/O location
+00000477:   B0B5        IN      R11,0x05         In from I/O location
100:       sum[adc]=sum[adc]-(sum[adc]>>8)+tmp;

============================================================
И еще, в
Код
unsigned int crc16(void *ptr,unsigned int n)


Код
return ((crcl<<8)|crch);

может надо так?
Код
return ((crch<<8)|crcl);


============================================================
Совершенно мне не ясно, что получим в результате
Код
sum[adc]=sum[adc]-(sum[adc]>>8)+tmp;

но это тоже навряд ли повлияет.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:07
Рейтинг@Mail.ru


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