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


Introduzione

Porta parallela e porta seriale

Porta parallela
Porta seriale

Porta parallela
L'esercizio consiste nell'attivare otto linee digitali (ciascuna associata ad un led) attraverso la scrittura, nel device associato alla porta parallela, di un intero a 8 bit (= 1 byte = char).

int main() {
  int fd;
  fd = open("/dev/parport0",O_WRONLY);  // apertura 
  if (fd == -1){
    ... // messaggio di errore
    return 1;
  }
  if (ioctl(fd,PPCLAIM)){               // accesso alla porta
    ... // messaggio di errore
    return 1;
  }

  unsigned char ch=...;
  ioctl(fd,...,...);                    // scrittura

  close(fd)
  ...
}
Per vedere in esadecimale il valore di un numero intero:
  cout << hex << i << endl;
Provate diverse sequenze di accensione e spegnimento dei led (da sinistra a destra e viceversa) utilizzando gli operatori bitwise di shift (<< e >>).

Porta seriale
Dopo aver collegato il multimetro digitale alla porta seriale si imposti la misura (comando composto dalla lettera d+invio) e si legga il risultato (il multimetro risponde inviando la misura effettuata all'istante del comando e quelle nei tre secondi precedenti):

-01234567890123-
 TT 7.3451  uu
    7.3441  
    7.3441  
    7.3441  
dove TT identifica il tipo di misura (OH=resistenza DC=misure in corrente continua) e uu l'unità di misura.
Schema:
  int main(){
    int fd;
    fd = open("/dev/ttyS0",O_RDWR); // apertura
    if (fd<0){
      ... // messaggio di errore
      return 1;
    } 
    init_metex(fd);              // set della modalita' di comunicazione
    string command="d\n";        // definizione del comando di misura
    write(fd,...,...);           // invio del comando di misura
    char buf[14];
    for (int i=0;i<4;i++){
      read(fd,...,...);          // lettura dei dati
      if (i==0){
        string sbuf(buf,14);
        //... lettura del risultato...
      }
    }
    close(fd);
    ...
  }
Per la funzione init_metex potete scaricare il modello (da completare) discusso a lezione per il METEX.

Dopo aver verificato di leggere correttamente il risultato del multimetro (ad esempio stampando il contenuto della stringa sbuf), create una funzione che esegua una singola lettura dello strumento

 double get_metex(int fd, string tipo_misura);
La funzione get_metex sarà molto utile per le prossime due esercitazioni: vi consigliamo quindi di realizzarla e provarla con cura per risparmiare tempo.
La codifica del dato letto dal multimetro deve controllare che il tipo di misura richiesta sia coerente con lo "stato" del multimetro: se questi controlli falliscono occorre interrompere il programma (funzione exit) e segnalare all'utente l'errore in modo che agisca di conseguenza sul multimetro. Letto il valore questo dovrà essere convertito in unità SI (in base alla presenza della lettera m (milli) o k (kilo) nell'unità).
È inoltre bene proteggersi dalla presenza di un carattere spurio all'inizio delle sequenza cercando l'inizio della prima stringa (TT) con il metodo find della classe stringa.

Facoltativo (ma utile): calcolo automatico dell'errore; la funzione misura diventa:

 void get_metex(int fd, string tipo, double &mis, double& err);
Per la definizione dell'errore fate riferimento al manuale dello strumento.