/*****************************************************
Chip type               : ATmega8
AVR Core Clock frequency: 8,000000 MHz
*****************************************************/
#include <mega8.h>
#include <delay.h>
#include <stdint.h>
#include <1wire.h>
#include <ds18b20.h>
#include <1202_pok.h>
#include <sumbol.c>

#define ADC_VREF_TYPE 0x40

#define set   PINB.0
#define plus  PINB.1
#define minus PINB.2
#define relay_on   PORTB.5=1;//включить реле
#define relay_off  PORTB.5=0;//отключить реле

//********************************************************************************
uint8_t term, counter_term, band, PWM, menu, ends, temp_term = 0;
uint16_t temper, counter;
uint32_t current_band_0, current_band_1, voltage, summai, summav, V_stop;
eeprom uint32_t eep_V_stop=2999;
//********************************************************************************
void show_measure(void){
    
  char_12_16((voltage/1000),18,1);    //отображение напряжения
  char_12_16(((voltage/100)%10),30,1);
  char_4_16(1,42,1);
  char_12_16(((voltage/10)%10),46,1);
  
  
  if(band==0){
    char_4_16(0,18,3);
    char_12_16(((current_band_0/100)%10),22,3);
    char_12_16(((current_band_0/10)%10),34,3);
    char_12_16((current_band_0%10),46,3);
    char_16_16(2,66,3); // знак "мА"
  }else{
    char_12_16(((current_band_1/100)%10),18,3);
    char_4_16(1,30,3);
    char_12_16(((current_band_1/10)%10),34,3);
    char_12_16((current_band_1%10),46,3);
    char_16_16(1,66,3); // знак "А"
  } 
  
  if(term==0){
    char_12_16((temper/10),0,6);
    char_12_16((temper%10),12,6);
    char_16_16(3,24,6);
  }
}

 uint16_t read_adc(uint8_t adc_input)// функция считывания АЦП
{
	ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
	delay_us(10);
	ADCSRA|=0x40;
	while ((ADCSRA & 0x10)==0);
	ADCSRA|=0x10;
	return ADCW;
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
 counter_term++;
  if(counter_term==60){ 
    counter_term=0;
    if(term==0){
      temper=ds18b20_temperature(0);
      if(temper<=40){
        PWM=0;
        temp_term = 0;
      }
      if(temper>=45)PWM=190;
      if(temper>=50)PWM=220;
      if(temper>=55)PWM=240;
      if(temper>=60)PWM=255;
      if (PWM>0 && temp_term == 0){
        PWM = 255;
        temp_term = 1;
      }
      OCR2=PWM;
    } 
  }
}

//********************************************************************************

