как связать два устройства по UART

Обсуждаем контроллеры компании Atmel.
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: как связать два устройства по UART

Сообщение Alkul »

Pavel_1978 писал(а):тогда сразу будет видно например что скорость разная

Осциллограф прекрасно покажет, какая скорость передачи данных имеет место быть

Pavel_1978 писал(а):на аналоговом (тот что с зеленым лучом) даже отследить передачу единичного символа, если он не посылается постоянно в цикле, нетривиальная задача...

Во-первых, осциллографом надо уметь пользоваться, во-вторых, когда тестируют обмен на предмет глюков отправки данных и уточнения скорости обмена именно так и делают - зацикливают передачу пакета

urry писал(а):Проблема в том, что вы не должны посылать в UDR данные до тех пор, пока не выйдет предыдущая инфа.

А ведь верно, это я упустил. Я-то сам очень давно уже делаю все отправки данных только в прерываниях - сформировал пакет, отправил первый байт из него, а отправка всех последующих идет в обработчике прерывания по завершению передачи байта. Поэтому оно само получается, что байт в UDR заносится только после отправки предыдущего, и я просто не думаю о проверке на "очищенность" UDR.
Реклама
Smen
Грызет канифоль
Сообщения: 256
Зарегистрирован: Вт окт 08, 2013 07:38:59
Откуда: СПб

Re: как связать два устройства по UART

Сообщение Smen »

Alkul писал(а):когда тестируют обмен на предмет глюков отправки данных и уточнения скорости обмена именно так и делают - зацикливают передачу пакета
лучше это делать логическим анализатором, и ничего зацикливать не надо. :wink:
Реклама
Аватара пользователя
Масяня
Прорезались зубы
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Re: как связать два устройства по UART

Сообщение Масяня »

Может кто нибудь написать программу, для этой схемы, чтобы по USART отправлялись символы, от A до N, при нажатии соответствующих кнопок, ну хотя бы для первых двух, постараюсь сам дальше разобраться, а то что то я явно не правильно написал. Я по крайней мере только учусь писать.
Изображение
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: как связать два устройства по UART

Сообщение ИС-пытатель »

слишком просто будет для вас.

Начните для начала хотя бы с того, чтобы по нажатию кнопки у Вас загорался или тух светодиод, подключенный к ноге.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Масяня
Прорезались зубы
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Re: как связать два устройства по UART

Сообщение Масяня »

Надеюсь понятно куда светодиоды цеплять аж целых 6 штук. Странно но по моему с этим может справиться и 6 транзисторов в ключевом режиме ну или логика по дешевле. Еще могу заставить их моргать если надо. :)) может поможет мне кто с USARTом не все же мне моргалки да пищалки делать.
Спойлер#include <mega8.h>
#include <delay.h>
void main(void)
{
PORTB=0b00111111; //ввод
DDRB=0x00; //вывод

PORTC=0x00; //ввод
DDRC= 0b00111111; //вывод

PORTD=0x00; //ввод
DDRD=0x00; //вывод

while (1)
{
if (!PINB.0) { //если PB0 замкнут на землю и равен 0
PORTC.0=1; //то PC0 приравниваем к 1 тем самым зажигаем светодиод
}
if (PINB.0>0) { //если же PB0 больше чем 0
PORTC.0=0; //то PC0 приравниваем к 0 тем самым гасим светодиод
};
if (!PINB.1) { //ДАЛЬШЕ ПИСАТЬ РУССКИЕ БУКВЫ НЕТ СМЫСЛА кто в курсе тот знает о чем речь идет
PORTC.1=1;
}
if (PINB.1>0) {
PORTC.1=0;
};
if (!PINB.2) {
PORTC.2=1;
}
if (PINB.2>0) {
PORTC.2=0;
};
if (!PINB.3) {
PORTC.3=1;
}
if (PINB.3>0) {
PORTC.3=0;
};
if (!PINB.4) {
PORTC.4=1;
}
if (PINB.4>0) {
PORTC.4=0;
};
if (!PINB.5) {
PORTC.5=1;
}
if (PINB.5>0) {
PORTC.5=0;
};
};
};
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Реклама
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: как связать два устройства по UART

Сообщение ИС-пытатель »

Топорная работа. С UARTом такое не прокатит. Сделайте чтобы по одному нажатию зажигался, а по по второму гас. И при этом чтобы если нажать и держать, он не моргал, как бешеный. И чтобы во время нажатий/отпусканий он не срабатывал несколько раз. хотя бы для двух кнопок. А уж потом я вам расскажу, как с UARTом работать.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: как связать два устройства по UART

Сообщение Аlex »

