реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ATmega162 не работает USART
ZZZRF413
сообщение May 4 2012, 19:43
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 26-07-09
Из: Нижний Новгород
Пользователь №: 51 578



Добрый день!

Помогите пожалуйста разобраться с 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
}


Сообщение отредактировал IgorKossak - May 4 2012, 20:35
Причина редактирования: [codebox] для длинного кода!
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 4 2012, 21:06
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Нету обычно пустого тела цикла в ожидании готовности приёмника и в ожидании передатчика.
Простой вариант - точка с запятой на отдельной строке. утяжелённый - continue и точка с запятой.
Go to the top of the page
 
+Quote Post
ZZZRF413
сообщение May 5 2012, 05:11
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 26-07-09
Из: Нижний Новгород
Пользователь №: 51 578



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

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

так должно быть?
Go to the top of the page
 
+Quote Post
Navovvol
сообщение May 5 2012, 08:11
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Всё неправильно. Как так ? ждать медленный USART в обычной цикле, при этом включен сторожевой пёс.
И вообще где само тело программы ? где вызов всех этих функций?
На начальном этапе WDT выключить.
Разобраться с прерываниями по передаче и приему данных.
И где вы только такие примеры берете?
Go to the top of the page
 
+Quote Post
alag57
сообщение May 5 2012, 14:01
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355



Цитата(ZZZRF413 @ May 5 2012, 00:43) *
Такое впечатление что в UDR ничего не записывается.

А как вы это установили? В симуляторе?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 5 2012, 14:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 выключить.

Тоже верно.
Go to the top of the page
 
+Quote Post
ZZZRF413
сообщение May 15 2012, 04:56
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 26-07-09
Из: Нижний Новгород
Пользователь №: 51 578



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

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


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

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


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


Всем большое спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 23:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016