PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2003) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : GestADC.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2003 | ;| DESCRIZIONE : Collaudo di ADC0804 nell'acquisizione della tensione | ;| presente sul cursore di un potenziometro. | ;| /----------\ -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | bisogna prima installare il Driver Configura_LPT1; scaricalo | ;| | | a: http://www.giobe2000.it/consigli/Scarica_VediLPT_XP.htm | ;| *----------* -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | la SHELL DOS deve essere a "Pieno Schermo" (l'esecuzione in | ;| | | "finestra DOS" non produce effetto sulla Stampante) | ;| *----------* -------------------------------------------------------------| ;| | | In ogni caso PRIMA DI OGNI SESSIONE DOS Š necessario eseguire| ;| | NB !! | il programma Config_LPT1.EXE in ambiente Windows per attivare| ;| | | la visibilit… dei driver installati con Configura_LPT1 !!!!! | ;| \----------/ -------------------------------------------------------------| ;\---------------------------------------------------------------------------/ ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC ; LIBRERIA UTILIZZATA DAL PROGRAMMA [opzione WinASM altrimenti non necessaria] includelib c:\arch-lab\bin\GIOBE.LIB ;PROCEDURE ESTERNE UTILIZZATE dal PROGRAMMA [NEAR, dalla LIBRERIA ~GIOBE.LIB~] ;----------------------------------------------------------------------------- EXTRN CambiaCol:NEAR EXTRN SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN KEYwait:NEAR EXTRN STAsp:NEAR EXTRN Acapo:NEAR EXTRN BIOScls:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR EXTRN Byt2Asc:NEAR EXTRN RAMcls:NEAR EXTRN RAMchr:NEAR EXTRN RAMcur:NEAR EXTRN RAMmes:NEAR EXTRN RIEMPI:NEAR EXTRN RAMpiu:NEAR EXTRN RAMcorn:NEAR PUBLIC ATTRIB ;Attributo di colore ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP GestADC ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 1FH TESTO1 DB "Gestione di un Convertitore Analogico-Digitale",00H TESTO2 DB "TUTORIAL ASSEMBLY --- www.Giobe2000.it ---",00H TESTO3 DB "Quit",00H TESTO4 DB "Premi un tasto qualunque per iniziare .... ",00H TESTO5 DB " Valore corrente: ",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;|PROCEDURA : DeskTop | ;|DESCRIZIONE: Procedura che inizializza completamente il piano di lavoro.| ;\---------------------------------------------------------------------------/ DeskTop:CALL RAMcls ;Pulisce lo schermo e inizializza il segmento ;dedicato alla RamVideo (ES=0B800H) CALL VIA_cur ; Rende il cursore invisibile M_COLOR 71H ; MOV AL,"°" ; CALL RIEMPI ; RAMrepC 80," ", 0, 0,30H; RAMrepC 80," ",24, 0,30H; RAMcol TESTO1, 0,10,3FH; Organizza il piano di presentazione RAMcol TESTO2,24,10,3FH; RAMcol TESTO3,24,73,30H; RAM_cur 24,73 ; M_COLOR 3FH ; MOV AL,"Q" ; CALL RAMchr ; MOV CX,1000H ;\CX=1000H >> OFFSET AREA VIDEO di salvataggio MOV BH,00H ;|BH=00 >> senza ombreggiatura MOV BL,00H ;|BL=00 >> a tratto semplice MOV AL,54 ;|AL=54 >> larghezza MOV AH,3 ;|AH= 3 >> altezza MOV DL,13 ;|DL=13 >> colonna MOV DH,12 ;|DH=12 >> riga ;|[ATTRIB] = colore CALL RAMcorn ;/Stampa una CORNICE RAMcol TESTO4,13,15,3FH; Premi un tasto qualunque per iniziare .... CALL KEYwait RAMcol TESTO5,13,15,3FH; Valore corrente: xy M_COLOR 3EH RET ;/---------------------------------------------------------------------------\ ;| NOME : Delay | ;| DESCRIZIONE : Assicura un piccolo ritardo ottenuto con un ciclo che perde| ;| tempo eseguendo alcune istruzioni (in questo caso la coppia| ;| PUSH/POP); il ritardo prodotto Š legato dalla velocit… del| ;| processore (per cui NON Š PORTABILE) ma assicura comunque| ;| almeno un ritardo di qualche centinaio di nanosecondi... | ;\---------------------------------------------------------------------------/ Delay: PUSH CX MOV CX,100 del2_: PUSH AX PUSH BX POP BX POP AX LOOP del2_ POP CX RET ;/---------------------------------------------------------------------------\ ;| NOME : Converti | ;| DESCRIZIONE : Gestisce la Conversione Digitale del segnale fornito sul-| ;| l'ingresso Analogico (la tensione presente sul cursore di un| ;| potenziometro). La prima fase prevede la formattazione del| ;| segnale di START, con la generazione di un breve impulso| ;| sulle linee CS e WR del Convertitore ADC0804. La procedura| ;| rimane poi in attesa della fine della conversione, evento| ;| segnalato dal passaggio a "0" della linea INTR | ;\---------------------------------------------------------------------------/ Converti:MOV DX,0378H ; Forza a "0" il bit0 della porta di OUTPUT, per MOV AL,11111110B ; attivare la linea CS, Chip Select, del OUT DX,AL ; Convertitore ADC0804 MOV AL,11111010B ; Forza a "0" anche il bit2 della porta OUTPUT OUT DX,AL ; per attivare anche la linea WR, Write, del ; Convertitore ADC0804 CALL Delay ; E' necessario un ritardo di almeno 100 ns MOV AL,11111110B ; Riporta a "1", in sequenza inversa, prima W e OUT DX,AL ; poi CS, mettendo sui bit2 e bit0 della porta MOV AL,11111111B ; di output della parallela il corretto valore OUT DX,AL ; binario ;/-------------------------------------------------------------------\ ;|L'effetto combinato di CS e W da inizio al processo di conversione;| ;|poco dopo (circa 450ns) la linea di INTR viene comunque alzata per| ;|segnalare che il convertitore sta per passare dallo stato d'attesa| ;|a quello di busy, nel quale sar… appunto occupato alla conversione| ;|in binario del livello di tensione ad esso sottoposto; dal momento| ;|in cui parte la conversione (fronte di salita di W) Š previsto un| ;|tempo di conversione da un minimo di 103 ad un max di 114 microsec.| ;\-------------------------------------------------------------------/ MOV DX,0379H ; Quando la conversione Š finita la linea INTR Conv1: IN AL,DX ; (bit3 della porta INPUT) passa a '0' e il dato AND AL,00001000B ; Š stabilmente disponibile sul latch interno CMP AL,00H ; del dispositivo ADC; il programma dunque si JNE Conv1 ; ferma in attesa che INTR torni a "'0" RET ;/---------------------------------------------------------------------------\ ;| NOME : Mpx_Dato | ;| DESCRIZIONE : Gestisce l'effettiva lettura degli otto bit del bus Dati del| ;| Convertitore ADC0804 sulle sole quattro linee possibili in| ;| input dalla porta parallela, con l'auito del Multiplexer 157| ;\---------------------------------------------------------------------------/ ; Forza a "1" il bit0 della porta USCITA COMANDI Mpx_Dato:MOV AL,01H ; della parallela; per effetto dell'inversione MOV DX,037AH ; interna la linea di "SELECT" del multiplexer OUT DX,AL ; 74LS157 Š a sua volta forzata a "0"; in questo CALL delay ; modo il MPX collega i 4 bit pi— significativi ; (bit7öbit4) del bus dati del convertitore sui ; pin11 (bit7), pin10 (bit6), pin12 (bit5) e ; pin13 (bit4) della porta parallela. ; Esegue praticamente la lettura dei 4 bit pi— ; significativi (bit7öbit4) del bus dati del MOV DX,0379H ; convertitore rispettivamente nei bit7öbit4 del IN AL,DX ; registro d'ingresso (di STATO) cioŠ ai pin11 ; (bit7), pin10 (bit6), pin12 (bit5) e pin13 ; (bit4) della porta parallela ; Formatta in BL la prima met… dell'informazione ; desiderata nella forma xxxx0000H mascherandone ; la parte bassa; va notato che Š NECESSARIO XOR AL,10000000B ; "raddrizzare" da SW il valore del bit7 per AND AL,0F0H ; evitare di interpretare in modo errato il dato MOV BL,AL ; acquisito, essendo esso internamente invertito ; da HW dall'interfaccia parallela ; Forza a "0" il bit0 della porta USCITA COMANDI MOV AL,00H ; della parallela; per effetto dell'inversione MOV DX,037AH ; interna la linea di "SELECT" del multiplexer OUT DX,AL ; 74LS157 Š a sua volta forzata a "1"; in questo CALL delay ; modo il MPX collega i 4 bit meno significativi ; (bit3öbit0) del bus dati del convertitore sui ; pin11 (bit7), pin10 (bit6), pin12 (bit5) e ; pin13 (bit4) della porta parallela. ; Esegue praticamente la lettura dei 4 bit meno ; significativi (bit3öbit0) del bus dati del MOV DX,0379H ; convertitore rispettivamente nei bit7öbit4 del IN AL,DX ; registro d'ingresso (di STATO) della porta ; parallela, cioŠ ai pin11 (bit7), pin10 (bit6), ; pin12 (bit5) e pin13 (bit4) XOR AL,10000000B ; Formatta in AL la seconda met… del dato letto SHR AL,1 ; dal convertitore, compattandola nella forma SHR AL,1 ; 0000xxxxH; poichŠ il valore del bit7 Š inter- SHR AL,1 ; namente invertito da HW dall'interfaccia SHR AL,1 ; parallela per evitare di interpretarlo in modo ; errato, il suo valore va "raddrizzato" da SW OR AL,BL ; * Ricostruisce in AL il byte ora acquisito ** RET ;/---------------------------------------------------------------------------\ ;| NOME : Leggi | ;| DESCRIZIONE : La fase di conversione Š terminata; si procede alla fase di| ;| Lettura, attivando (a"0") di nuovo le linee CS e RD del Con-| ;| vertitore ADC0804; dopo circa 135ns il dato Š disponibile| ;| sulle 8 linee d'uscita e pu• essere assunto con il Selettore| ;| 74LS157. Al termine i segnali RD e CS sono riportati a "1",| ;| per predisporre le successive conversioni... | ;\---------------------------------------------------------------------------/ ;/-------------------------------------------------------------------\ ;|La fase di conversione Š terminata; si procede alla fase di Lettura| ;\-------------------------------------------------------------------/ Leggi: MOV DX,0378H ; Forza a "0" il bit0 della porta di OUTPUT, per MOV AL,11111110B ; attivare di nuovo la linea CS, Chip Select, OUT DX,AL ; del Convertitore ADC0804 MOV AL,11111100B ; Forza a "0" anche il bit1 della porta OUTPUT OUT DX,AL ; per attivare anche la linea RD, Read , del ; Convertitore ADC0804 CALL Delay ; E' necessario un ritardo di almeno 135 ns ;/-------------------------------------------------------------------\ ;|Dopo circa 135 ns il dato viene trasferito dal latch interno sulle| ;|8 linee d'uscita (fino a questo momento in alta impedenza); dopo| ;|circa 300 ns il converter provvede a riportare a "1" la linea INTR;| ;|Š dunque possibile passare alla Fase di Lettura con il MPX 74LS157.| ;\-------------------------------------------------------------------/ CALL Mpx_Dato ; Gestisce l'effettiva lettura degli otto bit ; del bus Dati del Convertitore ADC0804 sulle ; sole quattro linee possibili in input dalla ; porta parallela, con l'auito del Multiplexer ;/-------------------------------------------------------------------\ ;|Da questo istante ogni momento Š buono per riportare a "1" i segna-| ;|li RD e CS, per predisporre le successive conversioni... | ;\-------------------------------------------------------------------/ PUSH AX MOV DX,0378H ; Riporta a "1", in sequenza inversa, prima RD e MOV AL,11111110B ; poi CS mettendo sui bit1 e bit0 della porta di OUT DX,AL ; output della parallela il corretto valore MOV AL,11111111B ; binario OUT DX,AL ; MOV CX,150 ; Il costruttore suggerisce di attendere almeno xxx2: PUSH CX ; 8 cicli di clock (cioŠ almeno 12,5 microsec, CALL Delay ; con clock a 640 kHz) per garantire che il POP CX ; prossimo controllo sul segnale di INTR sia LOOP xxx2 ; attendibile POP AX RET ;***************************************************************************** ; ---------------------------------------------- GestADC proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ; --------------------------------------------- CALL DeskTop ; Organizza il piano di presentazione ; --------------------------------------------- ; Inizio del processo di conversione ; --------------------------------------------- xxx0: ; Gestisce la Conversione Digitale del segnale ; fornito sull'ingresso Analogico (la tensione ; presente sul cursore di un potenziometro). La ; prima fase prevede la formattazione del segna- CALL Converti ; le di START, con la generazione di un breve ; impulso sulle linee CS e WR del Convertitore ; ADC0804. La procedura rimane poi in attesa ; della fine della conversione, evento segnalato ; dal passaggio a "0" della linea INTR ; La fase di conversione Š terminata; si procede ; alla fase di Lettura attivando (a"0") di nuovo ; le linee CS e RD del Convertitore ADC0804; CALL Leggi ; dopo circa 135ns il dato Š disponibile sulle 8 ; linee d'uscita e pu• essere assunto con il MPX ; 74LS157. Al termine i segnali RD e CS sono ; riportati a "1", per predisporre le successive ; conversioni... ; --------------------------------------------- ; Fase di visualizzazione dei risultati ; --------------------------------------------- M_CURSOR 13,49 ; Provvede alla stampa a video del byte appena CALL Byt2Asc ; pacchetto HW/SW che si occupa di questa acqui- MOV AH,01H ; sizione di DATI; la presenza dell'INT 16H ga- INT 16H ; rantisce la possibilit… di tornare al DOS con JZ xxx0 ; la pressione di un tasto qualunque, senza in- ; terrompere il "polling" della porta d'ingresso _OUT: PUSH AX ; Torna al DOS con la memoria liberata e con la RAMrepC 80," ", 0,0,0FH; chiusura di tutti i file; cede il controllo RAMrepC 80," ",24,0,0FH; al processo padre (generalmente COMMAND.COM); CALL RIP_cur ; il valore posto eventualmente in AL prima di MOV DH,23 ; uscire pu• essere testato in uscita con la MOV DL,0 ; funzione 4DH o mediante la lettura della CALL SET_cur ; variabile DOS "ERRORLEVEL" POP AX MOV AH,4CH INT 21H GestADC ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare