Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Regolare interrupt timer PIC18 Pierin

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Regolare interrupt timer PIC18 Pierin

Messaggioda Foto UtenteLuca1995 » 9 ago 2013, 17:34

Salve a tutti :)
Ho provato a cambiare il valore del conteggio del timer del PIC e anche le altre variabili ma non riesco a regolarlo in modo da ottenere un interrupt regolare ogni 10us o ogni 1us.
Questo perché il mio sensore di distanza lavora con le centinaia di us e non i ms.
Grazie in anticipo :ok:
Avatar utente
Foto UtenteLuca1995
790 2 6 12
Frequentatore
Frequentatore
 
Messaggi: 200
Iscritto il: 6 gen 2013, 23:17

0
voti

[2] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto Utentec1b8 » 9 ago 2013, 17:41

Perdonami, quale timer (lo zero)?
A quale frequenza lavora il PIC (a 48MHz con pll o 12 del quarzo)?
Non ho capito il riferimento al sensore...
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[3] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto UtenteLuca1995 » 9 ago 2013, 23:15

Allora:
Il micro controllore lavora a 48MHz (in turbo :D ) grazie al PLL. Il timer è il numero 2 (timer2).
Per quanto riguarda il sensore, questo per indicarmi la distanza dell'oggetto mi torna un segnale alto la cui durata è proporzionale alla distanza stessa. Questa durata allo stato logico alto varia di diversi us. Avendo per il momento un timer2 impostato per un'interrupt ogni 1ms non ho una sensibilità sufficiente per poter misurare il segnale del sensore di distanza.
Ecco il codice con cui il timer 2 conta fino a 1ms (che non ho ancora capito del tutto......)
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 millisecondo.
  // prescaler divide per 16
  T2CONbits.T2CKPS = 2;
  // Postscaler divide per 5
  T2CONbits.T2OUTPS = 4;
  // Imposta il valore comparatore a 150
  PR2 = 150;
  // Imposta l' interrupt del Timer 2 a priorita' bassa
  IPR1bits.TMR2IP = 0;
  // abilita interrupt del timer
  PIE1bits.TMR2IE = 1;

Grazie scusa il ritardo nel rispondere :)
Avatar utente
Foto UtenteLuca1995
790 2 6 12
Frequentatore
Frequentatore
 
Messaggi: 200
Iscritto il: 6 gen 2013, 23:17

1
voti

[4] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto Utentec1b8 » 10 ago 2013, 0:07

Ok, allora la formula per calcolare ogni quanto tempo il timer 2 genera un interrupt è la seguente:
1) t=(4*PR2*prescaler*postscaler)/48000000
o anche
2) t=(PR2*prescaler*postscaler)/12000000
Nell'esempio hai:
PR2=150
prescaler=16
postscaler=5
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.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[5] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto UtenteLuca1995 » 10 ago 2013, 0:24

Innanzitutto grazie :-)
Premetto che su questo PIC non ho ancora capito bene come funzionano i timer. La teoria la conosco ma per esempio che legame c'è tra l'istruzione
Codice: Seleziona tutto
      T2CONbits.T2CKPS = 0;
e il prescaler? Prima se volevo prescaler 16 scrivevo 2 nell'istruzione precedente.
O se volevo un postscaler di 5 c'era inserito 4......non capisco questo legame. Non penso che cambiando in numero inserito nel commento possa cambiare qualcosa?!? E poi il PR2 se lo imposto a 1 non è 2 in realtà?? perché c'è sempre un ciclo di 4 clock nel quale il processore esegue l'istruzione di azzeramento del contatore e perde tempo.......
Quanti dubbiiiii :ok:
Comunque non avendo una grande esperienza nell'uso dei timer non ho idea di come fare il progetto che mi hai proposto. Prima proverò con pre e post ad 1 e PR2 a 12...magari funziona non dovendo fare altro nel frattempo se non aspettare l'interrupt del timer2. Grazie mille comunque :D
Avatar utente
Foto UtenteLuca1995
790 2 6 12
Frequentatore
Frequentatore
 
Messaggi: 200
Iscritto il: 6 gen 2013, 23:17

1
voti

[6] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto Utentec1b8 » 10 ago 2013, 0:34

I valori per impostare il prescaler o il postscaler sono documentati nel datasheets a pagina 219: registro T2CON TIMER 2 CONTROL REGISTER.
Qui dice che il prescaler viene impostato in funzione del valore assegnato a 2 bit che vengono, per convenzione, chiamati T2CKPS.
T2CKPS = 0 equivale a prescaler 1
T2CKPS = 1 equivale a prescaler 4
T2CKPS = 2 equivale a prescaler 16
Ecco perché della scrittura
Codice: Seleziona tutto
T2CONbits.T2CKPS = 0;

che equivale a dire: imposta i bits T2CKPS del registro T2CON al valore 0.

Stesso discorso per il postscaller ma con numero di bit coinvolti, loro nome e valori diversi.
Guarda il datasheets.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[7] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto UtenteLuca1995 » 10 ago 2013, 0:43

Ho capito adesso grazie :)
Nel datasheet indica come va configurato l'intero registro :)
Poi vedró come eseguire il tutto come hai consigliato tu.....magari rompendoti ancora le scatole [-X
Grazie, Luca
Avatar utente
Foto UtenteLuca1995
790 2 6 12
Frequentatore
Frequentatore
 
Messaggi: 200
Iscritto il: 6 gen 2013, 23:17

1
voti

[8] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto Utentec1b8 » 10 ago 2013, 0:46

Tranquillo, fin dove le mie conoscenze permettono di rispondere proverò ad aiutarti.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[9] Re: Regolare interrupt timer PIC18 Pierin

Messaggioda Foto UtenteLuca1995 » 10 ago 2013, 0:48

Lo immaginavo, grazie ancora, adesso dormo ciaooo :)
Avatar utente
Foto UtenteLuca1995
790 2 6 12
Frequentatore
Frequentatore
 
Messaggi: 200
Iscritto il: 6 gen 2013, 23:17


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti