#include #include //////////////////////////////////////////////////////////////////////////////////////////// // ATmega328: // начальное: RC -1 МHz; фьюзы: Higt D9; Ext 07; Lok 3F; Low 62 // RC -8 МHz; фьюзы: Higt D9; Ext 07; Lok 3F; Low E2 // кварц - 20 МHz; фьюзы: Higt D9; Ext 07; Lok 3F; Low E7(CKOUT -off); XTAL2 – выход ----V // кварц - 20 МHz; фьюзы: Higt D9; Ext 07; Lok 3F; Low E7(CKOUT -on); CKOUT – выход //////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// DS18B20: unsigned char flag_DS18B20 = 1; // вкл. DS18B20 unsigned char t; // температура DS18B20 unsigned char t2; // температура DS18B20 unsigned char t_; // буфер температура DS18B20 unsigned int DSst; // счёт запуск преобразования int DS18B20 unsigned int bufer_t; // буфер температура DS18B20 unsigned char DS18B20[9]={ 0,// 0 - Температура LSB 0,// 1 - Температура MSB 0,// 2 - TH 0,// 3 - TL 0,// 4 - конфигурация 0,// 5 - FF 0,// 6 - 0C 0,// 7 - 10 0 // 8 - CRC }; unsigned char DScrc; // DScrc DS18B20 unsigned char DSbcrc; // DScrc буфер DS18B20 unsigned char DSa; // DSa - счёт DS18B20 ////////////////////////////////////////////////////////////// DSfcrc (TX/RX DS18B20): void DSfcrc(void) { DScrc ^= DSbcrc; // CRC-8-Dallas/Maxim // 0x31 ~ 0x8C for (DSa = 0; DSa < 8; DSa++ ) { if (DScrc & 0x01) DScrc = ( DScrc << 1 ) ^ 0x8C; // 0x31 ~ 0x8C else DScrc = DScrc << 1; }; } unsigned char DSmask; // wt/wr ///////////////////////////////////////////////////// передача wt (1-Wire-DS18B20): void wt(void) { DSmask=0b00000001; do { DDRC.3=0; // отпустить delay_us(4); DDRC.3=1; // прижать delay_us(4); if (t_ & DSmask) DDRC.3=0; // Data TX DSmask=(DSmask<<1); delay_us(80); } while (DSmask); DDRC.3=0; // отпустить } ///////////////////////////////////////////////////////////// приём wr (RX DS18B20): void wr(void) { DSmask=0b00000001; t_=0; do { DDRC.3=1; // прижать delay_us(4); DDRC.3=0; // отпустить delay_us(4); if (PINC.3) t_ |= DSmask; // Data RX DSmask=(DSmask<<1); delay_us(80); } while (DSmask); DDRC.3=0; // отпустить } ///////////////////////////////////////////////////////////// TX_DS18B20: Максимальное время конвертирования 750 ms void TX_DS18B20(void) { DDRC.3=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.3=0; // отпустить delay_us(550); // 480 мкС < имп ////////////////////// t_ =0b11001100; wt(); // обратиться ко всем устройствам t_ =0b01000100; wt(); // единственное температурное преобразование. } ///////////////////////////////////////////////////////////// RX_DS18B20: Максимальное время конвертирования 750 ms void RX_DS18B20(void) { DDRC.3=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.3=0; // отпустить delay_us(550); // 480 мкС < имп ////////////////////// читать DS18B20: t_ =0b11001100; wt(); // обратиться ко всем устройствам t_ =0b10111110; wt(); // читать DS18B20 ////////////////////// читать DS18B20: wr(); DS18B20[0]=t_; // 0 - Температура LSB wr(); DS18B20[1]=t_; // 1 - Температура MSB ////////////////////// читать DS18B20: wr(); DS18B20[2]=t_; // 2 - TH wr(); DS18B20[3]=t_; // 3 - TL ////////////////////// читать DS18B20: wr(); DS18B20[4]=t_; // 4 - конфигурация wr(); DS18B20[5]=t_; // 5 - FF ////////////////////// читать DS18B20: wr(); DS18B20[6]=t_; // 6 - 0C wr(); DS18B20[7]=t_; // 7 - 10 ////////////////////// читать DS18B20: wr(); DS18B20[8]=t_; // 8 - CRC ////////////////////// CRC-8 DS18B20: DScrc=0x00; for (x=0;x<9;x++) { DSbcrc=DS18B20[x]; DSfcrc(); }; ////////////////////// проверка crc if (DScrc==0) { ///////////////////// L + H: bufer_t = DS18B20[1]; // Температура MSB bufer_t = (bufer_t << 8) | DS18B20[0]; // Температура LSB ///////////////////// буфер -начальное DS18B20: if (bufer_t != 1360) { // при подаче питания 85°C (0000 0101 0101 0000), 1360-начальное DS18B20 t = (bufer_t >> 4); // Диапазон измерений от –55°C до +125°C t2 = bufer_t & 0x0F; // Диапазон измерений 0,... if (t > 125) { // от 0°C до +125°C t=0x00; t2=0x00; }; }; } ////////////////////// ошибка crc else { t=0x00; // ошибка crc (TX/RX DS18B20). }; } ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// void main(void) { //DDRC.3=0; // RX DS18B20 //PORTC.3=0; // RX DS18B20 DDRD=0xFF; PORTD=0x00; ///////////////////////////////////////////////////////////////////////////////////////////// _1: ///////////////////////////////////////////////////////////////////// DS18B20: if (flag_DS18B20) // вкл. DS18B20 { DSst++; // DSst - счёт запуск преобразования int -1 преобразование(минимум 750mc) //////////////////////////////////////// запуск преобразования: if (DSst == 1) { TX_DS18B20(); }; //////////////////////////////////////////////// читать DS18B20: if (DSst == 1000) { // 1 c. RX_DS18B20(); DSst = 0; PORTD=t; }; }; ///////////////////////////////////////////////////////////////////// delay_ms(1); goto _1; ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// }