rcall Start_uslovie ; повторный старт
ldi BTS, 0xA1 ; выдали адрес часов на чтение
<------------------ вот здесь забыли вызвать Send_Byte и отправить-таки 0x0A в шину
rcall Recieve_Byte ; забрали байт секунд
Но готовность устройства к общению (Ack) всё-таки адо проверять (IMHO), в более сложных проектах может пригодиться.
После долгих ковыряний мне всё таки удалось запихать все три варианта шлюза ( I2C, SPI и 1~Wire) в один. Плюс на остатках памяти ещё и GPIO удалось приделать.
Получилось вот так: UART to I2C/SPI/1W
Написал пару программулинок для шлюза. Одна сканирует ключи-таблетки по однопроводке, её на сайт выложил (в статье про шлюз, внизу, есть ссылка),
а другая позволяет программировать микросхемы памяти I2C. Она пока не дописана (пока может работать только с микрухами с однобайтным счётчиком), поэтому выложу сюда.
месяц болел, снова вернулся!)
Вопрос - как примерно реализовать многомастерность? у меня на линии и2ц одни часы к которым обращаются от 1 до 5 масетров одновременно. как тиньку обучить чтоб не мешала? слушать линию постоянно? али как?
Насколько я понимаю, всё происходит примерно так:
1) Начинать передачу мастер должен ни в любой момент когда попало, а только отследив состояние "свободная шина" (на обоих линиях высокий уровень дольше определённого времени)
2) Мастер должен не просто выставлять сигналы на шину, но и убеждаться, что на шине эти сигналы установились. Точнее это касается только сигнала высокого уровня. Это нужно для отслеживания коллизий, когда N мастеров начали передачу одновременно. Низкий уровень выставляется на шине жёстко, а высокий - подтягивается через резистор (выходная нога при этом переводится в Z-состояние). Соответственно, если какие-то мастера будут выставлять ноль, а какие-то - единицу, то "победят" те, кто выставляет ноль, то есть на шине установится ноль. И тогда те, кто выставлял единицу, должны увидеть, что единица не выставилась, понять, что раз так произошло - значит шиной рулит кто-то ещё и заткнуться в тряпочку (отследить состояние "свободная шина" и попробовать ещё раз) .
Написал отдельную статью про то, как использовать шлюз в качестве программатора I2C EPROM. Там же ссылка на новую версию программы (добавил чипов, возможность чтения/сохранения файлов) и небольшой видос, как это всё работает.