Ciao a tutti,
vi rompo ancora

Dunque, avevo realizzato un codice che varia il delay da applicare ad un segnale d'ingresso in base alla frequenza dello stesso ed ai valori salvati in memoria.
nel setup setto il timer1 in questo modo
// initialize Timer1
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
// set compare match register to desired timer count:
// turn on CTC mode:
TCCR1B |= (1 << WGM12);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
// Set for prescaler 8:
TCCR1B |= (1 << CS11);
TCCR1B &= ~(1 << CS12);
TCCR1B &= ~(1 << CS10);
// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);
// enable global interrupts:
sei();
Poi quando arriva il fronte di salita del segnale scatta una routine che esegue questo codice per resettare il timer e farlo contare fino al delay voluto
OCR1A = dt;
TCCR1B |= (1 << WGM12);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
TCCR1B |= (1 << CS11);
TCCR1B &= ~(1 << CS12);
TCCR1B &= ~(1 << CS10);
dopo di che quando il timer1 raggiunge il valore "dt" lancio la routine
ISR(TIMER1_COMPA_vect)
{
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0;
digitalWrite(PUOUT, 1);
}
Così alzo il pin di uscita che va a 1 dopo un certo ritardo.
Poi all'interno del loop dopo tot microsecondi (anche se so che la funzione micros non andrà bene perchè utilizzo il timer 1 per un altra cosa), tiro giù la stessa uscita con digitalWrite a 0. Non è importante che vada giù 100 piuttosto che 200 microsecondi dopo (poi al limite si può vedere di migliorare questa parte).
Quello che più mi preme è il fatto che dopo aver fatto
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0;
io setto il registro a 0 e quindi all'arrivo del fronte successivo devo re-inizializzarlo e questo mi porta via ben 30us...
Non esiste un modo per far si che quando ha finito di contare stia fermo a 0 o disabilitarlo in modo solo da farlo ripartire a contare da 0 al fronte successivo? Cioè senza inizializzarlo di nuovo.
Grazie mille