asis-kbr.ru

автоматические системы и системы безопасности
Текущее время: 13 ноя 2018, 07:26

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 29 ноя 2013, 09:53 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
MANCHESTER, в отличие от UART, удобен тем что в нем синхронизируется каждый бит... Благодаря такой особенности, можно читать довольно потрепанный сигнал. Многие помнят времена спектрумов, так вот вспомните, на каких только магнитофонах не скармливали спектруму программу, и он все кушал!!!!! Так вот это заслуга манчестера....

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

Кроме того, в манчестере можно реализовать алгоритм автоматического вычисления скорости передаваемого сигнала, т.к. в отличие от UART - легко можно определить длину бита и эти данные использовать для всей серии... Но такой функционал наверное стоит реализовывать только в проводных линиях, т.к. там где есть помехи, при реализации такой возможности неизбежно возрастут потери пакетов, из-за того что не всегда будет правильно определятся скорость... Так что я пока не рассматриваю такую фишку в моей программе...

До сих пор, я пользовался ассемблерным вариантом манчестера. Вот рабочий пример. Но в связи с повсеместным переходом на Си, переписал библиотечку, и вроде чтото получилось :)... Правда в реальном оборудовании еще не испытал, так что возможны и сюрпризы... Но думаю в ближайшее время это прояснится...

Пока что есть две отдельные библиотечки, передающая (пока простая - прямой ногодрыг, потом будет по прерываниям), и приемная. Со временем хочу сделать одну универсальную, чтобы устройство с одной библиотекой могло полноценно обмениватся данными.

В обоих либах (приема\передачи) надо настроить одинаковый заголовок (возможна размерность 1-16 символов), это такая латинская текстовая фраза, которую будет ожидать декодер...
Также надо указать в настройках необходимый размер буфера (возможные значения 1-255).
Есть еще такая полезная весчь, как пилот сигнал... тоже надо указать его длину (1-16 бит). Например для проводной линии достаточно одного бита, а вот для радио передачи можно и побольше, например 8, чтобы АРУ приемника перед полезной инфой, успела выйти на нужный режим...

Проекты оформлены с простеньким примерчиком работы... 4 кнопочки зажигают соответствующие светики в приемнике.
Вложение:
manchester.gif
manchester.gif [ 27.54 КБ | Просмотров: 32840 ]
Вложение:
AVRST4_mega8_manchester.7z [22.18 КБ]
Скачиваний: 867
Вложение:
PROT_mega8_manchester.7z [15.61 КБ]
Скачиваний: 778


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 янв 2015, 12:52 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
не удалось продвинуться?)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 янв 2015, 13:36 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
В одну библиотеку прием и передачу так и не оформил, а вообще пользуюсь во всю...
Последний раз использовал тут - viewtopic.php?f=21&t=193


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 янв 2015, 14:29 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
там без изменений код?
по ссылке кода нет


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 янв 2015, 14:38 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Именно что касается манчестера - без именений...
Если нужно, могу тебе в личку все исходники кинуть...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 янв 2015, 14:42 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
спасибо, интересен сам манчестер

заинтересовал "умный двор"
мне он как-то интереснее чем RS485
есть две задачи где должен подойти отлично


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 мар 2015, 14:26 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
axill писал(а):
не удалось продвинуться?)
Наконец продвинулся )))))...

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

Скинул сюда: viewtopic.php?f=13&t=211


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 май 2015, 17:56 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
вопрос по теории
у манчестера единица от нуля отличается тем какой переход фиксируется, с нуля на единицу или обратно
однако если ошибиться на полпериода, то можно спутать переход между битами за переход относящийся к самому биту и перевернуть все с ног наголову

за счет чего манчестер избавляется от такой ошибки?

еще. кроме способа фиксировать переход для кодирования нуля и единицы видел еще кодировку где кодирование определяется соотношением периода на которое выставляется логический уровень. Например один бит занимает 4 такта, логически ноль кодируется как три такта ноль, один такт единица. Единица как один такт ноль и три такта единица. Казалось бы это вариант должен быть надежнее манчестера - начала бита упустить не возможно, это всегда ноль, а кодирование определяется соотношением нуля и следующей за ним единицей. Тоже как в манчестере - синхронизация каждого бита.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 май 2015, 04:03 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
axill писал(а):
у манчестера ..... если ошибиться на полпериода, то можно спутать переход между битами за переход относящийся к самому биту и перевернуть все с ног наголову
Да, именно так... если происходит рассинхронизауция, то контрольная сумма не совпадет, и соответственно пакет забракуется...

axill писал(а):
за счет чего манчестер избавляется от такой ошибки?
Если подразумеваеш - "исправить ошибку" - это вряд ли... я не слышал чтобы обычные программные декодеры исправляли рассинхронизированные пакеты...
А если подразумеваеш - "отбраковать ошибку" - то как уже сказал, за счет контрольной суммы... просто бракованный пакет выбрасывается...
А если имееш ввиду - "как манчестер в начале передачи правильно цепляет переходы?" - тут секрет в пилот сигнале, либо в преамбуле, они должны содержать чередующиеся биты 0,1,0,1... ну или хотя бы два разные рядом стоящие бита... между этими битами не будет перепада, и тогда, даже если в начале прием начался не правильно, на этих битах синхронизация настроится правильно...

axill писал(а):
видел еще кодировку где кодирование определяется соотношением периода на которое выставляется логический уровень. Например один бит занимает 4 такта, логически ноль кодируется как три такта ноль, один такт единица. Единица как один такт ноль и три такта единица.
Казалось бы это вариант должен быть надежнее манчестера - начала бита упустить не возможно, это всегда ноль, а кодирование определяется соотношением нуля и следующей за ним единицей. Тоже как в манчестере - синхронизация каждого бита.
Да, хороший вариант... единственное, пропускная способность будет в 2 раза ниже чем у манчестера, т.к. у манчестера 1 бит это 2 такта, а у последнего варианта - 4 такта...
Т.е... если (к примеру) предельная пропускная частота среды передачи равна 100кгц, то на манчестере можно будет передавать на скорости 100кбит\сек... а тем способом, что ты упомянул (не знаю, как там его по научному обзывать надо)))), скорость упадет до 50кбит\сек...
Но если особая скорость передачи не нужна, то это действительно проще... так обычно работают брелки радиоуправления, например с кодированием KEELOQ... там скорость передачи около 1 - 2 кбит\сек


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 июн 2015, 10:24 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
у атмела есть апноут о манчестере http://www.atmel.com/images/doc9164.pdf
там так же есть кодировка BiPhase - по сути то о чем я выше писал - единица кодируется частотой в два раза выше чем ноль
но за счет дифференциального кодирования дата рейт получается такой же как у манчестера

интересно в чем практическая разница между манчестером и biphase
хочу именно biphase попробовать


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 июн 2015, 14:23 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
axill писал(а):
у атмела есть апноут о манчестере http://www.atmel.com/images/doc9164.pdf
Ух ты... я бы даже не догадался что у них и такое есть )))))

axill писал(а):
там так же есть кодировка BiPhase - по сути то о чем я выше писал - единица кодируется частотой в два раза выше чем ноль
Ну нет, BiPhase и то о чем ты говорил - это разные вещи вообще то...

axill писал(а):
интересно в чем практическая разница между манчестером и biphase, хочу именно biphase попробовать
Я тоже пока не очень понимаю в чем их плюсы и минусы...
Но уже как то занимался именно BiPhase... это была работа основанная на документе "Государственная автоматизированная система единого времени технической точности. Сигналы информационные в локальных хронометрических системах" там именно BiPhase использовался...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 июн 2015, 20:06 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
shads писал(а):
Ну нет, BiPhase и то о чем ты говорил - это разные вещи вообще то...


это как посмотреть
для меня не принципиальна форма сигнала
мне важно, что есть кодировка в которой нельзя спутать ноль с единицей как в манчестере если сбиться на один такт

в biphase как раз такая кодировка, но в отличии от описанного мной выше варианта, кодирование не понижает битрейт


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 июн 2015, 20:23 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
axill писал(а):
мне важно, что есть кодировка в которой нельзя спутать ноль с единицей как в манчестере если сбиться на один такт
Ты зря так боишься сбоя в манчестере... Дело в том, что сбой хоть от сторонней помехи, хоть от неточных временных таймингов - в любой кодировке вызовет ошибку...

Если насчет сторонней помехи - то по любому, среда передачи должна быть чистой... если же есть помехи (например неуверенный сигнал по радиоканалу), то приемная сторона должна распознавать битые пакеты и отбраковывать их... это касается любого кодирования, хоть манчестер, хоть заманчестер...
Если например помеха в манчестере может вызвать сбой синхронизации и в дальнейшем неверный прием, то та же помеха в другой кодировке, хоть даже и не вызовет сбой синхронизации, тем не менее испортит данные, так что пакет все равно нельзя будет использовать...
Ну а если канал чистый, то наш манчестер так же песни поет как и любая другая кодировка )))

Если насчет расброса таймингов, то у манчестера огромное преимущество по сравнению с тем что ты привел в пример вначале...
Дело в том, что манчестер позволяет разброс таймингов вплоть +\- 25%... другая система кодирования, например с 4-ми тактами, позволит разброс только до +\- 12%
Именно по этому я использую манчестер в бескварцевых системах... хотя обычный манчестер или бифазный - тут разницы нет...
Я даже думаю что у бифазного в принципе нет преимуществ перед обычным... то что в нем нагляднее кодирование - это только кажущееся преимущество...
Хотя... могу ошибаться...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 июн 2015, 22:19 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
стало мне любопытно написать самому код
пишу я правда медленно, вдумчиво )
еще одна цель - сделать совершенно универсальный кусок сишного кода
т.е. не привязанный к МК, в перспективе чтобы работал и на AVR и на STM8/STM32

сейчас закончил кодировщик
суть такая - в приложении описываются несколько функций специфичных для задачи/МК
и вставляется библиотечная функция в обработчик таймера
частота срабатывания таймера становится частотой кодирования манчестера

кстати в программе saleae китайского лонического анализатора можно декодировать манчестер
очень удобно, еще до написания своего кода декодирования я вижу что кодирую правильно
Вложение:
manc.jpg
manc.jpg [ 73 КБ | Просмотров: 30278 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 окт 2015, 13:15 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
добрался до продолжения
сделал декодировщик

интересно мнение Сергея на то, что у меня получилось

жаль нет спойлеров, чтобы простыни кода не постить
универсальность пока та, какую хотел - под конкретный МК нужно описать только:
- процедуру инициализации, включая прерывание по входу и прерывания по таймеру
- описать функцию чтения состояния входа и выхода
- описать функцию изменения состояния выхода

ниже пример драйвера для атмега32

пока одно мне не очень нравится. У меня получается что на один бит данных нужно 8 срабатываний прерывания таймера
изначально было 2 срабатывания на бит-интервал и этого достаточно для кодирования, но если меньше 8 то я не могу четко определять середину бит-интервала при декодировании
получается, что без кварца без предделителя на стандартном таймере я получаю 8000000/256/8 = 3906 бит в секунду или 488 байт/сек
но даже 8 к 1 не дадут возможность детектировать манчестер при сильной разнице частот передатчика и приемника (при отклонении более 30-50% работать не будет)

Сергей, у тебя там какие скорости?

альтернативой может быть использования значения железного счетчика (тот же OCR для AVR) для детектирования середины интервала, тогда будет 2 к 1 и 1953 байт/сек при прочих равных

Код:
//--------------------------------------------------------------------------------------------
/*
   atmega32 driver
   
   PB0 - output
   PD2 - input
   Timer0 & INT0 are in use
*/
#include <avr/io.h>
#include <avr/interrupt.h>

//--------------------------------------
ISR(TIMER0_OVF_vect) {
   swi_handler_timer();
}

ISR(INT0_vect) {
   swi_handler_recieve();
}

void swi_driver_init() {
   DDRB |= (1 << PORTB0);
   //PORTD |= (1 << PORTD2);
   MCUCR = (0 << ISC01) | (1 << ISC00);
   GICR = (1 << INT0);
   // timer 0 /8
   TCCR0 = (0 << CS02) | (1 << CS01) | (0 << CS00);
   TIMSK = (1 << TOIE0);
}
void swi_driver_set_output(uint8_t bit) {
   if(bit) {
      PORTB &= ~(1 << PORTB0);
   } else {
      PORTB |= (1 << PORTB0);
   }
}
uint8_t swi_driver_get_output() {
   return (PINB & (1 << PINB0))?1:0;
}
uint8_t swi_driver_get_input() {
   return (PIND & (1 << PIND2))?1:0;
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 окт 2015, 10:25 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Я как то раньше использовал такой подход к декодированию для обработки сигнала радиопультов...
http://forum.easyelectronics.ru/viewtop ... 3161#p3161
viewtopic.php?f=21&t=122
Но чтобы достаточно качественно анализировать сигнал, у меня частота опроса линии была в 10 раз больше чем частота принимаемого сигнала... (если частота данных 2кГц, то вызов прерывания 20кГц)
Ну у тебя близко, в 8 раз... думаю тоже пойдет...
Недостаток такого способа в небольшой скорости декодируемого сигнала... по внешним прерываниям скорость обмена возрастает на порядок...

Тут viewtopic.php?f=13&t=211 написано про скорость моего варианта , "Скорости передачи данных от 1кбит\с до 18кбит\с..."

Кстати... если внутри обработчика прерывания вызывать другие функции, то обработчик начинает сохранять буквально все рабочие регистры, что сказывается на размере кода и на быстродействии выполнения кода обработчика...
Я в таком случае размещаю вызываемые функции в одном файле с обработчиком и обзываю эти функции static...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 окт 2015, 00:16 
Не в сети
Свой человек!

Зарегистрирован: 14 июн 2013, 02:22
Сообщения: 102
посмотрел уже с новым пониманием код по твоей ссылке

- правильно понимаю, что у тебя таймер0 настроен на 125 кгц?
- при передаче ты манипулируешь значением TCNT0 так, чтобы прерывание по переполнению срабатывало два раза за бит-интервал?
- при приемке внутри INT0 ты опять же настраиваешь TCNT0 так, чтобы прерывание сработало через 3/4 бит-интервала?

если так, то красиво и оптимально
мне есть над чем задуматься
у меня то тупо долбит прерывания по таймеру с заданной частотой в 8 раз на бит интервал
а внутри я уже смотрю надо что-то делать или нет
хотел конечно изначально отказаться от эксклюзивного использования таймера, но есть над чем подумать

мне еще нужно решать вопрос с конфликтами. все таки предполагаю отсутствие мастера и общение на равных, т.е. любое устройство может инициировать передачу (иначе сканирование мастером требует много времени и ресурсов)

уже реализовано ожидание в течении заданного числа бит-интервалов, пока на линии не будет логической единицы в течении этого времени ни передача ни прием не стартуют
дальше хочу сделать еще такой механизм - при передаче после выставления значения на выходе - считывать актуальное состояние на входе. Если они разнятся то перезапускать передачу. Т.е. детектировать конфликт во время передачи и делать перезапуск при обнаружении конфликта. Паузы можно увеличивать при возникновении конфликта до тех пор пока сообщение не будет передано успешно. Как думаешь, будет так работать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 окт 2015, 18:58 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
axill писал(а):
- правильно понимаю, что у тебя таймер0 настроен на 125 кгц?
Ну да, частота прироста значения таймера равна 125кГц, или 8мкс один тик таймера...
Почему так - для наиболее полного использования счетчика при минимальной частоте... у нас минимальная частота сигнала равна 1кГц, т.е. один бит передачи по времени равен 1 мс... при этом таймер при своей частоте может досчитать до 0.000008 * 255 = 0.002сек, т.е. таймер может посчитать до 2-х Мс... это то что нам надо...
Конечно при увеличении частоты манчестер сигнала, точность счета таймера ухудшается, т.к. он начинает считать до все меньшего числа... но если ставить указанные частоты (1,2,4,6,12,18 кГц) то прием идет уверенно...

axill писал(а):
- при передаче ты манипулируешь значением TCNT0 так, чтобы прерывание по переполнению срабатывало два раза за бит-интервал?
Ага, именно так.

axill писал(а):
- при приемке внутри INT0 ты опять же настраиваешь TCNT0 так, чтобы прерывание сработало через 3/4 бит-интервала?
Ага.
Оно должно попасть в точку 1\4 времени бита, там мы разрешаем внешнее прерывание и ожидаем перепада в середине бита, после прерывания отключаем внешние прерывания и настраиваем счетчик так чтобы прерывание по переполнению случилось через 3\4 времени бита... Ну и так по кругу...

axill писал(а):
если так, то красиво и оптимально
Мне тоже пока что нравится )))

axill писал(а):
у меня то тупо долбит прерывания по таймеру с заданной частотой в 8 раз на бит интервал
Ну это тоже вариант... как я сказал - я так тоже раньше делал... но минус в том, что скорость сигнала особо не поднимеш... т.е. для низкочастотного сигнала тоже пойдет...

axill писал(а):
мне еще нужно решать вопрос с конфликтами. все таки предполагаю отсутствие мастера и общение на равных, т.е. любое устройство может инициировать передачу (иначе сканирование мастером требует много времени и ресурсов)
Ну я бы не сказал, что прям много времени и ресурсов...
но я почему то изначально решил пользоваться одномастерной сетью... это мне намного понятнее... насчет P2P вообще ни разу не размышлял... наверное это тебе стоит почитать еще материалы в сети на эту тему...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 дек 2016, 17:23 
Не в сети

Зарегистрирован: 28 ноя 2016, 22:19
Сообщения: 5
Ваша библиотека просто супер. Но есть вопрос, если Вас не затруднит. Все передается, все декодируется, поставил проверку на 3 байта - все гуд. Но вот на идентификатор не обращает внимания, любые символы ставлю, все равно принмивет как валидные. Может посмотрите че не так, хотя не суть, можно еще один байт добавить.

В теории хочу так - (беспроводный выключатель) - нажал на выключатель, тиня13 (вышла из комы) отправила код, ушла в кому. Ногодрыг тут как раз в тему. Без всяких... А в идеале - нажал на выключатель, тиня13 (вышла из комы) - глянула переменную, если <= 50 отправила просто свой код, если 50 - включила АЦП, прочитала "батарейку", обнулила переменную, отправила код - и в кому.
Спасибо


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 дек 2016, 18:01 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Ссылочку кинь на файлы которые качал, а то их тут несколько версий... Чтобы мы не начали говорить о разных вещах )


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB