Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATmega162 не работает USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ZZZRF413
Добрый день!

Помогите пожалуйста разобраться с 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
}
Genadi Zawidowski
Нету обычно пустого тела цикла в ожидании готовности приёмника и в ожидании передатчика.
Простой вариант - точка с запятой на отдельной строке. утяжелённый - continue и точка с запятой.
ZZZRF413
Цитата("Genadi Zawidowski")
Нету обычно пустого тела цикла в ожидании готовности приёмника и в ожидании передатчика.
Простой вариант - точка с запятой на отдельной строке. утяжелённый - continue и точка с запятой.

Я это процедуру брал с примеров.
Т.е. это
Код
void USART0_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !(UCSR0A & (1<<UDRE0)) )
        {
        };
    /* Start transmittion */
    UDR0 = data;     
      
}

так должно быть?
Navovvol
Всё неправильно. Как так ? ждать медленный USART в обычной цикле, при этом включен сторожевой пёс.
И вообще где само тело программы ? где вызов всех этих функций?
На начальном этапе WDT выключить.
Разобраться с прерываниями по передаче и приему данных.
И где вы только такие примеры берете?
alag57
Цитата(ZZZRF413 @ May 5 2012, 00:43) *
Такое впечатление что в UDR ничего не записывается.

А как вы это установили? В симуляторе?
_Артём_
Цитата(ZZZRF413 @ May 5 2012, 08:11) *
Я это процедуру брал с примеров.
Т.е. это
Код
void USART0_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !(UCSR0A & (1<<UDRE0)) )
        {
        };
    /* Start transmittion */
    UDR0 = data;     
      
}

так должно быть?

Да, так сойдёт.

Код
while ( !(UCSR0A & (1<<UDRE0)) )
    /* Start transmittion */
    UDR0 = data;

Ошибка в том, что ваш вариант делает следующее: пока бит UDRE0 равен 0 - пишет новые данные в UDR0. Точки с запятой не хватает после while.

Цитата(Navovvol @ May 5 2012, 11:11) *
Всё неправильно. Как так ? ждать медленный USART в обычной цикле, при этом включен сторожевой пёс.
И вообще где само тело программы ? где вызов всех этих функций?
На начальном этапе WDT выключить.

Тоже верно.
ZZZRF413
Я посмотрел ещё раз примеры и действительно ";" потерялась...

Цитата("alag57")
А как вы это установили? В симуляторе?


Нет, экспериментальным путем (осциллографом).

Цитата("Navovvol")
Всё неправильно. Как так ? ждать медленный USART в обычной цикле, при этом включен сторожевой пёс.
И вообще где само тело программы ? где вызов всех этих функций?
На начальном этапе WDT выключить.
Разобраться с прерываниями по передаче и приему данных.
И где вы только такие примеры берете?


Спасибо за критику, но в этой программе нет смысла. Это переработанная под простой UART вырезка с основной программы и она нужна была лишь для того чтобы разобраться с UART.


Всем большое спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.