реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 1-wire slawe на МК, у кого такое получилось?
Шалапут:-)
сообщение Nov 27 2008, 15:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303



Всем доброе время суток!
Пытаюсь сделать подобие 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().

На графиках видно, о чем я говорю...
Может, кто то сталкивался с подобным? Помогите, плиз)
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 27 2008, 15:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее.
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 28 2008, 08:44
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303



Цитата(aaarrr @ Nov 27 2008, 17:17) *
Для реализации 1W slave у МК должна быть быстрая реакция на прерывание от вывода, т.к. успеть выставить данные нужно в течение 10мкс после начала слота. А уж чем у Вас слейв так занят - Вам виднее.

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


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 28 2008, 08:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

Увеличивайте времянки - это будет уже не 1W, зато будет работать.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 28 2008, 09:52
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 28 2008, 10:28
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303



Цитата(aaarrr @ Nov 28 2008, 10:50) *
Увеличивайте времянки - это будет уже не 1W, зато будет работать.

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

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

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


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
xemul
сообщение Nov 28 2008, 11:30
Сообщение #7



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Шалапут:-) @ Nov 28 2008, 13:28) *
Уже думал над этим.. понял, что лучше сделать эдакий 1-wire софтверный..

А ванварь Вам точно нужна?
У Вас в системе уже есть ванварный мастер, который обслуживает "железные" ванварные девайсы, и Вы решили для единообразия изобразить ванварного слейва? Тогда Вам потребуется 1 нога контроллера, способная генерить прерывание по перепаду 1/0, и один таймер с разрешением 1-2 мкс. Тактовая частота контроллера, чтобы в фоне обслуживать ванварь со стандартными временами, должна быть не менее: мастер на PIC - 4 МГц, на AVR - 2 МГц; слейвы - раза в 3-4 выше. Если реализовывать функции SearchROM/MatchROM, то тактовую слейвов нужно увеличить еще раза в 1.5.
Если же Вы бьетесь с ванварным слейвом искусства ради, то ... Строить "софтверную" ванварь (если правильно понял Вашу мысль, нечто похожее на ванварь с масштабом по времени "уж как получится"), имхо, вообще бессмысленно: с "железной" ванварью совместимости не будет, а сама по себе ванварь - ну не очень интересный протокол, что по скорострельности, что по затратам на реализацию.
Go to the top of the page
 
+Quote Post
Шалапут:-)
сообщение Nov 28 2008, 14:51
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 11-01-07
Пользователь №: 24 303



Цитата(xemul @ Nov 28 2008, 13:30) *
А ванварь Вам точно нужна?

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

Прикрепленные файлы
Прикрепленный файл  ______slave.txt ( 5.52 килобайт ) Кол-во скачиваний: 97
 


--------------------
Роботы делают роботов - предел автоматизации
Go to the top of the page
 
+Quote Post
Denis R. Akimov
сообщение Mar 18 2009, 14:26
Сообщение #9





Группа: Новичок
Сообщений: 3
Регистрация: 12-02-09
Пользователь №: 44 727



У меня та же самая проблема.
Пытаюсь строить 1-wire slave, пишу на Code Vision, контроллер ATMega88P (раскочегаренный до 10 МГЦ 0_о, медленнее он просто промаргивает стартовый сигнал).
Навесил это дело на прерывание, у меня reset вызывает прерывание, потом программа ждет сколько он там постоит, если больше 100мкс значит это ресет, ждет пока он пройдет, и отправляет preserve.
Чтение, он ждет пока линия уйдет на ноль, когда ушло он ждет 9 мкс, считывает состояние линии, потом ждет пока уйдет на высокий уровень.
Запись, он ждет пока линия уйдет на ноль, если надо передать 0 то ставит линию на ноль, и ждет 12 мкс, если 1 то просто ждет 12 мкс.
На симуляторе(Proteus) всё работает на ура, вот в реале, один мусор какой то читаецо, вас никогда этот симулятор не подводил?
smile3046.gif

Сообщение отредактировал Denis R. Akimov - Mar 18 2009, 14:29
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Mar 28 2009, 17:08
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(Шалапут:-) @ 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)


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
asket
сообщение Oct 3 2009, 11:23
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 24-08-06
Из: Москва
Пользователь №: 19 809



господа! Подскажите есть ли готовые решения моста 1 wire-slave to serial interface? а то на сайте maxim-ic.com представлены только на стороне ведущего, а мне надо чтобы по ван вайре можно было передавать информацию для МК, slave писать я так понял муторно. У меня в голове есть только идеи использовать либо DS2408, через параллельный интерфейс загружать байты на Мк, либо через DS2406 по двум проводам через i2c, но опять же с программкой на стороне ведущего получается геморой, код громоздкий а скорость маленькая. Есть идеи или предложения по этому поводу, буду благодарен за любой ответ.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 3 2009, 21:48
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(asket @ Oct 3 2009, 14:23) *
... slave писать я так понял муторно...

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

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

PS: По поводу 1-wire:
1. Используете ногу прерывания и таймер.
2. Ловите прерывание на ноге.
3. По началу импульса - формируете диаграмму по таймеру, тем же способом что и у мастера.
Go to the top of the page
 
+Quote Post
asket
сообщение Oct 4 2009, 19:40
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 24-08-06
Из: Москва
Пользователь №: 19 809



Цитата(SasaVitebsk @ Oct 4 2009, 01:48) *
Да нечуть не муторно. И ничуть не сложнее чем мастера написать. Берёшь диаграмму, смотришь времянки и пишешь неторопясь.


Спасибо за ответ! Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шине, а так конечно бы целесообразно было бы использование i2c. Насколько корректно будет использование серийного номера от DS2401? То есть прочитать серийный номер при включении проца, а потом переключиться в режим слейв и выдавать этот серийный номер за ds2401 и плюс разработать собственные команды, по которым мастер будет обмениваться со слейвами.
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 4 2009, 19:48
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(asket @ Oct 5 2009, 01:40) *
Мне это нужно для организации сети 1 wire на таком расстоянии, на какое i2c боюсь не потянет из- за ряда ограничений, накладываемые на i2c, скажем метров до 300 и в количестве до 50 устройств на шине
Для таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 5 2009, 16:32
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(rezident @ Oct 4 2009, 22:48) *
Для таких расстояний и количеств узлов принято использовать дифференциальные интерфейсы типа RS485/RS422/CAN.

+1.
Да плюс ко всему я бы ещё и аккуратно саму сеть спроектировал. А то даже на 485 могут быть проблемы.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01521 секунд с 7
ELECTRONIX ©2004-2016