Бр... Когда люди хотели построить Вавилонскую башню, чтобы забраться на небеса к богу, он сделал несколько языков и "строители" перестали понимать друг друга... признаюсь, что я ламер в HI-TECH и С, и лишь отдалённо понимаю что там в коде написано, сам пишу всё на ассемблерере.. вообщем начну с описания как это происходит у меня, с временными задержками, посмотри, и разъясни, в каком месте у тебя камень предкновения: для экономии энергии WDT отключён !!! Итак, спим При изменении состояния просыпаемся, смотрим линию, если проснулись и на линии лог 1 то ждём 25 мкс, при этом успеваем загрузить все байты ключа в озу.. (датшит= 15-60) и выдаём 0 - импульс присутствия. держим его 130 мкс (датшит= 60-240) (если, проснувшись обнаруживаем на линии 0, то считаем, что это "глюк" и идём снова спать.) итак, отпустив шину от импульса присутствия мы через 8-10 мкс проверяем её на наличие 1. эта единица будет означать окончание передачи первого байта мастером (домофоном) команды 33H. Скорее всего, эта единица появится только спустя 30 или больше мкс, но в любом случае она появится, когда закончится передача. при этом проверка шины у меня идёт с периодичностью 6 мкс (тратится 3 мкс на защиту от зависона, если связь с мастером прервётся, ведь WDT-то отключен). После появления 1(конец передачи), ждём появления нуля, уже через 6 мкс. (в датшите сказано 1-15 держится 0, после чего выставляется бит). Так как мы ещё не все биты от команды 33H приняли, поймав 0 (его ловим с периодичностью 2 мкс, так как тут защита не нужна, на линии же 1 держится, пропадёт ведь когда нибудь!), ждём 20 мкс и снова ждём появление "1"-конца передачи. так делаем 8 раз, тупо пропустив команду 33H... :rolleyes: Итак, после появления последней "1", мы переходим к передаче кода, при этом уже готовы выставить бит, ожидая появление "0", строчкой
ask0
btfsc GPIO,0
goto ask0;
То есть, сканируя шину каждые 2 мкс. после появления 0 мы выставляем бит уже через 6 мкс ( то есть выводим 0) если нужо выставить 1 то ничего не делаем, сама появится, тупо ждём 20 мкс и опять идём в ожидание 0. (Этот 0 выставит мастер, когда прочтёт с шины 1.) Если же мы выставили 0, то ждём 20 мкс (по датшиту нужно держать 15-60 мкс) и отпускаем шину. после чего, ждём 20 мкс и идём в ожидание "0".(вот особый момент - если не подождать, и перейти в ожидание 0 сразу, то шина из за ёмкости, не успеет перейти в 1, и возможен ложный приём стартового "0", коим является лишь "эхо" выставленного вами 0 - помню, я долго с этим глюком "парился"). Вот так вот мы и передаём весь код. Всё успеваем, на 4 мгц ;) Почему у тебя выставить код получается только спустя 25 мкс? действительно поздновато! максимум 15.