/*
A program az 1ms időalapot biztosítja. Az időzítő megszakítási rutin villogtatja a 7. LED-et 2Hz frekvenciával.
Ezt nevezzük életjel LED-nek. Ha a program működik ez a LED villog.
*/

#include "avr/io.h"
#include "avr/interrupt.h"

#define  bs(sfr, bit) (_SFR_BYTE(sfr)|=_BV(bit))         //Bit Set
#define  bc(sfr, bit) (_SFR_BYTE(sfr)&=~_BV(bit))        //Bit Clear
#define  btg(sfr, bit) (_SFR_BYTE(sfr)^=_BV(bit))        //Bit toggle
#define  tb(sfr, bit) (bit_is_set(sfr, bit))             //Bit test

#define  OSCB  250;              // Oszcillator bazis frekvencia

void  leds(int n);               // LED bekapcsolo rutin
void  ledc(int n);               // LED kikapcsolo rutin
unsigned char btn(int n);        // Gomb lekerdezo rutin

void  timinit(void);             // Timer inicializalo rutin

unsigned cnt0=0;                 // Idozito szamlalok
unsigned cnt1=0;
unsigned cnt2=0;
unsigned cnt3=0;
unsigned cnt4=0;
unsigned cnt5=0;
unsigned cnto=OSCB;

unsigned char osc=0;             // Oszcillator bit

int main()
{
    timinit();
    DDRB=0xf0;
    DDRD=0xf0;
}

void  timinit(void)              // Timer inicializalasa
  {
  bs(TCCR1B,WGM12);              //Timer/Counter1 Control Register A: CTC mode  (135.o)
  bc(TCCR1B,CS12);               //Timer/Counter1 Control Register B: clk/1 (139.o)
  bc(TCCR1B,CS11);
  bs(TCCR1B,CS10);
  OCR1A=8000;                    // 8MHz 8000 1ms
  bs(TIMSK1,OCIE1A);             //Interrupt mask register:Output Compare A Match Interrupt Enable(142.o)
  cnto=2;
  }

ISR (TIMER1_COMPA_vect)          //Timer1 Compare Match A Interrupt Vector
  {
  int r;

  if(cnt0)  cnt0--;              // Ha a szamlalo erteke nem null, akkor
  if(cnt1)  cnt1--;              // csokkentjuk.
  if(cnt2)  cnt2--;              // Ha nulla, akkor lejart az ido
  if(cnt3)  cnt3--;
  if(cnt4)  cnt4--;
  if(cnt5)  cnt5--;

  cnto--;                        // Oszcillator szekcio
  if(cnto==0)                    // Lejart-e az ido?
    {
    osc^=1;                      // Az oszcillator bitet invertalja
    cnto=OSCB;                   // Ujra toltjuk az oszcillator szamlalojat
    if(osc) leds(7);             // Ha a osc igaz, bekapcsolja a 7. LED/et
    else    ledc(7);             // Ha nem kikapcsolja
    }

  }

void  leds(int n)
  {
  switch(n)                       // Melyik LED
    {
    case 0: bs(PORTB,4);break;    // Bekapcsoljuk
    case 1: bs(PORTB,5);break;
    case 2: bs(PORTB,6);break;
    case 3: bs(PORTB,7);break;
    case 4: bs(PORTD,4);break;
    case 5: bs(PORTD,5);break;
    case 6: bs(PORTD,6);break;
    case 7: bs(PORTD,7);break;
    }
  }

void  ledc(int n)
  {
  switch(n)                       // Melyik LED
    {
    case 0: bc(PORTB,4);break;    // Kikapcsoljuk
    case 1: bc(PORTB,5);break;
    case 2: bc(PORTB,6);break;
    case 3: bc(PORTB,7);break;
    case 4: bc(PORTD,4);break;
    case 5: bc(PORTD,5);break;
    case 6: bc(PORTD,6);break;
    case 7: bc(PORTD,7);break;
    }
  }
