Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 1-wire slawe на МК
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Шалапут:-)
Всем доброе время суток!
Пытаюсь сделать подобие 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
Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее.
Шалапут:-)
Цитата(aaarrr @ Nov 27 2008, 17:17) *
Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее.

Ноги МК под прерывания заняты. Снимаем значения с ног по таймеру, с интервалом 10 мкс при частоте 8 МГц, в таймере проверяем несколько условий, и записываем несколько переменных типа char
aaarrr
Цитата(Шалапут:-) @ Nov 28 2008, 11:44) *
Ноги МК под прерывания заняты. Снимаем значения с ног по таймеру, с интервалом 10 мкс при частоте 8 МГц, в таймере проверяем несколько условий, и записываем несколько переменных типа char

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

Увеличивайте времянки - это будет уже не 1W, зато будет работать.
MrYuran
Основная фича 1-wire это питание слэйва через сигнальную линию. Если вам это не нужно, то и смысла особого извращаться я не вижу.
С тем же успехом (и намного проще) можно взять и соединить всё через обычный УАРТ, можно на скорости 1200, если очень хочется.
RxD мастера подтянуть к "1", а TxD слэйвов подключать только при необходимости ответа.
Кстати, если подумать, можно это всё и по одной линии сделать.
Получится 1-Wire-UART
Шалапут:-)
Цитата(aaarrr @ Nov 28 2008, 10:50) *
Увеличивайте времянки - это будет уже не 1W, зато будет работать.

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

Цитата(MrYuran @ Nov 28 2008, 11:52) *
Кстати, если подумать, можно это всё и по одной линии сделать.
Получится 1-Wire-UART

Уже думал над этим.. понял, что лучше сделать эдакий 1-wire софтверный..
Аппаратный UART уже занят, к сожалению на нем есть устройство, с которым контроллер постоянно обменивается информацией... А если ещё к ним включить другие устройства, то боюсь, что они не подружаться при наличии в шине двух мастеров, которые могут одновременно что то передавать в линию, и тем самым себя заглушат вовсе, один будет тянуть вверх, другой вниз... Если бы его можно было применить, я бы так и сделал.
xemul
Цитата(Шалапут:-) @ Nov 28 2008, 13:28) *
Уже думал над этим.. понял, что лучше сделать эдакий 1-wire софтверный..

А ванварь Вам точно нужна?
У Вас в системе уже есть ванварный мастер, который обслуживает "железные" ванварные девайсы, и Вы решили для единообразия изобразить ванварного слейва? Тогда Вам потребуется 1 нога контроллера, способная генерить прерывание по перепаду 1/0, и один таймер с разрешением 1-2 мкс. Тактовая частота контроллера, чтобы в фоне обслуживать ванварь со стандартными временами, должна быть не менее: мастер на PIC - 4 МГц, на AVR - 2 МГц; слейвы - раза в 3-4 выше. Если реализовывать функции SearchROM/MatchROM, то тактовую слейвов нужно увеличить еще раза в 1.5.
Если же Вы бьетесь с ванварным слейвом искусства ради, то ... Строить "софтверную" ванварь (если правильно понял Вашу мысль, нечто похожее на ванварь с масштабом по времени "уж как получится"), имхо, вообще бессмысленно: с "железной" ванварью совместимости не будет, а сама по себе ванварь - ну не очень интересный протокол, что по скорострельности, что по затратам на реализацию.
Шалапут:-)
Цитата(xemul @ Nov 28 2008, 13:30) *
А ванварь Вам точно нужна?

Строю ванварь от безисходности... У меня нет готовой сети, она воплощаеться, скорости достаточно 1-4 кбит в сек, решил увеличить тайминги. Сегодня написал прогу на асме, которая умеет отвечать на ресет пульс и отправлять данные в тайм слоте.
завтра выложу мастера в Си, сегодя не успею, домой пора.
Denis R. Akimov
У меня та же самая проблема.
Пытаюсь строить 1-wire slave, пишу на Code Vision, контроллер ATMega88P (раскочегаренный до 10 МГЦ 0_о, медленнее он просто промаргивает стартовый сигнал).
Навесил это дело на прерывание, у меня reset вызывает прерывание, потом программа ждет сколько он там постоит, если больше 100мкс значит это ресет, ждет пока он пройдет, и отправляет preserve.
Чтение, он ждет пока линия уйдет на ноль, когда ушло он ждет 9 мкс, считывает состояние линии, потом ждет пока уйдет на высокий уровень.
Запись, он ждет пока линия уйдет на ноль, если надо передать 0 то ставит линию на ноль, и ждет 12 мкс, если 1 то просто ждет 12 мкс.
На симуляторе(Proteus) всё работает на ура, вот в реале, один мусор какой то читаецо, вас никогда этот симулятор не подводил?
smile3046.gif
QuickWitted
Цитата(Шалапут:-) @ Nov 27 2008, 20:05) *
Пытаюсь сделать подобие 1-wire сети на МК.


Раз подобие и самостоятельно не всё получается, то можно
посмотреть в сторону описания готовых систем...
например DISEqC
в 3 версии у него даже мультимастер зарезервирован...
(я не предлагаю именно его, но может натолкнёт на удачную мысль...)


Цитата(MrYuran @ Nov 28 2008, 14:52) *
RxD мастера подтянуть к "1", а TxD слэйвов подключать только при необходимости ответа.
Кстати, если подумать, можно это всё и по одной линии сделать.Получится 1-Wire-UART


