/*
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;
}
}