dal 2015 - visita n. 1454
PortaParallela
PortaParallela

 

Proviamo con la porta parallela


Generalmente il computer Ŕ dotato di una sola porta stampante a cui possono essere connesse la stampante ed altri dispositivi ad interfaccia parallela (ZIP, scanner, etc.). Essa Ŕ conosciuta anche come LPT, porta stampante, printer port, oppure ancora interfaccia Centronics. E' facilmente riconoscibile guardando il computer dall'esterno: si presenta come un connettore a 25 poli DB25 femmina.



Oggi spesso rimane inutilizzata in quanto molti dispositivi, tra cui le stesse stampanti, utilizzano la porta USB. La presenza di un bus I/O ad 8 bit la rende utilizzabile per interfacciare semplici circuiti elettronici. Per utilizzarla con maggiore comoditÓ per la nostra prova ci serviremo di un cavo di prolunga parallelo maschio/maschio, come quello mostrato in fotografia, in modo da avere sul nostro tavolo i segnali provenienti dal retro del computer.



Collegheremo quindi il connettore A al computer ed il connettore B alla semplice interfaccia descritta di seguito e costituita essenzialmente da un connettore femmina, 8 led ed 8 resistenze da 1000 Ohm. Quest'ultimo connettore Ŕ mostrato dal lato delle saldature, infatti c'Ŕ una perfetta corrispondenza con la piedinatura del connettore B dove sarÓ inserito.



Il risultato che vogliamo ottenere Ŕ semplicemente l'accensione programmata dei vari LED. Pertanto il software, su macchine Intel compatibili, dovrÓ realizzare i seguenti punti:

  1. Richiesta autorizzazione all'uso del dispositivo di I/O Porta Parallela
  2. Programmazione delle sequenze di accensione e spegnimento dei LED
  3. Revoca autorizzazione all'uso dei dispositivi di I/O Porta Parallela

L'esempio fa riferimento al dispositivo di indirizzo 378h, ma funziona ugualmente bene con il dispositivo di indirizzo 278, basta modificare nel listato il valore della costante LPTPORT.

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
; ioled_1.asm 
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;compilare con nasm+gcc

%macro  @ioperm  3
        mov     ebx,%1          ;;Numero porto iniziale;
        mov     ecx,%2          ;;Quantita' di porti in successione
        mov     edx,%3          ;;Richiesta: 1=Abilitazione, 0=Revoca
        mov     eax,101         ;;Funzione sys_call=ioperm
        int     80h
        or      eax,eax         ;;Test esito: "jns okay"
%endmacro

%define LPTPORT 378h		;Da modificare, se necessario

global  main                    ;necessario per il linker gcc
extern  usleep, printf

        section .data
msgerr  db      "NON abilitato all'uso dei porti di I/O! "
        db      "Occorrono i privilegi di ROOT.",0Ah
        db      "Oppure si e' verificato un ERRORE nel caso "
        db      "si sia in ROOT.",7,0Ah,0
durata  dd      500000

        section .text
main:   @ioperm LPTPORT,1,1     ;Richiesta Permesso LPTPORT
        jns     okay
        jmp     err
okay:   call    seq01           ;Chiamate output LPTPORT
        call    seq02
        jmp     exit

;:::::::::::::::::::::::::::::::;ON e OFF di ciascun LED da D0 a D7
seq01:  mov     ecx,8           ;
        mov     al,1            ;Imposta D0 acceso (ON)  
	mov	dx,LPTPORT
wrk01:	out     dx,al
        call    delay
        shl     al,1            ;Passa al LED successivo
        loop    wrk01
        ret

;:::::::::::::::::::::::::::::::;8 lampeggi di tutti i LED
seq02:  mov     ecx,8           ;
        mov	dx,LPTPORT
wrk02:  mov     al,0FFh         ;Imposta tutti accesi
	out     dx,al
	call	delay
        mov     al,0            ;Imposta tutti spenti
	out     dx,al
        call    delay
        loop    wrk02
        ret

;:::::::::::::::::::::::::::::::;Routine di ritardo
delay:  push    dword [durata]  ;Imposta durata in microsecondi
        call    usleep
        add     esp,4           
	ret
	
;:::::::::::::::::::::::::::::::;Gestione Errori e Uscita       
err:    push    dword msgerr    ;Passa il Ptr Stringa
        call    printf
        add     esp,4           ;Riallinea lo Stack
exit:   @ioperm LPTPORT,1,0     ;Revoca Permessi I/O
        ret
;EOF ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 



Nella tabella seguente c'è una descrizione sintetica dei singoli pin:


 Parallela NormaleParallela ECP 
PinNomeDescrizioneNomeDescrizioneAnnotazioni
1/STROBEStrobenStrobeStrobeout - ValiditÓ dei dati disponibili da D0 a D7
2D0Data Bit 0data0Address, Data or RLE Data Bit 0out - Byte inviato alla stampante
3D1Data Bit 1data1Address, Data or RLE Data Bit 1out - Byte inviato alla stampante
4D2Data Bit 2data2Address, Data or RLE Data Bit 2out - Byte inviato alla stampante
5D3Data Bit 3data3Address, Data or RLE Data Bit 3out - Byte inviato alla stampante
6D4Data Bit 4data4Address, Data or RLE Data Bit 4out - Byte inviato alla stampante
7D5Data Bit 5data5Address, Data or RLE Data Bit 5out - Byte inviato alla stampante
8D6Data Bit 6data6Address, Data or RLE Data Bit 6out - Byte inviato alla stampante
9D7Data Bit 7data7Address, Data or RLE Data Bit 7out - Byte inviato alla stampante
10/ACKAcknowledge/nAckAcknowledge  in - DisponibilitÓ a ricevere il prossimo dato
11BUSYBusyBusyBusy  in - Stampante/Buffer impegnata/o
12PEPaper EndPErrorPaper End  in - Stampante senza carta
13SELSelectSelectSelect  in - Stampante pronta
14/AUTOFDAutofeed/nAutoFdAutofeedout - Avanzamento riga
15/ERRORError/nFaultError  in - Errore rilevato dalla stampante
16/INITInitialize/nInitInitializeout - Inizializza la stampante
17/SELINSelect In/nSelectInSelect Inout - Invia una richiesta alla stampante
18GNDSignal GroundGNDSignal Groundgnd - Massa
19GNDSignal GroundGNDSignal Groundgnd - Massa
20GNDSignal GroundGNDSignal Groundgnd - Massa
21GNDSignal GroundGNDSignal Groundgnd - Massa
22GNDSignal GroundGNDSignal Groundgnd - Massa
23GNDSignal GroundGNDSignal Groundgnd - Massa
24GNDSignal GroundGNDSignal Groundgnd - Massa
25GNDSignal GroundGNDSignal Groundgnd - Massa


