Страница 1 из 1

UART последовательная передача данных

Добавлено: Вс сен 04, 2016 21:51:20
zekmaster
Господа коты, нужна помощь. Есть задача: считывать данные с АЦП (с этим проблем нет), а затем передавать их на другой мк. Итак, я перепробовал коды с прерываниями и без, но, к сожалению, ничего путного из этого не вышло... что именно не работает: передатчик не хочет отправлять данные. Принцип довольно простой: мы отправляем 3 байта последовательно, а затем их считываем и выводим на ножки мк. Приёмник выводит что-то непонятное .-.

Re: UART последовательная передача данных

Добавлено: Пн сен 05, 2016 04:13:13
Vov123
RX -> TX ?

Re: UART последовательная передача данных

Добавлено: Пн сен 05, 2016 04:15:17
pokk
А вы с фьюзами не ошиблись когда прошивали? Типа деления на 8.
Приёмник выводит что-то непонятное .-.
Сдается мне что у вас они работают на разных скоростях. По этому и принимается не то число которое отправили.

Re: UART последовательная передача данных

Добавлено: Пн сен 05, 2016 19:22:37
zekmaster
pokk, вы определённо правы. Глупая ошибка) Но почему после её исправления выходят одинаковые результаты? Т.е. переменные принимают одинаковые значения.

Re: UART последовательная передача данных

Добавлено: Пн сен 05, 2016 19:31:38
pcb

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

[b]volatile [/b]int i=0,  first=0, second=0, third=0;

Re: UART последовательная передача данных

Добавлено: Пн сен 05, 2016 19:52:21
zekmaster
не помогло

Re: UART последовательная передача данных

Добавлено: Вт сен 06, 2016 11:44:57
pokk
А что у вас за сигнал? может с АЦП идут одинаковые числа.
Для того что бы найти ошибку разделите программы на 2 части:
1)Сначала протестируйте канал связи (передавая фиксированные числа 1,2,3,4,255,170 через пару секунд) и смотрите что принимается на другом МК. (Или можно порт в первом МК настроить на вход, после по USART передать данные из порта и вывести на другом МК в порт, и замыкать выводы в первом мк, тогда четко все будет видно работает связь или нет)
2) Выдайте в порт(PORTA,PORTB), значение АЦП и по смотрите может они у вас там одинаковые.

После того как каждая часть будет работать соедините все вместе.

Re: UART последовательная передача данных

Добавлено: Чт сен 08, 2016 17:47:54
zekmaster
Выяснил, что проблема с передатчиком,но как её исправить понять не могу: пробовал изменять код ожидания окончания передачи(закидывал в прерывания по UDRE и TXC, менял в коде TXC на UDRE). Причём, если ножку связи оторвать от передатчика, приёмник выводит разные числа => что-то с передатчиком. P.S. вырезал из кода передатчика часть с АЦП. P.P.S.: с этим кодом приёмник выводит 192 на оба порта

Re: UART последовательная передача данных

Добавлено: Пт сен 09, 2016 17:05:54
zekmaster
Господа форумчане, спасибо за уделённое моей проблеме время ^_^ Мне стыдно признавать, но с передатчиком всё нормально, а вот с приёмником - не совсем. Как всегда, крайне глупая ошибка: лишние ";"

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

ISR (USART_RXC_vect)//считывание данных
{
	i+=1;
	if(i==1)
	{first=UDR;}
	if(i==2);
	{third=UDR;}
	if(i==3);
	{second=UDR;
	i=0;}
}
в строках "if(i==2);" и "if(i==3);" - лишние точки с запятой

Re: UART последовательная передача данных

Добавлено: Пт сен 09, 2016 20:13:22
ARV
Тут нужен switch, а не куча if

Re: UART последовательная передача данных

Добавлено: Сб сен 10, 2016 13:33:28
zekmaster
а это уменьшит вес кода?

Re: UART последовательная передача данных

Добавлено: Сб сен 10, 2016 14:16:07
DX168B
Эту конструкцию:

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

   i++;
   if(i==1)
   {
      first=UDR;
   }
   if(i==2)
   {
      third=UDR;
   }
   if(i==3)
   {
      second=UDR;
      i=0;
   }
 
можно изобразить так:

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

   if(i==0)
   {
      first=UDR;
   }
   if(i==1)
   {
      third=UDR;
   }
   if(i==2)
   {
      second=UDR;
      i=0;
      return;
   }
   
   i++;
 
Или так:

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

volatile uint8_t rcvData[3];
volatile uint8_t rcvIndex = 0;

ISR (USART_RXC_vect)//считывание данных
{
   if(rcvIndex < 0x03)
   {
      rcvData[rcvIndex] = UDR;
      rcvIndex++;
   }
   else
   {
      rcvIndex = 1;
      rcvData[0] = UDR;
   }
}
 
и работать уже с массивом.
И посылки надо как-то различать, а иначе можно получить разсинхронизацию из-за какой-нибудь помехи.
Хотябы разделить их таймаутом или слать в виде строки с символами начала и конца пакета. Чтобы посылки выглядели в терминале
как-то так:

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

:10.30.128!
активно пользуясь функцией itoa перед передачей и atoi после приема, ориентируясь на символы начала пакета, его конца и разделителя данных (символ точки в данном примере)
На крайняк можно поискать готовую реализацию какого-нибудь протокола. Modbus к примеру.

Re: UART последовательная передача данных

Добавлено: Сб сен 10, 2016 16:11:39
zekmaster
Спасибо за совет! действительно будет разумнее использовать строку.