Go Down

Topic: Timer 1 usato due volte in modi diversi (Read 3 times) previous topic - next topic

leo72


Ciao,
io uso un prescaler = 8, il tick diventa quindi 0.5us.

Sì, scusa. Avevo scritto CS12 per sbaglio e su quello mi basavo.

Quote

void counterISR viene chiamata da attachInterrupt sul pin 3 e su fronte RISING.



OK.

Comunque continuo a non capire la logica del tuo codice.
Vedendo le prime istruzioni della ISR agganciata all'interrupt di comparazione, tu fermi subito il timer.
Se ho capito è: arriva un segnale su un pin, richiamo un interrupt che fa partire il timer 1. Quando questo arriva al valore impostato da OC1A, fermo il timer. E poi?

ekjk

Quando il timer arriva al valore OCR1A per prima cosa faccio

Code: [Select]
if(!NotRun && fire) PORTD = PORTD | B00010000;
  else PORTD =PORTD & B11101111;


Alzo il pin 4.

Dopo di che fermo il timer e calcolo i giri basandomi sul fronte di salita attuale e su quello successivo.

ekjk

Non so se è chiaro, ma conoscendo la frequenza poi devo applicare un ritardo al segnale di uscita (pin 4) che scriverò in OCR1A e quando il timer arriva a tale valore alzo il pin 4 e fermo il timer.

leo72

Sì, ho capito.
Ma non posso aiutarti più di tanto perché per i tempi che servono a te occorrerebbe un oscilloscopio per vedere in quanto reagisce il timer a queste continue attivazioni/disattivazioni, strumento che io non ho. Cambiare valore di OCR1A in corsa non è un problema. Il problema secondo me nasce dall'attivazione/disattivazione del timer. Secondo me il timer riparte (non può non ripartire come dici tu) ma con un certo ritardo, per cui salti delle letture.

ekjk

Io c'è l'ho l'oscilloscopio...infatti verifico queste cose.
Non c'è un modo per imbrogliare il timer?

Io vorrei che si fermasse...Nella modalità count normale quando va in overflow che succede? Chiama una routine e poi riparte?

Go Up