Si tenga presente che la porta parallela è stata sviluppata, all'origine, per la gestione della stampante, pertanto alcuni segnali, presenti sul connettore esterno, risultano invertiti (negati) come stato logico. In sostanza ciò che viene trattato dal programmatore a livello di registri LPTBASE+? viene ulteriormente modificato, su alcune linee, da porte logiche invertenti. La figura seguente illustra meglio la situazione.



Possiamo notare che oltre la LPTPORT+0, che abbiamo usato come output nel nostro primo esempio, ci sono anche la LPTPORT+1, che dispone di 5 ingressi, e la LPTPORT+2 che dispone di altri 4 pin di output. Il programmatore agisce sui 3 registri interni (area in grigio), mentre sui piedini del connettore (numeri in rosso) arrivano dei segnali che transitano attraverso dei buffer che, in qualche caso, sono invertenti. Attenzione: se ne tenga conto nelle applicazioni.



Complementi 1

Proponiamo, di seguito, un altro piccolo esperimento che consente di verificare l'acquisizione dei 5 bit della LPTPORT+1. La pila da 4,5 V consente di avere lo stato logico alto (valore compreso tra 1,8 e 5,1 Volt), quando l'interruttore è posizionato su on (interruttore chiuso). La resistenza da 10.000 Ohm mantiene lo stato logico basso quando l'interruttore è posizionato su off (interruttore aperto).




Il telaio del software è lo stesso di quello visto in precedenza, pertanto ci soffermiamo soltanto sulla parte relativa all'uso della LPTPORT+1. Poichè il bit 7 risulta invertito dall'hardware occorrerà un piccolo intervento, dopo l'input, per reinvertirne lo stato.

;:::::::::::::::::::::::::::::::::::::::; Acquisizione dell'input (Lettura)
        mov	dx,LPTPORT+1		; 
	in      al,dx
;:::::::::::::::::::::::::::::::::::::::; Inversione del bit più significativo
	mov	ah,al			; duplica l'input nel registro ah
	not	ah			; inverte tutti i bit di ah
	and	ah,80h			; maschera i bit da 6 a 0 di ah 
	and	al,7Fh			; maschera il bit 7 di al
	or      al,ah                   ; ricostruisce il byte
;:::::::::::::::::::::::::::::::::::::::; Opzioni correttive
;       and     al,0F8h                 ; opzione 1 (decommentare se necessario)	
;       shr     al,3                    ; opzione 2 (decommentare se necessario)	

Attenzione: lo stato degli ultimi 3 bit non deve essere preso in considerazione in quanto non riferibile a nessun input proveniente dal connettore; pertanto la penultima riga di codice (opzione 1) può eliminare questa ambiguità azzerando sistematicamente i 3 bit. Un'altra possibilità è offerta dalla opzione 2 che, facendo scorrere verso destra il byte di 3 posti, azzera i 3 bit più significativi ed obbliga ad una rinumerazione verso il basso dei segnali ricevuti; a seconda delle situazioni e delle preferenze personali si può optare per le varie soluzioni.



Complementi 2

L'ultimo esperimento consiste nell'uso di LPTPORT+2 per l'emissione di 4 bit, tenendo conto sia della presenza di 3 inverter, sia del fatto che non dobbiamo alterare lo stato dei 4 bit più significativi.



;:::::::::::::::::::::::::::::::::::::::; Emissione output (Scrittura)
        mov	dx,LPTPORT+2		;
	in	al,dx			; Lettura dello stato preesistente
	mov	ah,pattern		; Simulazione input del pattern
	and	ah,0Fh			; Maschera i 4 bit più significativi
	or      al,ah			; Inserzione dei 4 bit del pattern in al
;:::::::::::::::::::::::::::::::::::::::; Inversione dei 3 bit negati
	mov	ah,al			; duplica l'output nel registro ah
	not	ah			; inverte tutti i bit di ah
	and	ah,0Bh			; maschera i bit 7,6,5,4,2 di ah 
	and	al,0F4h			; maschera i bit 3,1,0 di al
	or      al,ah                   ; ricostruzione del byte
;:::::::::::::::::::::::::::::::::::::::; 
	out     dx,al			; E, finalmente, invio sul porto








Presentazione
Introduzione
Hello World
I/O di Testo
Command Line
Colori e Macro
Introduzione I/O
Porta Parallela


x86 Asm Progranmming
Linux ELF Howto
Linux Assembly Howto


AppuntiAsmx.html
AppuntiAsmx.pdf



Si pu˛ mentire con la bocca; ma con l'espressione che si ha in quel momento si dice pur sempre la veritÓ.
Friedrich W. Nietzsche

Valid CSS!
pagina generata in 0.001 secondi