Ú-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).


 
2. Handshaking

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
 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
 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)  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.
 
 
  Napr.  
   
mov 
ah, 3
   
int 
21H









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)
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í a
  • vysielací.
Ü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  



 
 
 


 

[Návrat]