Vladimir Ljaschko (13.02.2008 14:45, просмотров: 3982)
В ATmege32 не устанавливается UCSRC=0x86; (остается 0) и формат посылки неправильный. Кристалл заменить? Иль чудеса какие? Заменил бы с ходу, но есть доработки на ножках. Полный текст инициализации:
void UsartInit ( void )
{
volatile char my_byte;
UCSRA = 0 ;
UCSRB = 0 ;
// UCSRC = 0 | (1<<URSEL) ;
//--------------------------------- set synchronous mode
//-------------------------------- set double speed mode
UCSRA |= ( 1 << U2X ) ;
//-------------------------------- set baud rate
// UBRRH=1;
UBRRH = ( Fzq / 8 / USART0_BAUD_RATE - 1 ) >> 8 ;
UBRRL = ( unsigned char ) ( Fzq / 8 / USART0_BAUD_RATE - 1 ) ;
my_byte=(1<<URSEL);
#if USART0_PARITY == EVEN
my_byte |= ( 3 << UPM0 ) ;
#elif USART0_PARITY == ODD
my_byte |= ( 1 << UPM0 ) ;
#elif USART0_PARITY != NO
#error "Invalid USART0 parity check mode !!!"
#endif
//----------------------------- set data length
#if USART0_DATA_LENGTH == 8
my_byte |= ( 3 << UCSZ0 ) ;
#elif USART0_DATA_LENGTH == 7
my_byte |= ( 2 << UCSZ0 ) ;
#elif USART0_DATA_LENGTH == 6
my_byte |= ( 1 << UCSZ0 ) ;
#elif USART0_DATA_LENGTH != 5
#error "Invalid USART0 data length !!!"
#endif
//------------------------------- set stop bits
#if USART0_STOP_LENGTH == 2
my_byte |= ( 1 << USBS0 ) ;
#elif USART0_STOP_LENGTH != 1
#error "Invalid USART0 stop bits !!!"
#endif
UCSRC=my_byte; //0x86
UCSRC=my_byte;
my_byte=UCSRC;
my_byte=UCSRC;
}