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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение zekmaster »

Господа коты, нужна помощь. Есть задача: считывать данные с АЦП (с этим проблем нет), а затем передавать их на другой мк. Итак, я перепробовал коды с прерываниями и без, но, к сожалению, ничего путного из этого не вышло... что именно не работает: передатчик не хочет отправлять данные. Принцип довольно простой: мы отправляем 3 байта последовательно, а затем их считываем и выводим на ножки мк. Приёмник выводит что-то непонятное .-.
Вложения
3 bytes.rar
(36.64 КБ) 158 скачиваний
Не стоит бояться задавать вопросы
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

RX -> TX ?
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

А вы с фьюзами не ошиблись когда прошивали? Типа деления на 8.
Приёмник выводит что-то непонятное .-.
Сдается мне что у вас они работают на разных скоростях. По этому и принимается не то число которое отправили.
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение zekmaster »

pokk, вы определённо правы. Глупая ошибка) Но почему после её исправления выходят одинаковые результаты? Т.е. переменные принимают одинаковые значения.
Не стоит бояться задавать вопросы
Реклама
Эиком - электронные компоненты и радиодетали
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

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

[b]volatile [/b]int i=0,  first=0, second=0, third=0;
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение zekmaster »

не помогло
Не стоит бояться задавать вопросы
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

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

После того как каждая часть будет работать соедините все вместе.
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение zekmaster »

Выяснил, что проблема с передатчиком,но как её исправить понять не могу: пробовал изменять код ожидания окончания передачи(закидывал в прерывания по UDRE и TXC, менял в коде TXC на UDRE). Причём, если ножку связи оторвать от передатчика, приёмник выводит разные числа => что-то с передатчиком. P.S. вырезал из кода передатчика часть с АЦП. P.P.S.: с этим кодом приёмник выводит 192 на оба порта
Вложения
3 bytes transmitter.rar
(19.31 КБ) 141 скачивание
Не стоит бояться задавать вопросы
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение 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);" - лишние точки с запятой
Не стоит бояться задавать вопросы
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Тут нужен switch, а не куча if
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение zekmaster »

а это уменьшит вес кода?
Не стоит бояться задавать вопросы
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение 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 к примеру.
Последний раз редактировалось DX168B Сб сен 10, 2016 21:24:40, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение zekmaster »

Спасибо за совет! действительно будет разумнее использовать строку.
Не стоит бояться задавать вопросы
Ответить

Вернуться в «AVR»