Introduzione |
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.
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
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] } }
void analisi( int n_meas, double *v_meas){ // Istogrammi, calcoli statistici.. }