Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
#1

простой медленный обмен между двумя МК - что выбрать?

16.10.2013, 03:54. Просмотров 9854. Ответов 19
Метки нет (Все метки)

хочется иногда немного распаралелить и работу и разработку своих любительских устройств и иметь например датчик на какой-нибуть тиньке - тинька преобразовывает аналог в цифру и отдает по 1 или максимум 2 проводам на основной МК. Или в обратную сторону - например модуль силового диммера, тинька делает всю работу по фазовому регулированию, а управляет значением мощности внешний МК

если честно в голову у меня сейчас укладывается только логика работы SPI )) Но он минимум три провода, да и скорость большая не нужна
что использовать? Буду признателен за наводку или ссылку на алгоритм или еще лучше сишную библиотеку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2013, 03:54
Ответы с готовыми решениями:

Обмен данными по SPI между двумя Atemga
Пытаюсь реализовать обмен 5 байт данными между двумя Atmeg(1-Atmega165 ведущий,...

Обмен файлами между микроконтроллерами
Здравствуйте, форумчане. Возникла проблема, ломаю голову над ее решением....

Обмен сообщениями между двумя ПК
Подскажите, как можно организовать отправку сообщений между двумя компами. Одно...

Обмен данными между двумя программами
Доброго времени суток! Подскажите, есть ли возможность передавать из одной...

Обмен информации между двумя устройствами
Разработать программу обмена информации между двумя устройствами. Передача...

19
tokky
0 / 0 / 0
Регистрация: 06.11.2009
Сообщений: 155
16.10.2013, 04:02 #2
минимум по ногам 1-wire, но аппаратно вроде как нет.
По UART есть в даташите описалово на построение "кластера" для мег.
I2C - два провода и есть аппаратно.
Все от конкретной задачи зависит.
третий вариант - взять ARM дешевле меги и забить на эти извраты
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
16.10.2013, 09:23 #3
Цитата Сообщение от tokky
минимум по ногам 1-wire, но аппаратно вроде как нет.
По UART есть в даташите описалово на построение "кластера" для мег.
I2C - два провода и есть аппаратно.
мне попадалась только одна реализация програмного 1-wire, но на мой взгляд она громоздка и схемотехнически и програмно - http://avr.ru/ready/inter/1wire/1wire
есть ли примеры программной реализации UART/I2C?

Цитата Сообщение от tokky
третий вариант - взять ARM дешевле меги и забить на эти извраты
а в армах что за чудо?)
0
HotD
0 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
16.10.2013, 09:56 #4
I2C проще тем, что там не нужен CS-пин, как в SPI. Чуть замороченней, правда, чем SPI, но можно дофига навесить на одну линию. в итоге только два провода - куда уж меньше.
0
drvtos
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
16.10.2013, 10:20 #5
Цитата Сообщение от Hotd
I2C проще тем, что там не нужен CS-пин, как в SPI. Чуть замороченней, правда, чем SPI, но можно дофига навесить на одну линию
Ну, у меня не слишком большой в этом опыт, но как-то понятнее, когда интерфейсы используют "по назначению". С этой точки зрения для работы на расстояниях от пары метров до пары километров существует RS-485. Что в нем такого плохого, чтобы изобретать применения I2C или SPI для данной задачи? Не пойму.
Аппаратно - всего-то по одному копеечному драйверу на каждой плате. Витая пара. Можно без всякой развязки, юзаю многократно на расстояния до пары сотен метров.
Программно - можно максимально упростить, если использовать свой протокол. Есть варианты с использованием 9-го бита для адресации, но особого смысла для описанной задача я не вижу. Есть и стандартные протоколы, тот же старина Модбас, скажем. Могут пригодиться, если вдруг мысля пойдет на развитие системы. Но это можно и потом решить. Все равно аппаратно ничего не надо менять.
Так что мое имхо - ставь RS-485 и работай в штатных режимах.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
16.10.2013, 11:15 #6
Цитата Сообщение от drvtos
Так что мое имхо - ставь RS-485 и работай в штатных режимах.
мне далеко не всегда нужны большие расстояния
а что за копеечное железо? rs485 цепляется у uart?
0
Johmmy0007
0 / 0 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
16.10.2013, 11:44 #7
LIN
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 12:30 #8
Цитата Сообщение от oxytt
а что за копеечное железо? rs485 цепляется у uart?
RS485 в простом понимании это UART с буфером для RS485 , который стоит копейки например MAX485
0
okotimiv
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,382
16.10.2013, 12:54 #9
Для внутриприборных соединений - I2C, для межприборных соединений - 485. Это, типа, классика.

