AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
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.RU
Регистрация: 08.02.2005
Адрес: Минск, Беларусь
Сообщений: 7,835
Сказал спасибо: 2,718
Сказали Спасибо 2,672 раз(а) в 1,976 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
1. ОООгромная пауза, после чего каждая плата быстро выплевывает свое сообщение
2. избыточное кодирование. НО! - приведет к увеличению длительности "плевка"
3. механически (шторками, линзами) по возможности разделить входные потоки
3. помогут ли поляризационные фильтры? - есть ли они на нужную длину волны...
4. Перейти с оптики на RF. Слать sms-ки, например
Шучу. Или нет...
Появляется вероятность, что платы с датчиками все же передадут данные "коллектору". Когда-нибудь, но не каждый раз.
Нужно оценивать риски неполучения вовремя информации.
Последний раз редактировалось Yuri222; 28.08.2018 в 10:52.
|
|
|
|
28.08.2018, 11:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,907
Сказал спасибо: 2,974
Сказали Спасибо 3,156 раз(а) в 2,142 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
Сообщение от Yuri222
|
3. механически (шторками, линзами) по возможности разделить входные потоки
|
12 отдельных оптик, как я понимаю.
Сообщение от threadstarter
|
Но все эксперименты не увенчались успехом видимо из за рассинхрона.
|
Хоть-бы кратенько - что за эксперименты и как ставились. Что безуспешно - не получается передать один канал или каналы мешают друг другу? Ведь очевидно, что если будет перекрывающаяся по времени передача от двух оконечных точек, то уже есть шансы не успеть обработать один из или оба потока. Правда event system я не раскуривал - сможет-ли она пихать битовые потоки в ОЗУ, а ЦП разгребать их относительно неспешно?
З.Ы. А почему такая монструозная конструкция? Для быстродействия, гальванической изоляции или чего ещё?
__________________
Экзорцист 40-го уровня.
|
|
|
|
28.08.2018, 11:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,621
Сказал спасибо: 115
Сказали Спасибо 810 раз(а) в 587 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
Дык, организуйте двухстороннюю связь и пусть мастер сообщает, от какого контроллера ожидает данные, если проблема с одновременной обработкой данных с 12 входов.
Да, а зачем через оптоволокно? Посадили бы всех на общую CAN-шину, и не парились!
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
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
Сообщений: 428
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
1. threadstarter, с какой скоростью идет (должен идти) обмен?
2. Atxmega32A4U - не имеет порта B4.
|
|
|
|
28.08.2018, 13:36
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,163
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
А обычного изолированного RS485 (что немного компактнее и проще) или изолированного же CAN (на CANOpen, что затратное по памяти и отладке в первом старте) не достаточно? Если так хочется оптики - то им и оптическую среду вполне можно приспособить
Остаётся только разобраться с протоколом передачи и арбитражом на шине.
В стороне остался ещё вариант с Ethernet на W5100…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
28.08.2018, 13:37
|
|
Прописка
Регистрация: 14.12.2006
Адрес: Ставрополь - Донское
Сообщений: 253
Сказал спасибо: 111
Сказали Спасибо 186 раз(а) в 76 сообщении(ях)
|
Re: Односторонний сбор данных с 12 МК
рекомендую почитать про 1-Wire.
а потом, перед занятием линии приплюсовывать
"пседвослучайный временной интервал
ЗЫ. сколько там данных то? какая скорость?
|
|
|
|
28.08.2018, 13:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
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, время: 17:31.
|
|