передача по USART

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Здравствуйте уважаемые форумчане! Написал вот такой код по книге Прокопенко В.С. Все работает нормально, данные передаются с одной меги 16 на вторую мегу. Только вот все не могу разобраться в строчке static FILE mystdout_mystdin = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);, и все что с ней связано в этом коде. Объясните пож. или скажите где можно прочитать про поток передачи Stream FILE, или как его правильно. Язык Си хоршо не знаю, только изучаю.

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

/*
 * usart_mega16_transmit.c
 *
 * Created: 12.11.2013 10:55:36
 *  Author: Администратор
 */ 

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

void USART_INIT(unsigned int UBRR_baud)
{
	
UBRRH = (unsigned char) (UBRR_baud>>8);
UBRRL = (unsigned char) UBRR_baud;

UCSRC = (1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL);
UCSRB &=~(1<<2);
UCSRB |=(1<<4)|(1<<3);
UCSRA &= ~(1<<1) & ~(1<<0);
}

static int uart_putchar(char simvol, FILE *stream)
{
	loop_until_bit_is_set(UCSRA,5);
	UDR=simvol;
	return 0;
	
};

static int uart_getchar(FILE *stream)
{
	loop_until_bit_is_set(UCSRA,7);
	return UDR;
}

static FILE mystdout_mystdin = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);

int i=0;
int main(void)
{
	USART_INIT(0x40);
	DDRB=0xff;
	PORTB=0x00;
	stdin = stdout = &mystdout_mystdin;


    while(1)
    {
		printf("%c\r\n", '5');
		_delay_ms(1000);//TODO:: Please write your application code 
    }
}
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Привет! Почитай тут http://www.nongnu.org/avr-libc/user-man ... stdio.html

Если кратко, то это переназначение стандартных потоков. Консоли у avr нету, в отличие от компьютера, потому вызовы printf(), puts() и прочие работать не будут и в реализации стандартной библиотеки Си для AVR avr-libc эти функции сразу возвращают управление.

Ты определяешь функции со специальной сигнатурой (имя можно любое) - в данном случае, uart_getchar, uart_putchar - это и есть реализации для потока ввода/вывода USART. Далее ты создаешь новый файловый дескриптор (структура FILE), вызывая FDEV_SETUP_STREAM и передавая ему указатели на созданные функции. Затем обновляешь значение переменных stdin и stdout - представляющих собой стандартные потоки ввода/выаода, которые используются внутри printf() и прочих методов. И теперь при вызове printf(), scanf(), puts(), gets(), getchar() они будут работать с USART-ом.
Изображение only pure true norwegian blackx Изображение
Реклама
Родился
Сообщения: 1
Зарегистрирован: Вт дек 03, 2013 10:53:59

Сообщение meXanicus »

Помогите пожалуйста. Этот пример пытаюсь собрать в Atmel Studio 6 (новый проект ATmega16) на что получаю три сообщения ссылающихся на одно и тоже место: sorry, unimplemented: non-trivial designated initializers not supported
если закоментировать строку

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

 static FILE mystdout_mystdin = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
то все ОК

Оффтоп: еще при инициализации UART в ATmega328p Студия не знает про регистр URSEL приходится делать так (1 << 7) с остальными регистрами ОК

Windows 7 | Atmel Studio 6.1 SP2 Все свежеустановленное.
Ответить

Вернуться в «AVR»