SPI в применении не столь удобен, а при увеличении количества контрагентов становится слишком громоздким.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
16.10.2013, 13:47 #10
Цитата Сообщение от oxytt
а что за копеечное железо? rs485
http://www.otyexpress.com/item/Friiship ... 03584.html

тут http://asis-kbr.ru/forum/viewtopys.php? ... t=twi#p349 (местный KONTROLLER) задействовал I2C.....

тут http://asis-kbr.ru/forum/viewtopys.php? ... t=LIN#p217 (местный KUBER) задействовал LIN.

тут http://asis-kbr.ru/forum/viewtopys.php? ... D0%B0#p191 используется OPENTHERM позволяет по 2-м проводам и питание и сигнал передавать.

тут http://asis-kbr.ru/forum/viewtopys.php?f=9&t=107 я в своей конструкции использую: линию - аналог 1wire, кодирование сигнала в линии - манчестер, формат общения устройств - далекий аналог модбаса.....

Короче - поле широкое..... как все стыковать.....
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
16.10.2013, 14:43 #11
Цитата Сообщение от oxytt
мне попадалась только одна реализация програмного 1-wire, но на мой взгляд она громоздка и схемотехнически и програмно - http://avr.ru/ready/inter/1wire/1wire
Ну... реализация - реализации - рознь.....

Вот например моя реализация эмуляции ключа DS1990A. Правда она сделана в лоб, т.е. сюда проц переходит безоговорочно на определенное время. (Есть еще реализация многозадачная, с работой на выводе с внешним прерыванием).
Зато в данном случае используется любой вывод контроллера, не обязательно с функцие внешнего прерывания.
В принципе это подходит для большинства задач, например вычислили какие то данные, и перешли сюда например на секунду, потом вернулись обновить данные, опять ушли на секунду.....

Вот как я преобразовывал данные бесконтактной RFID карты в эмуляцию TM ключа...
Всего 3 функции: ф-ция главная, ф-ция байтового обмена, ф-ция контрольной суммы... помоему совсем не сложно...

Код
//#######################################################################################################################
//#
//#   БИБЛИОТЕКА ФУНКЦИЙ ОБРАБОТКИ СОФТОВОГО 1WIRE SLAVE (РЕАЛИЗАЦИЯ ЭМУЛЯЦИИ TM КЛЮЧА DS1990A)
//#
//# Используются 2 таймера счетчика. Например:
//# На T2 (в основной программе) реализовано циклическое прерывание 100Гц и вызов оттуда ф-ции OWExe()
//# На T0 (в основной программе) реализован непрерывный счетчик. Время инкремента = 8 Мкс (F_CPU=8МГц, предделит=64)
//#
//#######################################################################################################################

//настройки портов
#define OW_PORT         PORTB            /*порт 1WIRE*/
#define OW_DDR          DDRB
#define OW_PIN          PINB
#define OW_LINE          (1<<7)         /*пин 1WIRE*/

//глобальные переменные
uint8_t OneWireCheckSumm;               /*байт контрольной суммы*/
uint8_t OWModeTimeCoun;
#define OW_MODE_TIME   500            /*100-1000мс. время работы в режиме iButton*/

//Прототипы функций
char OWByteOut (uint8_t* pByte);
void OWCheckSumm (char data);

//#######################################################################################################################
//#
//#   ФУНКЦИИ РАБОТЫ С 1WIRE SLAVE
//#
//#######################################################################################################################

//ФУНКЦИЯ обработки 1WIRE SLAVE
//активирована на время пока не обнулится OWModeTimeCoun
//АРГУМЕНТ - указатель на буфер данных RFID карты
void OneWire (char* pData)
{
OW_DDR &= ~OW_LINE;
OW_PORT &= ~OW_LINE;               //подготовка порта
OWModeTimeCoun = OW_MODE_TIME / 10;      //инит времени работы

//подготовка буфера и данных iButton для передачи
uint8_t OWData [8];
uint8_t* pOWData = OWData;            //указатель на буфер
*pOWData++ = 0x01;                  //0 - код семейства
*pOWData++ = 0x00;                  //1 - не используется
for (uint8_t i=0; i<5; i++)            //2,3,4,5,6 - байты RFID данных
*pOWData++ = *pData++;
OneWireCheckSumm = 0;
for (uint8_t i=0; i<7; i++)            //вычисление контрольной суммы
OWCheckSumm (OWData [i]);
*pOWData = OneWireCheckSumm;         //7 - контрольная сумма

//цикл ожидания запросов по 1wire (на время пока не обнулится OWModeTimeCoun)
while (OWModeTimeCoun){

//ЖДЕМ РЕСЕТА
while (OW_PIN & OW_LINE){            //ждем перепада линии в 0
if (! OWModeTimeCoun)   return;
asm ("wdr");                  //обработка WDT таймера
}

//крутимся пока линия в нуле
TCNT0 = 0;                        //сбросить счетчик таймера
while (! (OW_PIN & OW_LINE)){         //
if (TCNT0 >= 50){               //8мкс\такт * 50 = 400мкс (т.е. если больше 400мкс - то это ресет)

//РЕСЕТ ОБНАРУЖЕН, ждем окончания уровня 0
while (! (OW_PIN & OW_LINE))            //ждем возврата линии в 1
if (! OWModeTimeCoun)    return;         //закончилось время работы 1wire

SFIOR |= PSR10;               //обнулить прескалер
TCNT0 = 0;                  //сбросить счетчик таймера
while (TCNT0 < 3){}            //ждем 25мкс (8мкс\такт * 3)

SFIOR |= PSR10;               //обнулить прескалер
TCNT0 = 0;                  //сбросить счетчик таймера
OW_DDR |= OW_LINE;            //отрабатываем PRESENCE
while (TCNT0 < 16){}         //ждем 125мкс (8мкс\такт * 16)
OW_DDR &= ~OW_LINE;            //отпустить линию

//ОБМЕН ДАННЫМИ ПО 1WIRE
uint8_t Byte = 0xff;         //байт для обмена (работа через указатель)
uint8_t* pByte = &Byte;
if (! OWByteOut (pByte))   briok;//если обмен неудачный - рестарт
if (*pByte != 0x33)         briok;//ожидаем команду Read ROM (0x33), иначе - рестарт

//СЛИВАЕМ SERIAL NUMBER
for (uint8_t i=0; i<8; i++){
*pByte = OWData [i];
if (! OWByteOut (pByte)) briok;//если обмен неудачный - рестарт
}
briok;                     //обмен завершен
}
}
}
}

//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ байтового обмена в режиме 1WIRE SLAVE
//АРГУМЕНТ - указатель на байт для ввода\вывода в 1wire
//ЗНАЧЕНИЕ - (1)-передано нормально, (0)-ошибка
char OWByteOut (uint8_t* pByte)
{
uint8_t Byte = *pByte;
for (char i=0; i<8; i++){

//ждем перепада в 0
while (OW_PIN & OW_LINE)         //ждем перепада в 0 (пока не истекло время в OWModeTimeCoun)
if (! OWModeTimeCoun)
return 0;

//подготовка к приему\передаче бита
SFIOR |= PSR10;                  //обнулить прескалер
TCNT0 = 0;                     //обнулить таймер

//передаем 0 бит (считаем что приняли тоже бит 0)
if (! (Byte & 0x01)){
Byte >>= 1;
OW_DDR |= OW_LINE;            //выводим бит 0
while (TCNT0 < 4){}            //ждем 4 такта счетчика (8мкс\такт * 4 = 32 мкс)

OW_DDR &= ~OW_LINE;            //отпустить линию
TCNT0 = 0;
while (! (OW_PIN & OW_LINE))   //ждем возврата линии в 1
if (TCNT0 >= 20) return 0;   //превышение длительности прижатого состояния линии
}

//иначе - принимаем бит с линии
else{
Byte >>= 1;
while (! (OW_PIN & OW_LINE))   //ждем возврата линии в 1
if (TCNT0 >= 20) return 0;   //превышение длительности прижатого состояния линии

if (TCNT0 < 4)               //если 0 был менее 32 мкс (8мкс\такт * 4)
Byte |= 0x80;            //принятый бит = 1
}
}
*pByte =  Byte;
return 1;                        //удачный обмен. выход
}

