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