Я не уверен, но по моему, ожидание отправки байта происходит,
а после окончания отправки группы байт бит 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;
но это тоже навряд ли повлияет.