/*****************************************************
Project : RGB
Version : 1.0
Date    : 11.07.2009
Author  : sachok

Chip type           : ATtiny2313
Clock frequency     : 8 MHz
Memory model        : Tiny
Data Stack size     : 32
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
#include <stdlib.h>

void main(void)
{
// Declare your local variables here
unsigned int r,g,b,r_rand,g_rand,b_rand;
r=g=b=0;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In 
// State2=T State1=P State0=P 
PORTA=0x03;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=In Func0=In 
// State7=T State6=T State5=T State4=0 State3=0 State2=0 State1=T State0=T 
PORTB=0x00;
DDRB=0x1C;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=P State2=P State1=P State0=P 
PORTD=0x0F;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x04;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

srand(5);

while (1)
      {
      // Place your code here
        //збільшення яскравості світлодіодів
        if (!PIND.0 && !PINA.1 && PINA.0 && PIND.2 && PIND.3)
        {
        r++;
        delay_ms(200);
        OCR0A=r;        
        }
        
        if (!PIND.0 && !PINA.0 && PINA.1 && PIND.2 && PIND.3)
        {
        g++;
        delay_ms(200);
        OCR1AL=g;        
        }
        
        if (!PIND.0 && !PIND.2 && PINA.0 && PINA.1 && PIND.3)
        {
        b++;
        delay_ms(200);
        OCR1BL=b;        
        }
        //зменшення яскравості світлодіодів
         if (!PIND.1 && !PINA.1 && PINA.0 && PIND.2 && PIND.3)
        {
        r--;
        delay_ms(200);
        OCR0A=r;        
        }
        
        if (!PIND.1 && !PINA.0 && PINA.1 && PIND.2 && PIND.3)
        {
        g--;
        delay_ms(200);
        OCR1AL=g;        
        }
        
        if (!PIND.1 && !PIND.2 && PINA.0 && PINA.1 && PIND.3)
        {
        b--;
        delay_ms(200);
        OCR1BL=b;        
        }
        //збільшення яскравості всіх світлодіодів одночасно
        if (!PIND.0 && PIND.2 && PINA.0 && PINA.1 && PIND.3)
        {
        r++;
        g++;
        b++;
        delay_ms(200);
        OCR0A=r;
        OCR1AL=g;
        OCR1BL=b;
        }
        //зменшення яскравості всіх світлодіодів одночасно
        if (!PIND.1 && PIND.2 && PINA.0 && PINA.1 && PIND.3)
        {
        r--;
        g--;
        b--;
        delay_ms(200);
        OCR0A=r;
        OCR1AL=g;
        OCR1BL=b;
        } 
        //random
        if (!PIND.3)
        {
        r_rand=rand()%255;
        delay_ms(100);
        g_rand=rand()%255;
        delay_ms(100);
        b_rand=rand()%255;
        delay_ms(100);
        OCR0A=r_rand;
        OCR1AL=g_rand;
        OCR1BL=b_rand;
        }
        else
        {
        OCR0A=r;
        OCR1AL=g;
        OCR1BL=b;
        }       
        
      };
}