Страница 1 из 1

Atmega1280 настройка usart

Добавлено: Сб окт 13, 2012 11:55:21
Romu4
Доброго времени суток уважаемые. Возникла проблема с реализацией usart на atmega1280 (на других контроллерах с 1 usart получается) предположительно неправильно инициализирован. Задача получить кварц 16 MHz, 8 бит данных, 1 стоп бит, прием и передача разрешены. Даташит перечитал и по нему пытался настроить но в Proteus- се тишина.

Код: Выделить всё

#include <avr/io.h>//Библиотека ввода/вывода
#include <stdio.h>
#include <avr/interrupt.h>//Библиотека прерываний
 
//Прототипы подпрограмм
void USART_Transmit( unsigned char data );
void USART_Init( unsigned int ubrr);
 
//Подпрограмма обработки прерывания
ISR(USART_RXC_vect)
{
int b;
b = UDR0;
// Выполняем обработку принятого байта
if (b=='1')//Если приняли "1"
{
USART_Transmit('R');//Отправляем букву "R"
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку
}
else//Если нет
if (b=='2')//Если приняли "2"
{
USART_Transmit('L');//Отправляем букву "L"
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку


}
}
 
void USART_Init( unsigned int ubrr)//Инициализация модуля USART
{
/* Задаем скорость работы USART */	
UBRR0H = (unsigned char)(ubrr>>8);	
UBRR0L = (unsigned char)ubrr;       
/* Разрешаем прием и передачу по USART */
UCSR0B=(1<<RXEN0)|( 1<<TXEN0);
UCSR0B |= (1<<RXCIE0);

/* Устанавливаем формат данных 8 бит данных, 1 стоп бита */
//UCSR0C=0x86;// Инициализация именно для ATmega8
UCSR0C = (1<<USBS0)|(3<<UCSZ10);//USBSn 0-1 stop bit 1-2 stop bit;
}
 
void USART_Transmit( unsigned char data ) //Функция отправки данных
{
while ( !(UCSR0A & (1<<UDRE0)) ); //Ожидание опустошения буфера приема
UDR0 = data; //Начало передачи данных			        
}
 
int main(void)//главная программа
{
//Скорость USART 115200 при кварцевом генераторе 16MHz
USART_Init (8);

USART_Transmit('O');//Передаем при включении
USART_Transmit('k');//сообщение "Ok!", что свидетельствует
USART_Transmit('!');//о правильно работе программы
 
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку

sei();//разрешаем глобально прерывания
 
while(1)//вечный цикл
{//тут пусто
}
}

Re: Atmega1280 настройка usart

Добавлено: Сб окт 13, 2012 15:07:28
Romu4
есть предположение что проблема в UCSR0C

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 16:55:40
Kavka
Смотрите внимательно про количество стоп-битов :)

16МГц, 115200, 8бит, без паритета - рекомендую ещё U2X = 1 (пункт "22.10 Examples of Baud Rate Setting").

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 17:54:32
Romu4
курил я это но увы...

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 18:06:28
Romu4
а может проблема с фьюзами?
фьюзы.JPG
(63.53 КБ) 552 скачивания

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 18:22:42
Romu4
какие-то символы выводит и все...
не могу понять :o :o :o :o :o :o

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 20:11:21
Romu4
proteus.rar
(14.97 КБ) 210 скачиваний

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 20:37:45
POS_troi
Зайдите в настройки терминала и посмотрите какие скоростя он поддерживает.

11520 у меня в протеусе нет.

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 23:39:34
Romu4
С фьюзами разобрался. В протеусе можно свою скорость задавать.

Re: Atmega1280 настройка usart

Добавлено: Вс окт 14, 2012 23:44:10
Romu4
Самое интересное что подобный код на atmega8 работал, а на atmega8535 такая же проблема была. Думаю дело в UCSR0C=0x86;

Re: Atmega1280 настройка usart

Добавлено: Пн окт 15, 2012 00:11:33
Romu4
вот скрин из протеуса