Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры Atmega AVR

Войти
Регистрация
Восстановить пароль
 
 
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
#1

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

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

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

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

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

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

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

Обмен данными между двумя удаленными БД - PHP
Есть две БД. Обе находяться на разных серверах. Не могу реализовать обмен данными между ними в одном запросе. Реально это или нет.

Обмен данными между двумя сервисами - JavaScript
Здравствуйте. Стоит перед до мной одна задача. В системе amocrm создать виджет. Сам он пишет на JS. В нем я новичек. Цель виджета брать...

Обмен данными между двумя приложениями - C#
Здравствуйте! Задача такая: существует два приложения: одно содержит кнопки вверх, вниз, влево, вправо, другое квадрат в центре....

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.som/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)
//#
//#######################################################################################################################

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

//глобальные переменные
uint8_t OneWireCheckSumm;               /*байт контрольной суммы*/
uint8_t OWModeTimeCoun;
#defyme 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
16.10.2013, 23:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2013, 23:12
Привет! Вот еще темы с ответами:

Обмен данными между двумя устройствами - Сетевое оборудование
Доброго времени суток, У меня возник следующий вопрос. У нас в студенческом общежитии, где я живу, интернет организован путем...

Обмен данными между двумя приложениями - C++ WinAPI
есть 2 приложения. Приложение 1 - Создает Приложение 2 с помощью CreateProcess(); следовательно знает его ThreadId и ProcessId и...

Обмен почты между двумя серверами - Lotus
Есть два lotus домена с разными именами в одной локальной сети (два почтовых сервера в разных lotus доменах), как сделать так чтобы они...

Обмен данными между двумя процессами - C++
Добрый день/вечер. Усердно слушал преподавателя на паре, прошуршал много литературы дома, но так и не понял, как заюзать обмен данными...


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

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

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