Всем доброе время суток!
Пытаюсь сделать подобие 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().
На графиках видно, о чем я говорю...
Может, кто то сталкивался с подобным? Помогите, плиз)