| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Односторонний сбор данных с 12 МК
28.08.2018, 08:02
|
|
|
Прохожий
Регистрация: 27.02.2013
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Односторонний сбор данных с 12 МК
Добрый день.
Может кто-нибудь даст какие-либо наводки или поделиться своими знаниями в подобной работе.
Опишу условно:
12 плат с МК Atxmega 32A4U. Каждый собирает 4 температурных значения с 4-х DS18B20 (PORTA) и смотрит за активностью 4 своих ног на вход PORTB 0,1,2,3(наличие импульсов за интервал времени).
На каждой такой плате стоит оптопередатчик Avago HFBR 1522Z к ноге PORTB 4 вывода МК.
В основном цикле программы происходит увеличение 4 счетчиков импульсов при изменении состояния PORTB 0,1,2,3
1 плата сбора данных с МК Atxmega 128A3. На ней 12 оптоприемников Avago HFBR 2522Z PORTA 0,1,2,3,4,5,6,7 PORTB 0,1,2,3
На PORTC посажен USART - общение с внешним миром.
Каким то образом необходимо настроить одностороннюю передачу от 12 плат 4х температур, 4 состояний вводов. Мысль была начало передачи обозначать короткой паузой (100 мс) и после этого мигать ногой в соответствии с температурой 1ого датчика, потом пауза уже 50 мс, второй датчик и т.д. Но все эксперименты не увенчались успехом видимо из за рассинхрона.
Буду рад любым мыслям и подходам к реализации.
|
|
|
|
28.08.2018, 10:48
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.02.2005
Адрес: Минск, Беларусь
Сообщений: 8,919
Сказал спасибо: 3,109
Сказали Спасибо 3,030 раз(а) в 2,258 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
1. ОООгромная пауза, после чего каждая плата быстро выплевывает свое сообщение
2. избыточное кодирование. НО! - приведет к увеличению длительности "плевка"
3. механически (шторками, линзами) по возможности разделить входные потоки
3. помогут ли поляризационные фильтры? - есть ли они на нужную длину волны...
4. Перейти с оптики на RF. Слать sms-ки, например 
Шучу. Или нет...
Появляется вероятность, что платы с датчиками все же передадут данные "коллектору". Когда-нибудь, но не каждый раз.
Нужно оценивать риски неполучения вовремя информации.
Последний раз редактировалось Yuri222; 28.08.2018 в 10:52.
|
|
|
|
28.08.2018, 11:22
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,459
Сказал спасибо: 3,227
Сказали Спасибо 3,512 раз(а) в 2,393 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
Сообщение от Yuri222
|
|
3. механически (шторками, линзами) по возможности разделить входные потоки
|
12 отдельных оптик, как я понимаю.
Сообщение от threadstarter
|
|
Но все эксперименты не увенчались успехом видимо из за рассинхрона.
|
Хоть-бы кратенько - что за эксперименты и как ставились. Что безуспешно - не получается передать один канал или каналы мешают друг другу? Ведь очевидно, что если будет перекрывающаяся по времени передача от двух оконечных точек, то уже есть шансы не успеть обработать один из или оба потока. Правда event system я не раскуривал - сможет-ли она пихать битовые потоки в ОЗУ, а ЦП разгребать их относительно неспешно?
З.Ы. А почему такая монструозная конструкция? Для быстродействия, гальванической изоляции или чего ещё?
__________________
Экзорцист 40-го уровня.
|
|
|
|
28.08.2018, 11:47
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
Дык, организуйте двухстороннюю связь и пусть мастер сообщает, от какого контроллера ожидает данные, если проблема с одновременной обработкой данных с 12 входов.
Да, а зачем через оптоволокно? Посадили бы всех на общую CAN-шину, и не парились!
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
28.08.2018, 11:59
|
|
|
Прохожий
Регистрация: 10.12.2004
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
1) Настройте головной контроллер на работу по прерываниям от 12 входных пинов;
2) В прерывании формируйте флаги изменения состояний всех 12 входов;
3) В головном цикле по состоянию флагов вызывайте 12 процедур обработки входных потоков.
Учитывая, что процессы медленные, всё должно успешно обрабатываться.
|
|
|
|
28.08.2018, 13:22
|
|
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 434
Сказал спасибо: 20
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
1. threadstarter, с какой скоростью идет (должен идти) обмен?
2. Atxmega32A4U - не имеет порта B4.
|
|
|
|
28.08.2018, 13:36
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,285
Сказал спасибо: 11,860
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
А обычного изолированного RS485 (что немного компактнее и проще) или изолированного же CAN (на CANOpen, что затратное по памяти и отладке в первом старте) не достаточно? Если так хочется оптики - то им и оптическую среду вполне можно приспособить 
Остаётся только разобраться с протоколом передачи и арбитражом на шине.
В стороне остался ещё вариант с Ethernet на W5100…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
28.08.2018, 13:37
|
|
|
Прописка
Регистрация: 14.12.2006
Адрес: Ставрополь - Донское
Сообщений: 266
Сказал спасибо: 118
Сказали Спасибо 197 раз(а) в 81 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
рекомендую почитать про 1-Wire.
а потом, перед занятием линии приплюсовывать
"пседвослучайный временной интервал
ЗЫ. сколько там данных то? какая скорость?
|
|
|
|
28.08.2018, 13:38
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.10.2007
Сообщений: 2,758
Сказал спасибо: 1,100
Сказали Спасибо 1,033 раз(а) в 568 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
Я правильно понимаю: 12 однонаправленных оптических каналов собираются на плате сбора. (какие шторки? куда?  )
Проблема в том, что передатчики могут передавать в любое время и возникают коллизии при приёме. Это когда более одного пакета приходит одновременно и принимающий контроллер успевает принять только один, а остальные теряются.
Очень плохо, что передатчик не знает, дошло ли его сообщение. Это всё очень сильно усложняет.
Хорошо, что каналы очень быстродействующие. Меньшее соотношение длина пакета/длина паузы меньше вероятность коллизии
Передатчик должен передавать свои пакеты чаще, чем нужно приёмнику: часть из них будет теряться из-за коллизий. Приходит в голову одно: передавать пакет через (псевдо)случайный интервал. Приёмник начинает приём по прерыванию от изменения уровня на лапке.
Если можно снизить скорость передачи до такой, что принимающий контроллер будет тупо успевать опрашивать все 12 каналов за время одного бита, то прерывание от изменения уровня в канале запускает сбор данных. Нужен стартовый бит для запуска сбора данных. Похоже на RS232.
Последний раз редактировалось makakus; 28.08.2018 в 13:49.
|
|
|
|
28.08.2018, 13:46
|
|
|
Прохожий
Регистрация: 27.02.2013
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
Сообщение от ForcePoint
|
12 отдельных оптик, как я понимаю.
Хоть-бы кратенько - что за эксперименты и как ставились.
|
Эксперимент на одном канале:
Код с передающего МК:
|
PHP код:
|
PORTD.DIR = 0b11111111;
int t1 = 49;
int t2 = 50;
int t3 = 51;
int t4 = 52;
int startdelay = 100;
int packetdelay = 50;
int pindelay = 3;
while (1)
{
PORTD.OUT = 0b00000001;
delay_ms(startdelay);
for (int i = 0 ; i‹t1; i++)
{
PORTD.OUTTGL = 0b00000001;
delay_ms(pindelay);
}
delay_ms(packetdelay );
for (int i = 0 ; i‹t2; i++)
{
PORTD.OUTTGL = 0b00000001;
delay_ms(pindelay );
}
delay_ms(packetdelay );
for (int i = 0 ; i‹t3; i++)
{
PORTD.OUTTGL = 0b00000001;
delay_ms(pindelay );
}
delay_ms(packetdelay );
for (int i = 0 ; i‹t4; i++)
{
PORTD.OUTTGL = 0b00000001;
delay_ms(pindelay );
}
delay_ms(packetdelay );
}
|
Код приемника:
|
PHP код:
|
PORTD.DIR = 0b00000000;
PORTCFG.MPCMASK = 0xff;
PORTD.PIN0CTRL = PORT_OPC_PULLUP_gc;
while (1)
{
Byte oldd0 =0;
int cn = 0;
int t1 = 0;
int t2 = 0;
int t3 = 0;
int t4 = 0;
while(cn ‹ 99)
{
if (!(PORTD.IN&0b00000001))
{
cn++;
}
else
{
cn = 0;
}
delay_ms(1);
}
cn = 0;
oldd0 = PORTD.IN;
while (cn ‹50)
{
if ((oldd0 & 0b00000001) != (PORTD.IN&0b00000001))
{ t1++;
oldd0 = PORTD.IN;
cn =0;
}
else
{
cn++;
}
delay_ms(1);
}
cn = 0;
while (cn ‹50)
{
if ((oldd0 & 0b00000001) != (PORTD.IN&0b00000001))
{
t2++;
oldd0 = PORTD.IN;
cn =0;
}
else
{
cn++;
}
delay_ms(1);
}
cn = 0;
while (cn ‹50)
{
if ((oldd0 & 0b00000001) != (PORTD.IN&0b00000001))
{
t3++;
oldd0 = PORTD.IN;
cn =0;
}
else
{
cn++;
}
delay_ms(1);
}
cn = 0;
while (cn ‹50)
{
if ((oldd0 & 0b00000001) != (PORTD.IN&0b00000001))
{
t4++;
oldd0 = PORTD.IN;
cn =0;
}
else
{
cn++;
}
delay_ms(1);
}
}
|
Вот так вроде даже работает - но если последовательно опрашивать 12 каналов то время опроса будет что то из разряда 20-30 секунд(не пробовал - но по ощущениям так.) А это много. Вообще идеал в пару секунд опрашивать.
Сообщение от ForcePoint
|
12 отдельных оптик, как я понимаю.
А почему такая монструозная конструкция? Для быстродействия, гальванической изоляции или чего ещё?
|
Выпрямитель 3.3 киловольта. 48 диодов - по 4 в блоке. По датчику на блок, 12 штук в итоге - из силовой установки вытаскивать можно только оптикой - для сохранности жизни персонала(хотя +- 5в в силовую установку разрешили  )
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:14.
|
|