Laboratorio di Calcolo B
Dario Barberis , Paolo Morettini, Fabrizio Parodi, Enrico Robutti


Introduzione

Misura automatica di 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 la parallela ed, eventualemente, abilitare il pacchetto grafico.

Polling

void polling(int n_meas, double *dt_meas){

 bool second=false;
 int oldbit, bit=1;
 do {
   oldbit = bit;
   // lettura del bit 
   if (oldbit==0 && bit == 1){
     // salvo il t in t_old
     // calcolo t 
     // a partire dal secondo tempo: calcolo dt_meas[n] = t-t_old 
     //                              e aggiorno n
   } 
 } while(n<=n_meas);

}
schema per il calcolo del bit di ack
 unsigned char status;
 ioctl(fd_par,...,...);
 if (status & PARPORT_STATUS_ACK)
   // il bit e' 1
 else 
   // il bit e' 0


Interrupt


void interrupt(int n_meas, double *dt_meas, int *nint_meas){

  fs_set fd_coll; int ncount;
  FD_ZERO(&fd_coll);        // azzera l'insieme
  FD_SET(fd_par, &fd_coll); // assegna la parallela a fd_coll
  ...
  ioctl(fd_par,PPCLRIRQ,&ncount);  // resetto gli interrupt
  ...
  for (int i=0,i < n_meas;i++){
    select(fd_par+1,&fd_coll,0,0,0); // aspetto una transizione 0-1 su Ack
    ioctl(fd_par,PPCLRIRQ,&ncount);  // resetto gli interrupt 
    // calcolo t0
    select(fd_par+1,&fd_coll,0,0,0); // aspetto una transizione 0-1 su Ack
    // calcolo t1
    ioctl(fd_par,PPCLRIRQ,&ncount);  // resetto gli interrupt
    // calcolo  dt_meas[i], nint_meas[i]
  }

}


Analisi dati

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


Chiusura
Chiude il device ed il pacchetto grafico.