Ú-6 |
Styk
mikropočítača s prostredím |
µ |
Sériové
rozhranie |
1.
|
q |
Parametre
signálu pri sériovom prenose |
|
|
q |
Dátový a prenosový
okruh, zariadenia typu DCE a DTE |
|
|
q |
Znakovo orientovaný
formát prenosu dát |
|
|
q |
Bitovo orientovaný
formát prenosu dát |
2.
|
q |
Hanshaking |
|
|
q |
Hardwareový
spôsob |
|
|
q |
Softwareový
spôsob |
3.
|
q |
Štandardné
sériové rozhranie - COM |
|
|
q |
Prístup k
sériovému rozhraniu |
|
|
|
q
|
Pomocou služieb DOS |
|
|
|
q
|
Pomocou služieb BIOS |
|
|
|
q
|
Pomocou priameho programovania
UARTu |
|
|
q |
Vnútorné
registre adaptéra UART |
4.
|
q |
Metódy
realizovania sériového prenosu |
|
|
q |
Príklady sériovej
komunikácie na základe priameho programovania UARTu |

1. |
Parametre
signálu pri sériovom prenose |
q
Dátový a prenosový okruh, zariadenia typu DCE a DTE
Technická norma sériového rozhrania, zabezpečujúca
kompatibilitu spojenia medzi terminálmi a modemami, ktorá zahrnuje aj komunikačné
signály pre modem sa nazýva rozhranie RS
232 C (europsky analóg - V.24). Podľa tejto normy sú zariadenia
rozdelené do dvoch typov:
-
Zariadenie typu terminál, prevážne vysielajúce dáta
sa podľa tejto normy nazýva koncové zariadenie prenosu dát DTE(Data
Terminal Equipment ). Aby sa mohli
údaje z tohto rozhrania prenášať napríklad po telefónnom vedení treba ich
upraviť pomocou modemu (modulátor / demodulátor) t.j. prekonvertovať digitálny
signál na nosnú frekvenciu so šírkou pásma 300 - 3000 Hz, uskutočniť prenos
po telefónnej sieti a na prijímacej strane znova demodulovať na digitálny
tvar.
-
Zariadenia typu modemu, ktoré menia parametre signálu
prenášaného okruhom a do ktorého dáta prevážne vstupujú sa podľa tejto
normy nazývajú ukončujúce zariadenia dátového prenosu DCE
(Data Comunication Equipment). Pri prenose dátovej informácie sa potom
odlišuje dátový okruh a prenosový okruh.
 |
Obr. 6-1.. Schéma komunikacie zariadení
podľa normy RS 232 C. |
 |
Obr. 6-2. Napäťové úrovne pre sériové rozhranie
RS232C. Rozhranie RS232C pracuje s bipolárnymi logickými pravidlami a inverznou
logikou, to znamená, že signálu log "1" zodpovedá záporné napätie. Tmava
oblasť na obrázku predstavuje nedefinovanú oblasť logických úrovní. |
Rýchlosť sériového prenosu sa charakterizuje
počtom jednotkových intervalov určitého charakteristického
stavu (jedna z hodnôt binarnej informácie, ktorú signál nadobúda)
prenesených za jednotku času. Jej jednotkou je bit/s. Pri
diaľkovom prenose dát sa používa modulovaný signál. Rýchlosť prenosu, pri
ktorej sa prenesie jeden jednotkový interval za sekundu sa nazýva modulačná
rýchlosť prenosu dát. Jej jednotkou je Baud (Bd).
Pri dvojstavovej modulácii sú jednotkové intervaly označované ako bity.
V takomto prípade je prenosová rýchlosť v Bd číselne rovná rýchlosti sériového
prenosu v jednotkách bit/s. Pri viacstavovej modulácii, keď sa v modulovanom
signále počas jedného charakteristického stavu mení polarita signálu aj
niekoľkokráť to však neplatí. Modulačná rýchlosť prenosu sa pohybuje od
35 do 20 000 Bd. (Používajú sa štandardné rýchlosti prenosu: 50, 75, 100,
150, 300, 600, 1200, 2400, 4800, 9600, 19200 Bd).
Podmienkou pre úspešnú výmenu správ medzi zdrojom
a príjemcom dát je dohovorené usporiadanie prvkov správy - formát
správy.
q
Znakovo orientovaný formát
Pri znakovo orientovanom formáte je dĺžka prenášanej
správy a jej blokov celistvým násobkom dlžky prenášaných kódových značiek,
ktoré sa obvykle interpretujú ako znaky dohodnutej abecedy.
Základnou jednotkou znakovo orientovaného prenosu
dát je rámec (anglicky frame). Každý rámec sa prenáša ako
celok a samostatne sa zabezpečuje pred chybami, vzniknutými pri prenose,
napríklad pomocou paritného bitu v prípade normalizovanej abecedy. Znakovo
orientovaný prenos je teda asynchronnym typom komunikácie. Jednotlivé
bity znaku tzv. znakový rámec sa vysielajú sériovo tak, že
ako prvý sa vysiela LSb a posledný MSb. Znakový rámec je pri prenose uzavretý
medzi začiatočný spúšťací START bit a 1 až 2 záverné STOP bity a tvorí
tzv. kódový rámec (obr. 6-3).
Formát znakovo orientovanej správy (obr. 6-3)
sa skladá zo záhlavia, vlastného textu správy a zakončenia.Ako
signály ohraničujúce začiatok a koniec vlastného textu sa používajú znaky
rovnakej abecedy ako pri prenose obsahu spravy napríklad znaky kódu ISO
- 7 ( ASCII ). Pred zahájením sériového prenosu znakov sa obvykle vysiela
postupnosť bezvýznamných značiek (anglicky PAD s kódom FFH ), ktorých charakteristické
okamihy umožňujú, zosynchronizovanie zdroja a príjemcu signálu, resp. sa
vkladajú aj ďalšie synchronizačné znaky, ktoré slúžia k zaisteniu znakovej
synchronizácie. Na kontrolu správnosti prenosu bloku znakov sa na konci
poľa znakovo orientovaných dát pridávajú 1 alebo 2 znaky tzv. blokového
zabezpečenia, pomocou ktorých sa na prijímacej podľa rovnakých
pravidiel kontroluje bezchybnosť prenosu.
 |
Obr. 6-3. Formát pri znakovo orientovanom
sériovom prenose. Údaj 7BH je uzavretý medzi začiatočný ŠTART bit a 2 záverné
bity STOP. Paritný bit chýba nakoľko údaj nie je znakom normalizovanej
abecedy. Napríklad pri modulačnej rýchlosti 300 Bd trvá jednotkový interval
1/300 = 3,3 ms. |

q
Bitove orientovaný formát
Pri bitove orientovanom formáte prenášaných
dát nemusí byť dĺžka bloku rovná násobku kódových značiek určitej abecedy,
ale sa interpretuje ako postupnosť bitov podľa dohodnutého protokolu medzi
vysielajúcou a prijímajúcou stranou. Prenášaný rámec dát (obr. 6-4) môže
mať ľubovoľnú dĺžku a tvorí ho:
-
informačné pole postupnosti bitov dát,
obojstrane ohraničené tzv. krídlovými značkami .Okrem týchto
2 polí sú súčasťou rámca aj ďalšie 3 polia :
-
adresové pole, ktoré obsahuje adresu
stanice, ktorá vyšle odpoveď;
-
riadiace pole, ktorého informácia je
potrená na riadenie činnosti prenosu dát;
-
pole zabezpečenia bezchybného
prenosu, ktoré kontroluje prenos celého rámca, napríklad pomocou kontrolného
súčtu. Blokový prenos je teda synchronný typ komunikácie.
Komunikácia medzi dvoma zariadeniami môže byť:
-
Jenosmerná (simplexná )
od vysielača k prijímaču ( cex vodič TxD) alebo opačným smerom ( cez vodič
RxD), v najjednoduchšom prípade cez jeden signálny a jeden zemniaci vodič.
-
Dvojsmerná ( duplexná ) v
najjednoduchšom prípade realizovaná cez dva signálne a jeden zemniaci vodič,
umožňujúca súčastne príjem aj vysielanie.
F(0111
1110) |
A (8 bit) |
C (8 bit) |
I
- Informačné pole |
FCS (16
bit) |
F(0111
1110) |
|
Obr. 6-4. Formát rámca správy
protokolu HDLC (High Level Data Link Control podľa ISO), resp. SDLC (Synchronous
Data Link Control podľa IBM). Oba protokoly sú bitove orientované,
na kóde nezávislé (HDLC a SDLC sa odlišujú tým, že v HDLC možno adresový
A a riadiaci C bajt rozšíriť). U oboch metód prenos riadi primárna stanica
(Master) pomocou príkazov vysielaných k sekundárnym staniciam (Slave),
ktoré po vykonaní príkazu reagujú príslušnou odpoveďou, resp. znakom Abort
(pri predčasnom ukončení prenosu.) Rámec tohto prenosu môže byť ľubovoľne
dlhý a pozostáva z 5 častí:
-
F - krídlová značka (Start Flag = 0111 1110);
-
A - adresové pole (o dlžke 8 bit);
-
C - riadiace pole (o dlžke 8 bit);
-
I - informačné pole premenlivej dĺžky;
-
FCS - kontrolný znak bloku (Frame Check Sequence);
-
F - krídlová značka (Start Flag = 0111 1110).
|

V mnohých prípadoch treba korigovať rýchlosť prenosu
na základe úspešnosti prenosu pomocných ovládacich signálov. Tento kvitovací
dialog s cieľom riadenia toku informácie sa nazýva handshaking.
Obecne je handshaking typ podmieneného prenosu s obojstrannym kvitovaním
úspešnosti uskutočnenia komunikácie. Často býva len jednostranne riadený
zo strany prijímacieho zariadenia, napríklad keď tlačiareň ovláda rýchlosť
toku dát z počítača. V tomto prípade potrebuje menší počet riadiacich signálov
ako v prípade obojsmernej komunikácie, napríklad medzi terminálom a modemom.
Existujú dva typy handshakingu:
-
Hardwareový spôsob (zabezpečovaný technickými prostriedkami).
-
Softwareový spôsob (zabezpečovaný programovými prostriedkami)..
q
Hardwareový spôsob
Hardwareový spôsob, alebo kostrbate slovensky
povedané spôsob založený na využití technických prostriedkov, používa na
handshaking signály (signály odoslania a potvrdenia príjem dát), ktoré
sú pri prenose automaticky (bez vonkajšej softwareovej podpory) generované
obvodom sériového rozhrania:
RTS - |
( Výzva k vysielaniu -Request to send ) |
CTS - |
( Pripravenosť k vysielaniu - Clear to send) |
DSR - |
( Pripravenosť dátového zariadenia - Dataset
ready) |
DCD - |
( Nosná - Data Carrier detect) |
DTR - |
(Pripravenosť terminálu - Data terminalready). |
Pred započatím vysielania pomocou signálov výzvy
DTR a odpovede DSR sa testuje pripojenie zariadení a pomocou výzvy RTS
a odpovede CTS sa zosynchronizujú zariadenia a začnú vysielať po vodiči
TxD (anglicky Transmit Data). V jednoduchšom prípade jednosmerného prenosu
z DTE do DCE (na obrázku 6-5) riadia spojenie len signály CTS a DSR, vysielané
z prijímajúceho zariadenia DCE.
 |
Obr. 6-5. Prenos
dát z DTE do DCE, jednosmerný riadený z prijímajúceho zariadenia DCE. |
Pri príjme sa pomocou signálov výzvy DTR a odpovede
DSR oskúša pripojenie zariadení a po objavení sa nosnej DCD sa po zosynchronizovaní
začne príjem vysielaných dát po vodiči RxD (anglicky Receive Data). V jednoduchšom
prípade jednosmerného prenosu z DCE do DTE (na obrázku 6-6) riadia spojenie
signály DTR a zriedka aj RTS, vysielané z prijímajúceho zariadenia DTE.
 |
Obr. 6-6. Príjem
dát z DCE do DTE, jednosmerne riadený z prijímacieho zariadenia DTE. |
Tzv. veľký variant štandardu rozhrania
RS 232C, alebo jeho europskej analógie V.24 , navrhnutý elektronickou asociáciou
EIA (Electronic Industrie Asociation ) používa 25 kolíkový konektor s 12
žilovým káblom.
 |
Obr. 6-7. Vzájomné prepojenie
vývodov konektora RS232C na realizovanie sériového prenosu s potvrdením
príjmu (handshake) - vľavo úplné a vpravo zjednodušené zapojenie - nulový
modem. |
Zjednodušený tzv. stredný variant používa
9 kolíkový konektor a jednoduchší protokol overovania správnosti príjmu
s použitím signálov RTS, CTS , DCD , DTR .
Pretože neexistuje žiadna norma, ktorá by určovala,
ktoré zariadenie je DTE alebo DCE na najjednoduchšie spojenie dvoch zariadení
DTE a DCE, ktoré je vhodné do vzdialenosti cca 15 m, sa používajú skrížené
vodiče TxD, RxD a zem SGL, ktoré sa nazýva nulový modem (obr.
6-7).
Zapojenie konektorov sériového
rozhrania RS-232 pre variant: |
|
|
25 pinový
(DTE - IBM PC ) |
9 pinový
(DTE - IBM - AT ) |
|
|
|
|
1 |
Chassis Ground (GND) |
1 |
Carrier Detect (CD) |
|
2 |
Transmit Data (TD) |
2 |
Receive Data (RD) |
|
3 |
Receive Data (RD) |
3 |
Transmit Data (TD) |
|
4 |
Request to Send (RTS) |
4 |
Data Terminal Ready (DTR) |
|
5 |
Clear to Send (CTS) |
5 |
Signal Ground (SG) |
|
6 |
Data Set Ready (DSR) |
6 |
Data Set Ready (DSR) |
|
7 |
Signal Ground (SG) |
7 |
Request to Send (RTS) |
|
8 |
Carrier Detect (CD) |
8 |
Clear to Send (CTS) |
|
9-19 |
(not used) |
9 |
Ring Indicator (RI) |
|
20 |
Data Terminal Ready (DTR) |
|
|
|
22 |
Ring Indicator (RI) |
|
|

q
Softwareový spôsob
Prenos sa uskutočňuje bez pomoci signálov hardwareoveho
handshakingu. Používa na ovládanie špecialne znaky, ktoré sú programovo
generované a vysielané po dátových vodičoch TxD a RxD. Najpoužívanejšim
protokolom zo softwarovým handshakingom je protokol XON/XOFF.
V tomto protokole prijimacie zariadenie ak chce zastaviť vysielanie znakov
vyšle do vysielacieho zariadenia ASCII znak DC3 = 13H. Ak chce, aby vysielanie
pokračovalo, vyšle znak DC1 = 11H.

3. |
Štandardné
sériové rozhranie - COM |
Základnou súčiastkou rozhrania RS232 C je integrovaný
obvod UART (Universal
Asynchronous Receiver Transmitter), v ktorom sa vykonáva vlastný prevod
zo sériového kódu na paralelný kód a opačne. Pre komunikačné účely signál,
ktorý vstupuje do obvodu a vystupuje z obvodu sériove bit po bite treba
doplniť ďalšimi signálmi, ktoré kontrolujú proces vysielania a príjmu.
Okrem toho sériové rozhranie musí tiež zabezpečiť prevod logických úrovní
TTL z UARTu na logické úrovne (obr.6-2) používané v telekomunikačnej
technike prenosu signálov:
-
úroveň značky (anglicky mark - logickej
jedničky) od +5V do +15V a
-
úroveň medzery(anglicky space - logickej
nuly) od -5V do -15V.
(Označenie značka - medzera je terminologický pozostatok
z čias Morseovej abecedy).
Integrovaný obvod UART, je v počítači typu IBM
PC adresovaný ako jedno zo štandardných vstupno / výstupných zariadení.
Tieto sériové zariadenia sú v počitači označované ako COM1 až COM4, resp.
prvý sériový port adaptéra aj ako AUX = COM1. Obvody sériových portov môžu
požadovať o prerušenie IRQ. Na základe žiadosti IRQ môže byť potom realizované
prerušenie INT. Každé sériové rozhranie má teda svoju I/O adresu a číslo
IRQ, resp. INT. Počitač je informovaný o existencii a parametroch obvodov
COM pomocou tabuľky BIOS parametrov.
Port |
Adresa |
Žiadosť o INT |
Prerušenie |
Adresa tabuľky BIOS |
COM_1 |
3F8H-3FFH |
IRQ4 |
INT 0CH |
400H |
COM_2 |
2F8H-2FFH |
IRQ3 |
INT 0BH |
402H |
COM_3 |
3E8H-3EFH |
IRQ5 |
|
404H |
COM_4 |
2E8H-2EFH |
IRQ5 |
|
406H |
V starších počítačoch sa používali obvody (obr.
6-8) UART 8250, 8251 (pre každý sériový kanál jeden). V súčasných PC sa
štandardne používajú predovšetkým obvody UART 16550, resp. ich ekvivalenty.
Tieto majú nielen rýchlejšiu logiku, ale sú vybavené aj dvomi zabudovanými
16 bajtovými buffermi, t.j. vyrovnávacou pamäťou. Jeden buffer slúži pre
vstup a druhý pre výstup dát. Buffery UART pracujú v režime FIFO (First
In First Out), pri ktorom znak zapísaný do pamäti skôr je aj skôr čítaný.
 |
Obr. 6-8a. Vnútorná
štruktúra komunikačného adaptéra USART - 8251. |
 |
Obr. 6-8b. Pripojenie
komunikačného adaptéra USART - 8251 k zbernici PC. |

Príklad IvanS.asm:
ako nastaviť adriesy sériových portov COM_3 a
COM_4 do tabuľky BIOS v prípade, že to PC neurobilo automaticky
po inštalácii karty?
IvanS.asm - Nastavenie
adries sériových portov COM_3 a COM_4 do tabuľky BIOS
Príklad nastavenia adries sériových portov COM3
a COM4 v tabuľke parametrov BIOS, pre potreby stavovej informácie čítanej
pomocou prerušenia INT 11H.
Okrem uloženia správnych adries sériových rozhraníi
com_3 a com_4 do tabuľky BIOS (na adresu 0:4040H a 0:406H ) treba príslušnú
zmenu v inštalácii oznámiť aj na adresu 0:410H, kde je ako 16 bit slovo
uložená informácia o nastavení a voľbe príslušenstva počítača. Z hľadiska
danej demonštrácie sú zaujimavé :
bit 9 - 11 - |
počet
nainštalovaných sériových rozhraní v binárnom
tvare napríklad pre 2 kanály je 010b, pre 4 kanály
je 100b. |
bit 14, 15 - |
počet nainštalovaných
paralelnych rozhraní v binárnom
tvare napríklad pre LPT_1 je 01b, pre LPT_1,
LPT_2 je 10b. |
Túto stavovú informáciu potom používa počítač
pre svoju potrebu a je prístupná k prečítaniu pomocou INT 11H.
|
-------------------------------- |
|
abs0
|
segment at 0 |
;Začiatok RAM BIOS tabulky |
org
|
404h |
;Adresa tabulky BIOS pre
com_3 |
kom3
|
label word |
;Náveštie určujúce adresu
com_3 |
abs0
|
Ends |
|
|
|
;------------------------- |
ser3
|
equ 3e8h |
;adresa com3 portu |
ser4
|
equ 2e8h |
;adresa com4 portu |
|
|
;------------------------------ |
Code
|
segment |
|
|
assume cs:code |
|
|
org 100h |
;súbor.com |
initab
|
Proc |
|
|
sub ax, ax |
;Nastavenie DS=0 |
|
mov ds, ax |
|
|
assume ds:abs0 |
|
|
mov kom3, ser3 |
;Uloženie adresy com3
na 0:404H |
|
Mov kom3+2, ser4 |
;Uloženie adresy com4
na 0:406H |
|
Mov ax, kom3+12 |
;Stavové slovo z 0:410H |
|
or ax, 8800h |
|
|
and ax, 88ffh |
|
|
mov kom3+12, ax |
|
|
push es |
|
|
pop ds |
|
|
mov ah, 4ch |
|
|
int 21h |
|
initab
|
Endp |
|
code
|
Ends |
|
end
|
Initab |
|
|
---------------------------------- |
|
|
Kvôli lepšej názornosti
slúži výpis tabuľky BIOS pred spustením programu a po jeho zbehnutí: |
|
d0:400 420 toto je pôvodna
tabuľka |
|
0000:0400
F8 03 F8 02 00 00 00 00-78 03 00 00 00 00 00 00 ........x....... |
|
0000:0410
21 44 00 80 02 80 00 00-00 00 36 00 36 00 0D E0 !D........6.6... |
|
|
|
=> stavová
informácia na 0:410=411 má tvar 4421H =0100 0100 0010 0001B => že je prítomé
LPT_1, COM_1 a COM_2 , videomód obrazovky je farebný s 80 znakmi a je prítomný
jeden pevný disk. Po logickom súčte s maskou 8800H je stavová informácia
1100 1100 0010 0001B a po zamaskovaní logickou maskou 88FFH je stavová
informácia 1000 1000 0010 0001B, čo je želaný stav 8821H, uvedený v nasledujúcom
výpise. |
|
-d0:400 420 toto je upravená
tabulka |
|
0000:0400
F8 03 F8 02 38 03 38 02-78 03 00 00 00 00 00 00 ....8.8.x....... |
|
0000:0410
21 88 00 80 02 80 00 00-00 00 3A 00 3A 00 0D E0 !.........:.:... |
|
=> zmenila sa horná časť
MSB informácie v súvislosti s nainštalovaním 2*LPT a 4*COM. |

3a. |
Prístup
k sériovému rozhraniu |
q
Pomocou služieb DOS
«
Pomocou príkazu - mode z DOSu
Napr. |
Mode COM2: 9600,e,8,2 |
|
|
Copy
A:\súbor.ext COM2 |
=> copy súbor na COM2 |
|
Copy CON: COM2 |
=> vstup z klávesnice
na COM2 |
Príkaz mode nastaví COM_2 na prenosovú rýchlosť
9600 Bd (implicitne v PC 2400 Bd), s párnou paritou - e (alebo o - nepárnou
, n - bez parity), s 8 bitmi v znakovom rámci (znakový rámec môže mať 5
- 8 bit ), 2 stop bitmi (implicitne 1, len pri rýchlosti 110 Bd sa používajú
2 stop bity). Ak je k rozhraniu COM2 pripojená sériová tlačiareň tak vyššie
uvedené príkazy:
-
vytlačia súbor.ext
-
umožnia zasielať znaky z klávesnice priamo na tlačiareň
(po zadaní Ctrl + Z.).
«
Pomocou služby DOS - INT 21H
Služba DOS, realizovaná prerušením INT 21H
s rôznymi funkciami v závislosti od obsahu registre AH.
ÜAH = 4 -
číta znak zo štandardného zariadenia
DOS - AUX=COM_1 , ktoré je stále pripravené. Pre použitie COM_2 treba postupovať
rovnako ako pre súbor t.j. najskôr ho otvoriť, potom zapísať / čítať a
zavrieť.
|
Napr. výstup
"A" na COM_1 |
|
|
mov |
ah, 4 |
|
|
mov |
dl, "A" |
|
|
int |
21H |
ÜAH = 3 -zabezpečí
príjem znaku z COM_1 a uloží do registra AL kód ASCII prijatého znaku.

q
Pomocou služieb BIOS - INT 14H
Na odlíšenie adries portov sa používa register
DL. Takže ak je DL = 0 prebieha sériová komunikácia cez COM_1, pri DL =
1 cez COM_2. Služba BIOS, realizovaná prerušením INT 14H s
rôznymi funkciami v závislosti od obsahu registre AH:
ÜAH = 0 -
inicializácia sériového portu. (Pri
inicializácii sa nenastavuje žiadny ovládací signál rozhrania):
Bit
5 - 7 - rýchlosť prenosu: |
Bit 7 - 5 |
Rýchlosť |
Bit 7 - 5 |
Rýchlosť |
000B |
110 Bd |
100B |
1200 Bd |
001B |
150 Bd |
101B |
2400 Bd |
010B |
300 Bd |
110B |
4800 Bd |
011B |
600Bd |
111B |
9600 Bd |
Bit
3 - 4 parita: |
Bit 3 - 4 |
Parita |
00B |
Žiadna |
01B |
Nepárna |
10B |
Párna |
Bit
2 počet stop bit: |
Bit 2 |
Počet |
0 |
1 stop bit |
1 |
2 stop bit |
Bit
0 - 1 znakový rámec: |
Bit 0 - 1 |
Počet |
Bit 0 - 1 |
Počet |
11B |
8 bit |
10B |
7 bit |
01B |
6 bit |
00B |
5 bit |
Napríklad pre 9600 Bd, bez parity, 2 stop bit,
8 bit znak: 111 00 1 11 = E7H
|
mov ah, 0 |
|
mov dx, 0 |
|
mov al, 0E7H |
|
int 14H |
ÜAH = 1 -
Výstup znaku z AL
|
Výstup: AH =
|
Informácia o úspešnosti
prenosu : |
|
|
Bit7=1=> neúspešný |
|
|
Bit7=0=> OK |
Táto služba BIOS je určená hlavne pre ovládanie
a výstup na sériovú tlačiareň. Po vyslaní znaku z počítača sa nastavia
signály DTR a RTS a počítač očakáva, že signály DSR a CTS nastaví tlačiareň
a až potom sa vyšle znak. Namiesto prítomnosti signálov handshake na konektore
COM sa možu použiť oklamávacie prepojenia na konektore, tzv. nulový modem
(obr. 6-7).
Pri vyslaní prvého znaku do prázdneho vysielacieho
buffera nemusia byť podmienky nastavenia vyššie uvedených ovládacich signálov
v správnom termíne vyplnené a indikuje sa chyba - time out error.
ÜAH = 2 -
Príjem znaku do AL
|
Výstup AH
|
= 0 => prenos úspešný. |
Funkcia príjem znaku nastaví riadiaci signál DTR
a vypne signál RTS a potom čaká na znak, ktorý má byť prijatý. Ak sa príjem
neuskutoční v správnom časovom rozmedzí obvod hlási chybu - time out error.
ÜAH =
3- Informácia o stave linky
Výstup :
|
AH =>
stav linky, resp. rozhrania |
|
AL = stav modemu. |
Bit |
Obsah AH |
Obsah AL |
7 |
Time out error |
Signál na vedení pre príjem
indikovaný |
6 |
Vysielanie - OUT_reg prázdny |
Výzva pre RI (Ring Indik) |
5 |
Vysielanie
- posuv_reg prázdny |
DSR nastavené |
4 |
Break - stav |
CTS nastavené |
3 |
Chyba rámca |
Zmena signálu z bit_7 |
2 |
Chyba parity |
Zmena signálu z bit_6 |
1 |
Overrun error |
Zmena DSR |
0 |
Prijaý znak pripravený
na prečítanie |
Zmena CTS |

Bfig_8-16V1.asm -
Príklad na seriovú komunikaciu s využitim služieb BIOS
Príklad sériovej komunikácie medzi sériovými rozhraniami
v terminálovom režime s využitím služiieb BIOS - INT14H. = > inicializácia
rozhrania, príjem znaku a jeho uloženie do buffera a vysielanie znaku
Program predpokladá prepojenie portov 2 počítačov
cez sériové porty (napr. ako nulový modem) a vykonáva funkciu terminálu
=> vstup z jedného počítača sa zobrazuje na obrazovke druhého počítača
a obrátene.
|
|
;------------------------------------ |
stackseg
|
segment para stack |
|
|
db 256 dup("stack") |
|
stackseg
|
ends |
|
|
|
;------------------------------------ |
Data
|
segment 'data' |
|
|
znak db 0 |
|
|
flg db 0 |
|
|
tznak db 0,'$$' |
|
data
|
ends |
|
|
|
;------------------------------------ |
code
|
segment |
|
Assume
|
cs:code,ss:stackseg,ds:data |
|
posli
|
proc |
;vyšle znak z AL
na COM výstup |
|
push ax |
|
|
push dx |
|
|
mov dx, 1 |
;COM2=>(dx)=1 |
|
mov al, znak |
;posielany znak |
|
mov ah, 1 |
;funkcia transmit |
|
int 14h |
|
|
mov znak, 0 |
|
|
pop dx |
|
|
pop ax |
|
|
Ret |
|
posli
|
endp |
|
|
;---------------------------- |
;uloží znak z klávesnice
do |
klav
|
proc |
pamäťovej bunky
znak |
|
push ax |
|
|
mov ah, 0bh |
;test stlačenia klávesu
0/ff |
|
int 21h |
|
|
cmp al, 0 |
|
|
je skok |
;ak nestlačený kláves
tak koniec |
|
mov ah, 08h |
;čita kláves |
|
int 21h |
|
|
mov znak, al |
|
skok: |
pop ax |
|
|
Ret |
|
klav
|
endp |
|
|
;------------------------------ |
;test či data
prijaté a či môže |
modem |
Proc |
nastať vstup
z klávesnice |
|
push ax |
|
|
push dx |
|
|
mov ax, 300h |
;ah=3 čita stav portu |
|
mov dx, 1 |
;COM2 |
|
int 14h |
|
|
and ah, 1 |
|
|
cmp ah, 0 |
;test či prijaté data
ready? |
|
je skok1 |
|
|
mov flg, 0ffh |
;sú =>flag pre čitanie |
skok1: |
pop dx |
|
|
pop ax |
|
|
Ret |
|
modem
|
endp |
|
|
;------------------------------------ |
;Príjem a zobrazenie
znaku + |
citaj
|
Proc |
vynuluje flg |
|
push ax |
|
|
push dx |
|
|
mov ax, 200h |
;ah=2=>prijem znaku |
|
mov dx, 1 |
;COM2 |
|
int 14h |
|
|
mov tznak, al |
|
|
cmp tznak, 0 |
;je prijaté CR? |
|
jne skok3 |
|
|
mov tznak[1], 0ah |
;ano =>pripoj LF |
skok3: |
lea dx, tznak |
|
|
mov ah, 09h |
;zobrazenie znaku |
|
int 21h |
|
|
mov flg, 0 |
;vynuluj flg |
|
mov tznak[1], '$' |
|
|
pop dx |
|
|
pop ax |
|
|
Ret |
|
citaj
|
Endp |
|
|
|
;------------------------------------ |
START: |
|
;Štart programu |
|
mov si, seg data |
|
|
mov ds, si |
;nastaví ds |
|
mov dx, 1 |
;nastaví COM2 |
|
mov ax, 0ffh |
;rýchlost 9600b/s,párna
parita, 2stopbit, 8bit |
|
int 14h |
|
cykl: |
call klav |
;kod stlačeného
klavesu pošle na COM2 |
|
call modem |
;test portu COM2 |
|
cmp flg, 0 |
;ak je znak tak
ho zobrazi |
|
je skok2 |
|
|
call citaj |
;zobrazi znak z
COM2 |
skok2: |
cmp znak, 1bh |
;ESC ukonči program |
|
je koniec |
|
|
cmp znak, 0 |
;nestlačeny kláves |
|
je cykl |
|
|
call posli |
;vyšle kód stlačeného
klávesu |
|
jmp cykl |
|
koniec: |
mov ah, 4ch |
;návrat |
|
int 21h |
|
code
|
ends |
|
|
end start |
|
|
|
;--------------------------------------- |

