Помогите пожалуйста разобраться с USART. Совсем не работает. Такое впечатление что в UDR ничего не записывается.
Микроконтроллер ATMega162
Компилятор IAR 5.4
Fuse
EXT 0xEB
HIGH 0x19
LOW 0xEE
Main
CODE
void main(void)
{
WDTCR |=(1<<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1); //Enable WatchDog
WDTCR=0x00;
DDRE|=((1<<DDE2)|(1<<DDE1)|(1<<DDE0));// PE1, PE2 out
DDRA|=((1<<DDA7)|(1<<DDA6)|(1<<DDA5)|(1<<DDA4));// PE1, PE2 out
DDRB|=((1<<DDB1)|(1<<DDB0));// PE1, PE2 out
PORTA &=~((1<<PORTA7)|(1<<PORTA6)|(1<<PORTA5)|(1<<PORTA4));// For Debug
PORTB &=~(1<<PORTB1);// Config RS-485 //SD
PORTB |=(1<<PORTB0);// Config RS-485 // DE
CLKPR=0x00;// Max Freq
USART0_Init( 103 ); /* Set the baudrate to 9,600 bps using a 16MHz crystal */
USART1_Init( 103 ); /* Set the baudrate to 9,600 bps using a 16MHz crystal */
MCUCR &= ~(1<<ISC01);
GICR &= ~(1<<INT0); // Disable external interrupt
SREG|=(1<<7);
for (;;)
{
USART1_Transmit(55);// For Debug
Watch_Dog_Reset();
PORTA &=~((1<<PORTA7)|(1<<PORTA6)|(1<<PORTA5));// For Debug
}
}
void Watch_Dog_Reset(void)
{
WDTCR |=(1<<WDCE)|(1<<WDE); //Enable WatchDog
WDTCR=0x00;
WDTCR |=(1<<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1); //Enable WatchDog
PORTA |=(1<<PORTA7);
}
void USART0_Init( unsigned int baudrate )
{
/* Set the baud rate */
UBRR0H = (unsigned char) (baudrate>>8);
UBRR0L = (unsigned char) baudrate;
/* Enable UART receiver and transmitter */
/* Set frame format: 8 data 2stop */
UCSR0B =(1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);
UCSR0C =(1<<URSEL0)|(1<<UCSZ01)|(1<<UCSZ00);
}
void USART1_Init( unsigned int baudrate )
{
/* Set the baud rate */
UBRR1H = (unsigned char) (baudrate>>8);
UBRR1L = (unsigned char) baudrate;
/* Enable UART receiver and transmitter */
/* Set frame format: 8 data 2stop */
UCSR1B =(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
UCSR1C =(1<<URSEL1)|(1<<UCSZ11)|(1<<UCSZ10);
}
void USART0_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !(UCSR0A & (1<<UDRE0)) )
/* Start transmittion */
UDR0 = data;
}
void USART1_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !(UCSR1A & (1<<UDRE1)) )
/* Start transmittion */
UDR1 = data;
PORTA ^= (1<<PORTA4);// For Debug
}
{
WDTCR |=(1<<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1); //Enable WatchDog
WDTCR=0x00;
DDRE|=((1<<DDE2)|(1<<DDE1)|(1<<DDE0));// PE1, PE2 out
DDRA|=((1<<DDA7)|(1<<DDA6)|(1<<DDA5)|(1<<DDA4));// PE1, PE2 out
DDRB|=((1<<DDB1)|(1<<DDB0));// PE1, PE2 out
PORTA &=~((1<<PORTA7)|(1<<PORTA6)|(1<<PORTA5)|(1<<PORTA4));// For Debug
PORTB &=~(1<<PORTB1);// Config RS-485 //SD
PORTB |=(1<<PORTB0);// Config RS-485 // DE
CLKPR=0x00;// Max Freq
USART0_Init( 103 ); /* Set the baudrate to 9,600 bps using a 16MHz crystal */
USART1_Init( 103 ); /* Set the baudrate to 9,600 bps using a 16MHz crystal */
MCUCR &= ~(1<<ISC01);
GICR &= ~(1<<INT0); // Disable external interrupt
SREG|=(1<<7);
for (;;)
{
USART1_Transmit(55);// For Debug
Watch_Dog_Reset();
PORTA &=~((1<<PORTA7)|(1<<PORTA6)|(1<<PORTA5));// For Debug
}
}
void Watch_Dog_Reset(void)
{
WDTCR |=(1<<WDCE)|(1<<WDE); //Enable WatchDog
WDTCR=0x00;
WDTCR |=(1<<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1); //Enable WatchDog
PORTA |=(1<<PORTA7);
}
void USART0_Init( unsigned int baudrate )
{
/* Set the baud rate */
UBRR0H = (unsigned char) (baudrate>>8);
UBRR0L = (unsigned char) baudrate;
/* Enable UART receiver and transmitter */
/* Set frame format: 8 data 2stop */
UCSR0B =(1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);
UCSR0C =(1<<URSEL0)|(1<<UCSZ01)|(1<<UCSZ00);
}
void USART1_Init( unsigned int baudrate )
{
/* Set the baud rate */
UBRR1H = (unsigned char) (baudrate>>8);
UBRR1L = (unsigned char) baudrate;
/* Enable UART receiver and transmitter */
/* Set frame format: 8 data 2stop */
UCSR1B =(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
UCSR1C =(1<<URSEL1)|(1<<UCSZ11)|(1<<UCSZ10);
}
void USART0_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !(UCSR0A & (1<<UDRE0)) )
/* Start transmittion */
UDR0 = data;
}
void USART1_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !(UCSR1A & (1<<UDRE1)) )
/* Start transmittion */
UDR1 = data;
PORTA ^= (1<<PORTA4);// For Debug
}