Interfacciamento con mouse seriali
Mouse per P.C. Si sono affermati diversi standard per mouse collegabili a Personal Computer, tra di loro incompatibili dal punto di vista HW: mouse seriale “standard Microsoft” a 2 tasti, collegato all’interfaccia seriale mouse seriale “standard Genius” (o Logitech, o PC-mouse) a 3 tasti, collegato all’interfaccia seriale mouse “standard PS/2” a 2 tasti, con apposito connettore veicolato verso l’interfaccia della tastiera mouse “Microsoft a 3 tasti”, estensione dello standard Microsoft a 2 tasti.
Lo standard mouse “Microsoft” sistema operativo driver del mouse API interrupt API UART 8250 o 16550 programmi applicativi linea seriale Mouse
Protocollo seriale dello standard MS Il mouse contiene un trasmettitore seriale non programmabile. Esso trasmette informazioni ogniqualvolta: viene premuto o rilasciato un tasto viene spostato il mouse. Ogni volta che il mouse deve trasmettere informazioni, spedisce un pacchetto di dati contenente: lo stato attuale dei pulsanti lo spostamento relativo rispetto all’ultimo pacchetto di dati inviato.
Trasmissione seriale Il mouse trasmette secondo i seguenti parametri: 1200 baud 8 bit per carattere 1 bit di stop nessuna parità Il mouse può essere collegato ad una delle 4 interfacce seriali del P.C., da COM1 a COM4. Ciascuna interfaccia corrisponde ad un componente NS16550 (estensione del NS8250) che risponde a specifici indirizzi di I/O.
Formato del pacchetto dati Il pacchetto dati trasmesso dal mouse è costituito da 3 caratteri di 8 bit ciascuno. Essi vengono trasmessi in sequenza, e devono essere letti singolarmente dall’interfaccia seriale. primo byte 1 1 L R Y7 Y6 X7 X6 1 X5 X4 X3 X2 X1 X0 secondo byte 1 Y5 Y4 Y3 Y2 Y1 Y0 terzo byte
Pacchetto dati: la trama 1 1 L R Y7 Y6 X7 X6 1 X5 X4 X3 X2 X1 X0 1 Y5 Y4 Y3 Y2 Y1 Y0 i bit 7 e 6 indicano la trama del pacchetto: nel primo byte valgono 11 nel secondo e terzo byte valgono 10 per leggere dati significativi, occorre: sincronizzarsi con il trasmettitore, aspettando il primo byte con indicatore di trama 11 attendere i successivi due caratteri, verificando che abbiano indicatore pari a 10 in caso di errore occorre scartare quanto ricevuto e aspettare il prossimo pacchetto.
Pacchetto dati: i tasti 1 1 L R Y7 Y6 X7 X6 1 X5 X4 X3 X2 X1 X0 1 Y5 Y4 Y3 Y2 Y1 Y0 i bit 5 e 4 del primo byte contengono lo stato dei due tasti del mouse: il bit 5 “L” è relativo al tasto sinistro il bit 4 “R” è relativo al tasto destro ciascun bit vale 1 se il tasto è premuto, 0 se non è premuto il valore del bit indica lo stato attuale del tasto: per rilevare una variazione (pressione o rilascio), il software dovrà fare dei confronti con lo stato precedente.
Pacchetto dati: lo spostamento 1 1 L R Y7 Y6 X7 X6 1 X5 X4 X3 X2 X1 X0 1 Y5 Y4 Y3 Y2 Y1 Y0 i bit da 3 a 0 del primo byte, insieme ai bit da 5 a 0 del secondo e del terzo byte, contengono lo spostamento del mouse rispetto all’ultimo pacchetto trasmesso gli spostamenti sono espressi in complemento a 2 su 8 bit spostamento orizzontale (positivo verso destra): bit 3 e 2 del primo byte e bit da 5 a 0 del secondo byte spostamento verticale (positivo verso il basso): bit 1 e 0 del primo byte e bit da 5 a 0 del terzo byte
Estensione: mouse a 3 tasti Esistono in commercio dei mouse a 3 tasti che seguono il protocollo Microsoft. Il tal caso il tasto centrale viene trasmesso come L=R=1, ossia come se fossero premuti contemporaneamente i due tasti sinistro e destro. Molti di questi mouse sono dotati di un interruttore per selezionare il protocollo di funzionamento (MS=Microsoft / PC=Genius).
Coordinate relative ed assolute Il mouse trasmette esclusivamente coordinate relative. La traduzione in coordinate assolute (posizione sullo schermo) è totalmente a carico del software. Conviene disporre di due variabili globali, MouseX e MouseY, che indicano la posizione attuale del mouse. Nell’aggiornamento di tali variabili occorre limitarne i valori all’area rappresentabile sullo schermo. La posizione del cursore sullo schermo si otterrà moltiplicando MouseX e MouseY per opportune costanti.
Gestione dei tasti Al fine di rilevare la pressione ed il rilascio dei tasti, è necessario disporre di due variabili globali nelle quali memorizzare lo stato dei tasti. Esempio: ButtonL, ButtonR. Dal confronto dei dati ricevuti dal mouse con i valori contenuti nelle variabili ButtonL e ButtonR, è possibile determinare se è appena stato premuto o rilasciato un tasto, ed agire di conseguenza.
Ricezione dei dati dal mouse Inizializzazione interfaccia seriale Ricezione di un pacchetto dati Aggiornamento variabili Disegno del cursore su video
Inizializzazione È necessario inizializzare l’interfaccia seriale con i parametri opportuni, programmando i registri: Divisor Latch Low e High (Baud Rate) LCR (data format) FIFO C.R. (per disattivare la FIFO), solo 16550 IER (per disabilitare l’interrupt) MCR (per disabilitare OUT2 e abilitare RTS, DTR).
Ricezione di un pacchetto dati else Leggi un byte 11 else bit 7-6 = 11 11 else Leggi un byte 10 11 bit 7-6 = 10 10 Leggi un byte OK bit 7-6 = 10
Lettura di un byte Leggi LSR FI=1 OE=PE=FE=0 Leggi RBR Leggi RBR
Indirizzi delle interfacce seriali Indirizzi di I/O di base per le porte seriali: COM1: 3F8h COM2: 2F8h COM3: 3E8h COM4: 2E8h N.B. gli indirizzi effettivi si possono talvolta modificare agendo sui ponticelli della scheda seriale oppure mediante l’’auto-configurazione Plug-and-Play.
Esercizio Si scriva un programma che legga il flusso di dati proveniente dal mouse e sposti di conseguenza un carattere “*” sul video. Il tasto sinistro lascia dietro di sé una traccia di “.”, il tasto destro deve cancellare. Si consiglia di scrivere le procedure assembler: void init_mouse(void): inizializza l’interfaccia int poll_mouse(void): legge un carattere in polling, gestendo eventuali errori PE, FE, OE. Le procedure saranno poi richiamate da un programma C che penserà a interpretare i dati.