q
Priame programovanie sériového adaptéra
Integrovaný obvod UART 8250, resp. jeho novšia
verzia 16550 (Univesal Asynchronous Receiver Transmitter) obsahuje 10 osembitových
registrov, ktoré sú však prístupné len cez 7 adries => musia sa používať
všelijaké doplňujúce triky na odlíšenie adries registrov, napríklad použiť
aj pomocný bit DLAB.
Adresa portu |
Register |
DLAB bit |
03F8, 02F8 |
OUT_DATA Register |
0 |
03F8, 02F8 |
IN_DATA Register |
0 |
03F8, 02F8 |
Zápis LSB deliceho pomeru |
1 |
03F9, 02F9 |
Zápis MSB deliceho pomeru |
1 |
03F9, 02F9 |
IER - register uvolnenia
INT |
|
03FA, 02FA |
IIR - register identifikácie
INT |
|
03FB, 02FB |
LCR - register riadenia
linky |
|
03FC, 02FC |
MCR - register riadenia
modemu |
|
03FD, 02FD |
LSR - register stavu.
linky |
|
03FE, 02FE |
MSR - register stavu.
modemu |
|

Zaujímavé programy s hľadiska
sériového rozhrania
FTerm90.exe.
Produkt fy Symantec Corporation, tvoriaci súčasť
Norton Comandera umožňuje okrem iného kontrolovať, nastavovať a realizovať
rôzne spôsoby sériového prenosu. Umožňuje jednoducho nastaviť modulačnú
rýchlosť (Baudrate), paritu, počet bitov znakového rámca ako aj počet stop
bitov kódového rámca. Umožňuje podporu 8 sériových portov COM1 - COM8,
ako aj voľbu handshakingu ( hardwareový, softwareový a bez podpory) (F9
- vstup do menu, F10 - koniec, Alt+P - nastavenie spôsobu prenosu).
FUARTS.com.
Sharewareový program na kontrolu stavu registrov
sériového adaptéra UART. Program sa rezidentne uloží do pamäte a je k dispozicii
po stlačení Cntr + Right Shift. Help sa vypíše po dodaní /? . Program umožňuje
prezerať obsahy registrov sériových portov COM a poskytuje dobrú pomoc
pri ozrejmení funkcie sériového adaptéra UART.

3b. |
Vnútorné
registre UART |
Vnútorné registre adaptéra UART sú 3 typov:
-
riadiace,
-
stavové a
-
buffery.
«
Riadiace registre
Prijimaú príkazy z CPU ( t.j. registre LCR, MCR,
EIR a register deliča prenosovej rýchlosti )
ÜRegister
riadenia linky - LCR (Line
Control Register) sa používa na nastavenie parametrov komunikácie:
-
dĺžky slova (5 - 8 bit),
-
voľbu parity a
-
deliaceho pomeru.
Bity
registra LCR |
Bit |
Hodnota |
Význam |
7 |
1/0 |
Bit prístupu k deliču
prenosovej rýchlosti |
6 |
0/1 |
Povolenie BREAK (po 1
začne vysielať medzery) |
5 |
0 |
Parita u prijimača a vysielača
zhodná ( BIOS ) |
|
x0 |
žiadna parita |
4 - 3 |
01 |
Nepárna parita |
|
10 |
Párna parita |
2 |
0 |
1 stop bit |
|
1 |
2 stop bit ( len pri 5
bit rámci 1,5 bit ) |
1 - 0 |
11 |
8 bit znakový rámec |
|
10 |
7 bit znakový rámec |
|
01 |
6 bit znakový rámec |
|
00 |
5 bit znakový rámec |
Postup pri inicializácii:
-
Nastavit DLAB_bit = 1 v LCR registre, aby bolo možné
zapísať deliaci pomer do DATA_registrov.
-
Zapísať deliaci pomer => 2 bajty - LSB na adresu
DATA_Reg a MSB na DATA_Reg+1.
-
Nastavit DLAB_bit=bit7=0 v LCR registri a spolu s
ním uložit špecifikáciu kódového rámca znaku:
|
Napríklad
pre 8 bit znak, 1stopbit, bez parity, 9600 Bd je treba : |
|
mov |
dx, 3FBH |
; adr.LCR |
|
mov |
al, 1000 0000B |
; DLABbit=1 |
|
out |
dx, al |
|
|
mov |
dx, 3F9H |
;DATA_reg+1 |
|
out |
dx, al |
;MSB del. Pomeru |
|
dec |
dx |
;DATA_reg |
|
out |
al, 0CH |
;LSB =12D |
|
out |
dx, al |
|
|
mov |
al, 03H |
;špecifik znak, parita,
stopbit |
|
out |
dx, al |
|
ÜRegister
riadenia modemu - MCR (Modem
Control Register) riadi signály spojenia vysielané z obvodu UART. Po nastavení
úrovní signálov DTR = 1 a RTS = 1 môže vzdialené zariadenie začať vysielanie.
V počítačí IBM PC musí byť pri prerušením riadenom I/O nastavené Out1=
1.
Bity MCR (Bit 5 až 7sú vždy nastavené na 0 ):
Bit |
Skratka |
Názov |
0 |
DTR |
Dátový terminál pripravený |
1 |
RTS |
Žiadosť o vysielanie |
2 |
Out1 |
Uživateľsky definovaný
výstup 1 |
3 |
Out2 |
Uživateľsky definovaný
výstup 2 |
4 |
Loop |
Spätná sľučka testovacieho
módu |
ÜRegister
umožňujúci prerušenie - IER (Interrupt
Enable Register) sa používa na voľbu uvoľnenia prístupu udalostí, ktoré
majú vyvolať prerušenie. Ak program používa pri skúmaní pripravenosti komunikačných
zariadení metódu výziev (anglicky pooling), tak nie je povolené
žiadne prerušenie a program opakovane testuje stavové registre, aby zistil
či sa zmenil ich obsah.
Napríklad na zablokovanie všetkych prerušení možno
použiť nasledujúcu sekvenciu inštrukcii :
|
mov |
dx, IER |
|
mov |
al, 0 |
|
out |
dx, al |
ÜRegister
deliča prenosovej rýchlosti (Baud
Rate Divisor Latches) slúži na zadefinovanie prenosovej rýchlosti.
V jednoduchšich prenosových zariadeniach, napríklad
v niektorých počítačoch sa frekvencia hodinových impulzov odvodzuje od
taktovacej frekvencie mikroprocesora. Všeobecne sa používa nezávislý zdroj
frekvencie UART, najčastejšie sa používa generátor s frekvenciou 1,8432
MHz. Z dôvodov dobrej vnútornej synchronizácie je reálna prenosová rýchlosť
nižšia ako táto frekvencia. Často tvorí 16 násobok maximálnej prenosovej
rýchlosti. Potom pre určitú prenosovú rýchlosť - pr_rychl [Bd] treba nastaviť:
|
deliaci pomer = |
1843200 / ( 16*pr_rychl
) |
Takže čím je menšia rýchlosť prenosu, tým je treba
väčší deliteľ. Preto sú rezervované 2 byte na zápis deliteľa:
Bd_rýchlosť |
MSB deliteľa |
LSB deliteľa |
110D |
04H |
17H |
300D |
01H |
80H |
600D |
00H |
C0H |
1200D |
00H |
60H |
2400D |
00H |
30H |
4800D |
00H |
18H |
9600D |
00H |
0CH |
19200 |
00H |
06 |
38400 |
00H |
03 |
56000 |
00H |
02 |
115000 |
00H |
01 |