void main(void)
{
 PORTB |=(1<<0) | (1<<1) | (1<<2); //подтяжка резисторов для кнопок
 DDRB  |=(1<<3) | (1<<5);// выходы для реле и куллера
 
 DDRD  |=(1<<0) | (1<<1) | (1<<2) | (1<<3);// выходы для подключения дисплея
 
 ADMUX=ADC_VREF_TYPE & 0xff;   //настройка АЦП
 ADCSRA |=(1<<ADPS1) | (1<<ADPS2) | (1<<ADEN);//предделитель на 64; включить АЦП 
 
 TCCR0 |=(1<<CS00) | (1<<CS02);//таймер0, предделитель на 1024, 30 срабатываний по переполненю в секунду
// TIMSK |=(1<<TOIE0);// разрешение прерывания по переполнению для таймера0
 
 TCCR2 |=(1<<CS21) | (1<<CS22) | (1<<COM21) | (1<<WGM20);//настройка шим для куллера
 
 ACSR |=(1<<ACD);//отключить компаратор
 w1_init();// PORTD.5
 delay_ms(200);
 lcd_init();
 if(ds18b20_init(0,0,99,DS18B20_12BIT_RES)){
   print_string("* * * * * * * *",3,0);
   print_string("Найден датчик",10,1);
   print_string("температуры",15,3);
   print_string("DS18B20",25,5);
   print_string("* * * * * * * *",3,7);
   delay_ms(2000);
 }else{ 
   print_string("* * * * * * * *",3,0);
   print_string("Датчик",30,2);
   print_string("не найден",18,4);
   print_string("* * * * * * * *",3,7);
   delay_ms(2000);
   term=1;
   OCR2=255;//вентилятор на полную мощность
  };
  
  #asm("sei")
  
while (1)
      {
/////////////////////////////////////////////////////////////////////////////
//измеряем напряжение, ток и выводим на дисплей      
       if(menu==0){
         lcd_clear();
         V_stop=eep_V_stop;
         print_string("===============",3,0);
         print_string("===============",3,5);
         print_string("|U=  , V",42,6);
         char_16_16(0,66,1); // знак "V"
         char_5_8((V_stop/1000),60,6);    //отображение напряжения отключения
         char_5_8(((V_stop/100)%10),66,6);
         char_5_8(((V_stop/10)%10),78,6);
         
         if(term==1){
           print_string("ds18b20",0,6);
           print_string("OFF",10,7);
         }
         TIMSK |=(1<<TOIE0);// разрешение прерывания по переполнению для таймера0
         relay_on; 
         while(ends==0){
              counter++;
              if(band==0){
                read_adc(0);//измеряем ток по первому каналу 0 - 999 мА
                summai=summai+ADCW;
              }else{
                read_adc(1);//измеряем ток по второму каналу 950 мА - 9,99 А
                summai=summai+ADCW;
              }
              read_adc(2);//измеряем напряжение
              summav=summav+(ADCW*2.932);// 2,932 для 30 вольт, 4,882 для 50 вольт
              if(counter==300){
                counter=0;
                if(band==0){
                  current_band_0=summai/180;
                  if(current_band_0>=995) band=1;
                }else{
                  current_band_1=summai/176;
                  if(current_band_1<=95) band=0;
                }
                voltage=summav/300;
                summai=0;
                summav=0;
                if(voltage>=V_stop){
                relay_off;
                menu=2;
                ends=1;
                }
                show_measure();
              }
              
              if(set==0){
                while(set==0){};
                delay_ms(200);
                relay_off;
                menu=1;
                ends=1;
              }   
         }
        ends=0;
       }
/////////////////////////////////////////////////////////////////////////////
//установка напряжения отключения
       if(menu==1){
         lcd_clear();
         print_string("* * * * * * * *",3,0);
         print_string("* * * * * * * *",3,7);
         TIMSK &= ~(1<<TOIE0);// запретить прерывания по переполнению для таймера0
         char_16_16(0,66,1); // знак "V"
         char_8_16(1,9,1);
         while(ends==0){
              if(set==0){
                while(set==0){};
                delay_ms(200);
                eep_V_stop=V_stop;
                menu=0;
                ends=1;
              }
              if(plus==0){
                delay_ms(100);
                V_stop=V_stop+10;
                if(V_stop>=4999)V_stop=4999;//********************************
              }
              if(minus==0){
                delay_ms(100);
                V_stop=V_stop-10;
                if(V_stop<=10)V_stop=10;
              }
              
              char_12_16((V_stop/1000),18,1);    //отображение напряжения отключения
              char_12_16(((V_stop/100)%10),30,1);
              char_4_16(1,42,1);
              char_12_16(((V_stop/10)%10),46,1);
              
              delay_ms(5);
         }
        ends=0; 
       }
////////////////////////////////////////////////////////////////////////////
       if(menu==2){
         lcd_clear();
         print_string("* * * * * * * *",3,0);
         print_string("* * * * * * * *",3,7);
         print_string("Аккумулятор",20,2);
         print_string("заряжен",30,4);
         print_string("U=  , V",30,6);
         char_5_8((V_stop/1000),42,6);    //отображение напряжения отключения
         char_5_8(((V_stop/100)%10),48,6);
         char_5_8(((V_stop/10)%10),60,6);
         while(ends==0){
              if(set==0){
                while(set==0){};
                delay_ms(200);
                menu=0;
                ends=1;
              }      
         }
         ends=0;
       }
////////////////////////////////////////////////////////////////////////////
      }
}
