Аlex писал(а):Нужно сначала установить направление, а потом уже защёлкой рулить.
Поменял местами.
Функция read_ds. Не много 20 us до чтения бита ?
Судя по графику, не много, хотя согласен, что можно меньше.

Это остатки экспериментов, когда я мучился с этим нерабочим датчиком. Увеличивал тайминги, решив, что он не воспринимает команды.
Не пишите таких весомых кодов там, где каждый такт проца играет огромную роль.
Добавьте ещё одну функцию - чтения байта и вызывайте её сколь угодно раз.
В термометре на асм так же делал, через косвенную адресацию. Сейчас пробежался по асм выхлопу компилятора этой функции (оптимизация ПРО). Он конечно понаписал побольше, чем я писал на асм. Пересмотрю код, хотя не знаю, что я там смогу оптимизировать.
К тому же при чтении байта отдельным куском тоже будет перерасход тактов на call и return (retlw). И здесь опять-таки косвенная адресация останется.
Вообще, у Вас всё как то запутанно, можно всё упростить и привести к нормальному виду. Могу помочь, если нужно?
Чужой код - потемки

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

Если речь идёт, как я понял, о мелких PIC'ах.
Старик 876. Даже без буквы.
В защёлке всегда будет то состояние, которое было на входе ПИНа (физически !) с предыдущего обращения к порту. По этому, рулить просто направлением, как делают некоторые - косяк. Необходимо ещё обновлять содержимое защёлки, после установки ПИНа на выход.
Ну я так и сделал. DQ_OUT -> DQ0 -> pause -> DQ_IN -> DQ1, который суть (PORTB &= 0xFF) - обновление содержимого защелки.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.