Ciao a tutti, sto cercando di usare il timer2, ma volevo una conferma se le funzioni millis e micros fuzionano durante la chiamata a ISR(TIMER2_COMPA_vect).
Sembrerebbe di no visto che sembra che il calcolo del tempo che ho inserito nella chimata a ISR sembrano essere ininfluenti.
Grazie.
Stefano
Millis e micros non fanno altro che ritornare il valore del relativo contatore, quindi funzionano anche all'interno di una isr.
Spiega meglio che problema hai riscontrato, altrimenti è impossibile capire da cosa deriva.
Ciao Astro, sto cercando di gestire tramite il timer2 un servocomando e dei led.
C'è qualcosa che non mi funziona ma non riesco a capire cosa.
Quindi mi sono messo a dialogare un po' con il mio amico google ed ho trovato un PDF dove dicono che durante una ISR le funzioni delay e millis sono disabilitate.
Visto il malfunzionamento che riscontro questa affermazione ci può anche stare.
Il codice che ho scritto è questo:
void initTimer(void)
{
//Fermo gli interrupts
cli();
//Setto interrupt timer2
TCCR2A = 0;
TCCR2B = 0;
//Inizio conteggio da 0
TCNT2 = 0;
OCR2A = 64;
//Attivo il CTC mode
TCCR2B |= (1 << WGM21); //WGM12);
//Setto il prescaler a 1024
TCCR2B |= (1 << CS22) | (1 << CS21)| (1 << CS20);
//Abilito il timer di comparazione interrupt
TIMSK2 |= (1 << OCIE2A); //OCIE1A);
//Abilito gli interrupts
sei();
}
ISR(TIMER2_COMPA_vect)
{
static unsigned long tmr;
if((micros()-tmr) < map((long)servoPos, (long)SERVOMINVAL, (long)SERVOMAXVAL, (long)0, (long)180))
PORTD |= _BV(PD3);
else
PORTD &= ~_BV(PD3);
if((micros()-tmr) >= (20000-map((long)servoPos, (long)SERVOMINVAL, (long)SERVOMAXVAL, (long)0, (long)180)))
tmr=micros();
}
initTimer: viene richiamata in fase di setup.
servoPos: è la posizione del servo che viene convertita da ms a gradi e viceversa.
Poi in ISR ci sarebbe anche la gestione dei led che devono lampeggiare in base al valore di una variabile.
Il fatto è che la gestione dei led funziona, mentre quella del servo non riesco a farla funzionare.
L'istruzione "PORTD |= _BV(PD3);" viene eseguita solo una volta all'inizio e poi sembra che micros()-tmr dia sempre un valore superiore a 1500.
Ho pensato che magari (anche se impossibile) la funzione ci mettesse più di (servoPos)uS a completarsi e quindi ho provato a misurare quanto dura la chiamata all'ISR e (se micros è effettivamente funzionante anche dentro all'ISR) mi risulta che tutta la chiamata dura 24uS inclusa la scrittura del valore tramite seriale, quindi ci sto dentro senza problemi sui (servoPos)uS.
Spero di essermi spiegato.
Grazie.
Stefano
Non funziona per il semplice motivo che l'interrupt avviene ogni poco più di 15 ms, provato su Arduino UNO @16MHz.
Screenshot del DSO usando il tuo codice, unica differenza l'aggiunta di una commutazione del pin 13 ad ogni interrupt per visualizzare il periodo tra gli interrupt.
Grazie astro.
Trovato l'errore.
Ho impostato TCCR2B al posto di TCCR2A.
Stefano