«
Stavové registre
Stavové rgistre ( t.j. registre LSR, MSR, IIR)
používa CPU na zistenie informovácie o stave obvodov UART.
ÜRegister
stavu linky - LSR (Line Status
Register) sa používa na získanie informácie o príjme a vysielaní. Stavový
register linky LSR umožňuje pri vysielaní indikovať pripravennosť vyslať
znak z OUT_DATA_Reg = THR (Transmitter Holding Register) a potom či predchádzajúci
znak opustil buffer a uložil sa do posuvného registra TSR (Transmitter
Shift Register ) vysielača => či možno do jedného z buferov THR alebo TSR
uložiť znak.
Na test LSR možno teda použiť
nasledové bity:
nbit
0 = DR ( Data Ready),
ktorý signalizuje či obvod prijal znak. Zostáva
nastavený pokiaľ sa neprečíta znak z vyrovnávacej pamäte (=> buffera ).
Pri príjme dát oznamuje tento bit LSR, že znak je pripravený
v prijímacom bufferi a že ho program môže prevziať, aby nebol prepísaný
ďalšim znakom. Výsledok z test bit0 = 1 znamená pripravenost
vstupných dát.
Napríklad sekvencia inštrukcii z Bfig816.asm:
|
|
mov |
dx, 3FDH |
|
ser1: |
in |
al, 1 |
|
|
jz |
ser1 |
Teraz už možno prečítať znak z IN_DATA_Registera
( adresa 3F8H) do AL:
|
citaj: |
mov |
dx, 3F8H |
|
|
|
in |
al, dx |
;=>AL=znak |
|
|
|
|
|
nbit
5 = THRE (Transmitter Holding
Register Empty),
ktorý signalizuje pripravenosť prijatia nového
znaku pre odvysielanie. Pri vysielaní test bit5 = 1 znamená,
že je Data register THR prázdny. Ak je bit5 = 0 je OUT_DATA_Reg = THR plný
a nemôže byť do neho uložený ďalší znak na odoslanie. Až keď je bit5 =
1 OUT_DATA_Reg = THR je voľný a možno do neho pripraviť ďalší znak. Po
zápise znaku sa bit5 automaticky vynuluje a znak sa presunie do registra
TSR (Transmitter Shift Register ), kde sa uskutoční prevod paralelného
znaku na sériovú postupnosť bitov, ktorá sa odvysiela. Počas vysielania
znaku z posuvného registra TSR možno zapisovať nový znak do Data_Reg =
THR.
Napríklad sekvenciou inštrukcii v Bfig816.asm:
|
|
mov |
dx, 3FDH |
|
|
ser2: |
in |
al, dx |
|
|
|
test |
al, 20H |
;test bit5 = 1? |
|
|
jz |
ser2 |
|
Teraz možno už poslať napríklad znak=“A” z (AL)
na OUT_DATA_Register (na adrese 3F8H):
|
mov |
dx, 3F8H |
|
|
mov |
al, "A" |
;=> výstup "A" |
|
out |
dx, al |
|
|
|
|
|
nbit
6 = TSRE (Transmitter Shift Register Empty),
ktorý signalizuje priebeh paralelne / sériovej
konverzie, počas ktorej obvod UART nevysiela znak. Pri vysielaní
namiesto bitu5 možno použiť test bit6 = 1, ktorý určí či
posuvný register TSR nie je zaneprázdnený prevodom a môže sa do neho uložiť
znak. Ak je Bit6 = 1 je posuvný register vysielača prázdny, lebo neprebieha
konverzia dát, takže v principe až dva znaky môžno súčastne pripraviť na
vysielanie:
-
prvý uložiť do posuvného registra TSR vysielača a
-
druhý do bufera THR.
Ak teraz dôjde k vysielaniu ako prvý ide na výstup
znak z posuvného registra TSR vysielača a bit6 = 0 sa vynuluje nakoľko
v THR už čaká pripravený ďalší znak. Počas vysielania znaku by sa mohol
zpísovať nový znak ale tento test to blokuje. Napríklad sekvencia inštrukcii
z seriel2.asm.
|
|
mov |
dx, 3FDH |
|
|
ser3: |
in |
al, dx |
|
|
|
test |
al, 40H |
;test bit6 = 1? |
|
|
jz |
ser3 |
|
Nasleduje výstup znaku, podobne ako v
predchádzajúcom prípade.
ÜRegister
stavu modemu - MSR (Modem Status Register)
podáva informáciu o stave liniek ovládajúcich spojenie. Bity 4 - 7 obsahujú
informáciu o stave signálov CTS, DSR, RI (Ring Indicator => Indikátor vyzváňania),
RLSD (Receive Line Signal Detect => signalizujúci detekciu nosnej frekvencie
po nadviazaní spojenia ) a Bit 0 - 3 obsahujú informáciu o zmene stavu
týchto signálov voči poslednému čítaniu. Dôležité sú predovšetkým :
Bit 5 - DSR (Data Set Ready)
|
= 0 Modem (PC) nepripravený |
|
= 1 pripravený k prevádzke |
Bit 4 - CTS (Clear to Send)
|
= 0 => znak nemôže byť
vyslaný |
|
= 1 => znak môže byť vyslaný. |
|
|
ÜRegister
identifikácie prerušenia - IIR ( Interrupt
Identifikacion Register ) poskytuje informáciu o aktuálnom stave neobslúžených
prerušení.
Bit 2 |
Bit 1 |
Bit 0 |
Význam |
1 |
1 |
0 |
Stav linky |
1 |
0 |
0 |
Prijaté dáta sú k dispozícii |
0 |
1 |
0 |
Prazdny register THR |
0 |
0 |
0 |
Stav modemu |
x |
x |
1 |
Nie je neobslúžené prerušenie |

«
Registre vyrovnávacej pamäte
Sú to registre (buffery), ktoré obsahujú nespracované
znaky prijaté alebo ktoré sa majú odvysielať. Existujú 2 registre vyrovnávacej
pamäte:
ÜPrijímací
register vyrovnávacej pamäte (Register
Receiver Buffer = Rx = IN_DATA_Register), v ktorom je uložený posledný
prijatý znak. Po prečítaní znaku indikuje register stavu linky LSR, že
vyrovnávacia pamäť je prázdna, pokiaľ nie je prijatý ďalší znak.
ÜVysielací
register vyrovnávacej pamäte (Register
Transmitter Holding = Transmitter Buffer = Tx = OUT_DATA_Register), ktorý
obsahuje ďalší znak, ktorý má byť vyslaný. Register stavu linky LSR indikuje,
kedy bol znak prijatý.
Funkciu registrov a vplyv dat uložených do príslušných
registrov demonštruje rezidentný program UARTS.com
, ktorý možno hocikedy aktivovať pomocou Right Shift + Cntr, resp help
pomocou uarts/?.

4. |
Metódy
realizovania sériového prenosu |
Sériový prenos dát možno naprogramovať pomocou
:
ÜMetódy
výziev (anglicky pooling), pri
ktorej sa v slučke najprv otestuje pripravenosť zariadenia a potom sa uskutoční
samotný prenos. Súčasťou inicializačného programu by malo byť aj zablokovanie
obsluhy prerušení pomocou nastavenie registra IER na nulu. Ak program vysiela
dáta tak musí opakovane testovať stav registrov LSR a MSR a ak
je vysielací bufer (Transmitter Buffer = OUT_DATA_Register ) prázdny a
signály spojenia sú v stave “H” vyšle ďalší znak. Tento postup sa v sľučke
opakuje dovtedy pokiaľ nie sú vyslané všetky znaky. Proces príjmu
dát je podobný. Najprv sa nastavia signály riadenia spojenia, ktoré
potrebuje druhé zariadenie a potom sa cyklicky testuje register
LSR na prijatý znak. Ak bol príjem znaku indikovaný tak sa prečíta z registra
vstupného bufera (Receiver Buffer = IN_DATA_Register). Súčasťou testovacej
sľučky by mal byť aj test vstupu z klávesnice. Obvod UART sám nespracováva
softwarový handshaking. Preto napríklad pri použití protokolu XON / XOFF
by mal byť súčasťou testovacej sľučky aj test prijatého znaku XON a XOFF.
ÜMetódy
prerušení
za predpokladu, že vopred bola rezidentne nainštalovaná príslušné časť
kódu programu obluhy prerušenia a tiež bol uložený príslušný ukazovateľ
na tento program do tabuľky vektorov prerušenia. Žiadosť o prerušenie možno
generovať pomocou nastavenia registra IER. Napríklad žiadosť IRQ4 z rozhrania
COM1 po zavedení do obvodu PIC 8259
vyvolá prerušenie INT(4+8)= INT 0CH. Ak je žiadosť o prerušenie softwarove
povolená pomocou inštrukcie STI môže byť akceptovaná zo strany CPU a treba
ako súčasť obslužného programu ďalej identifikovať zdroj prerušenia pomocou
prečítania obsahu IIR. Prerušenie môže identifikovať Data Ready, čo znamená,
že bol prijatý znak, alebo že register THR je prázdny a treba doň uložiť
znak na vyslanie, alebo aj ďalšie príčiny spojené zo stavom linky.
Vnútorné priority adaptera USART sú pevne nastavené.
Najvyššiu prioritu má stav linky, potom následne keď sú k dispozícii prijímané
dáta, keď je prázdny register THR a nakoniec najnižšiu prioritu má stav
modemu. Ďalšie prerušenia nie sú generované pokiaľ nie je resetované prvé
prerušenie. Prerušenia sa resetujú nasledovne:
-
Prerušenie vyvolané stavom prijimacej linky (RLS)
je resetované po prečítaní registra stavu linky LSR.
-
Prerušenie po prijatí údaja ( RDA) je resetované
po prečítaní registra prijimacej vyrovnávacej pamate (RB)
-
Prerušenie keď je prázdny register THR je resetované
po prečítaní registra IIR (pokiaľ spôsobilo prerušenie) alebo po zapísaní
do registra THR.
-
Prerušenie vyvolané stavom modemu (MS) je resetované
po prečítaní registra stavu modemu MSR.
Obslužný
program prerušenia by mal okrem vlastnej obsluhy najprv zistiť,
či bol už nainštalovaný správny obslužný program. Napríklad pomocou obsluhy
DOS INT 21H (funkcie AH = 35H, AL = No_INT), ktorá uloží do registrov ES:BX
adresu
začiatku existujúceho obslužného programu z tabuľky vektorových
prerušení. (Iný spôsob zadefinovania adresy obslužného programu ilustruje
príklad Bfig817.asm). Na základe tohto zistenia
možno buď modifikovať existujúci obslužný program alebo nainštalovať nový
obslužný program a uschovať adresu starého obslužného programu na obnovu
stavu, ktorý bol pred inštaláciou obslužného programu. Pre inštaláciu nového
obslužného programu možno použiť DOS INT 21H (funkciu AH = 25H, AL = No_INT),
ktorá uloží z DS:DX vektor nového obslužného programu.
Žiadosti o prerušenie IQR nevstupujú do obvodu
CPU priamo ale cez príslušný kontroler PIC (Priority Interrupt Controller)
riadiaci prioritu prerušení. Obvod PIC obsahuje register, do ktorého vstupujú
požiadavky na prerušenie od rôznych zariadení. Požiadavky IRQ3 a IRQ4 zo
sériových rozhraní sú štandardne zamaskované a nemôžu požadovať o prerušenie.
Preto pred započatím komunikácie cez sériové rozhranie ovládanej prerušením
treba ich najprv odmaskovať v PIC.
Ďalej netreba zabudnúť, že CPU sa bude zaoberať
s prerušením len ak má CPU uvoľnený prístup k príznaku IF
stavového registra príznakov (Flag
register). Príkaz STI uvoľní prístup CPU k flagu IF a pomocou príkazu
CLI možno v prípade potreby zabezpečiť, aby sa CPU nezaoberal prerušeniami,
napríklad ak vykonáva nejaké dôležité činnosti. Z architektúry osobného
počítača vyplýva tiež, že bit3 = OUT2 registra MCR ovládania modemu musí
byť nastavený na úroveň “H” (=> Bfig817.asm).

« |
Príklady
sériovej komunikacie na základe priameho programovania UARTu |
Bfig_8-16.asm
- Nastavenie parametrov seriového kanála pre prijem a vysielanie na úrovni
technických prostriedkov.
Príklad programovania sériového rozhrania na úrovni
technických prostriedkov - inicializácie UART (zadefinovanie rýchlosti
prenosu a formátu prenosu ) a základných procedúr pre príjem a vyslanie
znaku. Pripravenosť k príjmu znaku sa testuje pomocou bitu 0 (signál -
Received Data Ready) registra stavu linky LSR ( Line Status Register na
adrese com+5). Pripravenosť na vyslanie znaku sa testuje pomocou bitu 5
(signál THRE - Transmitter Holding Register Empty => či je v OUT_DATA_Reg
pripravený znak na vyslanie) registra stavu linky LSR.
Inicializácia UART spočíva v základných krokoch
od náveštia Init:
-
V zadefinovaní rýchlosti prenosu,
pomocou uloženia deliaceho pomeru do DATA registra ( pri nastavenom bite
DLAB = 1), v uvedenom prípade pre 1200 Bd čísla 0060H, v poradí LSB=60H,
MSB=0 ( na poradí ukladania nezáleží, pretože registre majú rozdielne adresy).
-
V zadefinovaní formátu prenosu do registra
riadenia linky LCR, v uvedenom prípade znakovo orientovaného prenosu 8
bit znakového rámca s 1 stopbit bez partity.
Týmto je inicializácia UART zakončená. Dalšia časť
od náveštia:
-
Send otestuje stavový register linky
LSR a ak je vysielací posuvný register prázdny uloží do neho znak na výstup.
-
Recv otestuje stavový register linky LSR
a ak je prijimací posuvný register prázdny príjme do neho znak zo vstupu.
Program má len demonštračný charakter, lebo po nainicializovaní
obvodu vyšle znak “a” cez TxD a prijme znak cez RxD a zakončí sa.
|
|
--------------------------------- |
Stacks
|
segment para stack |
|
|
db 64 dup("stack") |
|
Stacks
|
ends |
|
|
|
|
|
|
;-------------------------------- |
|
serial equ 2f8h |
;Port 8250 #2=COM2 u AT |
|
|
;--------------------------------- |
|
|
|
code
|
segment |
|
|
assume cs:code,ss:stacks |
|
async
|
proc far |
|
init: |
push dx |
;Úschova navrat do DOS |
|
sub ax,ax |
|
|
push ax |
|
|
mov dx, serial+3 |
;adresa LCR |
|
mov al, 80h |
;7bit DLAB = 1 |
|
out dx, al |
;Nastavenie 1200 Baud |
|
mov ax, 0060h |
;LSB = 60h |
|
mov dx, serial |
|
|
out dx, al |
|
|
mov al, ah |
|
|
inc dx |
;MSB = 0 |
|
out dx, al |
|
|
Mov dx, serial+3 |
;LCR |
|
Mov al, 00000011b |
;No parity, 1 stopbit,
8bit |
|
out dx, al |
|
|
|
;*******Vyslanie
znaku ****** |
|
Mov dx, serial+5 |
;Line status register
LSR |
send: |
in al, dx |
|
|
test al, 20h |
|
|
jz send |
|
|
mov al, "a" |
;znak "a" do Data reg |
|
mov dx, serial |
|
|
out dx, al |
;vyšle znak a |
|
|
;***** Prijem znaku
****** |
|
mov dx, serial+5 |
;Line status register
LSR |
recv: |
in al, dx |
;tu čaká na vyskyt znaku |
|
test al, 1 |
|
|
jz recv |
|
|
mov dx, serial |
|
|
in al, dx |
;prijem znaku |
|
Ret |
|
Async
|
endp |
|
Code
|
ends |
|
end
|
async |
|
|
|
--------------------------------------- |

Seriel2.asm-
Vstup / výstup znaku zo sériového rozhrania.
Modifikácia procedúry Bfig_8-16.asm. Odlišuje
sa spôsobom testovania pripravenisti na vyslanie znaku a použitím macra
portaus. Netestuje sa bit 5 registra stavu linky LSR (signál THRE - Transmitter
Holding Register Empty) ako v príklade Bfig_8-16.asm, ale v tomto príklade
sa testuje bit 6 registra stavu linky LSR (signál TSRE - Transmitter Shift
Register Empty => zaneprázdnenosť posuvného registra TSR, vykonávajúceho
prevod paralelného kódu na sériový).
basis
|
equ 3f8h |
;definovanie adries portov
=> COM1 |
tx_buff
|
equ basis |
|
div_lsb
|
equ basis |
|
div_msb
|
equ basis + 1 |
|
int_en
|
equ basis + 1 |
|
con
|
equ basis + 3 |
|
Status
|
equ basis + 5 |
|
finis
|
equ
'$' |
; znak, ktorý ukončí program |
|
;---------------------- |
makro pre výstup znaku |
portaus
|
macro port, wert |
; wert na port |
|
mov al, wert |
;hodnotu wert do al |
|
mov dx, port |
;adresa portu do dx |
|
out dx, al |
;výstup znaku |
|
Endm |
|
|
|
;---------------------------------------- |
code
|
Segment |
|
|
assume cs:code,ds:code, |
es:code |
start: |
|
|
|
mov ax, cs |
; Nastavenie segment registra |
|
mov ds, ax |
|
|
mov es, ax |
|
Ini: |
portaus con, 10101110b |
;7 Bit, Párna p,
2 Stopbit, DLAB=1 |
|
Portaus div_lsb, 0ch |
;Prenosová rýchlosť
9600 |
|
Portaus div_msb, 0 |
|
|
Portaus con, 00101110b |
;DLAB = 0 |
|
Portaus int_en,
0 |
; IER zablokovať
Interrupt |
schleife: |
|
|
|
mov ah, 1 |
; Read_KBD_and_Echo |
|
int 21h |
|
|
cmp al,finis |
; End ? =>$ |
|
jz fertig |
|
|
call aus |
;Výstup znaku |
|
jmp schleife |
|
fertig: |
|
|
|
mov ax, 4c00h |
; Návrat do DOS |
|
int 21h |
|
|
|
;------------------------------------------- |
aus: |
push ax |
; Znak uschovať |
|
mov dx, status |
;Test či možno vyslať |
w1: |
in al, dx |
|
|
test al, 01000000b |
;=>40H=>posuv reg
vysielača TSR |
|
jz w1 |
|
|
pop ax |
|
|
Portaus tx_buff, al |
;Výstup znaku |
|
ret |
|
code
|
Ends |
|
end
|
Start |
|
|
|
;------------------------------------------ |

Bfig_8-17.asm
- Asynchronny sériovy kanál pomocou prerušenia INT.
Príklad procedúry obsluhy prerušenia už vopred
nainicializovaného adaptéra UART. V prvej časti sa uloží do tabuľky adries
vektorová adresa obslužnej procedúry Int_handler a odmaskuje sa príslušné
prerušenie, aby potom mohol byť v prípade potreby volaný rezidentne v pamäti
uložený obslužný Int_handler.
Demonštračný príklad pre už vopred nainicializovaný
sériový kanál, v ktorom procedúra set_int postupne:
-
nastaví nový vektor INT (CS:IP pre Int_Handler) bez
toho, aby si uschoval pôvodný starý vektor, napríklad pre potreby deinštalácie,
-
uvoľní bit2 registra IER tak, aby prerušenie bolo
vyvolané po príjme znaku,
-
odmaskuje prístup žiadosti o prerušenie do obvodu
PIC 8259 (pomocou bit3=0 na adrese 21H), nastaví bit3=1,
-
v MCR tak, aby signál Out2 neblokoval prerušenia
z adaptéra ačaká v nekonečnej sľučke na vyvolanie INT (za predpokladu,
že nebol predtým použitý príkaz CLI = Clear Interrupt Flag ).
Obslužný program Int_handler testuje DR(Data
Ready) = bit2 registra LSR, aby identifikoval, či prerušenie spôsobil príjem
znaku do buffera. Ak je DR = 0 zdroj prerušenia bol iný a obslužný program
skončí. Predtým ešte oznámi obvodu PIC 8259 koniec obsluhy prerušenia EOI.
Ak je DR = 1 prijme znak a uloží ho do pamäťového bufera a súčastne zvýši
obsah počitadla adresy v bufere, aby nasledujúci znak neprepísal predchádzajúci
obsah bufera.
|
|
;----------------------------------- |
abso
|
segment at 0 |
|
org
|
0bh*4 |
;COM2 na 2F8 - FH-
IRQ3 |
|
;resp. org 0CH*4 |
;COM1 na 3F8 - FH - IRQ4 |
async_interupt
|
label word |
|
abso
|
ends |
|
|
|
;---------------------------------- |
stackseg
|
segment para stack |
|
|
db 64 dup("stack") |
|
stackseg
|
ends |
|
|
; |
------------------------------------ |
code
|
Segment |
|
assume
|
cs:code,ss:stackseg |
|
ser
|
equ 2F8H |
; Bufer Tx a Rx pre COM2 |
buffer_pointer
|
dw buffer |
;info kde je znak v bufferi |
|
|
;---------------------------------- |
set_int
|
proc Far |
|
|
sub ax,ax |
|
|
mov ds,ax |
;adresa tabulky vektorov
INT |
assume
|
ds:abso |
;seg pre adresu INT vektora |
|
Mov async_interupt, offset
int_handler |
;Nast INT adresy-
IP |
|
Mov async_interupt+2,cs |
;Nast INT adresy
-CS |
|
|
|
|
mov dx,ser+1 |
; register IER=>
Maska INT |
|
mov al,04h |
;bit2=>uvolní INT pre
prijem |
|
out dx,al |
|
|
|
|
|
in al,21h |
; Stav IMR 8259 |
|
and al,0f7h |
;bit3=0 =>int(3+8)= int0BH |
|
out 21h,al |
;INT 0BH odmaskovany |
|
|
|
|
mov dx,ser+4 |
;MCR |
|
Mov al,08h |
;out2 odblokuje
INT enable |
|
out dx,al |
;na async card |
|
|
|
here: |
jmp here |
;čaka zamrznuté na INT |
|
|
|
|
|
;--------------------------------- |
|
mov ah,4ch |
;Navrat do DOS |
|
int 21h |
|
set_int
|
endp |
|
|
|
;================== |
|
|
;INT handler pre
prijem znaku |
|
|
;================== |
|
|
|
int_handler
|
proc far |
|
|
push ax |
;Uschova Int registrov |
|
push bx |
|
|
push dx |
|
|
mov dx, ser+5 |
;Test LCR bit0=DR |
|
in al, dx |
|
|
test al, 01h |
;Či bol prijatý znak DataReady |
|
jnz int_return |
;DR=1 ak prijaty znak |
|
mov dx,ser |
;IN_Data buffer |
|
in al,dx |
;Prijat vstupný
znak |
|
mov bx,buffer_pointer |
|
|
mov cs:[bx],al |
;Uložit do buffera |
|
inc bx |
|
|
mov buffer_pointer,bx |
|
int_return: |
|
|
|
pop dx |
|
|
pop bx |
;Obnova |
|
mov al,20h |
;povel EOI pre PIC
8259 |
|
out 20h,al |
|
|
pop ax |
|
|
Iret |
|
int_handler
|
endp |
|
|
|
;---------------------------------- |
|
|
|
buffer
|
db 128 dup (0) |
;sem ukladá znaky |
Code
|
ends |
|
end
|
set_int |
|
|
|
;---------------------------------- |

