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

Attiny2313 не могу инициализировать USART

Добавлено: Ср апр 11, 2012 16:52:04
pyls
Здравствуйте уважаемые форумчане и доброго времени суток.
Я пытался инициализировать Usart на контроллере attiny2313, прочитал для этого даташиты на него русский и английский, увидел несколько функций инициализации, написал их, но кажется они что-то забыли, т.к. Code Vision AVR показывает ошибки. Может есть другой способ инициализации без функции? Здесь 2 ошибки, он не знает, что такое UBBRH и UBBRL, но я так понял это из-за неизвестных без знаковых переменных.
вот код C

#include <tiny2313.h>
#include <stdio.h>
void USART_init(unsigned int boud) // функция инициализации USART
{
UBBRH = (unsigned char)(boud>>8); // задаем скорость
UBBRL = (unsigned char)boud; // в бодах, т.е. бит\с
UCSRB = (1<<TXEN)|(1<<RXEN); // разрешаем передачу и прием
UCSRC = (1<<USBS)|(3<<UCSZ0); // задаем формат кадра сигнала
}

Re: Attiny2313 не могу инициализировать USART

Добавлено: Ср апр 11, 2012 18:13:23
demiurg301
А визардом сначала?

Re: Attiny2313 не могу инициализировать USART

Добавлено: Ср апр 11, 2012 21:30:43
pyls
всмысле?:) т.е. в создании самого проекта сразу настроить юзарт?

Re: Attiny2313 не могу инициализировать USART

Добавлено: Ср апр 11, 2012 21:33:59
ploop
он не знает, что такое UBBRH и UBBRL
Конечно. Они ведь называются UBRRH и UBRRL :)

Re: Attiny2313 не могу инициализировать USART

Добавлено: Ср апр 11, 2012 21:46:50
urry

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

#define FOSC 12000000ul
#define VBOD 9600ul
#define UBR_ (FOSC/(VBOD*16ul) -1)
#if UBR_ > 255
#error "UART!"
#endif

	UCSRA =0;
	UBRRL =(UBR_&0xFF);
	UBRRH =0;
	UCSRC =  (1 << UCSZ0) | (1 << UCSZ1); //
	UCSRB =(1<<RXEN)|(1<<RXCIE); //rx enable



Re: Attiny2313 не могу инициализировать USART

Добавлено: Чт апр 12, 2012 01:59:34
pyls
ploop писал(а):
он не знает, что такое UBBRH и UBBRL
Конечно. Они ведь называются UBRRH и UBRRL :)
ОЙ :)))

Re: Attiny2313 не могу инициализировать USART

Добавлено: Чт апр 12, 2012 02:02:53
pyls
urry писал(а):

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

#define FOSC 12000000ul
#define VBOD 9600ul
#define UBR_ (FOSC/(VBOD*16ul) -1)
#if UBR_ > 255
#error "UART!"
#endif

	UCSRA =0;
	UBRRL =(UBR_&0xFF);
	UBRRH =0;
	UCSRC =  (1 << UCSZ0) | (1 << UCSZ1); //
	UCSRB =(1<<RXEN)|(1<<RXCIE); //rx enable


Юрий спасибо! Я так понимаю вверху по формуле для асинхронного режима рассчитывается значение для регистра скорости, т..е. 51 для 9600 бод, а далее идет сама инициализация. Ведь так?

Re: Attiny2313 не могу инициализировать USART

Добавлено: Чт апр 12, 2012 09:21:17
ploop
Почитайте вот тут, всё доходчиво описано по настройке.

Re: Attiny2313 не могу инициализировать USART

Добавлено: Чт апр 12, 2012 13:19:07
pyls
ploop писал(а):Почитайте вот тут, всё доходчиво описано по настройке.
Все конечно хорошо, регистры описаны отлично, но примеры на ассемблере, а я в нем не шарю)

Re: Attiny2313 не могу инициализировать USART

Добавлено: Чт апр 12, 2012 13:31:36
ploop
Да без разницы примеры, общую суть пойми, какой регистр за что отвечает и как рассчитывается значение в UBRR

Re: Attiny2313 не могу инициализировать USART

Добавлено: Пт апр 13, 2012 01:54:06
pyls
уже многое понял, продолжаю досконально изучать!

Re: Attiny2313 не могу инициализировать USART

Добавлено: Пт апр 13, 2012 07:43:13
pyls
Я переписал инициализацию, только вот не понимаю, что должна возвращать функция инициализации...
вот что получилось:)
#include <tiny2313.h>
#include <stdio.h>
#define speed XTAL/(16*baudrate)-1 // Вычесление значения для регистра скoр.
#define SET_B(x) |= (1<<x) // Установить бит
#define CLR_B(x) &=~(1<<x) // Сбросить бит
int XTAL = 8000000; // Рабочая частота контроллера в Гц
int baudrate = 9600; // Скорость передачи данных в бит/с



void USART_init(void) // функция инициализации USART
{

UBRR = speed; // задаем скорость

UCSRB SET_B(TXEN); // разрешаем передачу - установка бита TXEN в 1
UCSRC SET_B(USBS); // один стоповый бит
UCSRC = (3<<UCSZ0); // формат кадра - 8 бит
}

Re: Attiny2313 не могу инициализировать USART

Добавлено: Пт апр 13, 2012 07:47:19
ploop
только вот не понимаю, что должна возвращать функция инициализации...
Ничего. Она же у тебя объявлена как void

Re: Attiny2313 не могу инициализировать USART

Добавлено: Пт апр 13, 2012 13:28:23
urry
Какая размерность int ?
int XTAL = 8000000; // Рабочая частота контроллера в Гц
Почему не задефайнить ?

Re: Attiny2313 не могу инициализировать USART

Добавлено: Пт апр 13, 2012 20:47:25
pyls
urry писал(а):Какая размерность int ?
int XTAL = 8000000; // Рабочая частота контроллера в Гц
Почему не задефайнить ?
Я пробовал сначала дефайном, но он все время повторял, что где-то после дефайна пропущена скобка.
А зачем размерность? Мне значение нужно для вычисления значения по формуле, я получаю 51 и записываю в регистр скорости и тогда скорость ровна 9600 бод.

Re: Attiny2313 не могу инициализировать USART

Добавлено: Сб апр 14, 2012 17:31:25
pyls
Как вы и посоветовали я задефайнил, плюс написал функцию передачи и главную управляющую функцию
Вот:
#include <tiny2313.h>
#include <stdio.h>
#define speed XTAL/(16*baudrate)-1 // Вычесление значения для регистра скoр.
#define SET_B(x) |= (1<<x) // Установить бит
#define CLR_B(x) &=~(1<<x) // Сбросить бит
#define XTAL 8000000 // Рабочая частота контроллера в Гц
#define baudrate 9600 // Скорость передачи данных в бит/с

void USART_init(void) // функция инициализации USART
{
UBRR = speed; // задаем скорость
UCSRB SET_B(TXEN); // разрешаем передачу - установка бита TXEN в 1
UCSRC SET_B(USBS); // один стоповый бит
UCSRC = (3<<UCSZ0); // формат кадра - 8 бит
}

void USART_snt(unsigned char data)
{
while(!(UCSRA & (1<<UDRE)) ); // ждем пока очистится буфер передачи
// как только UDRE установится
UDR = data; // начать передачу данных
}

void main(void)
{
unsigned char data = 0xFF;
USART_init();
USART_snt(data);
}