INT 21h

Использование UART для отладки микроконтроллера AVR Atmega + библиотека (обновлено 24.07.2011)

№ 3035 В разделах: Программирование Электроника от June 27th, 2011,

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.

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Комментарии

  • 21h: нене ) без меня )
  • Серегй: Не совсем грабить)) если грабить можно и без рации, есть...
  • 21h: магазин грабить собрались? ) не, тут я не помощник ;)
  • Серегй: А что бы мне поймать чужую волну, что мне для этого нужно...
  • 21h: слушать никто не запрещает. нет закона, который запрещает...
  • Серегй: Я хотел узнать могу ли я просто прийти с данной рацией baofeng...
  • 21h: У меня есть только эти 2. По другим ничего не знаю. В интернете...

© Vladimir Smagin, 2005-2017. Копирование материалов без разрешения запрещено.