проще токовую петлю поднять... (если не требуется питание по линии гнать)
в этом случае никого "подключать" не надо, всё штатно и так весит...
только арбитраж ввести...

или описание готового посмотреть...
(MIDI по моему как раз на 1-Wire-UART)
asket
господа! Подскажите есть ли готовые решения моста 1 wire-slave to serial interface? а то на сайте maxim-ic.com представлены только на стороне ведущего, а мне надо чтобы по ван вайре можно было передавать информацию для МК, slave писать я так понял муторно. У меня в голове есть только идеи использовать либо DS2408, через параллельный интерфейс загружать байты на Мк, либо через DS2406 по двум проводам через i2c, но опять же с программкой на стороне ведущего получается геморой, код громоздкий а скорость маленькая. Есть идеи или предложения по этому поводу, буду благодарен за любой ответ.
SasaVitebsk
Цитата(asket @ Oct 3 2009, 14:23) *
... slave писать я так понял муторно...

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

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

PS: По поводу 1-wire:
1. Используете ногу прерывания и таймер.
2. Ловите прерывание на ноге.
3. По началу импульса - формируете диаграмму по таймеру, тем же способом что и у мастера.
asket
Цитата(SasaVitebsk @ Oct 4 2009, 01:48) *
Да нечуть не муторно. И ничуть не сложнее чем мастера написать. Берёшь диаграмму, смотришь времянки и пишешь неторопясь.


Спасибо за ответ! Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шине, а так конечно бы целесообразно было бы использование i2c. Насколько корректно будет использование серийного номера от DS2401? То есть прочитать серийный номер при включении проца, а потом переключиться в режим слейв и выдавать этот серийный номер за ds2401 и плюс разработать собственные команды, по которым мастер будет обмениваться со слейвами.
rezident
Цитата(asket @ Oct 5 2009, 01:40) *
Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шине
Для таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN.
SasaVitebsk
Цитата(rezident @ Oct 4 2009, 22:48) *
Для таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN.

+1.
Да плюс ко всему я бы ещё и аккуратно саму сеть спроектировал. А то даже на 485 могут быть проблемы.
asket
У нас CAN используется в качестве магистральной шины, а на 1 wire - висят датчики, с которых снимаем показания и передаем по CAN центральному пульту, и мало того на 1 wire висят исполнительные устройства, которыми надо управлять, и делаются на МК типа tiny, вот и ломаю голову как передавать туда информацию. Я может неправильно выразился, новичок я. rolleyes.gif
Rst7
Цитата
и мало того на 1 wire висят исполнительные устройства, которыми надо управлять, и делаются на МК типа tiny, вот и ломаю голову как передавать туда информацию.


И много информации? И сложна ли обработка в тинях? А то может просто заменить все на вот такой девайс - http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2921 - там получится 4 выхода с открытым стоком или входа АЦП.

По поводу самопального 1-wire слейва - вот у меня на столе лежит считыватель RFID'ов (125кГц), который для простоты подключения к контроллеру СКУД эмулирует DS1990 (обычную таблетку), т.е. подносишь тег, а он по 1-wire на ресет пресенсом отвечает и команду Read Rom хавает (уникальный ID изготавливается из информации, считанной с тега). Только вот Search Rom не поддерживает, очень абыдна. К сожалению, посмотреть, на каком камне сделан не могу, залит весь.
asket
Цитата(Rst7 @ Oct 6 2009, 14:14) *
И много информации? И сложна ли обработка в тинях?


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

Цитата(Rst7 @ Oct 6 2009, 14:14) *
По поводу самопального 1-wire слейва - вот у меня на столе лежит считыватель RFID'ов (125кГц), который для простоты подключения к контроллеру СКУД эмулирует DS1990 (обычную таблетку), т.е. подносишь тег, а он по 1-wire на ресет пресенсом отвечает и команду Read Rom хавает (уникальный ID изготавливается из информации, считанной с тега). Только вот Search Rom не поддерживает, очень абыдна. К сожалению, посмотреть, на каком камне сделан не могу, залит весь.


кстати и считыватель такого рода как считыватель RFID тоже планируется подключить к 1 wire шине, но вот опять незадача, не поддерживает команду SearchROM, а значит надо делать прибор который и считывал с считывателя, и передавал по 1 wire код карты, естественно с возможностью подключения wiegand и клавиатуры, иначе применение микроконтроллера будет неоправданно.

Попытался написать прогу для tiny24 1 wire slave, прием работает, пресенс генерирует, а вот на передачу - облом: slave надо передать "0", значит при спаде фронта он должен удержать шину на земле, мастер освобождает шину через микросекунду (минимальное время), а slave в это время думает о генерации прерывания, в результате возникает бугорок, это притом что он работает на 8 MHz. Проше поставить микросхему DS2408 и общаться через параллельку.
e-serg
Цитата(Rst7 @ Oct 6 2009, 19:14) *
И много информации? И сложна ли обработка в тинях? А то может просто заменить все на вот такой девайс - http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2921 - там получится 4 выхода с открытым стоком или входа АЦП.


Скорости АВР вполне хватает чтоб эмулировать 1-wire slave в прерывании, даже не отдавая процедуре регистры в монопольное использование.
требуется нога INT и аппаратный таймер, была как то такая дурная задача wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.