Сверху вниз по порядку написания, а не по порядку важности. Всё в целом - отличное подтверждение мнения "чтобы резко улучшить качество программного обеспечения и уменьшить его размер, надо во всех текстовых редакторах убрать функцию COPY/PASTE.
Я бы первым делом написал что-то в духе
<c>
void USART_put_nibble(uint8_t n)
{
n += '0';
if( n > '9') n += ('A' - '9' - 10);
USART_Transmit( n );
}
void USART_put_u8(uint8_t b)
{
USART_put_nibble( b >> 4);
USART_put_nibble( b & 0x0F);
}
/* И так далее по потребности, и не копипастил бы эти if() в таком количестве, и уж тем более строка
rez = i;
откровенно лишняя
Вызов
USART_put_u8( i );
выглядит гораздо читабельнее и код в целом будет короче.
*/
</c>
Зачем rez 32-битный - не понимаю.
Те " | 0 " в строках с набором маски битов были нужны и поравданы в показанном ранее примере только для того, чтобы можно было (почти) произвольно закомментировать/раскомментировать отдельные биты в болванке, в однострочном варианте они выглядят "как-то странно".
Куда-то затерялось ожидание готовности АЦП.
Читать из АЦП рекомендуют сначала младший байт, потом старший. Насколько я помню документацию, после чтения младшего блокируется обновление всего регистра данных АЦП до чтения ADCH.
<c>
uint16_t rez;
...
while( !(ADCSRA & (1<<ADIF)) );
rez = ADCW; /* компилятор достаточно умён, чтобы прочитать в нужном порядке */
USART_put_u16( rez);
</c>
Что там с i вышло - надо смотреть внимательно после переписывания кода в человеческом виде
-
- Кстати, в отладочном варианте можно вообще USART_put_u16( ADCW) писать. - ReAl(17.05.2007 11:35, )