 /*
* Project name:
      
 * Copyright:
     (c) Mikroelektronika, 2011.  . 
 * Revision History:
     04.02.2012:
       - initial release;
     * Description:
     //     
 * Test configuration:
     MCU:             PIC16F676
                      http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
     dev.board:       easypic6eds
                      http://www.mikroe.com/eng/products/view/297/easypic6-development-system/
     Oscillator:      RS, 4.0000 MHz
     Ext. Modules:    -
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/
 * NOTES:
         (50)
*/
  // 2  
   void interrupt(void);
   void port_OUT(void);

unsigned char PA2, PA4, PA5;             
unsigned int temp_res0;             //  0 ()
unsigned int temp_res1;             //  1 ()
unsigned char Status_Foto;          //  

volatile unsigned char i;           // 
volatile unsigned char out;         //  
static unsigned char msec = 0, sec = 0;  // 

unsigned char TIME_UP_LED; //   
unsigned char TIME_LAMP; //    :  sec

volatile unsigned char napravlenie; //  
volatile unsigned char narastanie_flag; //    
unsigned char out_flag; //    
volatile unsigned char TIME_UP_OFF;     //    
unsigned char Status_Sound;             //  
unsigned char Status_LAMP; // 1 -   0- 
unsigned char Status_TIMER; //    


//======================================================
//       
//======================================================
void interrupt()
{
if (INTCON.INTF)  
    //T0IE_bit = 0;      
    {  
    delay_us (40);  
    PA2 = PORTA.F2; 

    if(PA2){  
      INTCON.INTE = 0;         
      IOCA.IOCA4 = 1;    
        if (Status_LAMP)  {
                    
                switch (narastanie_flag)  
                  {    case 0:
                            
                         if(napravlenie)    {      
                            out_flag =1;  
                            out=255;        }       
                          
                         if (napravlenie==0)  {       
                             out=219;                
                             out_flag =0;      }
                             break;

                       case 1:  
                         if(napravlenie)   {       
                            out_flag =1;   
                             
                         if (out <= 254)     
                            {out=out++;}       
                                            }
                          
                        if (napravlenie==0)  {     
                        if (out > 219)  
                           {out=out--;}
                        if (out <= 219){
                             out=219;      
                             out_flag =0; 
                                       }
                                             }
                             break;
                  }

                       TMR0 = out;  
                       T0IE_bit = 1;
                       i = 0;       
                       PA2 =0;    
                           }
   
    INTCON.INTF = 0;         
  
           }
    if(++msec==1)       
             {
                msec = 0; 
                TIME_UP_LED++; 
             }
    if(++sec==50)                    
            {
          sec = 0;                   
                  if(Status_TIMER){  
                
                     if (narastanie_flag){
                         if (TIME_UP_OFF < TIME_LAMP){napravlenie = 1;}
                         if (TIME_UP_OFF == TIME_LAMP-1){napravlenie = 0;}
                         TIME_UP_OFF++;
                         if(TIME_UP_OFF >= TIME_LAMP) {TIME_UP_OFF = 0;
                                                Status_TIMER = 0;} 
                                          }
                        else{
                         if (TIME_UP_OFF+1 <= TIME_LAMP){napravlenie = 1;
                                                TIME_UP_OFF++; 
                                                        }
                         else {  napravlenie = 0;
                                 TIME_UP_OFF = 0; 
                                 Status_TIMER = 0; 
                               }
                            }
                                   }
             }
    }

   if (INTCON.T0IF)     
     {  T0IF_bit = 0;     


      if (Status_LAMP){    
           
              if((i & 1) == 0)  
                            {   
                              if (out_flag)  { 
                             PORTC |= (1<<5); // 1 ->  C5    
                             Delay_us(50);  
                                              }
                             PORTC &= (~(1<<5)); //0 ->  C5  
                             TMR0 = 217; 
                            }
                  else      {  
                              if (out_flag)  {
                             PORTC |= (1<<5); // 1 ->  C5    
                             Delay_us(50);  
                                              }
                             PORTC &= (~(1<<5)); //0 ->  C5  
                             INTCON.INTE = 1; 
                            }               
                           i++;  
                         return;
                       }

     }
   if (INTCON.RAIF)      
    {
        PA4 = PORTA.F4;    
        IOCA.IOCA4 = 0;   
                           
        Status_Sound = 1;  
        PORTC &= (~(1<<3)); 
        TIME_UP_OFF=0; 
        INTCON.RAIF = 0;   
        IOCA.IOCA4 = 1;   
     }
}

//======================================================
//       
//======================================================
    void port_OUT() 
 {       
    if (temp_res0 >= temp_res1)           
        {PORTC &= (~(1<<4));
         Status_Sound = 0;                
         Status_Foto = 0;                 
        }
      else {PORTC |= (1<<4); 
            Status_Foto = 1;             
           }
           
    if((Status_Foto)&& (Status_Sound))
                  {Status_LAMP = 1; 
                   IOCA.IOCA4 = 0;   
                   Status_TIMER = 1; 
                   Status_Sound = 0;
                   out_flag =1; 
                   Delay_us(3); 
                  }
                               
     if (TIME_UP_LED ==15) {TIME_UP_LED =0; 
                            PORTC |= (1<<3); 
                            }
     if (TIME_UP_LED >=10) { IOCA.IOCA4 = 1;   
                           }
 }



void main() {
//======================================================
//     PIC16F676
//======================================================
  TRISA = 0b111111;              // PORTA is input
  PORTA = 0b111111;
  TRISC = 0b000000;             // PORT is output
  PORTC = 0b011001;
       ANSEL = 0b000000011;  
    INTCON.GIE = 0;   
    INTCON.PEIE = 1;   
    INTCON.INTE = 1;   
    INTCON.RAIE = 1;   
    IOCA.IOCA4 = 1;  
    INTCON.TMR1ON =0;     

OPTION_REG.T0CS = 0;// bit 5 TMR0 Clock Source Select bit:0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
OPTION_REG.T0SE = 0;// bit 4 TMR0 Source Edge Select bit: 0=low/high / 1=high/low
OPTION_REG.PSA  = 0;// bit 3 Prescaler Assignment bit: 0=Prescaler is assigned to the Timer0
OPTION_REG.PS2  = 1;// bits 2-0  PS2:PS0: Prescaler Rate Select bits
OPTION_REG.PS1  = 1;
OPTION_REG.PS0  = 1;
TMR0 = 217;           // preset for timer register

INTCON.GIE = 1;    

         
out = 219;    
napravlenie= 1;  
Status_LAMP = 1; 
Status_TIMER = 1;
TIME_LAMP = 30; //     

   
PA5 = PORTA.F5;  //      
  if (PA5) { // 1 - "" -     
             narastanie_flag = 1;}  //  -  
      else { //0 -   -     
             narastanie_flag = 0;}  //  - 


//======================================================
//  
//======================================================
   while (1) {
          asm CLRWDT;        // asm line, clear WatchDog Timer
          
               
         temp_res0 = ADC_Read(0);    // get ADC value from 0nd channel
         temp_res1 = ADC_Read(1);    // get ADC value from 1nd channel

         port_OUT();//      
              }
             // !   
             //    !
}