Пн окт 23, 2023 22:29:28
Пн окт 23, 2023 23:11:53
Вт окт 24, 2023 16:27:51
Вт окт 24, 2023 18:05:36
Вт окт 24, 2023 21:32:04
Вт окт 24, 2023 22:43:43
Вт окт 24, 2023 23:04:48
Вт окт 24, 2023 23:28:07
Ср окт 25, 2023 11:00:38
Ср окт 25, 2023 11:31:57
Ср окт 25, 2023 12:16:11
Ср окт 25, 2023 12:27:27
////////////////////////////////////////////////////////////// передача wt (1-Wire-DS18B20):
void wt(void)
{
// LSB...MSB
for (x=0;x<8;x++) {
DDRC.4=0; // отпустить линию
delay_us(10);
DDRC.4=1; // прижать линию
DDRC.4= t_ & (1<<x) ? 0 : 1; // DDRC.4 // выход Data TX
delay_us(70);
};
DDRC.4=0; // отпустить линию
}
///////////////////////////////////////////////////////////////////// приём wr (RX DS18B20):
void wr(void)
{
// LSB...MSB
t_=0;
for (x=0;x<8;x++) {
DDRC.4=0; // отпустить линию
delay_us(10);
DDRC.4=1; // прижать линию
delay_us(4);
DDRC.4=0; // отпустить линию
delay_us(8); // delay_us(25); v //delay_us(30); x
if (PINC.4==1) {t_|=(1<<x);}; // Data RX
delay_us(70);
};
DDRC.4=0; // отпустить линию
}
/////////////////////////////////////////////////////////////////////// fwcrc (TX/RX DS18B20):
void fwcrc(void)
{
wcrc ^= wbcrc; // CRC-8-Dallas/Maxim // 0x31 8+x5+x4+1 // 1.0011.0001 // 0x8C // 1000.1100
for (x=0;x<8;x++) {
wcrc = wcrc & 0x01 ? ( wcrc >> 1 ) ^ 0x8C : wcrc >> 1;
};
}
///////////////////////////////////////////////////////////////// t - температура модель(датчик DS18B20):
// температура модель ds18b20: 0 C^ (00000000)... 128 C^ (10000000) (начальное 85 C^ (01010101))
// 32 пак/c. цикл 0,031.25c.
sd++; // sd - запуск преобразования: 1 преобразование(минимум 750mc)=1с.
////////////////////// запуск преобразования: -3,7 mc
if (sd == 1) { // Инициализация DS18B20
DDRC.4=1; // прижать линию DS18B20
delay_us(550); // 480 мкС < имп < 960 мкС
DDRC.4=0; // отпустить линию DS18B20
delay_us(550); // 480 мкС < имп
t_ =0b11001100; wt(); // обратиться ко всем устройствам на шине.
t_ =0b01000100; wt(); // начинает единственное температурное преобразование.
};
////////////////////// читать датчик DS18B20: -3,7 mc
if (sd == 31) { // Инициализация DS18B20
DDRC.4=1; // прижать линию DS18B20
delay_us(550); // 480 мкС < имп < 960 мкС
DDRC.4=0; // отпустить линию DS18B20
delay_us(550); // 480 мкС < имп
t_ =0b11001100; wt(); // обратиться ко всем устройствам на шине.
t_ =0b10111110; wt(); // читать содержание ПАМЯТИ (ОЗУ).
};
////////////////////// читать датчик DS18B20: -3,7 mc
if (sd == 32) {
wr(); t0=t_; // 0 - Температура LSB
wr(); t1=t_; // 1 - Температура MSB
wr(); t2=t_; // 2 - TH
};
////////////////////// читать датчик DS18B20: -3,7 mc
if (sd == 33) {
wr(); t3=t_; // 3 - TL
wr(); t4=t_; // 4 - конфигурация
wr(); t5=t_; // 5 - FF
};
////////////////////// читать датчик DS18B20: -3,7 mc
if (sd == 34) {
wr(); t6=t_; // 6 - 0C
wr(); t7=t_; // 7 - 10
wr(); t8=t_; // 8 - CRC
};
////////////////////// CRC-8 датчик DS18B20 -0,7mc
if (sd == 35) {
wcrc=0; // сброс
wbcrc=t0; fwcrc(); // 0
wbcrc=t1; fwcrc(); // 1
wbcrc=t2; fwcrc(); // 2
wbcrc=t3; fwcrc(); // 3
wbcrc=t4; fwcrc(); // 4
wbcrc=t5; fwcrc(); // 5
wbcrc=t6; fwcrc(); // 6
wbcrc=t7; fwcrc(); // 7
// crc
wbcrc=t8; fwcrc(); // 8
////////////////////// проверка crc
if (wcrc==0) {
////////////////////// сборка L + H :
// tok - датчик тока: 0...255. / температура 2
// tok = t & 0b00001111; // t0 = ....1111 - L младший бит температурного регистра.
t0 = (t0 >> 4); // t0 = 1111.... >> .... 1111 - L младший бит температурного регистра.
t1 = (t1 << 4); // t1 = ....1111 << 1111.... - H старший бит температурного регистра.
t = t1 | t0; // t = DS18B20.
}
////////////////////// ошибка crc
else {
t=0x00; // ошибка crc (TX/RX DS18B20).
// tok=0x00; // ошибка crc (TX/RX DS18B20).
};
////////////////////// сброс // sd - счётчик датчика DS18B20
sd = 0;
};
Ср окт 25, 2023 14:58:13
Ср окт 25, 2023 15:58:44
Ср окт 25, 2023 16:28:30
Чт окт 26, 2023 10:10:42
Чт окт 26, 2023 13:58:45
Чт окт 26, 2023 14:29:14
Чт окт 26, 2023 15:20:56
Чт окт 26, 2023 18:36:46