Вы вошли на сайт, как Гость
Регистрация

Прием символа от ПК

Программные примеры для микроконтроллеров AVR - AVRStudio
(Прием символа от ПК через интерфейс RS-232 и передача в ответ строки с помощью UART)

Пусть вывод 0 порта D будет назначен в качестве линии приема RXD приемопередатчика UART, а вывод 1 того же порта — в качестве линии передачи TXD. Для преобразования уровней последовательных сигналов, используемых микроконтроллером, к уровням, используемых интерфейсом RS-232 можно применить микросхему МАХ233

Пользователь нажимает на клавиатуре ПК какую-либо цифровую клавишу, ASCII-код которой передается по последовательному интерфейсу на вход приемопередатчика UART. Этот код обрабатывается в соответствующей подпрограмме обслуживания прерывания, и на основании выполненного анализа через UART на ПК передается та или иная текстовая строка. При этом используется следующий алгоритм. 1. Инициализация UART, подразумевающая разрешение приема, передачи и прерывания в случае передачи символа данных. Кроме того, следует установить скорость обмена (примем ее равной 9600 бод). 2. В бесконечном цикле проверяется состояние разряда RCX регистра USR. Если он установлен в 1, то это говорит о поступлении на вход UART символа данных. 3. Считывание принятого символа из регистра UDR, его анализ и последовательная передача на ПК соответствующей строки. На передачу всей строки может уйти довольно много времени. Для того чтобы избавить микроконтроллер от необходимости ожидать завершения передачи, можно воспользоваться очередью символов, каждый символ из которой передается при каждом последующем прерывании на передачу. Очередь реализуем с помощью символьного массива.

Примечание: при компиляции проекта требуется добавить в проект следующие библиотеки: "avr/io.h", "avr/interrupt.h", "signal.h".


char str0[] = "Zero";
char str1[] = "One";
char str2[] = "Two";
char str3[] = "Three";
char str4[] = "Four";
char str5[] = "Five";
char str6[] = "Six";
char str7[] = "Seven";
char str8[] = "Eight";
char str9[] = "Nine";
char strDefault[] = "Not digit";

unsigned char queueC, sendC;
unsigned char queue[50];

INTERRUPT(SIG_UART0_TRANS)
{
  if (queueC != sendC) UDR = queue[sendC++];
}

void SendStr(char *s)
{
  queueC = 0;
  sendC = 1;
  queue[queueC++] = 0x0D;
  queue[queueC++] = 0x0A;
  while (*s) queue[queueC++] = *s++;
  UDR = queue[0];
}

int main (void)
{
  char c;
  UCR = 0x58;
  UBRR = 0x33;
  sei();
  while(1) 
  {
    if (UCR & 0x80)
	{
	  c = UDR;
	  switch (c)
	  {
	    case '0': SendStr(str0); break;
	    case '1': SendStr(str1); break;
	    case '2': SendStr(str2); break;
		case '3': SendStr(str3); break;
		case '4': SendStr(str4); break;
		case '5': SendStr(str5); break;
		case '6': SendStr(str6); break;
		case '7': SendStr(str7); break;
		case '8': SendStr(str8); break;
		case '9': SendStr(str9); break;
		default: SendStr(strDefault);
  	  }
	}
  }
}

Файлы проекта можно скачать здесь: