kadrum 0 27 ноября, 2008 Опубликовано 27 ноября, 2008 · Жалоба Всем доброе время суток! Пытаюсь сделать подобие 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(). На графиках видно, о чем я говорю... Может, кто то сталкивался с подобным? Помогите, плиз) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 27 ноября, 2008 Опубликовано 27 ноября, 2008 · Жалоба Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kadrum 0 28 ноября, 2008 Опубликовано 28 ноября, 2008 · Жалоба Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее. Ноги МК под прерывания заняты. Снимаем значения с ног по таймеру, с интервалом 10 мкс при частоте 8 МГц, в таймере проверяем несколько условий, и записываем несколько переменных типа char Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 ноября, 2008 Опубликовано 28 ноября, 2008 · Жалоба Ноги МК под прерывания заняты. Снимаем значения с ног по таймеру, с интервалом 10 мкс при частоте 8 МГц, в таймере проверяем несколько условий, и записываем несколько переменных типа char С таким подходом ничего не выйдет: через 10 мкс после начала слота мастер должен уже считать данные, а у Вас слейв в лучшем случае только заметит спад на линии. Увеличивайте времянки - это будет уже не 1W, зато будет работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 28 ноября, 2008 Опубликовано 28 ноября, 2008 · Жалоба Основная фича 1-wire это питание слэйва через сигнальную линию. Если вам это не нужно, то и смысла особого извращаться я не вижу. С тем же успехом (и намного проще) можно взять и соединить всё через обычный УАРТ, можно на скорости 1200, если очень хочется. RxD мастера подтянуть к "1", а TxD слэйвов подключать только при необходимости ответа. Кстати, если подумать, можно это всё и по одной линии сделать. Получится 1-Wire-UART Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kadrum 0 28 ноября, 2008 Опубликовано 28 ноября, 2008 · Жалоба Увеличивайте времянки - это будет уже не 1W, зато будет работать. Временные интервалы увеличил приверно в 10 раз... и на графиках с увеличенными временными интервалами Кстати, если подумать, можно это всё и по одной линии сделать. Получится 1-Wire-UART Уже думал над этим.. понял, что лучше сделать эдакий 1-wire софтверный.. Аппаратный UART уже занят, к сожалению на нем есть устройство, с которым контроллер постоянно обменивается информацией... А если ещё к ним включить другие устройства, то боюсь, что они не подружаться при наличии в шине двух мастеров, которые могут одновременно что то передавать в линию, и тем самым себя заглушат вовсе, один будет тянуть вверх, другой вниз... Если бы его можно было применить, я бы так и сделал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 28 ноября, 2008 Опубликовано 28 ноября, 2008 · Жалоба Уже думал над этим.. понял, что лучше сделать эдакий 1-wire софтверный.. А ванварь Вам точно нужна? У Вас в системе уже есть ванварный мастер, который обслуживает "железные" ванварные девайсы, и Вы решили для единообразия изобразить ванварного слейва? Тогда Вам потребуется 1 нога контроллера, способная генерить прерывание по перепаду 1/0, и один таймер с разрешением 1-2 мкс. Тактовая частота контроллера, чтобы в фоне обслуживать ванварь со стандартными временами, должна быть не менее: мастер на PIC - 4 МГц, на AVR - 2 МГц; слейвы - раза в 3-4 выше. Если реализовывать функции SearchROM/MatchROM, то тактовую слейвов нужно увеличить еще раза в 1.5. Если же Вы бьетесь с ванварным слейвом искусства ради, то ... Строить "софтверную" ванварь (если правильно понял Вашу мысль, нечто похожее на ванварь с масштабом по времени "уж как получится"), имхо, вообще бессмысленно: с "железной" ванварью совместимости не будет, а сама по себе ванварь - ну не очень интересный протокол, что по скорострельности, что по затратам на реализацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kadrum 0 28 ноября, 2008 Опубликовано 28 ноября, 2008 · Жалоба А ванварь Вам точно нужна? Строю ванварь от безисходности... У меня нет готовой сети, она воплощаеться, скорости достаточно 1-4 кбит в сек, решил увеличить тайминги. Сегодня написал прогу на асме, которая умеет отвечать на ресет пульс и отправлять данные в тайм слоте. завтра выложу мастера в Си, сегодя не успею, домой пора. ______slave.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aderod 0 18 марта, 2009 Опубликовано 18 марта, 2009 (изменено) · Жалоба У меня та же самая проблема. Пытаюсь строить 1-wire slave, пишу на Code Vision, контроллер ATMega88P (раскочегаренный до 10 МГЦ 0_о, медленнее он просто промаргивает стартовый сигнал). Навесил это дело на прерывание, у меня reset вызывает прерывание, потом программа ждет сколько он там постоит, если больше 100мкс значит это ресет, ждет пока он пройдет, и отправляет preserve. Чтение, он ждет пока линия уйдет на ноль, когда ушло он ждет 9 мкс, считывает состояние линии, потом ждет пока уйдет на высокий уровень. Запись, он ждет пока линия уйдет на ноль, если надо передать 0 то ставит линию на ноль, и ждет 12 мкс, если 1 то просто ждет 12 мкс. На симуляторе(Proteus) всё работает на ура, вот в реале, один мусор какой то читаецо, вас никогда этот симулятор не подводил? :smile3046: Изменено 18 марта, 2009 пользователем Denis R. Akimov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuickWitted 0 28 марта, 2009 Опубликовано 28 марта, 2009 · Жалоба Пытаюсь сделать подобие 1-wire сети на МК. Раз подобие и самостоятельно не всё получается, то можно посмотреть в сторону описания готовых систем... например DISEqC в 3 версии у него даже мультимастер зарезервирован... (я не предлагаю именно его, но может натолкнёт на удачную мысль...) RxD мастера подтянуть к "1", а TxD слэйвов подключать только при необходимости ответа. Кстати, если подумать, можно это всё и по одной линии сделать.Получится 1-Wire-UART проще токовую петлю поднять... (если не требуется питание по линии гнать) в этом случае никого "подключать" не надо, всё штатно и так весит... только арбитраж ввести... или описание готового посмотреть... (MIDI по моему как раз на 1-Wire-UART) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 3 октября, 2009 Опубликовано 3 октября, 2009 · Жалоба господа! Подскажите есть ли готовые решения моста 1 wire-slave to serial interface? а то на сайте maxim-ic.com представлены только на стороне ведущего, а мне надо чтобы по ван вайре можно было передавать информацию для МК, slave писать я так понял муторно. У меня в голове есть только идеи использовать либо DS2408, через параллельный интерфейс загружать байты на Мк, либо через DS2406 по двум проводам через i2c, но опять же с программкой на стороне ведущего получается геморой, код громоздкий а скорость маленькая. Есть идеи или предложения по этому поводу, буду благодарен за любой ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 3 октября, 2009 Опубликовано 3 октября, 2009 · Жалоба ... slave писать я так понял муторно... Да нечуть не муторно. И ничуть не сложнее чем мастера написать. Берёшь диаграмму, смотришь времянки и пишешь неторопясь. Думаю день, ну максимум 2 займёт. Учитывая, что стоимость максимов недетская, то я бы как раз лучше какую-нибудь тиньку и поставил. Думаю что и питание на малой частоте вполне бы потянула. В смысле по 2 проводам обеспечить можно попробовать. Конечно шина не очень удобная, на мой взгляд. Особенно для каких-то сетевых применений или обмена. Скорее она предназначена для подключения "на горячую". Обратите внимание, что слэйв при первом подключении формирует пресенс. То есть обозначает своё подключение. Другое дело, что это редко используется. Обычно полингом мастер определяет слейв. Из медленных несинхронных шин, для обмена я бы выбрал I2C. Преимущества - статическая. А это значит необременяет устройства формированием диаграмы. Слэйв правда тоже не из лёгких, но наличие аппаратной поддержки во многих контроллерах - значительно упрощает использование. PS: По поводу 1-wire: 1. Используете ногу прерывания и таймер. 2. Ловите прерывание на ноге. 3. По началу импульса - формируете диаграмму по таймеру, тем же способом что и у мастера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 4 октября, 2009 Опубликовано 4 октября, 2009 · Жалоба Да нечуть не муторно. И ничуть не сложнее чем мастера написать. Берёшь диаграмму, смотришь времянки и пишешь неторопясь. Спасибо за ответ! Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шине, а так конечно бы целесообразно было бы использование i2c. Насколько корректно будет использование серийного номера от DS2401? То есть прочитать серийный номер при включении проца, а потом переключиться в режим слейв и выдавать этот серийный номер за ds2401 и плюс разработать собственные команды, по которым мастер будет обмениваться со слейвами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 4 октября, 2009 Опубликовано 4 октября, 2009 · Жалоба Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шинеДля таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 5 октября, 2009 Опубликовано 5 октября, 2009 · Жалоба Для таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN. +1. Да плюс ко всему я бы ещё и аккуратно саму сеть спроектировал. А то даже на 485 могут быть проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться