// Variabili per il tempo
volatile uint32_t ticks = 0;
volatile uint32_t interval = 0;
volatile bool intervalReady = false;
// Interrupt Service Routine del Timer1 - viene chiamata ogni 10ms
ISR(TIMER1_COMPA_vect) {
ticks++;
}
// Funzione di conversione tempo (assumendo che ogni tick è 0.01 secondi)
void convertiTicksInTempo(uint32_t ticks, int& ore, int& minuti, int& secondi, int& centesimi) {
// Calcola il totale dei secondi
uint32_t secondi_totali = ticks / 100;
// Calcola il rimanente dei centesimi
centesimi = ticks % 100;
// Estrae ore, minuti e secondi
ore = secondi_totali / 3600;
minuti = (secondi_totali / 60) % 60;
secondi = secondi_totali % 60;
}
// Funzione associata all'external interrupt sul pin 2
void buttonPressed() {
if (digitalRead(2) == LOW) {
interval = ticks;
} else {
interval = ticks - interval;
intervalReady = true;
}
}
void setup() {
Serial.begin(115200);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), buttonPressed, CHANGE);
// Configurazione del Timer1 per incremento ticks ogni 0.01 secondi (10 ms)
noInterrupts();
// Imposta Timer1 in modalità CTC (Clear Timer on Compare Match)
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0; // Inizializza il contatore a 0
// Calcola il valore di confronto per 10ms
// Formula: OCR1A = (16MHz / prescaler * desired_time) - 1
// Per 10ms con prescaler 8: (16MHz / 8 * 0.01s) - 1 = 19999
OCR1A = 19999;
// Abilita modalità CTC
TCCR1B |= (1 << WGM12);
// Imposta prescaler a 8
TCCR1B |= (1 << CS11);
// Abilita interrupt sul compare match
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
void loop() {
// Visualizza l'intervallo quando pronto
if (intervalReady) {
intervalReady = false;
// Calcola ore, minuti, secondi e centesimi
int ore, minuti, secondi, centesimi;
convertiTicksInTempo(interval, ore, minuti, secondi, centesimi);
Serial.print("Ticks: "); Serial.print(interval);
Serial.print(" -> Tempo: ");
Serial.print(ore); Serial.print("h ");
Serial.print(minuti); Serial.print("m ");
Serial.print(secondi); Serial.print("s ");
Serial.print(centesimi); Serial.println("cs");
}
}