Ú-4  Styk mikropočítača s prostredím

 
 µ Paralelné rozhranie
  q Zbernica počítača
  q Adresovanie I/O zariadení
  q Paralelné rozhranie s obvodom PPI 8255A
  q Inicializácia PPI a ovládanie portov
  q Ovládanie jednotlivých bitov portu PC
    q Príklady na ovládanie portov v móde 0
    q Príklady na ovládanie jednotlivých bitov PC
  q D/A a A/D prevodníky
  q Paralelné rozhranie pre tlačiareň
    q Obsluha tlačiarne na úrovni BIOS
    q Obsluha tlačiarne na úrovni DOS
    q Ovládanie tlačiarne na hardwareovej úrovni


µ 
Zbernica počítača

Zbernica počítača predstavuje sústavu vodičov pomocou, ktrorých je procesor spojený s pamäťou a vstupno / výstupnými obvodmi. V pojme zbernica je zahrnutý aj spôsob komunikácie (protocol). Zbernica býva vyvedená na konektor, pomocou ktorého je možné k nej pripájať adaptérové karty ďalšich zariadení. Podľa funkcie sa zbernica počítača delí na dátovú zbernicu DB ( Data Bus ), adresovú zbernicu AB  (Address Bus ) a riadiacu zbernicu CB (Control Bus).

V počítači PC XT bolo navrhnuté firmamy IBM a Microsoft (MS) určité lokalizovanie signálov na 62 kontaktnom konektore pre 8 bit dátovú zbernicu, 20 bit adresovú zbernicu a signály riadiacej zbernice. Procesor 8088 bol pripojený k oscilátoru s frekvenciou OSC = 14,32 MHz ( T= 70 ns ), ktorá sa delila tromi tak, že procesor 8088 už pracoval s pracovnými cyklami procesora T = 210 ns (f =  4,47MHz ). Pritom vykonanie jednej inštrukcie procesora (M - strojový cyklus) trvalo 1 až 4 takty T, ktoré v prípade potreby mohlo byť predĺžené vložením čakacích cyklov Tw. Vstupno/výstupné zariadenia však používali predĺžený pracovný takt o T - takže typické trvanie vykonania jednej inštrukcie so 4 taktami, ktorá spolupracovala s pamäťou bolo Mmem=4*210ns=840ns a trvanie inštrukcie podporujúcej I/O bolo Mio=(4+1)*210ns=1,05us - o jeden takt T dlhšie.

Zbernica počítača PC AT so 16 bitovou dátovou zbernicou sa stala základom pre štandard ISA(Industry Standard Architecture). Kompatibilita so zbernicou PC XT bola zaručená pridaním ďalšieho 32 kontaktového konektora k pôvodnému 62 kontaktovému, takže celkom 98 kontaktov je k dispozícii pre adaptory so 16 bit dátovou zbernicou. Niektoré signály sú prítomné zduplovane na oboch konektoroch, aby bola zachovaná kompatibilita používania pre adaptory s 8 bit a 16 bit dátovou zbernicou. Aby bolo zachované obdobné časovanie I/O zariadení ako u PC XT pri používaní vyššej taktovacej frekvencie CLK vkladajú sa pri vykonávaní I/O inštrukcii dodatočné čakacie cykly Tc.
 

Neskôr, nakoľko IBM začala používať v počítačoch PS/2 zbernicu MCA (Microchannel architecture), nekompatibilnú so zbernicou ISA a viazanú na licencnčné poplatky pri používaní, dohodli sa ostatní výrobcovia počítačov na rozšírení konektora zbernice ISA o 59 kontaktov, teda celkom na 157 kontaktov a zaviedli štandard zbernice EISA (Extended ISA), ktorý je vďaka vhodnému uspôsobenie kontaktov konektora kompatibilný s zbernicou ISA a je vhodný pre 32 bitovú architektúru počítačov.
 

Pre zrýchlenie komunikácie medzi procesorom, pamäťou a videoadaptérmi sa architektúra počítača rozširuje často ešte o lokálnu zbernicu, ktorá môže plne využívať rýchlosť hodin procesora bez ohľadu na rýchlosť ostatných periférnych zariadení pripojovaných cez normálnu zbernicu. Lokálna zbernica (PCI - Peripheral Component Interconection) je nezávislá od procesora, len jej synchronicácia je odvodená od procesora, všetky potrebné signály sú na 1 konektore. Od procesorovej zbernice je oddelená špecialnymi obvodmi -"bridges" (mosty). Výhodou je pomerne vysoká taktovacia frekvencia. PCI priniesla so sebou novinku umožňujúcu automatické konfigurovanie rozširujúcich dosiek - normu PnP (Plug and Play). Budúcnosť má pripojenie grafického subsystému AGP (Accelerated Graphics Port) - grafický akcelerátor, ktorý zobrazenie realizuje samostatne len na základe požiadoviek od procesora.












µ 
Adresovanie I/O zariadení

Na adresovanie vstupno / výstupných (I/O) zariadení v počítačoch IBM PC sa používa rovnaká adresová zbernica ako pre adresovanie pamätí. Pamäťový priestor sa odlišuje pomocou rôznych riadiacich signálov. V prípade prístupu :

  • k pamätiampomocou signálov MEMR a MEMW;
  • k I/O zariadeniam pomocou signálov IOR a IOW.
Na adresovanie sa používa 16 bit adresa zariadenia alebo presnejšie portu (brány), ktorá tvorí kanál cez ktorý zariadenie komunikuje . V zmysle takejto definície procesor komunikuje s vonkajšim prostredím cez paralený alebo sériový port a pod. Konštruktéri IBM PC vyhradili adresy prvých 512 portov štandardným zariadeniam, nachádzajúcim sa na základnej doske, napríklad adresu 20H až 3FH a A0H až BFH pre kontroléry prerušení , adresu 40H až 5FH pre timer, adresu 60H až 6FH pre adaptér klávesnice a pod. Adresy ďalšich 512 zariadení (adresy s 9bit=1) sú vyhradené pre ďalšie I/O adaptéry, alokované na zásuvných kartách, napríklad adresy 278H až 27FH a 378H až 37FH pre tlačiarne LPT2 a LPT1, adresy 2F8H až 2FFH a 3F8H až 3FFH ako adresy pre sériové komunikačné kanály COM2 a COM1 a pod. Ako porty obyčajne neslúžia jednoučelovo naprogramované vstupy alebo výstupy, ale sa používajú programovateľné obvody s možnosťou naprogramovania smeru prenosu dát, resp. aj rôznych iných funkcii obvodu. Napríklad v obvode programovateľného paralelného interfejsu PPI sa pomocou uloženia vhodného kódu do jeho riadiaceho registra dá naprogramovať činnosť 3 portov, tvoriacich súčasť programovateľného obvodu. Pri použití takýchto programovateľných obvodov potom 2 najmenej významné bity adresy A0 a A1 odlišujú adresy jednotlivých portov, v spoluprácii s dekódovanou časťou adresy z ostatných adresných bitov (A2 - A9, resp. A2 - A15) a signála AEN (odlišuje či adresu generuje procesor alebo kanál DMA ). Napríklad niektoré štandardné I/O adresy v PC XT:
 
Adresa I/O
0 H - 0FH KontrolérDMA
20H - 21H KontrolérINT
40 H - 43H Timer
60H - 63H  PPI na základnej doske*
378H - 37FH LPT1
3F8H - 3FFH COM1
*/ používa sa okrem iného aj na obsluhu klávesnice.
 
 Obr.4-1. Prehľad využitia bitov zbernice AB pri adresovaní vstupov a výstupov.

Pre pripojenie uživateľských zariadení nie je jednoznačne určená oblasť adries, hoci formálne býva uvádzaná adresa 300H. Môže sa použiť ľubovoľná z adries vyššich ako 3FFH , ktorá väčšinou nie je obsadená štandardným vstupno / výstupným zariadením.


µ  Programovateľný obvod paralelného rozhrania PPI 8255A

Jedným z najčastejšie používaných obvodov na realizovanie paralelného rozhrania je univerzálny programovateľný obvod PPI (Programmable Peripheral Interface) typ 8255A, cez ktorého porty (brány) možno realizovať prenos 8 bitových dát paralelným spôsobom (t.j. naraz). Na rozdiel od pamäťových obvodov prenos dát na zbernicu z prostredia a opačne riadia synchronizačné impulzy z riadiacej zbernice IOR a IOW (obr. 4-2).
 
