цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Программный полудуплексный UART для AVR, поддерживающий работу с одним выводом


Программный полудуплексный UART для AVR, поддерживающий работу с одним выводом

Автор: Mike(admin) от 19-03-2014, 11:38

Большинство микроконтроллеров ATtiny не имеют аппаратного модуля UART из-за ограниченного количества выводов. Ядра Arduino tiny используют класс TinyDebugSerial, который обеспечивает только передачу данных, для приема данных нужно писать дополнительный код. Поэтому ниже предлагается компактный код и простая схема для организации программного UART, поддерживающего работу с одним выводом.


Программный полудуплексный UART для AVR

Когда TTL-адаптер последовательного порта не передает данные, напряжение на выводе Tx поддерживает транзистор Q1 открытым, и на выводе микроконтроллера Tx/Rx будет напряжение высокого логического уровня, что будет свидетельствовать о состоянии ожидания. Когда AVR отправит 0 при включенном Q1, Rx подтянется к низкому логическому уровню, что будет означать прием 0. Резистор R1 нужен для того, чтобы ток, текущий через базу транзистора, был менее 1 мА. Когда AVR отправит 1, Rx не будет больше подтянут к логическому нулю, а значит вернется в высокое состояние. Когда адаптер последовательного порта будет передавать 0, диод D1 позволит подтянуть вывод микроконтроллера к нижнему логическому уровню. При отсутствии тока, текущего через базу, транзистор Q1 выключится, и линия Rx последовательного адаптера отключится.


Код, работающий в качестве Arduino-библиотеки, можно взять здесь. Ему требуется только 62 байта флеш-памяти и не требуется оперативной памяти, поскольку буферизация не предполагается. Он поддерживает высокие скорости передачи до 460.8 Кб/с при 16 МГц. По умолчанию в BasicSerial3.h определена скорость 115.2 Кб/с и может быть изменена в define-константе BAUD_RATE. По умолчанию библиотека использует вывод PB5 как для Tx, так и для Rx. Это может быть изменено путем изменения UART_Tx и UART_Rx в BasicSerial3.S. Ниже представлен скетч с использованием этой библиотеки:



#include <BasicSerial3.h>

void setup()
{
}

void serOut(const char* str)
{
   while (*str) TxByte (*str++);
}

void loop(){
  byte c;
  serOut("Serial echo test\n\r");
  while ( c = RxByte() ){
    TxByte(c);
  }
  delay(1000);
}



Перевод © digitrode.ru


<Источник>




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий