Передача по USART

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 327
Зарегистрирован: Пн авг 25, 2008 10:24:51
Откуда: Россия, Магадан

Сообщение belyay »

Добрый день. Есть такая задача, передать по USART 6- данных по 10 бит и 1 - 8 бит.
имеется вот такая сборка http://www.ebay.com/itm/261086921764?ss ... 1497.l2649 (Не реклама) на передатчике ATMega 8 на приемнике ATMega16, частота у обоих 7,3728 MHz, скорость передачи 1200, частота обновления данных 1 Гц в идеале 2 Гц.
ссылка на проект - http://forum.rcdesign.ru/f8/thread312364.html
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

и? в чем проблема то? Вы привлекаете на тот форум?
Ставим плюсы: )
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 327
Зарегистрирован: Пн авг 25, 2008 10:24:51
Откуда: Россия, Магадан

Сообщение belyay »

ibiza11 писал(а):и? в чем проблема то? Вы привлекаете на тот форум?
Нет, ни кого я не привлекаю, дал ссылку для наглядности чего я хочу. Проблема в том что только начал изучать МК. программу для оброботки принятых данных написал, а вот как мне зашифровать, отправить, принять, расшифровать и разложить по переменным увы пока не разобрался. Вот и прошу помощи.
Спасибо.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

нужно выбрать протокол обмена. Пусть будет UART (как у Вас в заголовке)
Но UART подразумевает обмен байтами, а Вам нужно передать пакет.
Вот и начните обдумывать состав пакета и характеристики передачи:
1) количество байт в пакете
2) последовательность байт в пакете (например: 0-скорость старший байт, 1-скорость младший байт, 2-температура)
3) средства защиты от ошибок приема (например: CRC8)
4) продолжительность передачи пакета и промежуток между пакетами.

далее пишете функцию передачи байта. встраиваете эту функцию в функцию побайтовой передачи пакета. Аналогично прием.
в приемнике отводите массив в который будете складывать принятые данные. как проходит время приема пакета - взводите флаг приема и обрабатываете пакет. тут много можно писать. проще поискать уже готовые проекты.
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

Сообщение VladimirVladimirovitch »

belyay писал(а):
ibiza11 писал(а):и? в чем проблема то? Вы привлекаете на тот форум?
Нет, ни кого я не привлекаю, дал ссылку для наглядности чего я хочу. Проблема в том что только начал изучать МК. программу для оброботки принятых данных написал, а вот как мне зашифровать, отправить, принять, расшифровать и разложить по переменным увы пока не разобрался. Вот и прошу помощи.
Спасибо.
Шифруйте КСОРОМ - логический оператор XOR - исключающий ИЛИ.
z = x ^ y;
где
z - зашифрованный байт
x - незашифрованный
y - ключ

расшифровка в обратном порядке:

x = z ^ y;
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

кстати, а зачем Вам шифрование?
Ставим плюсы: )
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 327
Зарегистрирован: Пн авг 25, 2008 10:24:51
Откуда: Россия, Магадан

Сообщение belyay »

ibiza11 писал(а):кстати, а зачем Вам шифрование?
Шифрование - имеется ввиду что надо как то обозначить 7 переменных в передатчике, что бы их потом разложить каждую в свою переменную в приемнике.
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Тогда более правильным термином будет не шифрование, а скорее кодирование или структура данных. Передавайте свои байты в пределенном порядке, а в приемнике (приняв их в том-же порядке) раскладывайте по соответствующим переменным. Например, первый байт в первую переменную с тем-же именем, что в передатчике, второй - во вторую и т.д.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 327
Зарегистрирован: Пн авг 25, 2008 10:24:51
Откуда: Россия, Магадан

Сообщение belyay »

как я понимаю за раз можно передать только 1 байт или 8 бит. То есть можно так представить пакет <1xxxxe
где
< - начало пакета
1 - переменная (1- скорость, 2- 1 банка, 3-2 банка, и т.д.)
xxxx - сама переменная (от 0 до 1023)
e - конец пакета
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Я выше писал о передаче всех данных сразу. Но если будете передавать каждый раз по одной величине, то достаточно передать 3 байта: первый байт как у Вас будет говорить какая величина передается, а последующие 2 байта - значение самой величины (из 16 переданных бит будет исползовано лишь 10, в приемнике потом соберете оба байта в одну переменную). Начало и конец пакета отмечать не нужно, т.к. протокол UART уже включает посылку стартового и (как опцию) стопового битов для каждого из байтов, а пакет у Вас будет фиксированной длины (3 байта).
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 327
Зарегистрирован: Пн авг 25, 2008 10:24:51
Откуда: Россия, Магадан

Сообщение belyay »

Подскажите как разобрать 16 бит на два байта и потом как их сложить?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Странный вопрос, учитывая, что ATmega 16 битных чисел даже не знает. В ней все числа в 8 битном виде хранятся, следовательно нужно просто взять и младший и старшие байты числа, передать их, а на принимающем контроллере положить в соответствующие ячейки памяти. Или вопрос в конкретном языке программирования? Если адреса неизвестны (язык высокого уровня, работа с переменными), можно тупо сделать логическое "и" с числом 255 - это младший байт, логическое "и", и сдвиг вправо на 8 бит - это старший байт. Наоборот: старший байт сдвинуть влево на 8 бит и прибавить младший.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 327
Зарегистрирован: Пн авг 25, 2008 10:24:51
Откуда: Россия, Магадан

Сообщение belyay »

помогите с написанием ПО есть переменная ch_1 она может быть до 10 бит. в uart лезет только до 8 бит

putchar('<'); // признак переменной
putchar(ch_1); // отправка переменной

как написать что бы она разбивалась на два байта?
и как в приемнике собрать в кучу

if (getchar() == '<')
sb=getchar();

спасибо
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

может так
unsigned int ch_1;
unsigned char lsb,hsb;

lsb = ch_1;
hsb = 8 >> ch_1;

или так

unsigned int ch_1;
char mass[2];

*(int*)mass = ch_1;
Ответить

Вернуться в «Периферия»