Ok, allora la formula per calcolare ogni quanto tempo il timer 2 genera un interrupt è la seguente:
1)

o anche
2)

Nell'esempio hai:



che determinano un interrupt ogni 1ms.
Per modificare il tempo di interrupt dovrai modificare uno o tutti quei valori.
Ad esempio modificando solo PR2 e portandolo a 1 (valore minimo) avrai in interrupt ogni 6,66666 us
Portando PR2=2 avrai un int ogni 13,3 microsecondi.
Per avere quindi int ogni 1us o 10us non basta modificare il PR2.
Il prescaler può assumere i valori 1, 4 o 16
Il postscaler tutti i valori tra 1 e 16.
Per avere un int ogni 1us dobbiamo avere il numeratore uguale a 12 (vedi formula 2), potremmo quindi ipotizzare di porre postscaler e prescaler a 1 e PR2=12:
- Codice: Seleziona tutto
// De-inizializza il timer2. Non sarebbe necessario perché il micro esce
// allo stato di RESET ma è comunque buona pratica de-inizializzare sempre
// le periferiche per non tralasciare nessun bit.
timer2_deInit();
// Inizializza il timer 2 per interrupt ogni microsecondo.
// prescaler divide per 1
T2CONbits.T2CKPS = 0;
// Postscaler divide per 1
T2CONbits.T2OUTPS = 0;
// Imposta il valore comparatore a 12
PR2 = 12;
// Imposta l' interrupt del Timer 2 a priorita' bassa
IPR1bits.TMR2IP = 0;
// abilita interrupt del timer
PIE1bits.TMR2IE = 1;
Per avere un int ogni 10us dobbiamo porre postscaler e prescaler a 1 e PR2=120
- Codice: Seleziona tutto
// De-inizializza il timer2. Non sarebbe necessario perché il micro esce
// allo stato di RESET ma è comunque buona pratica de-inizializzare sempre
// le periferiche per non tralasciare nessun bit.
timer2_deInit();
// Inizializza il timer 2 per interrupt ogni 10 microsecondi.
// prescaler divide per 1
T2CONbits.T2CKPS = 0;
// Postscaler divide per 1
T2CONbits.T2OUTPS = 0;
// Imposta il valore comparatore a 120
PR2 = 120;
// Imposta l' interrupt del Timer 2 a priorita' bassa
IPR1bits.TMR2IP = 0;
// abilita interrupt del timer
PIE1bits.TMR2IE = 1;
Adesso sai come calcolare il tempo per generare un interrupt del timer 2.
Piccolo consiglio: non utilizzare interrupt così ravvicinati nel tempo.Generare interrupt ogni microsecondo equivale a piantare il PIC. Tieni presente che un PIC con frequenza di lavoro a 48MHz esegue 12 istruzioni in un microsecondo, 12 istruzioni sono probabilmente meno di quante ne servano per gestire l'interrupt stesso.
Anche un interrupt ogni 10us è a un grosso rischio. Potresti farlo se il main del programma non ha nulla da fare o quasi. Nel tuo caso mi pare di capire che si aspetti un segnale da sensori per decidere cosa fare, ma se continuamente interrotto cosa, o meglio, in quali tempi sarà in grado di decidere cosa fare e attuare la decisione?
10us equivalgono a 120 istruzioni, una parte delle quali spese nella routine di interrupt stessa.
Per misurare un impulso esistono altre tecniche, meno dispendiose e più precise.
Io ad esempio attiverei un interrupt per change sul pin collegato al sensore, allo scattere dell'interrupt (che avviene solo quando il sensore invia impulsi) farei partire un timer, al nuovo change del pin (nuovo interrupt) controllo il valore raggiunto dal timer: questo valore equivale alla durata del mio impulso.
In pratica 2 interrupt per misurare un impulso, qualsiasi sia la sua durata.