ИС-пытатель писал(а):А уж потом я вам расскажу, как с UARTом работать.
Ахаха... о великий сэнсей, снизойдите, откройте нам великую тайну, ибо этого никто без вас никогда не узнает ... :)))
http://yandex.ru/yandsearch?clid=9582&t ... 0Uart&lr=5

ЗЫ: Столько постов, и только одно "Я" и самопиар. А по делу абсолютно ничего... :facepalm:
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: как связать два устройства по UART

Сообщение ИС-пытатель »

А ты, как я погляжу, тут старший бла-блабол?
Очень деловой совет - послать в яндекс! Страно, и как это ТС сам не догадался?

Столько постов, и только одно "Я" и самопиар. А по делу абсолютно ничего... :facepalm:


Да, при этом "спасибо" мне, естесственно, за мой самопиар говорили. Не кажется, что личная неприязнь ко мне несколько мешает тебе выполнять свои обязанности модератора? Или ты почувствовал себя здесь всемогущим?
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: как связать два устройства по UART

Сообщение Alkul »

Для Масяни. Я не пишу на Си, но и то знаю, что нотации вида
Масяня писал(а):

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

PORTC.0=1


не соответствуют стандарту языка Си и "понимаются" только кодевижном. Привыкайте сразу писать так, чтобы это соответствовало стандарту и "понималось" любым компилятором Си.

Нужно бит установить нулевой бит в регистре PORTC, пишем не

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

PORTC.0=1

а

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

PORTC|=(1<<0);


Нужно сбросить нулевой бит - не

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

PORTC.0=0

а

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

PORTC&=~(1<<0);


В общем случае выглядит так:

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

PORTC&=~(1<<номер_бита); Установка бита
PORTC|=(1<<номер бита);  Сброс бита



А по USART - если я и дам пример кода, то только на ассемблере.
Но вначале мне бы хотелось увидеть, что Вы пытаетесь разобраться сами. Пока я этого не вижу.

P.S. Коты, ну что вы тут разборки устроили. Добрее надо друг к другу.
Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Re: как связать два устройства по UART

Сообщение Pavel_1978 »

Аlex писал(а):ЗЫ: Столько постов, и только одно "Я" и самопиар. А по делу абсолютно ничего... :facepalm:

Ну раз ты Такой весь аж МОДЕРАТОР, то объясни котенку который полный ноль в МК как сразу обработку клавиатуры написать и сварганить СВОЙ!!! протокол обмена по UART не тыканьем носом в яндекс / гугл, а чтоб он сам смог понять и написать.

Полностью Поддерживаю Ломателя. Грамотно все он объясняет.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: как связать два устройства по UART

Сообщение uk8amk »

Alkul
С точки зрения портируемости на другие платформы и универсальности - да. С точки зрения оптимальности - нет.
Сравните:

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

;     124       PORTA.0=1;
   SBI  0x1B,0

Операция атомарна.
И вот это "чудо":

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

;     125       PORTA.0 |=  (1<<0);
   LDI  R30,0
   SBIC 0x1B,0
   LDI  R30,1
   ORI  R30,1
   CPI  R30,0
   BRNE _0x8
   CBI  0x1B,0
   RJMP _0x9
_0x8:
   SBI  0x1B,0
_0x9:


Получается, что это весьма удобная и полезная надстройка.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: как связать два устройства по UART

Сообщение urry »

:)
если заранее неизвестен разряд, который будет сбрасываться или устанавливаться,то да, долго, проще подставить таблицу.
Если задефайнить разряд, то код оптимизируется в то же SBI.
Ну это ладно.
Относительно наездов - "котенку который полный ноль в МК обучить не можете" - то подсказок было достаточно.
Все они были проигнорированы.
Посылка в гугль обоснована.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: как связать два устройства по UART

Сообщение ibiza11 »

uk8amk писал(а):Операция атомарна.
И вот это "чудо": PORTA.0 |= (1<<0);
вообще предлагалось PORTA |= (1<<0); а не то что вы написали.
вот мой компиль:

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

//  202    PORTA |= (1<<0);
        SBI     0x1B, 0x00
и это даже при отключенной оптимизации
Ставим плюсы: )
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: как связать два устройства по UART

Сообщение Аlex »

Pavel_1978 писал(а):Ну раз ты Такой весь аж МОДЕРАТОР, то объясни котенку который полный ноль в МК как сразу обработку клавиатуры написать и сварганить СВОЙ!!! протокол обмена по UART не тыканьем носом в яндекс / гугл, а чтоб он сам смог понять и написать.
Полностью Поддерживаю Ломателя. Грамотно все он объясняет.
Во первых. На "ты" мы не переходили. Я Вас не знаю и знать не собираюсь. Негоже "тыкать" незнакомому человеку.
Во вторых. Объяснять кому-то что-то я не собираюсь, ибо не обязан этого делать. Тем более, учитывая, что все объяснения находятся в гугле за пару минут. Пересказывать это всё - мартышкин труд.
В третьих. Причём тут модераторство ? Или Вы считаете, что модератор должен всем пользователям задницу лизать с улыбкой на лице ? Ошибаетесь.
Ну и в четвёртых. Если этот пользователь для Вас всё грамотно объясняет, то уровень Ваш понятен. Хотя, по разговору итак всё очевидно. Отсюда, упрёки в мою сторону по техническим вопросам, предлагаю Вам засунуть себе куда-нибудь в глубокое место и не высовывать их оттуда никогда. Ибо это моё дело какие давать подсказки людям - в гугол отправлять или что-то объяснять. Не Вам указывать что мне делать.

ЗЫ: Всё вышесказанное, так-же относится и к "пытателю".
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: как связать два устройства по UART

Сообщение ИС-пытатель »

Всё вышесказанное, так-же относится

И к тебе в том числе. Так что не надо тут своих шуточек и подковырочек.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: как связать два устройства по UART

Сообщение uk8amk »

Сорри, был мой косяк ночью.
Но я думаю вы со мной согласитесь, что в общем случае:
= операция присваивания;
|= операция чтение-модификация-запись и ее реализация может зависеть от конкретного компилятора.
Аватара пользователя
desertkun
Открыл глаза
Сообщения: 61
Зарегистрирован: Пн ноя 05, 2012 14:14:30

Re: как связать два устройства по UART

Сообщение desertkun »

ТС, если все еще актуально, могу поделиться библиотекой UART для Atmel Studio. В библиотеке описаны базовые функции отправки/получения данных, причем работа идет не на уровне массива данных, а на уровне addInt, addString, getInt, getString e.t.c., причем используется контрольная сумма CRC16 для проверки пришедших данных.
Zhevagin
Родился
Сообщения: 9
Зарегистрирован: Чт июн 05, 2014 22:09:46

Re: как связать два устройства по UART

Сообщение Zhevagin »

Да куда ему UART? Ему бы с кнопками до конца разобраться!
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: как связать два устройства по UART

Сообщение Alkul »

uk8amk писал(а):Alkul
С точки зрения портируемости на другие платформы и универсальности - да. С точки зрения оптимальности - нет.

Ну, во-первых, Вы ошиблись (но это Вам уже указали).
А во-вторых, я говорил не о портируемости на другие платформы, а о корректном понимании исходника другими компиляторами (генерирующими код для AVR контроллеров).
Что касается именно других платформ, то я лично считаю, что для микроконтроллеров портируемость Си-шных программ - ложь от лукавого. Конечно, те, кто ассемблера не знают и архитектуру МК не изучали, не понимают этого до конца. Ну возьмем, к примеру, ATtiny15, у которого и ОЗУ-то в полном понимании этого слова нет. Есть блок регистров и все. А стек - аппаратный, причем всего лишь трехуровневый. Если программа изначально писалась с использованием частых вызовов подпрограмм в расчете на МК из серии мега, как это увязать для тини15? А если архитектура программы задумывалась в расчете на наличие второго 16-ти разрядного таймера?
Вот и получается, что на самом деле "портируемость" возможна только между схожих МК одной серии, а в этом случае и ассемблер прекрасно портируем. И при этом речь идет еще о контроллерах одного семейства! Что уж говорить о портируемости на другие семейства. Конечно, если речь идет о программке для моргания светодиодом, тогда да, легко портируется. Если же речь о сложной программе, написанной с учетом архитектуры МК, то вряд ли возможна портируемость наподобие: "Изменил в заголовке файл-описатель контроллера, перекомпилировал и - вуаля". Не бывает такого.

Для Масяни. Ну, где Ваша самостоятельная работа по изучению USART? Что уже освоили, что поняли, что еще остается непонятным?
Аватара пользователя
Масяня
Прорезались зубы
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Re: как связать два устройства по UART

Сообщение Масяня »

Я вот тут все почитал и думаю, зачем столько слов, не надо на меня наваливать все и сразу, я только начал программировать, помогли бы луче мне освоиться, разобраться где тут и что, и не надо меня в гугл и яндекс носом тыкать, я вродебы не где не нагадил. А пока я просил только пример того что мне надо, но и от реальной помощи в освоении этого пока что не понятного для меня мира программирования я же не программист в конце концов чтобы все и сразу понять не откажусь. У нас же в обучалке сам КОТ не смог нормально написать про программирование, И взял не самый популярный МК я лично такого даже в Улан-Удэ не нашел.
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Ответить

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