//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ПОДСЧЕТА КОНТРОЛЬНОЙ СУММЫ
//АРГУМЕНТ - байт участвующий в формировании контрольной суммы
//OneWireCheckSumm - глобальная переменная контрольной суммы
void OWCheckSumm(char data)
{
for (char i=0; i<8; i++){
char temp = data;
temp ^= OneWireCheckSumm;

if (temp & 0x01){
OneWireCheckSumm ^= 0x18;
temp = 0x80;
}
else
temp = 0;

OneWireCheckSumm >>= 1;
OneWireCheckSumm |= temp;
data >>= 1;
}
}

//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ обработки переменных 1WIRE (вызывать из прерывания с частотой 100Гц)
void OWExe (void)
{
if (OWModeTimeCoun)
OWModeTimeCoun--;
}

//#######################################################################################################################
//#
//#   THE END!
//#
//#######################################################################################################################
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
16.10.2013, 19:40 #12
посмотрел даташит на max485. В одном даташите сразу несколько чипов. Как я понял у некоторых есть режим низкого потребления, у некоторых есть ограничение полосы пропускания. Чем-то еще они принципиально отличаются?
В даташите были указаны еще две харрактеристики - Half duplex или Full duplex - это что?
Количество устройств на шине для max485 указано - 32. А как там адресация делается? Если это обычный UART с другим физическим транспортом, то откуда берется адресация?

правильно понимаю, что шина - это витая пара, два провода и не надо земли устройств соединять, так?
а если все-таки общая шина питания - это будет работать?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 22:59 #13
1. Максимальная скорость
2. Полудуплекс и дуплекс
3. Адресацию Вы делаете softoм
4. Зависит от длины - читай помехoзащита RS485
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
16.10.2013, 23:10 #14
Цитата Сообщение от YTYOUT
2. Полудуплекс и дуплекс
что это значит? full duplex значит, что идет одновременно передача и прием, а полудулекс - либо передача либо прием?

3. Адресацию Вы делаете softoм
тоесть например в первом байте пакета указывают кому адресовано?
а как решаются коллизии если вдруг несколько устройств одновременно хотят сделать передачу?
[/quote]
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
16.10.2013, 23:12 #15
Цитата Сообщение от ShodS
Вот как я преобразовывал данные бесконтактной RFID карты в эмуляцию TM ключа...
Всего 3 функции: ф-ция главная, ф-ция байтового обмена, ф-ция контрольной суммы... помоему совсем не сложно...
спасибо за пример, поизучаю
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 23:17 #16
1. Да
2. Обычно префикс + 8-бит адрес + данные+ СRC
3. В полудуплексе - только тот к кому обратился кто-то . Дуплекс не делал Но предполагаю нужен арбитр
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
17.10.2013, 00:02 #17
Цитата Сообщение от YTYOUT
3. В полудуплексе - только тот к кому обратился кто-то . Дуплекс не делал Но предполагаю нужен арбитр
то есть обратиться может только мастер?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
17.10.2013, 00:39 #18
Может только мастер , может и любой - это как софт для своей сетки напишешь
0
tokky
0 / 0 / 0
Регистрация: 06.11.2009
Сообщений: 155
17.10.2013, 02:50 #19
Я чего-то не догоняю? Дуплекс на 485 или таки 422?
0
YTYOUT
17.10.2013, 12:46     простой медленный обмен между двумя МК - что выбрать?
  #20
0
17.10.2013, 12:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2013, 12:46
Привет! Вот еще темы с ответами:

Обмен данными между двумя формами
У меня есть две формы и нужно передать данные от одной формы к другой. Вот...

Обмен данными между двумя компьютерами
Добрый день. Интересует такой вопрос. Осуществим ли через Excel обмен данными...

Обмен данными между двумя приложениями
Здравствуйте! Задача такая: существует два приложения: одно содержит кнопки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru