Web site di Fabrizio Iacopetti
Risoluzione consigliata: 1024 x 768HomeMail-me

Connessione e comunicazione PIC - mouse PS/2
Siete il visitatore n.


Il mouse PS/2 interfacciato ad un PIC 16F877 sulla Development Board v. 1.2 . Il PIC è connesso anche alla seriale di un PC (visibili il MAX 232 e i componenti di contorno)

Introduzione

In questa pagina viene riportato un piccolo circuito elementare (Fig. 1) con il quale interfacciare un mouse PS/2 e un microcontrollore PIC 16F877. Lo schema è utilizzabile anche con numerosi altri microcontrollori e dispositivi logici: verificarne sempre in ogni caso le caratteristiche elettriche, in particolare la corrente che può essere erogata/assorbita dai pin di I/O utilizzati e i loro livelli logici. A richiesta (leggi oltre), è possibile ottenere gratuitamente anche il programma assembler per la comunicazione fra PIC 16F877 e mouse PS/2. Il PIC con il quale è stata testata la connessione e la comunicazione con il mouse PS/2 è un16F877 a 20 MHz; trattandosi di una applicazione non critica, una vasta schiera di altri dispositivi PIC a 14 bit dovrebbe poter essere utilizzata, effettuando al limite limitatissime modifiche al codice. Nell'articolo sulla comunicazione hardware fra host e mouse PS/2, viene riportata una descrizione del protocollo utilizzato dai mose PS/2.

Nota bene: i dispositivi PS/2 sono diversi dai mouse seriali sia per quanto riguarda il protocollo di comunicazione che per quanto riguarda i livelli elettrici; nei mouse PS/2 i livelli utilizzati per l'alimentazione e la scambio dati sono 0 e +5V, in quelli seriali troviamo invece i livelli della RS-232, +12V e -12V. Questo articolo è relativo alla gestione di un mouse PS/2. Anche il PIC, quindi, deve essere alimentato con una tensione di +5V. In particolare, i terminali di comune (o massa) di PIC e mouse PS/2 devono essere collegati fra loro; stessa cosa per i terminali a +5V.

Per sviluppare e utilizzare il programma assembler ho utilizzato un PIC 16F877 a 20 MHz montato sulla Development Board v. 1.2 da me ideata e descritta nell'articolo PIC 16F877 Development Board v.1.2 su questo stesso sito.

Fate attenzione alle connessioni, onde evitare spiacevoli danni ai dispositivi! Prima di rovinare un PIC o un mouse, se proprio non siete sicuri di agire correttamente potete scrivermi.


Riconoscimenti e avvertenze

Il materiale contenuto in queste pagine costituisce il frutto di prove preliminari, sviluppo e verifica del progetto eseguiti in prima persona dall'autore di questa pagina.

Per quanto riguarda il programma assembler, l'autore garantisce l'assoluta originalità del materiale, pur ovviamente non escludendo che in rete sia possibile incontrarne di analogo.

Trattandosi di un programma messo gratuitamente a disposizione di chi ne faccia richiesta, ne è assolutamente vietata ogni forma di utilizzazione a fini commerciali, salvo preventiva richiesta scritta (via e-mail); leggere comunque quanto riportato più avanti nella sezione "Il programma assembler".

Non mi assumo naturalmente alcuna responsabilità per danni diretti o indiretti a cose o persone derivanti dalle informazioni attinte da questo articolo.

I marchi PIC e Microchip sono registrati. Il programma assembler è stato sviluppato grazie al software gratuito Microchip MPLAB v. 5.61.00.

Lo schema del circuito di interfaccia con un mouse PS/2 è stato disegnato con TARGET 3001! (licenza 400 pin).

Il circuito di interfaccia

