Перейти к содержанию
    

Всем доброе время суток!

Пытаюсь сделать подобие 1-wire сети на МК.

С реализацией Ведущего проблем не возникло, он успешно генерит ресет импульс, и таймслоты тоже, и считывать всё тоже умеет.

Но проблема возникла с Ведомым. В интернете всего полно по реализации ведущего, и "кот наплакал" про Ведомого. за то есть много документации о том, как должны себя вести ведомые устройства в сети.

Решил придельно упростить интерфейс до такого:

 

1) Мастер:отправляет ресет импульс

2) Ведомый: отправляет импульс присутствия

3) Мастер: Проверяет, отправил ли кто то импульс присутствия?, если нет, к п.1

4) Мастер: генерит начало таймслота, переменная BIT_COUNT_M=0;

5) Ведомый: после начала слота опускает линию, или оставляет в лог "1"

6) Мастер: ждет малость и считывает значение с шины, записывая его. BIT_COUNT_M=BIT_COUNT_M+1

7) Ведомый: ждет и отпускает линию

8) Мастер: Если BIT_COUNT_M<8 переход к см. п 4, иначе, отпускаем линию и возвращаем значение

 

Т.е. как видим, мастер просто оправшивет устройство.

Но ведомый иногда не распознаёт начала тайм слота, а ресет импульс - один из трёх раз.

Частота ошибок при передаче данных, примерно 1 бит на 10 байт.

Почему так? как устранить это?

 

Вся программа ведомого работает в обработчике таймера, который работает с периодом 10 мкс,

Связываю две ATmega-16, использую АВР студию 4.14 билд 589, GCC компилятор 20080610.

Для опускания шины в ведомом использую _delay_us().

 

На графиках видно, о чем я говорю...

Может, кто то сталкивался с подобным? Помогите, плиз)

post-24303-1227798246_thumb.jpg

post-24303-1227798259_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее.

Ноги МК под прерывания заняты. Снимаем значения с ног по таймеру, с интервалом 10 мкс при частоте 8 МГц, в таймере проверяем несколько условий, и записываем несколько переменных типа char

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ноги МК под прерывания заняты. Снимаем значения с ног по таймеру, с интервалом 10 мкс при частоте 8 МГц, в таймере проверяем несколько условий, и записываем несколько переменных типа char

С таким подходом ничего не выйдет: через 10 мкс после начала слота мастер должен уже считать данные, а у Вас слейв в лучшем случае только заметит спад на линии.

 

Увеличивайте времянки - это будет уже не 1W, зато будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Основная фича 1-wire это питание слэйва через сигнальную линию. Если вам это не нужно, то и смысла особого извращаться я не вижу.

С тем же успехом (и намного проще) можно взять и соединить всё через обычный УАРТ, можно на скорости 1200, если очень хочется.

RxD мастера подтянуть к "1", а TxD слэйвов подключать только при необходимости ответа.

Кстати, если подумать, можно это всё и по одной линии сделать.

Получится 1-Wire-UART

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увеличивайте времянки - это будет уже не 1W, зато будет работать.

Временные интервалы увеличил приверно в 10 раз... и на графиках с увеличенными временными интервалами

 

Кстати, если подумать, можно это всё и по одной линии сделать.

Получится 1-Wire-UART

Уже думал над этим.. понял, что лучше сделать эдакий 1-wire софтверный..

Аппаратный UART уже занят, к сожалению на нем есть устройство, с которым контроллер постоянно обменивается информацией... А если ещё к ним включить другие устройства, то боюсь, что они не подружаться при наличии в шине двух мастеров, которые могут одновременно что то передавать в линию, и тем самым себя заглушат вовсе, один будет тянуть вверх, другой вниз... Если бы его можно было применить, я бы так и сделал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже думал над этим.. понял, что лучше сделать эдакий 1-wire софтверный..

А ванварь Вам точно нужна?

У Вас в системе уже есть ванварный мастер, который обслуживает "железные" ванварные девайсы, и Вы решили для единообразия изобразить ванварного слейва? Тогда Вам потребуется 1 нога контроллера, способная генерить прерывание по перепаду 1/0, и один таймер с разрешением 1-2 мкс. Тактовая частота контроллера, чтобы в фоне обслуживать ванварь со стандартными временами, должна быть не менее: мастер на PIC - 4 МГц, на AVR - 2 МГц; слейвы - раза в 3-4 выше. Если реализовывать функции SearchROM/MatchROM, то тактовую слейвов нужно увеличить еще раза в 1.5.

Если же Вы бьетесь с ванварным слейвом искусства ради, то ... Строить "софтверную" ванварь (если правильно понял Вашу мысль, нечто похожее на ванварь с масштабом по времени "уж как получится"), имхо, вообще бессмысленно: с "железной" ванварью совместимости не будет, а сама по себе ванварь - ну не очень интересный протокол, что по скорострельности, что по затратам на реализацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А ванварь Вам точно нужна?

Строю ванварь от безисходности... У меня нет готовой сети, она воплощаеться, скорости достаточно 1-4 кбит в сек, решил увеличить тайминги. Сегодня написал прогу на асме, которая умеет отвечать на ресет пульс и отправлять данные в тайм слоте.

завтра выложу мастера в Си, сегодя не успею, домой пора.

______slave.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня та же самая проблема.

Пытаюсь строить 1-wire slave, пишу на Code Vision, контроллер ATMega88P (раскочегаренный до 10 МГЦ 0_о, медленнее он просто промаргивает стартовый сигнал).

Навесил это дело на прерывание, у меня reset вызывает прерывание, потом программа ждет сколько он там постоит, если больше 100мкс значит это ресет, ждет пока он пройдет, и отправляет preserve.

Чтение, он ждет пока линия уйдет на ноль, когда ушло он ждет 9 мкс, считывает состояние линии, потом ждет пока уйдет на высокий уровень.

Запись, он ждет пока линия уйдет на ноль, если надо передать 0 то ставит линию на ноль, и ждет 12 мкс, если 1 то просто ждет 12 мкс.

На симуляторе(Proteus) всё работает на ура, вот в реале, один мусор какой то читаецо, вас никогда этот симулятор не подводил?

:smile3046:

Изменено пользователем Denis R. Akimov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь сделать подобие 1-wire сети на МК.

 

Раз подобие и самостоятельно не всё получается, то можно

посмотреть в сторону описания готовых систем...

например DISEqC

в 3 версии у него даже мультимастер зарезервирован...

(я не предлагаю именно его, но может натолкнёт на удачную мысль...)

 

 

RxD мастера подтянуть к "1", а TxD слэйвов подключать только при необходимости ответа.

Кстати, если подумать, можно это всё и по одной линии сделать.Получится 1-Wire-UART

 

проще токовую петлю поднять... (если не требуется питание по линии гнать)

в этом случае никого "подключать" не надо, всё штатно и так весит...

только арбитраж ввести...

 

или описание готового посмотреть...

(MIDI по моему как раз на 1-Wire-UART)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

господа! Подскажите есть ли готовые решения моста 1 wire-slave to serial interface? а то на сайте maxim-ic.com представлены только на стороне ведущего, а мне надо чтобы по ван вайре можно было передавать информацию для МК, slave писать я так понял муторно. У меня в голове есть только идеи использовать либо DS2408, через параллельный интерфейс загружать байты на Мк, либо через DS2406 по двум проводам через i2c, но опять же с программкой на стороне ведущего получается геморой, код громоздкий а скорость маленькая. Есть идеи или предложения по этому поводу, буду благодарен за любой ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... slave писать я так понял муторно...

Да нечуть не муторно. И ничуть не сложнее чем мастера написать. Берёшь диаграмму, смотришь времянки и пишешь неторопясь. Думаю день, ну максимум 2 займёт. Учитывая, что стоимость максимов недетская, то я бы как раз лучше какую-нибудь тиньку и поставил.

Думаю что и питание на малой частоте вполне бы потянула. В смысле по 2 проводам обеспечить можно попробовать. Конечно шина не очень удобная, на мой взгляд. Особенно для каких-то сетевых применений или обмена. Скорее она предназначена для подключения "на горячую". Обратите внимание, что слэйв при первом подключении формирует пресенс. То есть обозначает своё подключение. Другое дело, что это редко используется. Обычно полингом мастер определяет слейв.

 

Из медленных несинхронных шин, для обмена я бы выбрал I2C. Преимущества - статическая. А это значит необременяет устройства формированием диаграмы. Слэйв правда тоже не из лёгких, но наличие аппаратной поддержки во многих контроллерах - значительно упрощает использование.

 

PS: По поводу 1-wire:

1. Используете ногу прерывания и таймер.

2. Ловите прерывание на ноге.

3. По началу импульса - формируете диаграмму по таймеру, тем же способом что и у мастера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да нечуть не муторно. И ничуть не сложнее чем мастера написать. Берёшь диаграмму, смотришь времянки и пишешь неторопясь.

 

Спасибо за ответ! Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шине, а так конечно бы целесообразно было бы использование i2c. Насколько корректно будет использование серийного номера от DS2401? То есть прочитать серийный номер при включении проца, а потом переключиться в режим слейв и выдавать этот серийный номер за ds2401 и плюс разработать собственные команды, по которым мастер будет обмениваться со слейвами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шине
Для таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN.

+1.

Да плюс ко всему я бы ещё и аккуратно саму сеть спроектировал. А то даже на 485 могут быть проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...