/*******************************************************
This program was created by the
CodeWizardAVR V3.14 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 01.10.2024
Author  : 
Company : 
Comments: 


Chip type               : ATtiny13A
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13a.h>

// 1 Wire Bus interface functions
#include <1wire.h>
#include <ds18b20.h>
#include <delay.h>

volatile int cnt = 0; //глобальная переменная для таймера
interrupt [TIM0_OVF] void timer0_ovf_isr(void)           //прерывание по переполнению таймера
{
TCNT0=0x00;  //обнулили таймер
 cnt++;               // прибавили 1 к счетчику
}

int ds18b20_read(unsigned char num) //процедура считывания данных с датчиков
{
     unsigned int j;
     int temp_int;
     unsigned char temperature[2];
static const  unsigned char addr1[8] = {0x28, 0x61, 0x64, 0x0A, 0x70, 0x7E, 0xDE, 0x32};      //адрес датчика отопителя
static const  unsigned char addr2[8] = {0x28, 0x61, 0x64, 0x0A, 0x70, 0x66, 0x2A, 0xBD};   //адрес датчика окружающего воздуха
     w1_init();  
       if (num == 0)
       {
       ds18b20_select(addr1);
       w1_write(0x44);   
       while (PINB.2 == 0)
       ;
       w1_init() ;
       ds18b20_select(addr1);
       w1_write(0xbe);   
       }
       if (num == 1)
       {
       ds18b20_select(addr2);
       w1_write(0x44);   
       while (PINB.2 == 0)
       ;
       w1_init() ;
       ds18b20_select(addr2);
       w1_write(0xbe);   
       }     
       for (j = 0; j < 2; j++)      //считываем первые два байта температуры
		 temperature[j] = w1_read();
	 w1_init();          
	 temp_int = ((temperature[1]<<8)|(temperature[0]));   
      temp_int=(temp_int>>4);;
	 return temp_int;
}

void main(void)
{
unsigned int temp_k;
unsigned int temp_o;
bit rej = 0;
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
GIMSK=(0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
DIDR0=(0<<AIN0D) | (0<<AIN1D);
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
w1_init();
#asm("sei")
PORTB.1 = 0;
while (1)
      {
       if (cnt > 2000)
	           { 
               	           temp_k = ds18b20_read(0);
	           temp_o = ds18b20_read(1);
	            if ((temp_o<15) && (rej ==1) && (temp_k <50))
	                {
	                 PORTB.3 = 1; //1
	                 rej = 0;
	                }
	              if ((temp_o > 20) && (rej == 0))
	                {
	                PORTB.3=0; //0
	                rej = 1;
	                }
	              if ((temp_k < 40) && (rej == 0))
		               PORTB.3 =1;
	              if (temp_k > 50)
	            	  PORTB.3=0;
	           cnt=0; 
               if (temp_k == 0)
               PORTB.1 = 1;

      }      
      }
}