Il circuito utilizzato per comunicare con un mouse PS/2 è piuttosto semplice. L'alimentazione è la stessa del PIC (+5V e GND). Al connettore K2 vanno connessi due piedini di I/O del PIC; il programma assembler fa uso di due piedini di I/O del PIC della porta A, ma NON di tipo open collector. Il protocollo PS/2 stabilisce che le linee Clock e Data siano di tipo open collector per la possibilità di pilotarle sia da parte dell'host che del device PS/2 senza avere conflitti elettrici (ad esempio, se l'host porta basso il clock quando anche il mouse lo sta pilotando, significa che l'host vuole riguadagnare il controllo della comunicazione); essendo i piedini del PIC non di tipo open collector, tali linee non vanno mai pilotate alte da parte del PIC. Quanto segue si riferisce indifferentemente alla linea Clock e alla linea Data. Affinché la linea possa andare a livello logico alto (come deve essere quando il suo stato è inattivo), portata alta dal pull-up visibile nello schema elettrico, il relativo piedino del PIC va posti in alta impedenza, ovvero, settato come ingresso. Quando si desidera invece imporre un livello basso sulla linea open collector, il PIC deve portare basso il relativo piedino, ovvero, settare il piedino coinvolto come uscita e imporre su di esso un valore logico basso. Nel caso si commettesse un errore di progammazione, imponendo un livello logico alto su un piedino del PIC, e il mouse portasse bassa la linea coinvolta, la resistenza di protezione da 330 Ohm limiterebbe a circa 15 mA il valore della corrente che il piedino del PIC dovrebbe erogare, scongiurando la necessità di comprare un nuovo PIC. NOTA BENE: questa eventualità non è mai stata testata.

Facendo click sul link sotto la figura si avrà un'immagine ingrandita in una nuova finestra.
Per stampare l'immagine dello schema elettrico potete anche salvarla e poi aprirla con il browser stesso o con qualche altro programma; controllate in ogni caso le dimensioni con l'anteprima di stampa (ove possibile). 



Figura 1 - Schema elettrico della connessione fra mouse PS/2 e microcontrollore PIC 16F877

Il programma assembler

Il programma assembler da me sviluppato per la comunicazione con il mouse PS/2 è gratuitamente utilizzabile, alle seguenti condizioni:

chi desiderasse utilizzarlo per realizzare una connessione con un mouse per scopi puramente personali, può farlo senz'altro;

chi se ne servisse in ambito accademico, utilizzando il programma integralmente o con limitate modifiche, nel caso di pubblicazione dei risultati del lavoro in cui esso fosse utilizzato dovrebbe citare come fonte l'autore del codice (e di questo articolo); nel caso il programma venisse fortemente alterato, la citazione della fonte sarebbe solo gradita, ma non richiesta;

chi se ne servisse in ambito commerciale, dovrebbe prima richiedere il permesso scritto all'autore del codice (anche via e-mail).

Il programma assembler non è disponibile sul sito; per contattarmi, scrivetemi attraverso il vostro account e-mail riportando eventualmente anche l'indirizzo della vostra home page e indicando l'uso che intendete fare del codice; vi risponderò eventualmente allegando il programma (ribadisco che il codice è gratuito). Non scrivetemi per il codice da uno dei form nelle pagine del sito.

Una volta ottenuto il codice, non è mio intendimento che ne sia fatto uso per fini diversi da quelli per cui è stato richiesto (dovreste fare una nuova richiesta).

In particolare, non è mio intendimento che, una volta ottenuto il programma assembler, questo venga reso disponibile senza il mio consenso, ad esempio mediante pubblicazione su Internet. Prima di farlo, scrivetemi. Se volete, potete invece inserire un link a questa pagina.


Il programma assembler (debitamente commentato) essenzialmente inizializza il mouse con vari comandi (alcuni sono inviati al mouse solo per prova), e poi entra in un ciclo nel quale ogni 300 millisecondi circa chiede al mouse la trasmissione dei dati su stato dei pulsanti e spostamento avvenuto rispetto all'ultima lettura. Tali dati sono posti in alcuni file registers del PIC. La comunicazione è gestita verificando anche gli errori di timeout, di framing, di parità, e codificando tali errori in un file register del PIC. L'errore di timeout, in particolare, si può banalmente verificare anche nel caso il mouse sia disconnesso, o non risponda, o vi sia un filo staccato, ecc..

Personalmente utilizzo una versione più completa di questo programma assembler, la quale invia ad un PC i dati ricevuti dal mouse attraverso la porta seriale (il 16F877, tra l'altro, dispone di una porta seriale on-chip).

Buon lavoro.



Se volete contattarmi per chiarimenti o suggerimenti potete farlo al seguente indirizzo:
f_iacopetti@libero.it