#include <tiny13a.h>        //9.6MHz
#include <delay.h>

#define LUX     1           //     
#define PHOTO   2           //     
#define TIME    3           //     

#define RELAY   PORTB.0     //  

unsigned int lux_reg;       //   
unsigned int delay_reg;     //  
unsigned int delay_count;   //   
unsigned int light_lvl;     //  

unsigned char delay_flag;   //    
unsigned char relay_flag;   //   /

void UART_byte(unsigned char a)
 {
  unsigned char i;
  
  PORTB.1=0;    //start bit
  delay_us(100);
  
  for(i=0; i<8; i++)
   {
    if((a >> i) & 0x01) {PORTB.1=1;}//data bit
    else                {PORTB.1=0;}//data bit
    delay_us(100);
   }

  PORTB.1=1;//stop bit
 } 
void UART_send(char *str)// 
 {
  char i = 0;
  while(str[i]) UART_byte(str[i++]);
 }
void UART_digit(unsigned int value)
 {
  if(value>999) UART_byte(( value / 1000)      + '0');
  if(value>99)  UART_byte(((value / 100) % 10) + '0');
  if(value>9)   UART_byte(((value / 10)  % 10) + '0');
                UART_byte(((value / 1)   % 10) + '0');
 }
void UART_strings(unsigned char word)
 { 
  if(word==1)UART_send("\r");
  if(word==2)UART_send("Time = ");
  if(word==3)UART_send("m");
  if(word==4)UART_send("LUX = ");
  if(word==5)UART_send("PWR ");
  if(word==6)UART_send("O");
  if(word==7)UART_send("F");
 }
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //
 {
  //      0...27 
  if(delay_flag==1 && delay_count < delay_reg) delay_count++; 
  if(delay_flag==0)                            delay_count=0;
 }
unsigned int read_adc(unsigned char adc_input) // 
 {
  ADMUX=adc_input;
  delay_us(50);
  ADCSRA|=(1<<ADSC);
  while ((ADCSRA & (1<<ADIF))==0);
  ADCSRA|=(1<<ADIF);
  return ADCW;
 }

void main(void)
 {
  unsigned int buf;
 
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

  PORTB.1=1;
  DDRB=0b11100011;                  // 

  ADCSRA=(1<<ADEN)|(1<<ADPS2);      //  75
  TCCR0B=(1<<CS02)|(1<<CS00);       //27.301ms
  TIMSK0=(1<<TOIE0);                // 

  lux_reg  = read_adc(LUX);         //     
  buf=delay_reg = read_adc(TIME);       //   
  delay_reg = delay_reg * 64;       //  
  
  #asm("sei")                       //  
  
  UART_strings(4);
  UART_digit(lux_reg);
  UART_strings(1);
  
  UART_strings(2);
  UART_digit(buf*27/1000);
  UART_strings(3);
  UART_strings(1);
  UART_strings(1);
   
  while(1)
   {
    light_lvl = read_adc(PHOTO);    //   

    switch(relay_flag)              //  
     {
      case 0:  //   
       { 
        //     
        if(light_lvl < lux_reg) delay_flag=1;
        else                    delay_flag=0;
        
        //       
        if(delay_flag==1 && delay_count==delay_reg && relay_flag==0)
         {
          RELAY=1;          // 
          relay_flag=1;     //   
          delay_flag=0;     //     
          
          UART_strings(1);  // \r
          UART_strings(5);  // PWR
          UART_strings(6);  // O
          UART_send("N");   // N
          UART_strings(1);  // \r
          UART_strings(1);  // \r
         } 
        break;              //
       }
        
      case 1:  //   
       {
        //     
        if(light_lvl > lux_reg) delay_flag=1;
        else                    delay_flag=0;
        
        //        
        if(delay_flag==1 && delay_count==delay_reg && relay_flag==1)
         {
          RELAY=0;          // 
          relay_flag=0;     //   
          delay_flag=0;     //   
          
          UART_strings(1);  // \r
          UART_strings(5);  // PWR
          UART_strings(6);  // O
          UART_strings(7);  // F
          UART_strings(7);  // F
          UART_strings(1);  // \r
          UART_strings(1);  // \r
         } 
        break;              //
       }
     }

    delay_ms(1000);  //

    UART_strings(4);
    UART_digit(light_lvl);
    UART_strings(1);

    buf=delay_reg-delay_count;
    buf=buf/1000*27/60;
    
    UART_strings(2);
    if(delay_flag==1) UART_digit(buf);
    else              UART_digit(0);
    UART_strings(3);
    UART_strings(1);
   }
 }
