/*
  a)  Timer-ul 1 este pe 16 biti -> numara pana la 2 ^ 16 valori
      Prescale = 64 (P)
      Frecventa ceasului = 16 * (10 ^ 6) Hz (FC)
      frecv ceasului trecuta prin prescaler = 16 * (10 ^ 6) / 64 = 25 * (10 ^ 4) (F1)
      frecv intreruperilor = F1 / (nr de valori pe care le numara numaratorul = 2 ^ 16) =>
      perioada intreruperilor = 1 / (frecv intreruperilor) = 0.262144

  b)  Prescale = 256 (P)
      Frecventa ceasului = 16 * (10 ^ 6) Hz (FC)
      T = 250 ms = 250 * 10 ^ (-3) secunde
      OCR1A = T * FC / P - 1 = 15624

 */
#include <avr/io.h>
#include <avr/interrupt.h>
volatile byte counterValue = 0, count = 0;
void setup() {
  // put your setup code here, to run once:
  cli();
  // In wokwi nu se poate folosi biblioteca TimerOne
  // deci trebuie sa initializam TCCR1A so TCCR1B la 0
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << WGM12);
  OCR1A = 15624;
  TIMSK1 |= (1 << OCIE1A);
  TCCR1B |= (1 << CS12);
  sei();
  DDRA = 0b11111111;

}

void loop() {
  // put your main code here, to run repeatedly:
  PORTA = counterValue;
}
ISR(TIMER1_COMPA_vect){
  // ceasta intrerupere se activeaza odata la 250 de ms
  // deci ne trebuie o valoare care sa contorizeze de cate ori
  // s-a facut intreruperea, astfel ca la 4 intreruperi sa se 
  // incrementeze numaratorul
  count += 1;
  if (count == 4){
    counterValue += 1;
    count = 0;
  }
}