№ 3035 В разделах: Electronics
Programming
от June 27th, 2011,
В подшивках: Arduino
UART – Универсальный асинхронный приёмопередатчик. Прочитать о нем можно многое. Если не вдаваться в детали, хватит изучения странички в Wikipedia и на Easy Electronics.
Допустим, что вы уже прочитали все и хотите начать писать программу. А как проще всего отправить данные в UART? Конечно же воспользоваться готовой функцией из библиотеки stdio. Но для начала функции отправки надо прикинуться шлангом потоком. Делается это так:
В заголовочном файле говорим, что UART_console это поток с функцией-отправителем UART_Transmit
и UART_Receive
получателем.
static FILE UART_console = FDEV_SETUP_STREAM(UART_Transmit, UART_Receive, _FDEV_SETUP_RW);
Осталось только правильно написать функции отправки и приема:
void UART_Transmit(char c, FILE * stream)
{
cli();
if (c == '\n')
UART_Transmit('\r', stream);
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
sei();
}
char UART_Receive(FILE * stream)
{
loop_until_bit_is_set(UCSRA, RXC);
if (UCSRA & _BV(FE))
return _FDEV_EOF;
if (UCSRA & _BV(DOR))
return _FDEV_ERR;
return UDR;
}
Ну а дальше все просто. Надо проинициализировать непосредственно UART, чтобы ножка микроконтроллера начала передавать сигнал.
void UART_Init(void)
{
UBRRL = UBRRL_VALUE;
UBRRH = 0;
UCSRB = (1 << TXEN) | (1 << RXEN);
UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0);
stdout = &UART_console;
stdin = &UART_console;
}
Не забудьте прочитать даташит к вашему микроконтроллеру. Данный код тестировался только на Atmega16, но должен работать и на других МК тоже.
Пример использования:
printf("error! TW_STATUS %#x. sending stop...\n", twst);
Такой подход займет очень много памяти. Если сделать строки статичными, то будет гораздо веселее. Для этого нужно подключить библиотеку pgmspace.h
и использовать макрос PSTR
.
Вот пример:
#include <avr/pgmspace.h>
#include <stdio .h>
#include "uart.h"
void main(void) {
UART_Init();
...
printf_P(PSTR("SYS: State is %d\n"), current_state);
...
}
\n
это перенос на новую строку. Если не поставить, то следующий вывод строки начнется там же, где кончился последний.
Собственно библиотека: uart.c uart.h. Настроена на работу со скоростью 9600 бод, 8 бит данных, 1 стоповый бит, четности нет, контроля потока нет. Рекомендую использовать для работы PuTTY.
Fortune cookie: Today's spam: increase in sexual desire
Leave a Reply