Con i timer non puoi lasciare "rimasugli" di precedenti setup ![]()
Soprattutto quando hai un DS da leggere che spesso non le dice tutte in modo chiaro. Ci sono casi estremi che non sono spesso spiegati bene. Il tuo rientra in uno di questi secondo me. Tu togli il clock al timer ma non spengi il timer. Hai un interrupt che setti ma non usi. Secondo me succedono conflitti.
Impostando la giusta ISR, tutto si risolve. Infatti questo codice a me pare funzionare:
ISR(TIMER1_OVF_vect) {
asm __volatile__("nop\n\r");
}
ISR(TIMER1_COMPA_vect)
{
digitalWrite(7, HIGH);
digitalWrite(7, LOW);
}
void setup()
{
delay(100);
pinMode(7, OUTPUT);
cli();
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS10);
TCNT1 = 0;
OCR1A = 100;
TIMSK1 = (1 << OCIE1A) | (1<<TOIE1);
sei();
delay(3000);
cli();
TCCR1B = 0; // Ferma Timer, INVECE non si ferma col delay da 100 iniziale
sei();
}
void loop(){}
Molto probabilmente proprio perché definendo la ISR il vettore non salta a caso nel codice. Ora non ricordo di preciso, ma se un vettore non è definito, viene assegnato un indirizzo di default.