Вверх ↑
Ответов: 70
Рейтинг: 0
#1: 2016-01-24 18:52:08 ЛС | профиль | цитата
Леонид писал(а):

К стати да, это Вы верно подметили, а я сам разобрать, к сожалению, не смог.
Хорошо, какого чёрта датчик вместо 0 говорить FC (а вернее CF)??? Надо глубже копнуть... Я как что ни буть разузнаю обязательно сообщу.
------------ Дoбавленo в 18.16:
Блин, как же я забыл???

http://avr.ru/beginer/understand/1wire

Сигнал "Чтение". Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого подчинённый, если хочет передать 0, удерживает шину в низком состоянии до 60 мкс; если же подчинённых хочет передать 1, то он просто освобождает линию. Ведущий обычно сканирует состояние шины по истечении 15 мкс после установки низкого уровня на шине.
Так, ведомый удерживает линию к земле, если хочет передать "0", и просто отпускает линию, если хочет передать "1".
Таким образом при чтении получаем следующие диаграммы.
Основные проблемы, которые возникают при реализации чтения-записи – это проблемы со временем, то есть "невыдерживание", или наоборот, "передерживание" временных задержек при чтении линии. Возникают эти проблемы из-за того, что часто не делают поправку на медленность языков программирования высокого уровня. Особенно это касается различных "дополнительных" функций и ништяков.



Блин вот оно что! Я когдато раньше писал программку на С для AVR-ки и там было ток:


void receive_ds1820(void){//Функция приема битов от DS1820
cli();
for(unsigned char i=0;i<16;i++) { //Прием 2 байт с температурой и знаком
DDRD|=_BV(DT); //Вывод порта настраеваем как выход
_delay_us(6); //Задержка на 6 мкс
DDRD&=~_BV(DT); //Вывод порта настраеваем как вход
_delay_us(9); //Задержка на 9 мкс
if (PIND & (1<<DT)) {//Проверка состояния вывода
grand_temperature|=_BV(i);} //Запись лог. 1
else {grand_temperature&=~_BV(i); } //Запись лог. 0
_delay_us(55);} //Задержка на 55 мкс
des_temperature=grand_temperature&0b00001111;
des_temperature=(des_temperature*5)/8;
temperature=(grand_temperature>>4);
temperature=(temperature*10)+des_temperature;//Значение температуры х10 для обработки
sei();
}


Понимаете как это? То есть для чтения нужно в линию сказать 0 в течении 1-15 мс (или 6 как я делал раньше) только потом после этого датчик если говорит 0 то в течении 60 мс на линии 0, а если говорит 1 то в течении 60 мс в линии 1.
Вот оно что, вот от куда берётся 0хFC (а вернее CF) это датчик отвечает. В течении того времени как терминал уже отчситал 0b111111 только потом датчик говорит своё 0b00 что хотел сказать.
карма: 0

0