Ottava Esercitazione (Misura automatica intervalli temporali )


Prima di iniziare la misura dovrete verificare che i collegamenti sulla basetta siano corretti, e dovrete voi stessi collegare e regolare le alimentazioni.
Il circuito richiede una alimentazione positiva di +5V (e naturalmente un riferimento a 0V).
Fate attenzione a non sbagliare i collegamenti, perché potreste distruggere i componenti.
I data sheets complete del dispositivi sono disponibili sulla pagina web del corso.





Struttura del programma

Inizializzazione
Misure di intervalli di tempo con il metodo del polling
Misura di intervalli di tempo con il metodo dell'interrupt
Creazione, riempimento e disegno dell'istogramma dei periodi misurati (calcolo di media, dev. standard ed errore)
Chiusura

Il main dovrà chiamare una funzione diversa per la misura degli intervalli temporali a seconda dell'opzione fornita dall'utente (tale opzione seleziona anche il device da utilizzare e le relative opzioni).
Suggeriamo di salvare le misure di periodo in un vettore che viene dimensionato dall'utente e creato nel main.

Verificate il funzionamento dei due metodi al variare del periodo dell'oscillatore (variando il potenziometro) e del carico sulla CPU.

Inizializzazione
Deve inizializzare i device (pp1 per la lettura in polling, ppint per l'utilizzo del driver che esegue la lettura in interrupt) ed abilitare il pacchetto grafico.

Polling

void polling(int n_meas, double *v_meas){

  float dt;
  struct timeval t0,t1;

  for (int i=0;i < n_meas;i++){

    bool start=true;
    char c = 0x40;  // inizializzo il bit a 1  

    while(1){
      int valold = c & 0x40;  // valore precedente
      read(sidp,&c,1);
      int val    = c & 0x40;  // valore attuale
      if (val !=0 && valold == 0) {  // c'e' stata una transizione 0-1
        if (start) {
          gettimeofday(&t0,NULL);  // se start e' vero e' il tempo di inizio
          start = false;
        } else {
          gettimeofday(&t1,NULL);  // se start e' falso e' il tempo di fine
          v_meas[i] = delta_t(t1,t0); // la funzione delta_t e' quella che avete
                                      // creato per la II esercitazione
          break;          
        }
      }
    }
  }
}


Interrupt


void interrupt(int n_meas, double *v_meas){

  char   tim[16];
  double t,told;

  char c=n_meas+1;   // le misure di tempo saranno n+1 per avere n intervalli di tempo(attenzione c deve essere minore di 255)
                     // Come fareste per fare piu' di 255 misure ?
  write(sidpint,&c,1);  // Istruiamo il device /dev/ppint a fare 255 misure
                     // Il device parte, termina la lettura e riempe una tabella in memoria

  for (int i=0;i < n_meas+1;i++){
    read(sidpint,tim,16);     // leggiamo la tabella in memoria
    string sbuf(tim,16);
    istringstream is(sbuf);
    told = t;
    is  >> t;
    if (i > 0) {
      v_meas[i-1] = t-told;  // il periodo e' ottenuto come differenza tra due valori di
                             // tempo successivi
    }
  }

}


Analisi dati

  void analisi( int n_meas, double *v_meas){
   // Istogrammi, calcoli statistici..
  }


Chiusura
Chiude il device ed il pacchetto grafico.