#include <avr/io.h>
#include <util/delay.h>

/*
    F_CPU = 8 MHz

    Attiny2313     POLLIN FUNK AVR   BRÜCKE
    =======================================
    PB2   OC0A                11 an J4
    PD5   OC0B    PD5/LED2    31 an J4
    PB3   OC1A                12 an J4 --+
    PB4   OC1B                13 an J4   |
                  PD6/LED1    32 an J4 --+
*/

#if 0
unsigned char pwmtable_8D[32] = {
   0*8,  1*8,  2*8,  3*8,  4*8,  5*8,  6*8,  7*8,
   8*8,  9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8,
  16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8,
  24*8, 25*8, 26*8, 27*8, 28*8, 29*8, 30*8, 31*8 
};
#endif 

unsigned char pwmtable_8D[32] = {
0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 
13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76,
91, 108, 128, 152, 181, 215, 255
};

void init_fade(void) 
{
  DDRB = (1<<PB2) | (1<<PB3) | (1<<PB4);
  DDRD = (1<<PD5);

  // 8-Bit Timer0 
  // Clear OC0A/OC0B on compare-match when up counting
  // Set OC0A/OC0B on compare-match on TOP
  TCCR0A = (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00); // 0xA3 Mode 3 Fast-PWM TOP=0xFF
  TCCR0B = (1<<CS02);  // precaler 256 -> ~122 Hz PWM frequency 

  // 16-Bit Timer1
  // Clear OC0A/OC0B on compare-match
  // Set OC0A/OC0B on compare-match on TOP (=0xFF)
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10); // // 0xA1
  TCCR1B = (1<<WGM12);  // 0x08 Mode 5 non-inverted PWM on OC1A, 8 Bit Fast PWM
  TCCR1B |= (1<<CS02);  // precaler 256 -> ~122 Hz PWM frequency 
} 

void fade(void) 
{
  unsigned char tmp;

  for(tmp=0; tmp<=31; tmp++){
    OCR0B = *(pwmtable_8D+31-tmp); // LED2 ausfaden
    OCR1A = *(pwmtable_8D+tmp);    // gleichzeitig LED1 einfaden
    _delay_ms(50);
  }

  _delay_ms(1000);
    
  for(tmp=0; tmp<=31; tmp++){
    OCR0B = *(pwmtable_8D+tmp);    //LED2 wieder einfaden
    OCR1A = *(pwmtable_8D+31-tmp); //LED1 ausfaden
    _delay_ms(50);
  }

  _delay_ms(1000);
}

int main(void)
{
  init_fade();

  while(1)
  {
    fade();
  }
}