Bfig_8-16V2a1.asm -
Seriová komunikácia s využitím technických prostriedkov obsluhy portov.
Obdoba sériovej komunikácie z Bfig_8-1-16V1.asm
realizovaná pomocou naprogramovania sériového rozhrania na úrovni technických
prostriedkov = > inicializácia rozhrania UART, príjem znaku a jeho uloženie
do buffera a vysielanie znaku v terminálovom režime .
Program je obdobou Bfig816V1.asm na úrovni hardwareovej
obsluhy sérioveho portu. Program predpokladá prepojenie sériových portov
2 počítačov a vykonáva funkciu terminálu => vstup z jedného počítača sa
zobrazuje na obrazovke druhého počítača a obrátene.
|
|
;------------------------------------ |
Stackseg
|
segment para stack |
|
|
db 256 dup("stack") |
|
Stackseg
|
ends |
|
|
|
;------------------------------------ |
|
|
|
Data
|
segment 'data' |
|
znak
|
db 0 |
; obsah sa vyšle |
Tznak
|
db 0,'$$' |
;sem uloží prijatý znak
+LF |
Data
|
ends |
|
|
|
|
|
|
;------------------------------------ |
Ser
|
equ 2f8h |
;adresa com2 portu |
|
|
|
Code
|
segment |
|
assume
|
cs:code,ss:stackseg,ds:data |
|
|
|
;------------------------------------ |
|
|
|
posli
|
proc |
;vyslanie znaku |
|
push ax |
|
|
push dx |
|
|
mov dx, ser |
;COM port |
|
mov al, znak |
;posielany znak |
|
out dx, al |
|
|
mov znak, 0 |
|
|
pop dx |
|
|
pop ax |
|
|
Ret |
|
posli
|
endp |
|
|
|
;----------------------- |
klav
|
proc |
;prečíta znak z
klávesnice |
|
push ax |
|
|
mov ah, 0bh |
;test stlačenia klávesu
0/ff |
|
int 21h |
|
|
cmp al, 0 |
|
|
je skok |
;ak nestlačený tak koniec |
|
mov ah, 08h |
;čita kláves |
|
int 21h |
|
|
mov znak, al |
|
skok: |
pop ax |
|
|
Ret |
|
klav
|
endp |
|
|
|
;------------------------ |
citaj
|
proc |
;príjem znaku |
|
push ax |
|
|
push dx |
|
|
mov dx,ser+5 |
;COM+5 |
|
in al, dx |
|
|
and al, 1 |
|
|
jz dalej |
;skonči ak nebol znak |
|
mov dx, ser |
;čitaj znak z COM |
|
in al, dx |
|
|
mov tznak, al |
;uloží prijatý znak do
tznak |
|
cmp al, 0dh |
;Bol prijatý CR? |
|
jne tlac |
;nie pokračuj |
|
mov tznak[1], 0ah |
;ano, pripoj LF |
tlac: |
lea dx, tznak |
;zobraz znak |
|
mov ah, 9h |
|
|
int 21h |
|
|
mov tznak, 0 |
;premaže $ po zobrazení |
|
mov tznak[1], '$' |
|
dalej: |
pop dx |
|
|
pop ax |
|
|
Ret |
|
Citaj
|
endp |
|
|
|
;------------------------------ |
|
|
;inicializácia
a vlastný |
PROGRAM: |
|
program emulácie
terminálu |
|
mov si, seg data |
|
|
mov ds,si |
;nastav ds |
|
|
|
|
MOV al, 10000011b |
;8b,1stop,0p,9600b/s |
|
mov dx, ser+3 |
;COM+3 = LCR |
|
out dx, al |
|
|
|
|
|
xor al, al |
|
|
mov dx, ser+1 |
;COM+1 |
|
out dx, al |
;najprv MSB potom
MSB |
|
mov al, 12 |
|
|
dec dx |
|
|
out dx,al |
|
|
|
|
|
mov al, 03h |
;priprava na prenos
dat |
|
mov dx, ser+3 |
;COM+3 = LCR |
|
out dx, al |
|
|
|
|
cykl: |
call klav |
;kod stlač kláv pošle
na COM |
|
cmp znak, 1bh |
;ESC ukonči program |
|
je koniec |
|
|
cmp znak, 0 |
;či treba vyslať znak |
|
je skok2 |
|
|
call posli |
;vyšle kód stlačeného
klávesu |
skok2: |
|
|
|
call citaj |
;zisti aký znak
bol prijatý |
|
jmp cykl |
;čitaj dalši znak z klavesnice |
koniec: |
|
|
|
xor al, al |
|
|
mov ah, 4ch |
;návrat do DOS |
|
int 21h |
|
Code
|
ends |
|
end
|
program |
|
|
|
-------------------------------------- |

DVMG.asm-
Zber dát na základe protokolu XON/ XOFF.
Zber dát z číslicového V - A metra DVMG-1005 na
základe protokolu XON/ XOFF.t.j. handshaking s pomocou programových
prostriedkov.
Číslicový volt - ampérmeter DVMG-1005 má svoj
sériový výstup dát pripojený k rozhraniu COM1. Na základe protokolu
XON / XOFF po vyslaní kódu 11h (ktorý možno realizovať z klávesnice
pomocou Ctrl+Q+Q) sa začnú vysielat z DVMG-1005 údaje. Po zadaní kódu 13h
(=> z klávesnice Ctrl+Q+S) sa vysielanie dát zakončí. Rýchlost generovania
vysielaných dát sa nastavuje vzadu DVMG prepínačom. Po stlačení ESC sa
program zberu dát zakončí.
Pri inicializácii rozhrania sa zadá deliaci pomer
pre 1200Bd a kódový rámec (bez parity, 1 stopbit, 7bit údaj) ktoré požaduje
DVMG.
|
|
;------------------------------------ |
stackseg
|
segment para stack |
|
|
db 256 dup("stack") |
|
Stackseg
|
ends |
|
|
|
;------------------------------------ |
|
|
|
Data
|
segment 'data' |
|
znak
|
db 0 |
;sem uložíi znak
ktorý treba vyslať |
tznak
|
db 0,'$$' |
;sem uloží prečítaný
znak |
Data
|
ends |
|
|
|
;------------------------------------ |
ser1
|
equ 3f8h |
;com1v PP06-25kolik konektor |
ser
|
equ 2f8h |
;com2 - 25 kolik v PC-AT |
|
|
;------------------------------------ |
|
|
|
Code
|
segment |
|
Assume
|
cs:code,ss:stackseg,ds:data |
|
Posli
|
proc |
|
|
push ax |
|
|
push dx |
|
|
mov dx, ser |
;DX=COM2=ser |
|
mov al, znak |
;posielany znak |
|
out dx, al |
|
|
mov znak, 0 |
;vymazanie stareho znaku |
|
pop dx |
|
|
pop ax |
|
|
Ret |
|
Posl i
|
endp |
|
|
|
;----------------------- |
Klav
|
proc |
|
|
push ax |
|
|
mov ah, 0bh |
;test stlačenia klavesu
0=>nebol stlačený |
|
int 21h |
;FFH=> v buferi je pripraveny
znak |
|
cmp al, 0 |
;=> finta lebo nečaká
na kláves |
|
je skok |
;ak nestlačeny tak koniec |
|
mov ah, 08h |
;čita ASCII klavesu bez
zobrazenia |
|
int 21h |
|
|
mov znak, al |
;uloží ASCII znak |
skok: |
pop ax |
|
|
Ret |
|
klav
|
endp |
|
|
|
;------------------------ |
citaj
|
proc |
|
|
push ax |
|
|
push dx |
|
|
mov dx, ser+5 |
;COM+5 |
|
in al, dx |
|
|
and al, 1 |
|
|
jz dalej |
;skonči ak nebol |
|
mov dx, ser |
;čitaj znak z COM |
|
in al, dx |
|
|
mov tznak, al |
|
|
cmp al, 0dh |
;Bol prijaty CR ? |
|
jne tlac |
;nie pokračuj |
|
mov tznak[1], 0ah |
;Ak CR tak pripoj LF |
tlac: |
lea dx, tznak |
;zobrazí prečítany znak |
|
mov ah, 9h |
|
|
int 21h |
|
|
mov tznak, 0 |
;vymaže prečítany znak |
|
mov tznak[1],'$' |
;obnova pôvodneho |
dalej: |
pop dx |
|
|
pop ax |
|
|
Ret |
|
citaj
|
endp |
|
INICIAL:
|
|
|
|
mov si, seg data |
|
|
mov ds, si |
;nastav ds |
|
mov dx, 37ah |
|
|
mov al, 02 |
|
|
out dx, al |
|
|
mov al, 10000010b |
;DLAB=1 v LCR=com+3 |
|
mov dx, ser+3 |
;=> pre uloženie frekvencie |
|
out dx, al |
|
|
xor al, al |
;Pre 1200 Bd
je: |
|
mov dx, ser+1 |
;MSB=0 do COM+1 |
|
out dx, al |
|
|
mov al, 60h |
|
|
dec dx |
;LSB=60h do COM |
|
out dx, al |
;D4,3=00; D2=0 ;D1,0=10 |
|
mov al, 02h |
;0 parit;1 stopbit;7bit
data |
|
mov dx, ser+3 |
;DLAB=0 do LCR=COM+3 |
|
out dx, al |
|
cykl: |
call klav |
;ASCII stlač kláv pošle
na COM2 |
|
cmp znak, 1bh |
;ESC ukonči program |
|
je koniec |
|
|
cmp znak, 0 |
;nestlačený kláves |
|
je skok2 |
|
|
call posli |
;vyšle kód stlačeného
klavesu |
skok2: |
call citaj |
;zisti aký ASCII
znak bol prijatý |
|
jmp cykl |
;čítaj další znak z klávesnice |
koniec: |
xor al, al |
|
|
mov ah, 4ch |
;návrat do DOS |
|
int 21h |
|
code
|
ends |
|
end
|
inicial |
;--------------------------------------- |