Obr. 4-2 a. Princip obvodu 8255A.

 
Obr. 4-2b. Realizácia dvojportového paralelného rozhrania pomocou obvodov 8255A. Vďaka obvodovej realizácii v dolnej časti obrázku sa súčastne generujú signály ODDPORTSEL a EVENPORTSEL na adresovanie obvodov.

Obvod PPI - 8255A obsahuje v sebe 3 porty - PA, PB a PC (so záchytnými registrami), z ktorých port PC možno ešte rozdeliť na dva nezávislé 4 bitové porty. Funkcia portov sa programuje uložením inicializačného slova CW do riadiaceho registra CWR obvodu 8255A. Týmto spôsobom možno definovať smer dát (vstup/výstup) a režim činnosti - mód.


q Inicializácia PPI a ovládanie portov

Vhodnému kódu , potrebnému na inicializáciu sa hovorí inicializačné slovo, hoci v skutočnosti ide o 8 bit slovo, teda bajt (byte). V móde 0 má formát.
 
 
Format riadiaceho slova pre inicializáciu 8255
D7 D6 D5 D4 D3 D2 D1 D0
1 MA1 MA0 A Ch MB B Cl

MA1,MA0 : Mód brány A (pre mód 0= 00b, pre mód 1= 01b, pre mód 2=10b).
MB : Mód brány B (pre mód 0= 00b, pre mód 1= 01b.
Stav ostatných bitov :

  • 1 pre vstupnú bránu;
  • 0 pre výstupnú bránu.
Bit D7=1


q Ovládanie jednotlivých bitov portu C v móde 0
 
 
Format riadiaceho slova pre ovládanie bitov PCí
D7 D5 D4 D3 D2 D1 D0
0 x x C C C bit 

bit : hodnota 1 / 0 na ktorú treba bit nastaviť.
ccc : binárny tvar čísla bitu PC (= 000b až 111b).
xxx : ľubovoľná hodnota.
Bit D7=0, čím sa odlišuje od stavového slova pre inicializáciu.


µ  Príklady na ovládanie portov PPI v móde 0

 
 Obr. 4-3. Demonštračný prípravok zapojený k prvému PPI obvodu.

Portsk1.asm - Vstup a výstup dát cez porty

Testovacia procedúra, ktorá po inicializácii obvodu 8255 (PA-in, PB, PC-out) postupne v sľučke číta stav tlačítiek na porte PA a prečítaný kód z PA zasiela na LED indikáciu pripojenú k portu PB. Koniec testovania nastane ak prečíta z portu PA=0 t.j. ak všetky tlačítka na vstupe portu PA budú stlačene. Porty sú programované pomocou mnemonického čísla portu (napr.cwr).
 
 
  title Port_sk.asm - Skúška portu A a B
  .MODEL small
  .STACK 100h
  .DATA
  Sprava     DB     "Ahoj",13,10,"$"
  .CODE
  cwr     equ     703h                               ; Týmto určeny CWR0
  cw      equ     90h                                 ;všetky out, PA in
  ;----------------------------------------------------------------------------------------
  mov dx, cwr                                          ;Riadiaci register
  mov al, cw                                            ;Riadiace slovo
  out dx, al
  dec dx
  dec dx
  dec dx                                                   ;nastavenie PA 
  call prog
  mov ax,@data                                       ;Nastav DS
  mov ds, ax
  mov ah, 9                                              ;DOS výstup reťazca s $
  mov dx, OFFSET Sprava                        ;Nastavit relat adresu
  int 21h
  mov ah, 4ch
  int 21h
prog: in al,dx                                                    ;číta PA a výstup na PB
  inc dx                                                     ;nastavenie PB
  out dx, al 
  dec dx                                                   ;nastavenie PA
  or al, al
  jnz prog
  ret 
  END

Demo1.com

Obdobná testovacia procedúra ako Port1.asm, ktorá ale v sľučke neustále číta stav tlačítiek na porte PA a prečítaný kód z PA zasiela na LED indikáciu pripojenú k portu PB. Koniec testovania nastane po stlačení ESC na klávesnici. Program bol vytvorený a zapísany pomocou Debuggera , preto nemá priamo prístupný výpis a má koncovku - com.

Demo2.com

Obdobná testovacia procedúra ako Port1.asm, ktorá v sľučke neustále číta stav tlačítiek na porte PA a prečítaný kód z PA zasiela na LED indikáciu, pripojenú k portu PB. Od Portsk1.asm sa líši len spôsobom generovania oneskorenia pre LED spôsobom ukončenia testovacej sľučky. Program bol vytvorený a zapísany pomocou Debuggera, preto nemá priamo prístupný výpis a má koncovku .com.

Portsk1c.asm

Obdobná testovacia procedúra ako Portsk1.asm, ktorá ale po inicializácii obvodu 8255 (PA-in, PB, PC-out) postupne v sľučke číta stav tlačítiek na porte PA a prečítaného stav z PA zasiela na LED indikáciu pripojenú k portu PC. Koniec testovania nastane ak prečíta z portu PA=0 t.j. ak všetky tlačítka na vstupe portu PA budú stlačene.

Portsk.asm - test výstupu z portov

Testovacia procedúra, ktorá po inicializácii obvodu 8255 (PA, PB, PC-out, s indikáciou LED ) postupne inkrementuje obsah AL od 1 po FFH a postupne tento (AL) s oneskorením ~ 0,1s zasiela na najprv na výstup portu PC, potom na výstup portu PB a nakoniec na výstup portu PA. Porty sú natvrdo programované pomocou čísla portu (napr.700H).

Title Skuska portov v byvalom PMD85 rozsirovaci
   
  .MODEL small  
  .STACK 100h  
  .DATA  
  Sprava DB "Ahoj",13,10,"$"  
  .CODE  
  mov dx,703h  ;pre PORT 0
  Mov al,80h  ;vsetky out
  call prog  
  mov ax,@data  ;Nastav DS
  mov ds,ax  
  mov ah,9  ;DOS vystup retazca s $
  mov dx,OFFSET Sprava  ;Nastavit relat adresu
  int 21h  
  mov ah,4ch  
  int 21h  
prog: out dx,al  
  dec dx  
  mov al,01h  
  call xxx  ;port c
  dec dx  
  mov al,01h  
  call xxx  ;port b 
  dec dx  
  mov al,01h  
  call xxx  
  Ret  
xxx: out dx,al  ;port a
  call delay  
  inc al  
  or al,al  
  jnz xxx  
  ret   
delay:     
  push bx  
  mov bx,0f500h  
 dly: dec bx  
  or bx,bx  
  jnz dly  
  pop bx  
  Ret  
  END  



 Obr.4-4. Periferie pripojené k druhému PPI obvodu.

Motor.asm  - ovládanie motora - start / stop

Demonštrácia výstupného zariadenia - motora, pripojeného k PA. Motor sa ovláda slovom 0X0YZZZZ B, v ktorom ZZZZ, reprezentované 4 Lsb určuje rýchlosť motora (maximálna rýchlosť 0FH), Y - smer otáčania a X - štart/stop. (Ak X=1 tak motor sa točí, ak X=0 tak zastane.).

Po inicializovaní portov (PA-in, PB out, PC- in =1001 1001b) pomocou riadiaceho slova cw= 8AH sa motor ovláda slovom 0X0YZZZZ B, v ktorom bit X ovláda start/stop a bit Y ovláda smer otáčania motora. Štvorica bitov ZZZZ určuje rýchlosť otáčok (maximálne 0Fh). Pre štart motora s maximálnou rýchlosťou vpred => X=1 , Y=1 (vpred) , rýchlost 0FH je potrebný kód 4FH a pre zastavenie motora napríklad kód 1FH.
 
  .MODEL small  
  .STACK 100h  
  .CODE   
  pa1 equ 704h   
  pb1 equ pa1+1   
  pc1 equ pb1+1  
  cwr1 equ pc1+1  
  cw1 equ 8ah  ; PA-in, PB out, PC- in 10011001b
  ;---------------------------------  
  mov dx, cwr1  
  mov al, cw1  ;inicializacia
  out dx, al  
  mov al, 4fh  ;start
  mov dx, pa1   
  out dx, al  
  call onesk  
  mov al, 1fh ;stop
  out dx, al  
  mov ah, 4ch  ;koniec
  int 21h  
onesk: mov cx,0  ;oneskorenie
sem: loop sem  
  Ret  
  END  

Motor.asm - ovládanie počtu otáčok motora

Procedúra, v ktorej sa kontrolujú otáčky motora pomocou otáčkomera s Hallovou sondou, ktorá je pripojená k bitu 7 PC. Po roztočení motora na maximálnu rýchlosť vykoná motor predvolený počet otáčok.

Motor je pripojeny k portu 2A a otáčkomer k bitu 2PC7 => riadiace slovo na definovanie portov CW2 10001010=8AH. tak, aby bol 2PA-out, 2PB- out, 2PCd-out, 2PCh- in Pre ovladanie motora treba slovo STM=0x0y ZZZZ. v ktorom ZZZZ (max 0FH určuje rýchlost, y - smer otačania a x=1-start, resp. x=0 - stop. Napríklad pre jeden smer otáčania 4FH/0FH.

Otáčkomer pripojený k bitu 2PC7 reaguje na zmenu logických úrovní H -L (1 - 0) tak, že neustále porovnáva práve odmeranú hodnotu 2PC7 s hodnotou zistenou pri predchádzajúcom meraní, ktorú má uloženú v registri BH, resp. počas testu aj prechodne v registri BL. Okamik skoku H-L sa určuje súčtom bitu 2PC7 (ktorý je 0 alebo 1) s invertovaným predchadzjucim stavom bitov brány 2PC teda stavom FFH, alebo 7FH Pri tom môžu nastať prípady:
 
  0 --> 0   00+FF=FF   CY = 0
  0 --> 1   00+7F=7F   CY = 0
  1 --> 1   80+7F=0   CY = 0
  1 --> 0   80+FF=7F   CY = 1

=> pri zmene amplitúdy H - L sa bude pri súčte generovať prenos CY=1 a tento indikuje okamih prechodu stavov H - L. Pretože na obvode kružku, ktorý otáča motor sa nachádzjú 2 snímače budúsa generovať 2 impulzy na otáčku motora.
 
  title   Kontrola otacok motora
  .MODEL small  
  .STACK 100h  
  .CODE   
    ;Motor je pripojeny k PA2 =CW2 =PA2-out, PB2- out, PC2d-out, PC2h-in =>
    ; CW2=1000 1010=8AH. Pre ovladanie
    ;motora STM=0x0y ZZZZ. ZZZZ max 0F urcuje rychlost, y-smer otacania a x=1-start,  x=0- stop. Napr.4FH/0FH. 
   
    ;PC7 otackomer mera H -L= 2 imp na otacku motora. CL - pocitadlo impulzov 
    ;n = n/2 pocet otacok
    ;BH - uschova predchadz. stavu otackomera PC7=00H ,80H
    ;BL - buffer PC7 pretoze sa okamik skoku H-L urcuje zlozenim PC7=0 alebo 1
    ; s invertovanym predchadzjucim
    ;stavom FFH, alebo 7FH =>
    ; zmena ampl: sucet prenos CY 
    ; 0 -> 0            00+FF=FF    0
    ; 0 -> 1            00+7F=7F    0 
    ; 1 -> 1            80+7F=0      0
    ; 1 -> 0            80+FF=7F    1
    ;Stav pocitadla CL sa indikuje na LED
    ;------------------------------------------------------
  pa1 equ 700h   
  pb1 equ pa1+1   
  pc1 equ pb1+1  
  cwr1 equ pc1+1  
  cw1 equ 99h  ;pa-in, pb out, pc- in 1001 1001b
  pa2 equ 704h   
  pb2 equ pa2+1   
  pc2 equ pb2+1  
  cwr2 equ pc2+1  
  cw2 equ 8ah  ;pa-o,pb-o,pcd-o,pch-i 1000 1010b
  poc_otac equ 6    ; 6/2=>3 otacky
    ;---------------------------------------------------
  mov dx,cwr1  
  mov al,cw1  ;inicializacia 1
  out dx,al   
     
  mov dx,cwr2  
  mov al,cw2  ;inicializacia 2
  out dx,al  
     
  mov bh,0  ;usch predchadz otacok
start: mov dx,pa2   
  mov al,4fh  ;start motora 
  out dx,al ;na motor
  mov cl,poc_otac   
otack: mov dx,pc2  
  in al,dx ;stav otacok PC7
  and al,80h  ;maska PC7 
  mov bl,al  ;uschova PC7
  not al  ;invert al
  add al,bh  
  mov bh,bl  ;obnova
  jnc otack  
  dec cl  ;-1 otacka
  mov al,cl  
  mov dx,pb1 ;indikacia na LED
  out dx,al  
  jnz otack  
  mov dx,pa2  
  mov al,0fh ;stop motora
  out dx,al  
    ;-------------
  mov ah,4ch  ;koniec
  int 21h  
     
  END  

Motor1a.asm - kontrola otáčok motora pomocou otáčkomera s Hallovou sondou

Zdokonalená obdoba Motor1.asm, v ktorej sa po roztočení motora najprv nastaví vhodná rýchlosť otáčania motora pomocou tlačítiek na porte A. (Testovaná rýchlosť sa zmení až po stlačení ľubovoľného klávesu a po stlačení ESC sa ukončí nastavovanie otáčok.). Potom sa motor otáča až do stlačenia spínača na bite 0 portu C. Od okamihu uvoľnenia spínača sa motor ešte otočí predvolený počet otáčok a zastaví sa.

Na začiatku programu sa po inicializácii portov nastavi rychlosť motora pomocou slova STM, ktoré možno zadať ako data pomocou tlačítiek cez port 1PA , zobraziť ho pre kontrólu na porte 1PB na LED a vďaka slučke v programe aj okamžite kontrolovať zmenu rýchlosti otáčania. Ak sa potvrdí stlačením klávesu ESC klávesnice PC , že sú už nastavené vhodné otáčky tak program si uschová parametre otáčania a po stlačení tlačítka 2PC0 zastaví motor. Ďalej program čaká na na pustenie tlačítka 2PC0 , po ktorom sa spustí motor a začnú rátať otáčky, počet ktorých je uložený v registri CX. Po odtočení zvoleného počtu otáč motora sa motor zastaví a program sa skončí. Program používa nasledovné registre:
 
 CL  - počítadlo impulzov n => n/2 počet otáčok
 BH  - úschova predošlého stavu bituPC7 => 00H, 80H
 BL  - buffer PC7 počas testu

 
  .MODEL small  
  .STACK 100h  
  .CODE   
  pa1 equ 700h   
  pb1 equ pa1+1   
  pc1 equ pb1+1  
  cwr1 equ pc1+1  
  cw1 equ 99h  ; pa-in, pb out, pc- in 1001 1001b
  pa2 equ 704h   
  pb2 equ pa2+1   
  pc2 equ pb2+1  
  cwr2 equ pc2+1  
  cw2 equ 8ah  ; pa-o,pb-o,pcd-o,pch-i 1000 1010b
  poc_otac equ 6  ; 6/2=3 otacky 
    ;---------------------------------------------
  mov dx, cwr1  
  mov al, cw1  ;inicializacia 1portov- LED a tlačítka
  out dx, al   
  mov dx, cwr2  
  mov al, cw2  ;inicializacia 2portov = motor
  out dx, al ;-------------------------------------------
  mov bh ,0  ;usch predchadz otacok
start: mov dx, pa1   
  in al, dx  ;vstup vhodného STM z tlačítiek
  mov dx, pb1  
  out dx, al  ;na LED
  mov dx, pa2   
  out dx, al  ;na motor
  mov bh, al  ;uschova otacok
  mov ah, 0  ;caka na klaves
  int 16h  
  cmp al, 1bh  
  jnz start  ;ak ESC tak dalej
    ;motor sa otáča s vhodnou rýchlosťou--
  mov dx, PC1  
zac: in al, dx  ;caka na stlac PC0=0 => stop motor
  test al, 01  
  jnz zac  
  mov cx, 0ffh  ;onesk na ustalenie
tu: LOOP TU   
  mov dx, PA2  ;stop motora
  mov al, bh  ;z úschovy
  and al, 0BFh  ;bit PA6=0
  out dx, al  
  mov cx,0FFH  ;oneskorenie na ustalenie kontaktov
Tm: loop Tm  
    ;------motor stojí------------------------
  mov dx, PC1  ;caka na pustenie PC=1
kon: in al, dx  
  test al, 01H  
  jz kon  
  mov dx, PA2  ;znova start motora
  mov al, bh  ;s predtým zvolenou rýchlosťou
  out dx, al  
  mov cx, poc_otac ;------ meranie otáčok ---------------
otack: mov dx, pc2  
  in al, dx  ;stav otacok PC7
  and al, 80h  ;maska PC7 
  mov bl, al  ;uschova PC7
  not al  ;invert al
  add al, bh  
  mov bh, bl  ;obnova
  jnc otack  
  dec cx  ;-1 otacka
  jnz otack   
  mov dx, pa2  ;----- zastavenie motora ---------------
  mov al, 0fh  ;stop motora
  out dx, al  
  mov ah, 4ch  ;koniec
  int 21h  
  END  


µ Príklady na ovládanie jednotlivých bitov portu PC v móde 0

Zvuk.asm

Generovanie tónu pomocou individuálnho ovládania bitu 1 portu PC s oneskorením, ktoré určuje frekvenciu tónu.
Port je zadefinovaný slovom CW2 = 1000 1010 = 8AH. ( 2PA - out, 2PB-out, 2PCd-out, 2PCh- in. Reproduktor je pripojený k 2PC0, takže treba generovať na výstupe 2PC0 obdlžnikové impulzy o trvaní (BX) a frekvencii (CX). Pretože 2PCh je definovany ako vstupný, aby nedochádzalo ku kolízii medxi časťou portu 2PCh a 2PCd je vhodne použiť na ovládanie reproduktora spôsob umožňujúci ovládať zvlášť jednotlive bity pomocou stavoveho slova STWT, (tvaru 0000 NNNS, kde NNN - číslo výstupného bitu, ktorý sa ovláda a S - nastavený stav, napríklad S=1 alebo S=0), ktoré sa zapíše do riadiaceho registra CWR. Napríklad:
 
 
  slovo STWT=0000 0001 =01H nastavi 2PC0=1 a
  slovo STWT=0000 0000 =00H nastavi 2PC0=0.

Použitie registrov v programe:
 
   BL -  trvanie tónu
   CX -  frekvencia tónu

 
  Zvuk.asm  
  .MODEL small  
  .STACK 100h  
  .CODE   
    ;----------------------------------------------
  pa1 equ 700h   
  pb1 equ pa1+1  ;tlačítka ˇLED
  pc1 equ pb1+1  
  cwr1 equ pc1+1  
  cw1 equ 99h  ; pa-in, pb out, pc- in 1001 1001b
  pa2 equ 704h   
  pb2 equ pa2+1  ;Kufor
  pc2 equ pb2+1  
  cwr2 equ pc2+1  
  cw2 equ 8ah ; pa-o,pb-o,pcd-o,pch-i 1000 1010b
  TRV equ 0500H  ;trvanie tonu
  FRQ equ 132H  ;frekvencia 
     
 proc 
zvuk far  
  push DS  
  mov AX, 0  
  push AX  ;návrat adresa pre ret
  mov dx, cwr1  
  mov al, cw1  ;inicializacia 1 portov =>LED a tlačít
  out dx, al  
  mov dx, cwr2  
  mov al, cw2  ;inicializacia 2 portov = >reproduktora
  out dx, al  
  mov bx, trv  ;trvanie tonu
ton: mov dx, CWR2  
  mov al, 1  ; frekvencia na reproduktor
  out dx, al  ; f = 1/ ( ti + tm ) => PC0=1 pre tI
  mov cx, frq   
onesk1: loop onesk1  
  xor al, al  
  out dx, al  ;PC0=0 pre tm
  mov cx, frq  
onesk2: loop onesk2  
  dec bx  ;test konca trvania tónu
  jnz ton  
  Ret  
  zvuk endp  
  END  

Zvuks.asm

Generovanie tónu na reproduktore, pripojeného k bitu 0 portu C pomocou obdlžnikových impulzov. Procedúra používa 2 parametre:

  • trvanie tónu TRV (BX) a
  • frekvenciu tónu FRQ (CX).
Procedúra má slúžiť ako subrutina (deklaracia portu v inom programe, na konci návrat pomocou ret)
 
 
  title  Generovanie tonu pomocou oneskorenia ako sbr
  .MODEL small  
  .STACK 100h  
  .CODE   
    ;Port je zadefinovany v hlavnom programe.
    ;Reproduktor je pripojeny k PC0, takze treba generovat na vystupe PC0 obdlznikove impulzy
    ; o trvani (BX) a frekvencii (CX).
    ;
    ; Pouzitie registrov v programe:
    ;BL - trvaniu tonu
    ;CX - frekvencia tonu
    ;---------------------------------------------------
  TRV equ 0a00H ;trvanie tonu
  FRQ equ 0ccH  ;frekvencia 
    ;---------------------------------------------------
  public zvuks  ;chcem pouzit v prg.
 proc
 zvuks far  
  mov bx,trv  ;trvanie tonu
 ton: mov al,1  ;PC0=1 
  out dx,al  ;na reproduktor
  mov cx,frq  ;frekvencia
onesk1:    
  loop onesk1  
  xor al,al  
  out dx,al  ;PC0=0
  mov cx,frq  
onesk2: loop onesk2  
  dec bx  
  jnz ton  
  Ret  
 zvuks
 endp  
  END  

Zvuks1.asm

Obdoba procedúry Zvuks.asm. Na rozdiel od nej však vo vnútri procedúry používa len parameter FRQ. Trvanie tónu musí byť preto určené v inom programe. Subrutina Zvuks1.asm je určená k programu Tepl1.asm.

Port je zadefinovaný v hlavnom programe. Reproduktor je pripojeny k 2PC0, takže treba generovaľ na výstupe 2PC0 obdlžnikové impulzy o trvaní, ktoré je zadané v hlavnom programe ako parameter TRV a v priebehu subrutiny  je parameter TRV uložený v (BX) a frekvencia FRQ je uložená  v (CX).
 
  Použitie registrov v programe:
  BX - trvaniu tónu
  CX - frekvencia tónu

 
  title  Subrutina generovanie tónu .
Parameter TRV je zadaný do BX v hlavnom programe
  .MODEL small  
  .STACK 100h  
  .CODE   
  FRQ equ 0ccH  ;frekvencia 
  ;---------------------------------------------------
  public zvuks  ;chcem použit v hlavnom programe.
  extrn trv  
 proc 
 zvuks far  ;dx=CWR2 z hlavneho prg 
 ton: mov al, 1  ;PC0=1 
  out dx, al  ;na reproduktor
  mov cx, frq  ;frekvencia
onesk1: loop onesk1  
  xor al, al  
  out dx, al  ;PC0=0
  mov cx, frq  
onesk2: loop onesk2  
  dec bx  
  jnz ton  
  Ret  
 zvuks
 endp  
  END  

Tepl.asm

Meranie teploty pomocou termorezistora, ktorý je zapojený ako súčasť časovej konštanty v obvode s monovibratororm, takže vplyvom teploty sa mení trvanie generovaných impulzov. V procedúre sa najprv nainicialuzuje PPI podľa potreby hardware (PA-out, PB- in, PCd-out, PC2h- in). Trvanie impuzu z monovibratora sa meria na vstupe bitu 0 portu PB. Kód úmerný odporu termorezistora (so stúpajúcou teplotou sa jeho odpor zmenšuje) sa indikuje pomocou LED.
 
title  Meranie teploty pomocou termistora s monovibratororm
.MODEL small 
.STACK 100h 
.CODE 

 
 ;Port je zadefinovany slovom CW2 =PA2-out, PB2- in, PC2d-out, PC2h- in 
 ;=> CW2=1000 1010=8AH.
 ;Termorezistor je zapojeny v obvode monovibratora, takze trvanie impulzu na jeho
 ;vystupe zavisi od hodnoty termorezistora
 ;Monovibrator sa spusti skokom H-L
 ;generovanym do PC1. A trvanie jeho impuzu sa meria na vstupe PB0. (Pretoze medzi PB
 ; a vystupom je este zapojeny oddelovaci 
 ;clen, treba pomocou PC3=0 zadefinovat 
 ;smer jeho priepustnosti t.j. pre vstupny
 ;port PB. Po inicializacii su vsetky PCi=0.)
 ; Pretoze PCh je definovany ako in
 ;je vhodne pouzit na ovladanie zvlast jednotlive bity pomocou stavoveho slova, ktore sa
 ;zapise do CWR: 0000 NNNS, kde
 ; NNN - cislo vystupneho bitu , ktory sa ovlada
 ;a S - nastaveny stav, napr. S=1 alebo S=0. 
 ;Napr.  slovo STWT=0000 0011 =03H nastavi PC1=1 a slovo STWT=0000 0010 =02H
 ; nastavi PC1=0.
 ; Pouzitie registrov v programe:
 ;BL - pocitadlo impulzov umerne trvaniu impulzu
 ;CX - pouziva na generovanie intervalov merania DLY
 ;BH - pouziva na ohranicenie priebehu merania
 ;Stav pocitadla BL sa indikuje na LED
 ;Odpor termoreziistora cca 4kW sa so stupajucou teplotou  zmensuje.
 ;V danom programe (BL) od 9EH(lad) -> 43H -> 07H (plamen)

 
 


    ;-----------------------------
  pa1 equ 700h   
  pb1 equ pa1+1   
  pc1 equ pb1+1  
  cwr1 equ pc1+1  
  cw1 equ 99h  ;pa-in, pb out, pc- in 1001 1001b
  pa2 equ 704h   
  pb2 equ pa2+1   
  pc2 equ pb2+1  
  Cwr2 equ pc2+1  
  cw2 equ 8ah  ;pa-o,pb-o,pcd-o,pch-i 1000 1010b
  STWT equ 03H  ;slovo na start PC1=1 
  STWi equ 08h  ;slovo pre PC3=0
    ;----------------------------------
  Mov dx,cwr1  
  Mov al,cw1  ;inicializacia 1
  out dx,al   
  mov dx,cwr2  
  mov al,cw2  ;inicializacia 2
  out dx,al  
  Mov al,STWi  ;PC3=1
  Out dx,al  
  Mov bh,5  ;pocet merani
 start: mov bl,0  ;clear pocitadlo 
  mov dx,CWR2  ;start monovibratora
  mov al,STWT  ;PC=1 
  out dx,al  ;na monovibrator
  Dec al  
  Out dx,al  ;PC=0
citaj: inc bl  ;meria trvanie impulzu
  mov dx,PB2  
  in al,dx  ;stav  PB0
  Rcr al,1  ;PB0 do CY 
  jc citaj  
  Mov al,bl  
  Mov dx,pb1  ;indikacia na LED
  out dx,al  
  Mov al,10h  
dly: mov cx,0  ;oneskorenie DLY
tu: loop tu  
  Dec al  
  Jnz dly  
  Dec bh  ;dalsie meranie ?
  jnz start  
    ;------------- 
  mov ah,4ch  ;koniec
  int 21h  
  END  









Tepl1.asm

Zdokonalená obdoba procedúry Tepl.asm so zvukovou indikáciou -’ beep’ (zvuks1.asm) pri každom odmeraní teploty.

Port pre ovládanie teplomera (s ohľadom na dalšie pripojené zariadenia vyžaduje, aby bol PA2-out, PB2- out, PC2d-out, PC2h- in ) je zadefinovaný slovom CW2 = 10001010=8AH. Na meranie teploty sa používa termorezisor , ktorého odpor sa pri zvyšovaní teploty zmenšuje Termorezistor je zapojený v obvode monovibrátora, takže trvanie impulzu na jeho výstupe závisi od hodnoty jeho odporu. Monovibrátor sa spustí skokom H-L generovanym do 2PC1. Trvanie impulzu z monovibrátora sa meria na vstupe 2PB0, je však hradlované signálom AKTIV z výstupu PC3 Ak je 2PC3 = L je hradlo otvorené a možno uskutočniť meranie dlžky trvania impulzu (na 2PB0 ) z monovibrátora. Pretoze PCh je definovany ako vstupný, aby nedošlo ku kolízii s hornou časťou brány PCh ovládajú sa zvlášť jednotlive bity 2PC pomocou stavoveho slova v tvare 0000 NNNS, ktore sa zapise do 2CWR
 
 kde: NNN - číslo výstupného bitu , ktorý sa ovláda a
  S - nastavený stav, napríklad S=1 alebo S=0. 

Napríklad slovo STWT=0000 0011b =03H nastavi PC1=1 a slovo STWT = 02H = 00000010b nastaví PC1=0. Použitie registrov v programe:
 
  BL - počítadlo impulzov, ktorého obsah je úmerný trvaniu impulzu
  CX - používa na generovanie intervalov merania DLY
  BH - používa na ohraničenie priebehu merania

Stav počítadla BL sa indikuje na LED, pripojených na port 1PB. Odpor termorezistora pri izbovej teplote cca 4kW sa so stúpajúcou teplotou zmenšuje. V danom programe pri teplote ľadu je [(BL) = 9EH), pri izbovej teplote (BL) = 43H a pri teplote plameňa je (BL) = 07H. Každé odmeranie sa signalizuje “Beep”. Hlavný program - tep.obj a subrotinu zvuks.obj treba- spolu zlinkovať pomocou tlink/x tepl1.obj+zvuks1.obj.
 
 
  .MODEL small  
  .STACK 100h  
  .CODE   
    ;---------------------------------------------------
  pa1 equ 700h  ;tlačítka a LED indikácia
  pb1 equ pa1+1   
  pc1 equ pb1+1  
  cwr1 equ pc1+1  
  cw1 equ 99h  ; pa-in, pb out, pc- in 10011001b
  pa2 equ 704h  ;kufor
  pb2 equ pa2+1   
  pc2 equ pb2+1  
  cwr2 equ pc2+1  
  cw2 equ 8ah  ; pa-o,pb-o,pcd-o,pch-i 1000 1010b
  STWT equ 03H  ;slovo na start PC1=1 
    ;---------------------------------------------------
  POCMER equ 5  ;pocet opakovani merania
  TRV equ 080h  ;trvanie beep
  public trv 
extrn zvuks:far 
;parameter definovaný v subrutine
;externá far:procedúra
    ;----------------------------------------------------
  mov dx, cwr1  
  mov al, cw1  ;inicializacia 1= tlačítka ˇLED
  out dx, al  
  mov dx, cwr2  
  mov al, cw2  ;inicializacia 2 = kufor
  out dx, al  
  mov al, 08h  ;nast PC3=0 = AKTIV pre PB in
  out dx, al  
  mov bh, pocmer  ;pocet merani
  start: mov bl,0  ;clear pocitadlo 
  mov dx, CWR2  ;monovibrator
  mov al, STWT  ;PC1 =1 
  out dx,al   
  dec al  
  out dx, al  ;PC1=0 = H-L štart merania teploty
citaj: inc bl   
  mov dx, PB2  
  in al, dx  ;stav monovibrátor PB0
  rcr al, 1 ;PB0 do CY   
  jc citaj  
  mov al, bl  
  mov dx, pb1  ;indikacia teploty na LED
  out dx, al  
  push dx  
  mov dx, CWR2  
  push cx  
  push bx  
  mov bx, trv  
  push ax  
  call zvuks ;zvuk signalizacia
  pop ax  
  pop bx  
  pop cx  
  pop dx  
  mov al, 10h  
dly: mov cx, 0  ;oneskorenie DLY
  tu: loop tu  
  dec al  
  jnz dly  
  dec bh  ;dalsie meranie ?
  jnz start  
  mov ah, 4ch ; koniec => do DOS
  int 21h  
  END  


µ  Ovládanie D/A a A/D prevodníkov

Funkcia prevodníkov A/D a D/A sa dá vhodme demonštrovať pri meraní jednosmerného napätia. Jednosmerné napätie Uin (pre dané demonštráčné aplikácie v rozsahu 0-5 V), ktoré je treba odmerať sa privádza na vstup komparátora - ADCin. Na druhý vstup tohto komparátora je pripojený výstup z D/A prevodníka s refernčným napätím UDAC . Možno teda programovo (v danom prípade pomocou ovládania portu 1PB) nájsť referenčné napätie - UDAC, ktoré bude s presnosťou niekoľkych mV (rozdiel napätí medzi vstupmi komparátora) rovné vstupnému napätiu na svorke ADCin. Tento stav zaregistruje komparátor tak, že na jeho výstupe COMPout (v danom prípade na bite 1PC5) sa zmení napätie z úrovne H na úroveň L. Po zaregistrovaní tejto zmeny udáva číselný kód (z portu PB, ktorý ovláda D/A prevodník a ktorý sa zobrazuje na LED) hodnotu zaregistrovaného napätia, vyjadrenú v krokoch N prevodníka D/A, resp. meraná hodnota sa nachádza medzi N a N - 1 krokmi. Podľa spôsobu menenia referenčného napätia sa používajú predovšetkým 2 spôsoby (obr. 4-5) a to:
 

  • s lineárne narastajúcim referenčným napätím;
  • s postupnou aproximáciou hľadanej úrovne referenčného napätia.

Obr. 4-5. Princip A/D a D/A prevodu: 
  • s lineárne narastajúcim referenčným napätím
  • s postupnou aproximáciou hľadanej úrovne referenčného napätia. 

  •  
     
    Obr. 4-6
     Obr.4-6. Zapojenie meraného prevodníka A/D. (Na rozdiel od obrázku v prípravku je výstup komparátora COMPout namiesto k PC0 pripojený k bitu 1PC5 a prevodník DAC sa ovláda cez port PB a nie port PA.).









    Dac1.asm - demonštrácia prevodu A/D pomocou lineárne narastajúceho referenčného napätia z DAC

    DAC je pripojený k portu 1PB, ktorý má súčastne aj indikáciu výstupu na LED, takže možno z neho určiť kód, ktorý je úmerný vstupnému napätiu. Testovaný výstup komparátora COMPout je pripojený k bitu 1PC5. Meranie teda prebieha tak, že sa postupne, od 0 vždy o 1 krok, zvyšuje obsah registra (port PB), pripojeného k DAC a následne sa testuje reakcia komparátora na výstupe COMPout dovtedy až nastane stav COPMPout=L. Výstupný kód z LED po vynásobení konštantou osembitového prevodníka 5V/256 udáva veľkosť odmeraného napätia Uin.
     
     
      title  Skúška prevodnika ADC 
      .MODEL small  
      .STACK 100h  
      .DATA  
      Sprava1 DB  "Port je inicializovany PA-in, PB-out, PC-in",13,10,"$"
      Sprava2 db  "Start merania ",0dh,0ah,24h
      Sprava3 DB  "Koniec merania",13,10,"$"
      .CODE   
      pa1 equ 700h   
      pb1 equ pa1+1   
      pc1 equ pb1+1  
      cwr1 equ pc1+1  
      cw1 equ 99h  ; pa-in, pb out, pc- in 1001 1001b
        ;---------------------------------------------------
      mov ax, @data  ;Nastav DS
      mov ds, ax  ;pre oznamy
      mov dx, cwr1  
      mov al, cw1  ;inicializacia
      out dx, al  
      push dx  ;zobrazenie oznamu 1
      mov dx, offset sprava1  
      call zobraz  
      pop dx  
      xor ah, ah ;resp ináč 1/ mov al,0; 2/ sub al,al 
      push dx  ;zobrazenie oznamu 2
      mov dx, offset sprava2  
      call zobraz  
      pop dx  
      dec dx  ;port PC
        ;--------------- Štart merania ---------------
    start: call onesk  ;oneskorenie testu aby sa ustalil výstup 
      in al, dx  
      test al, 40h  ;test PC5
      jz koniec  
      dec dx  ;zmena kódu o +1 na port PB
      mov al, ah  
      out dx, al  
      inc dx  ;port PC
      inc ah  ;buffer výstupného kódu DAC
      jmp start  
     koniec: dec ah ; N-1 hodnota kódu DAC
      dec dx  ;port PB
      mov al, ah  
      out dx, al ; vysledok na LED
      mov dx, OFFSET Sprava3  ;zobrazenie oznamu 3
      call zobraz  
      mov ah, 4ch  ;koniec do DOS
      int 21h  
        ;---------------------------------------
    onesk: mov cx, 0  ;oneskorenie 1 sposob
    sem: loop sem   
      Ret  
    delay: push bx ; iny variant oneskorenia
      mov bx, 0f500h  
    dly: dec bx  
      or bx, bx  
      jnz dly  
      pop bx  
      Ret  
    zobraz: push ax  
      mov ah, 9  ;DOS vystup retazca s $
      int 21h  
      pop ax  
      Ret  
      END  









    Dac12.asm - demonštrácia prevodu A/D pomocou hľadania optimálneho referenčného napätia z DAC metódou postupnej aproximácie

    DAC je pripojený k portu 1PB, ktorý má súčastne aj indikáciu výstupu na LED, takže možno z neho určiť kód, ktorý je úmerný vstupnému napätiu. Testovaný výstup komparátora COMPout je pripojený k bitu 1PC4. Meranie teda prebieha tak, že sa najprv od 0 zvyši obsah registra, pripojeného k DAC na polovicu maximálnej hodnoty 256/2 = 128 = 1000 0000B = 80H a testuje sa reakcia komparátora na COMPout. Ak je Uin väčšie ako momentálne vygenerované referenčné napätie, tak stav COMPout sa nezmení a v následnom programovom kroku treba zvýšiť obsah registra znova o polovicu intervalu, teda na 1100 0000B = C0H a znova prebehnúť test COMPout. Ak napríklad je nastavené referenčné napätie už vyššie ako Uin znamená to, že tento krok bol neuspešný a že treba menej zvýšiť referenčné napätie. V danej postupnosti výkladu bude teda nasledujúci výstupný bajt zaslaný na DAC 1010 0000B = 0A0H a na základe testu COMPout sa rozhodne či tento 5 bit zostane naďalej na hodnote 1 alebo nie. Tento postup postupnej aproximácie Uin prebehne pri n bitovom slove celkom n razy. Na záver teda už bude nastavené referenčné napätie rovné Uin s presnosťou do najmenšieho kroku prevodníka (v danom prípade 5V/256). Proces odmerania napätia týmto typom prevodníka je teda podstatne rýchlejší ako v pri prevodníku s  lineárne od 0 narastajúcim referenčným napätím. Nevýhodou je o niečo menšia spoľahlivosť nameraného údaja, pretože aproximovaná hodnota môže byť raz vyššia a raz nižšia ako vstupné napätie, v závislosti od postupu aproximácie. Pri postupnom lineárnom zvyšovaní referenčnej úrovne napätia je odmerané napätie vždy menšie ako skutočná hodnota napätia. V uvedenom programe sa používajú registre:
     
    AL - pre vstup / výstup dát do portu určeného (DX)
    AH - ako buffer n + 1 hodnoty aproximácie
    BL - ako buffer n hodnoty aproximácie
    BH - ako posúvadlo bitu 1 ( bitshift - používa sa inštrukcia pre logický posuv vpravo - SHR ). Obsah ( BH ) sa potom zloží   (OR) s obsahom registra (BL)

     
      title DAC12   ADC s postupnou aproximáciou
      .MODEL small  
      .STACK 100h  
         
      .DATA  
      Sprava1 DB  "Port je inicializovany PA-in, PB-out, PC-in",13,10,"$"
      Sprava2 db  "Start merania ",0dh,0ah,24h
      Sprava3 DB  "Koniec merania",13,10,"$"
      .CODE   
      pa1 equ 700h   
      pb1 equ pa1+1   
      pc1 equ pb1+1  
      cwr1 equ pc1+1  
      cw1 equ 99h  ; pa-in, pb out, pc- in 1001 1001b
         
      mov ax, @data  ;Nastav DS
      mov ds, ax  ;pre oznamy
      mov dx, cwr1  
      mov al, cw1  ;inicializacia
      out dx, al  
      push dx  
      mov dx, offset sprava1  
      call zobraz  
      pop dx  
      xor ah, ah  ;resp.ináč =>mov al,0; sub al,al 
      mov bl, ah  ;N <
      mov bh, 80h  ;posuvadlo 1
      dec dx  ;port PC
      dec dx  ;port PB = vystup na DAC
      push dx  
      mov dx, offset sprava2  
      call zobraz  
      pop dx  
    start: or ah, bh  ;N < + bitshift
      mov bl, ah  
      mov al, ah  ;vystup
      out dx, al  
      inc dx  ;port PC
      in al, dx  
      dec dx  ;port PB
      test al, 10h  ;test PC4
      jnz viac  
      mov ah, bl  ;=N <
    viac: mov bl, ah  ;zmena N do 
      shr bh, 1  ;novy bitshift
      call onesk  
      cmp bh,1   
      jnz start  
      mov dx, OFFSET Sprava3   
      call zobraz  
      mov ah,4ch ;koniec=> do DOS
      int 21h  
        ;----subrutiny ------------------------
    onesk: mov cx,0  
    sem: loop sem  
      Ret  
         
    zobraz: push ax  
      mov ah, 9  ;DOS vystup retazca s $
      int 21h  
      pop ax  
      Ret  
      END  

     

     

    µ 
    Paralelné rozhranie pre tlačiareň

    Úlohou paralelného rozhrania pre tlačiareň je umožniť vyslanie znakov na tlačiareň spolu s ďalšími riadiacimi signálmi a príjem stavových signálov z tlačiarne a tak zabezpečiť komunikáciu medzi počítačom a tlačiarňou a tým aj efektívnu rýchlosť tlačenia a bezporuchovú prevádzku.

    V personálnych počítačoch zaviedla firma IBM pre rozhrania tlačiarní nasledovné priradenie portov, prerušení a bazových adries v tabulke BIOS:
     
    Rozhranie Adresa I/O Prerušenie adresa tab. BIOS
    LPT1 = PRN 378H - 37FH IRQ 7 408H
    LPT2 278H - 27FH IRQ 5 40AH
    LPT3 3BCH - 3BFH   40CH
    LPT4 nemá pridelené   40EH

    Pomocou uloženia iných adries portov do tabuľky bázových adries BIOS možno jednoducho presmerovať pridelenie portov a rozhraní. Na bázovej adrese 478H je uložený Time out tlačiarne, čo je maximálne trvanie za ktoré musí tlačiareň potvrdiť výzvu z počítača . Ak k tomu nedôjde signalizuje sa príslušné chybové hlásenie. Rozhranie tlačiarne je po zapnutí počítača inicializované tak, aby:

    • port PA bol výstupný, lebo cez neho sa uskutočňuje výstup znakov,
    • port PB a časť portu PCh bol nainicializovaný ako vstupný, lebo funguje ako stavový register snímajúci stav tlačiarne a
    • port PCd ako výstupný, fungujúci ako riadiaci register cez, ktorý prechádzajú ovládacie signály na tlačiareň.
    Pretože tlačiareň je pomalšie zariadenie ako počítač treba, aby komunikácia výstupu znakov na tlačiareň prebiehala s rýchlosťou určenou rýchlosťou činnosti tlačiarne pomocou signalov potvrdenia príjmu (Handshake). Existuje niekoľko štandardmých spôsobov komunikácie s tlačiarňou, napríklad CENTRONICS, EPSON, IRPR a pod.
     

    Obr. 4-7. Časový priebeh signálov paraleného rozhrania tlačiarní podľa Centronics. Po vyslaní 8 bitov dát spoločne so signálmi STROBE a BUSY, ktoré signalizujú tlačiarni, že dáta už môžu byť prijímané, čaká PC na potvrdenie ACKNL príjmu dát od tlačiarne.


    q Ovládanie tlačiarne pomocou obsluhy BIOS
     

    Program obsluhy tlačiarne sa potrebuje často a preto ho možno volať aj ako obsluhu BIOS pomocou INT 17H.
     
     
    INT 17H adresa  tlačiarne určená (DX)
    AH = 00H Výstup znaku z AL; príznaky stavový register PB
    AH = 01H Inicializácia =ak neuspešná tak (AH) = príznaky z PB a PB0= 1
    AH = 02H Číta do AH príznaky stavového registera PB

    Ako príklad výstupu znakov na tlačiareň na úrovni obsluhy BIOS slúži program Bfig513a.asm a jeho subrutina Bfig514a.asm.










    u Príklady obsluhy tlačiarne na úrovni BIOS

    Pgn9a.asm

    Príklad na ozrejmenie ovládania tlačiarne.Test tlačiarne na základe zaslania na výstup LPT1 ASCII kody: 5fh až ffh pomocou int17/ah=0. Návrat do DOS pomocou RET, na základe predošlého uloženia návratovej adresy PSP.
     
     
      Pgn9a.asm  
      title  Test tlaciarne : vystup 5fh=` az p=ffh 
        ;pomocou int17/ah=0
      page , 132  
     stackx 
    segment para stack "stack"  
      db 10 dup ("STACK") ;zaplni stack
     stackx 
    ends  ;10*"stack"
        ;-------------------------------------------------
     tlaccode 
    segment para "code"  
      assume cs :tlaccode,ss:stackx  
        ;Test tlaciarne
     tlac
    proc far  
      push ds  ;navrat do DOS pomocou RET
      mov ax,0  
      push ax  
      mov ax,cs  ;inicializacia datasegmentu
      mov ds,ax  
      sti  ;uvolnenie int, hoci sa nepouziva
      mov al,5fh  ;prvy znak
      mov bh,2  ;2 riadky
    riadok: mov cx,80  ;tlac 80 znakov
      mov dx,0  ;tlaciaren LPT1
        ;-------------------------------------------------
    dalsi: mov ah,0  ;nr. 0
      int 17h  ;tlac znakov,v AH=status
      inc al ;dalsi znak
      loop dalsi  
        ;--------------------------------------------------
      push ax ;Pokracovat v ASCII
      mov ax,000ah  ;LF
      int 17h  
      mov ax,000dh  ;CR
      int 17h  
      pop ax  
        ;-------------------------------------------------
      dec bh  
      jnz riadok  
      Ret  
     Tlac 
    endp  
     Tlaccode 
    ends  
      End tlac   

    Bfig513a.asm - hlavný program na vytlačenie oznamu

    Pomocou subrutiny output_sbr , ktorá umožňuje vytlačiť znak z pamäťovej bunky output_znak, zorganizuje tento program vytlačenie oznamu, označeného náveštím Message. ( Data označené náveštím Message sú adresované síce pomocou segmentu DS, ale tento bol na začiatku programu nastavený na CS = DS . Pre adresovanie Message možno teda použiť impicitný tvar inštrukcii bez prefixu CS napriek tomu, že dáta sú alokované v CS segmente. ) Pred začatím tlačenia najprv sa inicializuje tlačiareň .
     
     
      page , 132  
     sstack 
    segment stack  
      dw 64 dup(?)  
     sstack 
    ends  
        ;---------------------------------------------
     Code 
    SEGMENT public  ;ze ho mozno kombinovat 
        ;s inymi segmentami 
        ;rovnakeho mena
        ;---------------------------------------------
      extrn output_sbr:near,  
      output_znak:byte  
      extrn inicial:near  
        ;---------- Su az v bfig514 definovane
      ASSUME CS:Code  
    Start  proc far
      Push ds ; Navratova adr int20h
      Mov ax,0  ;pre segment
      Push ax  ;pre offset =0
      Cld  ;Direction flag
      Mov ax,cs  ;Nastavenie DS =CS
      Mov ds,ax  
         
      Assume DS:code  ;Nove priradenie
      Call inicial  ;inicializ tlaciarne
      Mov si,offset message  ;adresa stringu message
    slucka:    
      Lodsb  ;Dalsi bajt spravy
      Mov output_znak,al  ;Ulozit do memory
      Call output_sbr  ;Vystup znaku
      Cmp output_znak,10  ;Ci je LF ?
      Jne slucka ; Naspat ak nie LF
      Ret  
      message db  1bh,53h,0,"Toto je test",13,10
        ;Kod 1bh,53h,0- komprim pismo
      start endp  
      code ends  
      END start  ;Navestie pre 1 instr! 

    Subrutina Bfig_5-14a.asm

    Príklad subrutiny pre výstup na tačiareň, volaného z iného programu. Subrutina - output_sbr vyšle na tlačiareň znak z pamäťovej bunky output_znak s použitím int 17h/ah=0.
     
     
      TITLE Fig.5.14  Priklad : vystupny podprogram na tlaciaren
      page , 132  
         
      Code SEGMENT public ;ze ho mozno kombinovat 
        ;s inymi segmentami 
        ;rovnakeho mena
         
      ASSUME CS:Code,ds:code  ;Toto musi byt splnene
        ;----------------------------------------
      public output_znak,   
       output_sbr,inicial  
      output_znak db ?  ;Sem ulozi znak bfig513a
        ;----------------------------------------
      output_sbr proc near   
      mov al,output_znak  ;Dat znak na vystup
      mov ah,0  ;BIOS funkcia
      mov bx,0  ;videopage
      mov dx,0 ; Bios parametre-cislo LPT1
      int 10h  ;Zobraz sbr
      int 17h  ;vytlaci sa
      Ret  
      output_sbr endp  
         
      inicial proc  ;inicializacia tlaciarne
      mov ah,1  
      mov dx,0  
      int 17h  ;V AH je status tlac
      ret  
        ;STATUS:
        ;0 - time out ; 3 - I/O chyba
        ;4 - volba tlac;0=nezapojena; 5 - Koniec papiera PE=1 
        ;6 - ACK po prijme znaku 0=ready 7 - Busy, 0=nezapojena
      inicial endp  
      code ends  
      END ;Bez mena!!!  









    Bfig_5-13.asm a jeho subrutina Bfig_5-14.asm

    Obdoba Bfig_5-13a - ako príklad hlavného programu pre výstup znaku na tlačiareň a subrutiny Bfig_5-14a, ktoré majú rovnakú štruktúru len namiesto  Int 17H/ah=0, resp.1- status používajú int10H pre výstup znaku na obrazovku. Znak sa v hlavnom programe rovnako ako v predošlom príklade uloží  do bunky pamäte output_znak a volá sa extrn output_sbr:near (Bfig_5-14).

     

     


    q Ovládanie tlačiarne pomocou obsluhy DOS

    Program obsluhy tlačiarne možno volať aj aj ako obsluhu DOS pomocou INT 21H/ah=5. V porovnaní s obsluhou na úrovni BIOS sa pri vykonaní tejto obsluhy DOS predpokladá, že tlačiareň funguje ako štandardné zariadenie LPT1 a preto netreba špecifikovať adresu portu.


    u Príklady obsluhy tlačiarne pomocou obsluhy DOS
     

    Pgn9.asm

    Príklad na ozrejmenie ovládania tlačiarne pomocou Int DOS. Test tlačiarne na základe zaslania na výstup LPT1 ASCII kodov: 21h=! až p=70h pomocou int21/ah=5. Návrat do DOS pomocou Int 21H/ ah=4CH.
     
      Pgn9.asm  
      title Test tlaciarne : vystup 21h=! az p=70h
        ;pomocou int21/ah=5
      page , 132  
     stackx
    segment para  stack "stack"
      db 10 dup ("STACK")  ;zaplni stack
     stackx 
    ends  ;10*"stack"
        ;---------------------------------------------
     Tlaccode 
    segment para  "code"
      assume  cs:tlaccode, ss:stackx
        ;Test tlaciarne
     Tlac 
    proc  ;=> near proc
      mov ax,cs  ;inicializacia datasegmentu
      mov ds,ax  
      mov dh,3  ;3 riadky
    Riadok: mov cx,80  ;tlac 80 znakov
      mov dl,21h  ;zacne od !
        ;----------------------------------------------
      mov ah,5  ;nr. 5
    Dalsi: int 21h  ;tlac znakov
      inc dl  ;dalsi znak
      loop dalsi  
        ;---------------------------------------------
      mov dl,0ah  ;LF
      int 21h  
      ; mov dl,0dh  ;CR ak treba na posuv riadku
      ; int 21h  
        ;---------------------------------------------
      dec dh  
      jnz riadok  
      mov ah,4ch  ;navrat do DOS cez INT 21H 
      int 21h   
        ;---------------------------------------------
     Tlac 
    endp  
     Tlaccode 
    ends  
      End tlac   


    u Príklady obsluhy tlačiarne na úrovni hardware
     

    Bfig_8-15.asm

    Ovládanie výstupu z portu 378H, ku ktorému je štandardne pripojená tlačiareň. Všetky portrebné porty sú nainicializované už pri spustení počítača. (PortA 378h je out,PB je in, PC je out). Výstupom programu je oznam ("Sprava pre printer",13,10,) v komprimovanom tvare (kód 1bh, "l", 0fh)
     
     
      page ,132  
      TITLE  Fig.8.15 - Ovladanie vystupu z tlaciarne
     stackseg 
    segment para  segment para stack 
      db 64 dup ("stack")
     stackseg 
    ends  
      base equ 378h  ;Vystup ide cez portA 378h 
     code 
    segment  ;PB je in, PC je out
      assume  cs:code,ss:stackseg
      msg db  1bh,"l",0fh,"Sprava pre printer",13,10,"$"
     main 
    proc far  
      push ds  ;Uschova navrat do DOS
      sub ax,ax  
      push ax  
      lea bx,msg  ;ulozit adresu spravy
    print_loop:    
      mov al,cs:[bx]  ;Znak do al
      cmp al,"$"  ;Ci koniec retazca?
      je main_return  
      call print  ;Print znak
      inc bx  
      jmp print_loop  
    main_return:    
      Ret  
     main 
    endp   
        ;------------------------------
        ;SBR pre vytlacenie znaku z al
        ;------------------------------
     print 
    proc near  
      mov dx,base  ;dx<--adr portu 
      out dx,al p ;znak na vystu
      inc dx  ;Adr status portu
    wait_busy:    
      in al,dx  ;Busy je 7 bit
      test AL,80H  
      jz wait_busy  
      inc dx  ;odpoved na CWR
      mov al,0dh  ;5 bit na 1
      out dx,al  
      mov al,0ch  ;5 bit na 0
      out dx,al  
      Ret  
     print 
    endp  
     code 
    ends  
      end main   

    Bfig_8-15a.asm

    Modifikácia Bfig8-15 s cieľom modelovať činnosť tlačiarne, resp. postupnosti handshake (obr. 4-7.) signalov BUSY, STR na prípravku, ktorý je pripojený namiesto tlačiarne.
     
     Obr. 4-8. Prípravok na modelovanie funkcie tlačiarne Centronics.

    Najprv sa testuje pripravenosť tlačiarne pomocou signálu BUSY na PB7. Pripravenosť tlačiarne sa modeluje pomocou tlačítkového BUSY signálu HLH - program čaká na pustenie tlačítka. (Iná možnosť, ktorá sa ale v tomto programe nevyužíva by bolo čakanie na potvrdzovací signál ACKNL o trvaní impulzu okolo 5us, generovaného v okamihu skončenia signálu BUSY). Potom ako sa počítač  presvedčil, že tlačiareň je pripravená generuje signál STR=HLH o traní impulzu 10us na PC0, ktorý sa tiež po predľženi indikuje na LED. Pomocou prípravku sa dá overiť aj funkcia INT 17H/ah=0. Pri použití INT 21H/ah=05 sa výpiše na obrazovke chybové hlásenie zrejme v dôsledku toho že sa dostatočne rýchle nenastavia správne úrovne dalších signalov tlačiarne a chyba prekročenia time out zavolá INT_23H s výzvou na ukončenie operácie.
     
     
      TITLE  Fig.8.15a - Modelovanie cinnosti tlaciarne
     stackseg 
    segment para  stack 
      db 64 dup ("stack")
     stackseg 
    ends  
      base equ 378h  ;Vystup ide cez portA 378h 
     code 
    segment  ;PB je in, PCd je out, PCh-in
        ;********************************************
        ;Modelovanie tlaciarne na pripravku:
        ; Najprv testuje pripravenost tlaciarne BUSY na PB7
        ;Pripravenost tlaciarne sa modeluje pomocou HLH Busy imp 
        ;a 15us ACK impulzu z tlacitka = program teda caka na
        ;pustenie tlacitka.
        ; Potom program generuje STR=HLH imp 10us na PC0
        ; => ktory sa po predlzeni indikuje na LED na PC0.
        ; Pomocou pripravku sa da overit aj INT 17H/ah=0. 
        ;INT 21H/ah=05 vyvolava INT 23H => vyzaduje aj spravne
        ;urovne ostatnych kontrolnych signalov a preto 
        ;tlaciarne hlasi chybu.
        ;*********************************************
      Assume cs:code, ss:stackseg
      Msg db  1bh,"l",0fh,"Sprava pre printer",13,10,"$"
        ;---------------- 1BH,0FH = komprimovana tlac
     main 
    proc far  
      push ds  ;Uschova navrat do DOS
      sub ax,ax  
      push ax  
      lea bx,msg ;ulozit adresu spravy
    print_loop:    
      mov al,cs:[bx]  ;Znak do al
      cmp al,"$"  ;Ci koniec retazca?
      je main_return  
      call print  ;Print znak
      inc bx  
      jmp print_loop  
      main_return:  
      Ret  
     main 
    endp   
        ;------------------------------
        ;SBR pre vytlacenie znaku z al
        ;------------------------------
     print 
    proc near  
      mov dx,base  ;dx<--adr portu 
      out dx,al ;**** znak na vystup ****
      inc dx  ;Adr status portu
    wait_busy:    
      in al,dx ; BUSY je 7 bit
      test AL,80H ;  
      jz wait_busy  ;** = caka na tlacitko HLH ***
      inc dx  ;odpoved na PC
      mov al,0dh  ;1101= INV STR je PC0=0
      out dx,al  ;**** indikovat PC0 ******
      mov al,0ch  ;1100 =PC0=1
      out dx,al  
      Ret  
     print 
    endp  
     code 
    ends  
      end main   


     

    [Návrat]