mediante PIC 16F84 Siete il visitatore n. Click here for English version Pagina ottimizzata per risoluzione 1024x768 |
||
Torna alla Home Page | Argomenti simili su questo sito: PIC 16F84 F.F. Evaluation Board Connessione e comunicazione PIC-mouse PS/2 Connessione di microcontrollori a porte RS-232 e dispositivi PS/2 |
Introduzione
Come spiegato nell'articolo sulla comunicazione hardware fra host e mouse PS/2, per testare sperimentalmente il protocollo da utilizzare nella comunicazione con un mouse PS/2 ho interfacciato quest'ultimo con un PIC 16F84 opportunamente programmato. Se siete interessati ad un programma più completo, scritto per il PIC 16F877 ma adatto anche a molti altri microcontrollori PIC, potete dare un'occhiata all'articolo Connessione e comunicazione PIC-mouse PS/2 su questo stesso sito. 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 connettere mouse e microcontrollore suggerisco una presa PS/2 volante, alla quale connettere i 4 fili necessari. Tali fili possono essere portati su una basetta prototipi, e collegati su di essa agli opportuni piedini del PIC, dai quali si avrà cura di far giungere i fili necessari. Per far funzionare il PIC ho utilizzato la versione precedente della Evaluation Board descritta nell'articolo PIC 16F84 F.F. Evaluation Board su questo stesso sito. Per le connessioni vedere l'articolo citato in precedenza, l'eventuale piedinatura dei connettori PS/2 e le prime righe del listato. Se in questo modo il mouse non desse segno di vita, connettere due resistori di pull-up fra i piedini data e clock e l'alimentazione (che, ribadisco, deve essere la stessa per microcontrollore e mouse). Valori adatti dovrebbero aggirarsi su 3-10 KOhm. 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. 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. L'autore garantisce l'assoluta originalità del materiale, pur ovviamente non escludendo che in rete sia possibile incontrarne di analogo. Trattandosi di materiale messo gratuitamente a disposizione di chiunque lo desideri, ne è assolutamente vietata ogni forma di utilizzazione a fini commerciali. 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 A seguire il listato del programma assembler. Come si nota dal listato, si tratta sostanzialmente di una serie di routine per inviare comandi al mouse e memorizzarne le risposte. Trattandosi di un programma che mi è servito per condurre dei test, esso non è ottimizzato, né per quanto riguarda l'occupazione di memoria, né in riferimento ad altri aspetti. Contiene inoltre qualche sezione che mi è servita solo per verificare la corrispondenza fra il protocollo reale e quello descritto in alcuni documenti in rete (ho riscontrato una importante differenza; la corretta descrizione del protocollo di comunicazione si trova nell'articolo sulla comunicazione hardware fra host e mouse PS/2 in questo stesso sito). Per indicare a quale sezione del programma si sia arrivati durante l'esecuzione ed eventuali condizioni di errore, è previsto il lampeggio diversificato di un led collegato ai piedini del PIC (per chi non lo sapesse, è necessario un resistore in serie al LED; valori adatti da 330 Ohm a 1KOhm). I valori utilizzati per i cicli di attesa si riferiscono ad una frequenza di clock di 4 MHz, ovvero di 1 milione di istruzioni al secondo. I dati inviati dal mouse su spostamento e stato dei pulsanti non sono utilizzati. A voi il compito di scrivere programmi adatti alle vostre applicazioni, e di suggerirmi eventuali errori contenuti in qualche sezione di questo. |
;pag.1 ;
nome file: mouseps2.asm ; Poiché queste linee dovrebbero
essere di tipo ; RA0 (Clock) ed RA1 (Data) sono utilizzati ;
RB0 è utilizzata (come uscita)
per indicazioni PROCESSOR 16F84 RADIX DEC __CONFIG 3FF1H ; XT ; /PWRO enable ; WDT disable INCLUDE "P16F84.INC" TOCS EQU 05H CIN EQU 0 RA0 EQU 0 ORG
0CH count
RES 1 | ;
pag.2 cbit RES 1 hexd0 RES 1 number RES 1 ; ATTENZIONE: mantenere sempre a 0 il bit ORG 00H goto start ORG 50H start bsf STATUS,RP0 ; RB1-7: INPUT movlw
11111111B ;
RA4 :INPUT (non utilizzato) movlw
11111111B |
; pag.3 ; disattiva Clock e Data movlw 11111111B ; assegna al tmr0 la fosc/4 bcf OPTION_REG,TOCS ; assegna il prescaler al tmr0 con valore 256 ;
bsf OPTION_REG,PSA ;
movlw 00H movlw 00H ; attende 1 s call del1s ;
emette tre volte il segnale di comando
inviato call cmdsnt ; invia il comando di reset (FFH) movlw 0FFH | ;
pag.4 ; attende 1 s call del1s ; emette il comando di enable (F4H) movlw 0F4H ; attende 1 s call del1s ;
emette il comando di impostazioni di
default movlw
0F6H call del1s ; richiede la trasmissione dati (EBH) movlw 0EBH call del1s ; richiede la trasmissione dati (EBH) movlw 0EBH call del1s ; set stream mode (EAH) movlw
0EAH |
; pag.5 call
cmdts ;
richiede la trasmissione dati (EBH) dopo movlw 0EBH ; ricezione dati continua (ogni 100 ms) datain ; richiede la trasmissione dati (EBH) movlw 0EBH | ;
pag.6 xorlw 0FFH recby ; ricezione dati - restituisce il
byte
ricevuto in movlw 00H waitst ; attende che il clock vada a 0 e
inserisce movf PORTA,W ;
ad inizio ricezione porta alto il valore
del bsf
STATUS,RP0 |
;
pag.7 ; se il bit di
start è diverso da
STBIT segnala btfsc
STATUS,Z stbok movlw 08H ; riceve gli 8 bit waitb movf PORTA,W carry1 bsf STATUS,C carry0 bcf STATUS,C storeb rrf byteio,F ; riceve il bit di parità waitpy movf PORTA,W ;
calcola la parità del byte
contenuto in byteio call pargen | ; pag.8
pbok nop ; attende il bit di stop waitsb movf PORTA,W ;
se il bit di stop è diverso da
ENDBIT segnala btfsc
STATUS,Z ebok bsf STATUS,RP0 ;
se byteio = FFH significa che
c'è stato movlw 00H endrec return ; non necessario goto fine ; calcola la parità del byte
contenuto in byteio pargen movlw 08H pcycle xorwf byteio,W |
; pag.9 andlw
00000001B ;
pone sulla porta PORTA,DOUT il L.S.bit outbit andlw 1H outz bcf STATUS,RP0 outuno bsf STATUS,RP0 endss return ; attende che il clock (PORTA,CIN) passi da wcup btfss PORTA,CIN ;
attende che il clock (PORTA,CIN) passi da wcdown btfsc PORTA,CIN ;
attende che la linea dati (PORTA,DIN)
passi wdup btfss PORTA,DIN ;
attende che la linea dati (PORTA,DIN)
passi wddown btfsc PORTA,DIN | ; pag.10
; errore nel ricevere lo start bit
(diversità dalla estb bsf STATUS,RP0 cycle2 movlw 00H ozero bcf PORTB,RB0 ouno bsf PORTB,RB0 cycle3 decfsz delay1 ;
errore nel ricevere lo start bit
(diversità dalla eparb bsf STATUS,RP0 cycle4 movlw 00H |
; pag.11 ozero1 bcf PORTB,RB0 ouno1 bsf PORTB,RB0 cycle5 decfsz delay1 ;
errore nel ricevere lo stop bit
(diversità dalla eendb bsf STATUS,RP0 cycle6 movlw 00H ozero2 bcf PORTB,RB0 ouno2 bsf PORTB,RB0 cycle7 decfsz delay1 | ; pag.12
; comando inviato - alterna 1 e 0
su RB0 per
2 cmdsnt bsf STATUS,RP0 cycle8 movlw 00H ozero3 bcf PORTB,RB0 ouno3 bsf PORTB,RB0 cycle9 decfsz delay1 ; riceve in byteo e byteio il byte da inviare sendby bcf STATUS,RP0 ;
forza il clock a 0 e attende circa 200 us bcf STATUS,RP0 |
; pag.13 bsf
STATUS,RP0 ; mettere 42H in delay1 (circa 200 us) movlw 42H cycle1 decfsz delay1 ; rilascia il clock bsf
STATUS,RP0 detbit bcf STATUS,C bitz movlw 00H bituno movlw 01H ; PROVA INVERSIONE PARITA' xorlw 00000001B | ;
pag.14 movlw ENDBIT ; routine di attesa di circa 1ms del1ms movlw 02H cyc21 decfsz delay1 ; routine di attesa di circa 10ms del10m movlw 0DH cyc51 decfsz delay1 ; routine di attesa di circa 100ms del.1s movlw 0A0H cyc41 decfsz delay1 ; routine di attesa di circa 1s del1s |
; pag.15 movlw
05H cyc11 decfsz delay1 ; indica che si sta per inviare un comando - mette 1 su RB0 con un ; impulso di circa 0.1 sec e poi 0 per altri 0.1 sec cmdts bsf STATUS,RP0 | ; pag.16 bcf
TRISB,RB0 cyc31 decfsz delay1 fine END |
Buon lavoro! |
|