Но знание асма и архитектуры АВРки позволяет критичные участки писать на си аккуратно. И не наступать на грабли с атомарностью, например.
А с I2C - повторюсь, достаточно проверить АСК при отправке адреса. А дальше проверки не нужны. Ведомый отозвался - ура, работаем на ожиданиях. Не отозвался - показать пользователю ЕГГОГ.
a1000, для DS18B20 тоже делайте на ожиданиях, не забыв запретить прерывания на период чтения/записи одного бита и отсчитывания таймингов.
Тайминги сделайте на циклах. 15 мкс получится на однобайтовом цикле - это 240 тактов при 16 мгц (я выше кидал примерный алгоритм цикла). Стартовое значение счетчика цикла либо посчитать по тактам, либо подобрать в эмуляторе студии. 45 мкс - три раза дернуть задержку 15 мкс. 480 мкс - 32 раза по 15 мкс.
Обратите внимание - сброс-пауза-ожидание presence должно быть атомарным блоком, т.е. перед сбросом запретить прерывания, а разрешить только после проверки presence.
Чтение/запись бита тоже должно быть атомарным - запретить прерывания, прижать линию на 15/45 мкс (при записи) или на 15 мкс, отсчитать 45 и посмотреть что на линии (при чтении), потом разрешить прерывания.