Meranie.asm
- zber dát sériovým spôsobom s ukladaním výsledkov do súboru.
Je to úprava programu Dvmg.asm pre zber dat z
2 V/A metrov pre úlohu praktika 4 - Franckov - Hertzov experiment, v ktorej
je treba merať V-A charakteristiku žiarovky . Oba V/A metre su pripojene
na jediný sériový kanál COM1 počítača PP06, lokalizovaný na adrese 3F8H-FH.
(PC PP06 má totiž len jeden port COM1. V inom variante tejto úlohy s PC
AT sa používajú oba porty COM1 a COM2.) Zber dát z číslicových prístrojov
DVMG-1005 sa prepina pomocou bitu PC2 z portu tlačiarne na adrese 37AH.
Namerané dáta sa uložia do súboru C:\qpro\praktik\meranie.asc a neskôr
sa vyhodnocujú iným programom. Jednotlivé meranie sa zaháji vyslaním príslušných
signálov podľa protokolu XON/XOFF, ktoré sa v danom prípade vyšľú po stlačení
medzerníka. Koniec merania nastane po zadaní ESC.
stackseg
|
Segment para
stack |
|
|
db 256 dup("stack") |
|
stackseg
|
ends |
|
|
|
;--------------------------------- |
Data
|
segment 'data' |
|
znak
|
db 0 |
;sem uloži vyslaný znak |
tznak
|
db 0,'$$',0ah |
;sem uloži prijatý znak |
Sprava
|
db
57 dup(0),'$$' |
|
sprava1
|
db 26 dup(0),0Dh,0Ah,'$$' |
|
sprava2
|
db "Zaciatok",29
dup(0), "Koniec",0dh,0ah |
;bufer pre newfile |
handle
|
dw ? |
;handle pre newfile |
newfile
|
db "C:\qpro\praktik\" |
;path |
heslo
|
db "meranie" |
;heslo 8 znakov |
|
db ".asc",0 |
;verzia ASCIZ tvar |
prep
|
db 2 |
;prepinac |
oznam
|
db 0ah,0ah,'Ak
si pripraveny, stlac medzernik ( ESC -
db koniec',0dh,0ah,'$$' |
Data
|
ends |
|
|
|
;------------------------------- |
ser
|
equ 3f8h |
;adresa com1 portu |
par
|
equ 37ah |
;port C tlačiarne |
|
|
;================ |
code
|
segment |
|
Assume
|
cs:code,ss:stackseg, |
ds:data,es:data |
Tlac
|
proc |
|
|
push ax |
|
|
lea dx, tznak |
|
|
mov ah, 9h |
|
|
int 21h |
;zobrazi tznak na obrazovku |
|
pop ax |
|
|
Ret |
|
tlac
|
endp |
|
|
|
;--------------------------------- |
cit2
|
proc |
|
|
mov dx, ser+5 |
|
|
In al, dx |
|
|
and al, 1 |
;je vyslany znak? |
|
Jz |
; nieje |
|
Mov dx, ser |
|
|
In al, dx |
;prijem znaku |
|
Mov tznak, al |
|
Nieje: |
ret |
|
cit2
|
endp |
;-------------------------------------- |
zmena
|
proc |
|
|
Push ax |
|
|
Push dx |
|
|
xor prep, 2 |
;nastav prepinač |
|
Mov dx, par |
|
|
Mov al, prep |
|
|
Out dx, al |
;prepni PC=1, resp PC=0 |
|
Mov cx, 1000h |
|
|
Mov al, 0 |
|
kl: |
Add ax, 1 |
|
|
loop kl |
;čakaj na prepnutie |
|
mov cx, 0A000h |
|
Opakuj: |
Mov znak, 11h |
|
|
call posli |
;začni vysielat XON |
|
Call cit2 |
;načitaj úvodné znaky |
|
Loop opakuj |
|
dok: |
call cit2 |
|
|
cmp tznak, 0ah |
|
|
jne dok |
;čitaj až do konca riadku |
|
cmp prep, 2 |
;ak je zapisaný len prvý
údaj, |
|
je gg |
;pokračuj v merani |
|
mov znak, 13h |
;ak sú zapisané oba údaje
=.>stop |
|
call posli |
;prestaň vysielať |
|
lea dx, oznam |
|
|
Mov ah, 9 |
|
|
int 21h |
;a zobraz oznam o stlačení |
gg: |
pop dx |
|
|
pop ax |
|
|
ret |
|
zmena
|
endp |
|
|
|
;--------------------------------------- |
posl i
|
proc |
|
|
Push ax |
|
|
Push dx |
|
|
Mov dx, ser |
;DX=COM1=ser |
|
Mov al, znak |
;posielany znak |
|
Out dx, al |
|
|
mov znak, 0 |
;vymazanie starého znaku |
|
Pop dx |
|
|
Pop ax |
|
|
Ret |
|
posl i
|
endp |
|
|
|
;----------------------- |
klav
|
proc |
|
|
Push ax |
|
|
mov ah, 0bh |
;test stlač klavesu 0=>nebol |
|
int 21h |
;FFH=> v buferi je znak |
|
Cmp al, 0 |
|
|
je skok |
;ak nestlačeny koniec |
|
mov ah, 08h |
;čita ASCII kláves bez
zobraz |
|
Int 21h |
|
|
mov znak, al |
;uloží ASCII znak |
|
cmp znak, 20h |
|
|
jne skok |
;ak bol stlačený SPACE |
|
mov znak, 11h |
;uloži 11h |
skok: |
Pop ax |
|
|
Ret |
|
klav
|
endp |
|
|
|
;------------------------ |
citaj
|
proc |
|
|
Push ax |
|
|
Push dx |
|
|
Mov dx, ser+5 |
|
|
In al, dx |
|
|
and al, 1 |
|
|
jz dalej |
;návrat, ak nebol vyslaný
znak |
|
Mov dx, ser |
|
|
In al, dx |
|
|
mov tznak, al |
;ulož tznak |
|
cmp al, 60d |
;medzera miesto < |
|
Jne ok |
|
|
Mov al, 20h |
|
ok: |
cmp al, 62d |
;medzera miesto > |
|
Jne uloz |
|
|
mov al, 20h |
|
uloz: |
mov ds:[si], al |
; Tu sa ukladá do bufera |
|
Inc si |
|
|
Cmp al, 0ah |
|
|
Jne pis |
|
|
mov znak, 13h |
;koniec 1 spravy |
|
Call posli |
|
|
Push ds |
|
|
pop es |
|
|
lea si, sprava |
;na začiatok správy |
|
lea di, sprava1 |
|
|
add si, 3 |
;na štvrtý znak správy
= prvé čislo |
|
mov cx, 0Dh |
;kopir bude 13 znakov |
|
cmp prep, 0 |
|
|
jnz p2 |
;prvý údaj sa meral? |
|
rep |
;áno |
|
movs sprava1, sprava |
;zkopiruj údaj => 1 meranie |
|
Jmp sk |
|
p2: |
add di, 0Dh |
;druhý údaj - zapisuje
az za prvý |
|
Rep |
|
|
movs sprava1, sprava |
;zkopiruj údaj =>2 meranie |
|
call write_handle |
;všetko zapiš do meranie.asc |
sk: |
call zmena |
;prepni pristroje |
|
lea si, sprava |
;začiatok novej správy |
pis: |
Call tlac |
|
|
mov tznak, 0 |
;vymaž prečítany znak |
|
mov tznak[1], '$' |
;obnova pôvodneho |
dalej: |
Pop dx |
|
|
pop ax |
|
|
Ret |
|
citaj
|
endp |
|
|
|
;------------------------------ |
subor
|
proc |
|
create_handle: |
|
;založi súbor |
|
Mov dx, offset newfile |
|
|
mov cx, 0 |
;atribúty súboru |
|
Mov ah, 3ch |
|
|
Int 21h |
|
|
Ret |
|
|
|
|
open_handle: |
|
;otvori subor (newfile) |
|
mov dx, offset newfile |
|
|
mov al, 2 |
;kód pristupu k súb pre
zápis |
|
Mov ah, 3dh |
|
|
Int 21h |
|
|
Ret |
|
|
|
|
write_handle: |
|
;zapiše do súboru |
|
mov bx, handle |
;súbor špecifikovaný handle |
|
mov dx, offset sprava1 |
;bufer DTA =>ds:dx |
|
mov cx, 28d |
;počet prenášaných bajtov |
|
Mov ah, 40h |
|
|
Int 21h |
|
|
Ret |
|
|
|
|
close_handle: |
|
|
|
Mov bx, handle |
|
|
Mov ah, 3eh |
|
|
Int 21h |
|
|
Ret |
|
subor
|
Endp |
|
|
|
;------------------------------ |
INICIAL: |
|
|
|
Mov si, seg data |
|
|
Mov ds, si |
|
|
Mov si, offset sprava |
|
|
Mov al, 10001010b |
;DLAB=1 v LCR=com+3 |
|
mov dx, ser+3 |
;=> pre uloženie frekvencie |
|
Out dx, al |
|
|
xor al, al |
;Pre 1200 Bd je: |
|
mov dx, ser+1 |
;MSB=0 do COM+1 |
|
out dx, al |
|
|
mov al, 60h |
|
|
dec dx |
;LSB=60h do COM |
|
out dx, al |
;D4,3=00; D2=1 ;D1,0=10 |
|
mov al, 0ah |
;01-p parit;2 stopbit;7bit
data |
|
mov dx, ser+3 |
;DLAB=0 do LCR=COM+3 |
|
out dx, al |
|
|
|
;--------------------------------- |
|
Call create_handle |
|
|
Call open_handle |
|
|
Mov handle, ax |
|
|
Call zmena |
|
|
Mov tznak, 0ah |
|
|
Call tlac |
|
|
Mov tznak, 0 |
|
cykl: |
call klav |
;ASCII stlač klávesu pošle
na COM1 |
|
cmp znak, 1bh |
;ESC ukonči prg |
|
Je koniec |
|
|
cmp znak, 0 |
;nestlačený kláves |
|
Je skok2 |
|
|
call posli |
;vyšle kód stlač klávesu |
skok2:
|
call citaj |
;zistí aký ASCII znak
bol prijatý |
|
jmp cykl |
;čítaj další znak z klavesnice |
koniec:
|
xor al, al |
|
|
call close_handle |
|
|
Mov ah, 4ch |
;navrat |
|
Int 21h |
|
code
|
ends |
|
end
|
inicial |
|

|