вполне достаточно 750 миллисекунд ожидания.
Это же совсем в впритык.
перед "Skip Rom, Read Scratchpad" еще один "reset pulse"
Так точно! Упустил
вполне достаточно 750 миллисекунд ожидания.
перед "Skip Rom, Read Scratchpad" еще один "reset pulse"
Chelovek писал(а):С кодом немного разобрался. Но возникли вопросы. Не понял подпрограмму rw_byte. И не понял как вычисляется crc.
Код: Выделить всё
/*
Name : CRC-8
Poly : 0x31 x^8 + x^5 + x^4 + 1
Init : 0xFF
Revert: false
XorOut: 0x00
Check : 0xF7 ("123456789")
MaxLen: 15 байт(127 бит) - обнаружение
одинарных, двойных, тройных и всех нечетных ошибок
*/
unsigned char Crc8(unsigned char *pcBlock, unsigned int len)
{
unsigned char crc = 0xFF;
unsigned int i;
while (len--)
{
crc ^= *pcBlock++;
for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
}
return crc;
}
Если посмотреть картинку в даташите, то легко видеть, что тайм-слот чтения и записи практически одинаковы. Так зачем тратить аппаратные ресурсы на 2 подпрограммы, когда можно обойтись одной? Впрочем, можете сделать 2 отдельные, просто у меня в тини-13 нет для этого места. Комменты вроде подробные, добавлю что байт outByte служит для приема и передачи: из него побитно выдаем информацию и в него же принимаем (и так 8 раз в цикле). Просто для чтения предварительно в него пишем 0xff.Chelovek писал(а):С кодом немного разобрался. Но возникли вопросы. Не понял подпрограмму rw_byte. И не понял как вычисляется crc.
arelaw1 писал(а):мужики , подскажите как будет себя вести DS1820 к критическим для него отметкам температуры т.е в реале может быть и 125 гр. делал простенький терморегулятор по этой схеме http://www.radiosait.ru/page_281.html , и планирую его использовать в автоматике самодельного автоклава ? будет ли работать , или загнется быстро?
Сериг писал(а):оФИГЕННО!Спасибо!пойду пробовать перевести в CVAVR!именно то что я искал!!
Код: Выделить всё
rw_byte:
ldi bit,8
dec bit
nop
nop
nop
nop
nop
nop
nop
nop
brne rw_byte1
Код: Выделить всё
sbi DDR1wire, BIT1wire ; Переводим линию в "0" в течении минимум 6 мкс
nop
nop
sbrc outByte, 0
cbi DDR1wire, BIT1wire ; Если нужно выдать "1" переводим
Код: Выделить всё
clc ; готовим 0 в outByte, 7
ror outByte
Код: Выделить всё
sbic pin1wire, BIT1wire
sbr outByte, 0x80
Код: Выделить всё
ldi DelayReg, 20 ; Выдерживаем интервал Tslot=67 мкс
rcall usDelay
cbi DDR1wire, BIT1wire
Ну, да. Так оно и есть: этот кусочек подпрограммы принимает/передает 1 бит, так как в байте их целых 8, то и повторяем 8 раз. bit и есть счетчик циклов, при каждом проходе уменьшаем его значение на 1 и так до 0.Chelovek писал(а):Тут получается мы 8 раз выполняем подпрограмму rw_byte1, bit можно сказать как счетчик, если он равен 0, то мы выходим из подпрограммы?
Посмотрите внимательнее, мы устанавливаем/снимаем бит в DDRB, который определяет состояние вывода: вход-выход, т.е. мы подаем "1" в DDRB и переводим вывод BIT1wire на выход, а PORTB предварительно установлен в "0", что будет на выводе? Конечно "0", а когда DDRB "0", то вывод будет в высокоимпедансном состоянии, плюс подтягивающий резистор, итого "1".Chelovek писал(а):Чтобы передать 0 нужно удерживать линию в низком логическом уровне, а если 1 то мы сравниваем outBute с 0 и если нужно передать 1, то выдаем 1? Но почему команда sbi, а написано что переводим в 0, ведь sbi это установить бит в РВВ? А cbi это установить 0, а написано 1, или я опять не так понял?
Код: Выделить всё
sbrc outByte, 0Точно так, чтобы не вдвинуть чего лишнего и гарантированно вдвигаем "0".Chelovek писал(а):Здесь мы отчищаем флаг переноса, и сдвигаем outByte для передачи следующего бита?
Опять см. систему команд: не последний бит будет "0", а самый старший (левый) бит станет "1", мы туда уже засунули "0" чуть выше, а он не пригодился...Chelovek писал(а):Вот это я не понял, почему если 1 в BIT1wire, то мы получается ставим последний бит в 0? То есть в любом случаем в конце этих двух команд последний бит в outByte будет 0?
Точно так.Chelovek писал(а):Задержка и перевод линии в 1?
Все верно?
allbest писал(а):проблема решилась подключением по 2-х проводной схеме.
Chelovek писал(а):Решил на выходных код пописать. Так вот тактовая частота лучше всего 1-2 мГц? Легче задержки делать будет. Верно?