- Вложения
-
- 3 bytes.rar
- (36.64 КБ) 158 скачиваний
UART последовательная передача данных
- Сообщения: 12
- Зарегистрирован: Пт янв 08, 2016 13:49:20
Господа коты, нужна помощь. Есть задача: считывать данные с АЦП (с этим проблем нет), а затем передавать их на другой мк. Итак, я перепробовал коды с прерываниями и без, но, к сожалению, ничего путного из этого не вышло... что именно не работает: передатчик не хочет отправлять данные. Принцип довольно простой: мы отправляем 3 байта последовательно, а затем их считываем и выводим на ножки мк. Приёмник выводит что-то непонятное .-.
Не стоит бояться задавать вопросы
- Реклама
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
А вы с фьюзами не ошиблись когда прошивали? Типа деления на 8.
Сдается мне что у вас они работают на разных скоростях. По этому и принимается не то число которое отправили.Приёмник выводит что-то непонятное .-.
- Сообщения: 12
- Зарегистрирован: Пт янв 08, 2016 13:49:20
pokk, вы определённо правы. Глупая ошибка) Но почему после её исправления выходят одинаковые результаты? Т.е. переменные принимают одинаковые значения.
Не стоит бояться задавать вопросы
Код: Выделить всё
[b]volatile [/b]int i=0, first=0, second=0, third=0;Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
- Реклама
- Сообщения: 12
- Зарегистрирован: Пт янв 08, 2016 13:49:20
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
А что у вас за сигнал? может с АЦП идут одинаковые числа.
Для того что бы найти ошибку разделите программы на 2 части:
1)Сначала протестируйте канал связи (передавая фиксированные числа 1,2,3,4,255,170 через пару секунд) и смотрите что принимается на другом МК. (Или можно порт в первом МК настроить на вход, после по USART передать данные из порта и вывести на другом МК в порт, и замыкать выводы в первом мк, тогда четко все будет видно работает связь или нет)
2) Выдайте в порт(PORTA,PORTB), значение АЦП и по смотрите может они у вас там одинаковые.
После того как каждая часть будет работать соедините все вместе.
Для того что бы найти ошибку разделите программы на 2 части:
1)Сначала протестируйте канал связи (передавая фиксированные числа 1,2,3,4,255,170 через пару секунд) и смотрите что принимается на другом МК. (Или можно порт в первом МК настроить на вход, после по USART передать данные из порта и вывести на другом МК в порт, и замыкать выводы в первом мк, тогда четко все будет видно работает связь или нет)
2) Выдайте в порт(PORTA,PORTB), значение АЦП и по смотрите может они у вас там одинаковые.
После того как каждая часть будет работать соедините все вместе.
- Сообщения: 12
- Зарегистрирован: Пт янв 08, 2016 13:49:20
Выяснил, что проблема с передатчиком,но как её исправить понять не могу: пробовал изменять код ожидания окончания передачи(закидывал в прерывания по UDRE и TXC, менял в коде TXC на UDRE). Причём, если ножку связи оторвать от передатчика, приёмник выводит разные числа => что-то с передатчиком. P.S. вырезал из кода передатчика часть с АЦП. P.P.S.: с этим кодом приёмник выводит 192 на оба порта
- Вложения
-
- 3 bytes transmitter.rar
- (19.31 КБ) 141 скачивание
Не стоит бояться задавать вопросы
- Сообщения: 12
- Зарегистрирован: Пт янв 08, 2016 13:49:20
Господа форумчане, спасибо за уделённое моей проблеме время ^_^ Мне стыдно признавать, но с передатчиком всё нормально, а вот с приёмником - не совсем. Как всегда, крайне глупая ошибка: лишние ";"
в строках "if(i==2);" и "if(i==3);" - лишние точки с запятой
Код: Выделить всё
ISR (USART_RXC_vect)//считывание данных
{
i+=1;
if(i==1)
{first=UDR;}
if(i==2);
{third=UDR;}
if(i==3);
{second=UDR;
i=0;}
}Не стоит бояться задавать вопросы
Тут нужен switch, а не куча if
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 12
- Зарегистрирован: Пт янв 08, 2016 13:49:20
а это уменьшит вес кода?
Не стоит бояться задавать вопросы
Эту конструкцию:
можно изобразить так:
Или так:
и работать уже с массивом.
И посылки надо как-то различать, а иначе можно получить разсинхронизацию из-за какой-нибудь помехи.
Хотябы разделить их таймаутом или слать в виде строки с символами начала и конца пакета. Чтобы посылки выглядели в терминале
как-то так:
активно пользуясь функцией itoa перед передачей и atoi после приема, ориентируясь на символы начала пакета, его конца и разделителя данных (символ точки в данном примере)
На крайняк можно поискать готовую реализацию какого-нибудь протокола. Modbus к примеру.
Код: Выделить всё
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!На крайняк можно поискать готовую реализацию какого-нибудь протокола. 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
Спасибо за совет! действительно будет разумнее использовать строку.
Не стоит бояться задавать вопросы


