Veramente incredibile!
Arduino prima di chiamare setup() chiama una funzione interna init() che configura i timer in questo modo:
- timer0, phase-correct PWM, prescaler 64, overflow interrupt
- timer1, phase-correct PWM 8 bit, prescaler 64
- timer2, phase-correct PWM 8 bit, prescaler 64
con l'istruzione
TIMSK1 = (1 << OCIE1A) | (1 << TOIE1);
nel codice si abilita overflow interrupt sul timer 1 assieme all'output Compare Match A interrupt.
L'interrupt di overflow si scatena solamente se c'è lo sleep iniziale, da qui il comportamento errato.
La soluzione è
TIMSK1 = (1 << OCIE1A);
In poche parole togliere il clock al timer, ovvero
TCCR1B = 0;
non basta da solo sempre a fermare il timer ![]()
C'è ancora da investigare secondo me per capire bene il tutto..