I think I might have found a solution by changing this part of the code
void timer1_get() {
tmr1 = TCNT1 - previous;
previous = TCNT1;
//TCNT1 = 0; // reset Timer1
}
ISR(TIMER1_OVF_vect) { // Timer1 interrupt service routine (ISR)
tmr1 = 0;
previous = 0;
}
So instead of reseting the timer after each cero crossing I save the previous value and later reset when timer1 overflows.