SOFTWARE mikro-POČÍTAČOV triedy I 8051(I4051,I2051)


Obsah tém zameraných na Programovanie mikropočítačov triedy I8051 v asambleri . 

  1. Začíname STEP BY STEP (krok za krokom).
    1. Postup krokov k vytvoreniu aplikácie.
  2. Píšeme prvé programy
    1. Príklad 1 - Prenosové inštrukcie
    2. Príklad 2 - Sériová komunikácia
    3. Príklad 3 - Ručný obojsmerný čítač so zobrazením v hex./dek. sústave
    4. Príklad 4 - Rotácia segmentu na displeji so zmenou otáčania
    5. Príklad 5 - Semafor 3 cestnej kryžovatky
    6. Príklad 6 - Použitie časovača ne generovanie 1s časových intervalov
    7. Príklad 7 - Použitie časovača pre dvojciferný dekadický čítač 00 až 99 s 1-sek. intervalom
    8. Univerzálny ukažkový program sériovej komunikácie 
          a obojsmerného čítača hexadec.čísel
  3. Prerušovací systém
    1. Externé prerušenie.
    2. Prerušenie časovačmi.
    3. Prerušenie sériovou linkou.
  4. Schéma prepojenia riadiacich registrov

Návrat na začiatok Začíname STEP BY STEP (krok za krokom).

Aby sa z vás stal dobrý programátor mikropočítačových aplikácií v assambleri potrebujete zvládnuť tri veci:

  1. Poznať hardware mikropočítača a elementárnych súčiastok tvoriace zariadenie. Tu sme na tej najnižšej úrovni kde programovo budete riadiť stavy binárnych údajov na tom ktorom vodiči zbernice. 
  2. Poznať inštrukčný súbor mikropočítača a vedieť ako sa príkazy prejavujú na výstupných pinoch mikroprocesora. Znamená to, že potrebujete poznať časovanie a priebehy signálov, podľa toho ako ich taktuje časový generátor mikroprocesora. (ALE, RD*,WR*,PSEN*)
  3. Ovládať vývojové nástroje na tvorbu software a jeho simulovanie.

Návrat na začiatok Postup krokov k vytvoreniu aplikácie (projektu).

Vytvorenie mikropočítačového projektu má minimálne dve etapy. 

Prvá - hardwarová - má za úlohu:  

  • riešiť harwarovú konštrukciu zohľadňujúcu potrebu praktickej objednávky, napr. počítačom riadený stroj resp. ovládanie vykurovacieho systému. Riešenie pozostáva zvyčajne z výkonovej časti a senzorov a z  riadiacej časti, ktorej centrom je mikropočítač. 
  • Po tom, ako je vytvorená schéma zapojenia,  navrhnú sa plošné spoje a vyrobia sa. 
  • Nakoniec sa osadia súčiastky do plošných spojov a napájajú sa. Zariadenie je pripravené na testovanie a programovanie. 

K ďaĺšej práci - softwarovej - potrebujete:

  • ZDROJ napájania pre dosku s mikropočítačom, 
  • počítač s operačným systémom DOS, resp. WINDOWS
  • programové vývojové prostredie pre tvorbu a odlaďovanie softvéru,
  • zariadenie na "napálenie" programu do pamäte mikroprocesora resp. do ROM pamäte mikropočítačovej dosky. 

Programové vývojové prostredie pre tvorbu software mikropočítača pozostáva jednak zo zariadení (počítača a napalovačky EPROM) a z niekoľkých vývojových programov, ktoré umožňujú nasledovné práce:

  1. Písanie zdrojového textu programu v assambleri - textový editor napr. v prostredí  Norton Commander-a, EDIT pod DOS, ... a iných.
  2. Preklad  programu do BIN, resp. OBJ tvaru a tvorba LISTINGU t.j. protokol o preklade aj so strojovými kódmi. - kompilátor A51.EXE 
  3. Odlaďovanie programu v prostredí simulovania programu  - SIM51.EXE
  4. Napálenie programu do EPROM pamäte mikroprocesora pomocou programu  - PATMEL.EXE

Niektoré vývojové programy integrujú všetky tieto čiastkové programy do jediného vývojového prostredia ktoré sa spúšťa jediným príkazom a všetky tieto čiastkové operácie vykonáva v réžii jednoho programu.

 

Návrat na začiatok Píšeme prvé programy.

Každý program najprv musíme napísať v zdrojovom texte, a tento skompilujeme programom, ktorý nám vytvorí strojové kódy uložené v binárnom súbore. V našom prípade budeme používať kompilátor assamblera A51.EXE. Toto je program, ktorý spracúvava text zdrojového programu napísaného v Assambleri I8051, I4051 a I2051. 

Základné pravidlá pri písaní zdrojového textu: 

  1. Program začína inštrikciou $MOD2051 resp. $MOD8051 , ktoré slúžia na pripojenie tabuľky symbolických názvov, tak, aby sme neboli nútení zapisovať názvy registrov a bitov v hexadecimálnom kóde presne podľa ich umiestnenia v časti RAM pamäte vyhradenej registrom špeciálnych funkcií (SFR) , ale aby sme ich mohli písať symbolicky (napr. symboly EA resp. IE.7  zodpovedajú adrese 0AFH umiestnenia bitu č.7 v registri IE povolujúceho funkciu prerušovacieho systému)
  2. Program môžeme doplňovať komentármi ktoré začínajú znakom bodkočiarka ( ; ). 
  3. Adresu pre uloženie inštrukcie do CODE pamäti  nastavujeme riadiacim príkazom pre kompilátor ORG 0xxxxH, kde 0xxxxH je hexadecimálna adresa.
  4. Viac textových znakov do pamäťovej bunky vkladáme ako reťazec znakov medzi uvodzovkami, alebo ich píšeme ako samostatne kódy binárne, dekadické, osmičkové alebo hexadecimálne, oddelené od seba čiarkou príkazom  DB  "AB", 041H, 01000001B, 101O, 65 ( = DB "ABAAAA" ).  
  5. Bitové operácie v príkazoch assamblera môžeme nastavovať 3 ekvivalentnými spôsobmi (vďaka $MOD2051 a $MOD8051):
    • Názvom bitu v registri SETB PX0 
    • Názvom registra a číslom bitu  SETB IP.0 
    • Adresou bitu SETB #0B8H
  6. Registre môžeme nazvať v príkazoch assamblera:
    • Názvom registra  MOV A, #0
    • Použitím adresy umiestnenia registra v RAM pamäti v oblasti registrov špeciálnych funkcií  MOV 0E0H, #0
  7. Miesto písania adries, v skokoch a inštrukciách, môžeme používať symbolické adresy formou návästí - identifikátory umiestnené na začiatku riadku ukončené ( : ). Príklad:   START:  SJMP START

 

Príklad_1: Návrat na začiatok

Prenosové inštrukcie

Uskutočňujú prenos operandu z registra do registra  A, B, R0,R1,R2,R3,R4,R5,R6,R7, 
P0,P1,P2,P3,DPH,DPL,SP,TH1,TL1,TH0,TH1,TMOD,PCON,SCON,SBUF, direct

 
 MOV A,#35  ; prenes priamy operand inštrukcie s dekadickou hodnotou 35 do Acc
 MOV A,R1   ; prenes obsah registra R1 do registra A
 MOV R1,A   ; prenes obsah registra A do registra R1
 MOV R1,35  ; prenes obsah bunky 35 do registra R1
 MOV A,@R0  ; prenes obsah bunky adresovanej registrom R0 do registra A 
 
Príklad_2: Návrat na začiatok

Príklad sériovej komunikácie. 

Program v prvej fáze inicializuje mód sériovej linky a mód časovača T1 a povolia sa prerušenia sériovej linky. Následne sa vstúpi do uzavretej slučky neustále opakovane vysielajúcej dva znaky.

Zdrojový text programu
Príklad_3: Návrat na začiatok

Príklad ručného obojsmerného čítača 
zobrazujúceho v dekadickej resp. hexadecimálnej sústave. 

Program najprv inicializuje prerušenia od vstupov INT0 a INT1. Prerušenie bude vyvolané zmenou stavu týchto vstupov z logickej "1" do logickej "0". Toto zabezpečia dve tlačidlá spínajúce voči zemi. Vyvolané prerušenia inkrementujú resp. dekrementujú počítadlo v registri B. Po každej zmene sa programovo kontroluje výsledok a upraví tak, aby hodnota v registri B neprekročila hranicu rozsahu kódovej tabuľky ktorá obsahuje zobrazenie číslic na displeji.  Nakoniec program zobrazí na displeji výsledok vo forme dekadického resp. hexadecimálneho čísla . 

Zdrojový text programu
Príklad_4: Návrat na začiatok

 UNIVERZÁLNY DYNAMICKÝ RIADENÝ PROCES - Príklad rotácie segmentu na displeji s možnosťou prepínania smeru pomocou dvoch tlačidiel . 

Program najprv inicializuje prerušenia od vstupov INT0 a INT1. Prerušenie bude vyvolané zmenou stavu týchto vstupov z logickej "1" do logickej "0". Toto zabezpečia dve tlačidlá spínajúce voči zemi. Vyvolané prerušenia nastavia alebo resetujú príznakový bit s adresou 00 v bitovej oblasti RAM pamäti. V hlavnom programe sa následne vyhodnotí stav a podľa neho sa inkrementuje (+1) alebo decrementuje (-1) obsah B registra ktoré slúži ako počítadlo zobrazovanej pozície v Tabuľke ktorej obsah sa zobrazuje na displeji. Po každej zmene sa programovo kontroluje výsledok a upraví tak, aby hodnota v registri B neprekročila hranicu rozsahu kódovej tabuľky ktorá obsahuje kódy zobrazovane na displeji. Rýchlosť rotácie je daná konštantami podprogramu Pauza.  

Zdrojový text programu 1
Zdrojový text programu 2
Príklad_5: Návrat na začiatok

Príklad semaforov 3 cestnej križovatky s dvomi hlavnými cestami   
s možnosťou prednostnej zelenej pre mestské autobusy na hlavnej ceste. 

Program najprv inicializuje prerušenia od vstupov INT0 a INT1. Prerušenie bude vyvolané zmenou stavu týchto vstupov z logickej "1" do logickej "0". Toto zabezpečia dve tlačidlá spínajúce voči zemi. Vyvolané prerušenia nastavia príznakový bit s adresou 00 resp. 01 v bitovej oblasti RAM pamäti. V hlavnom programe sa pravidelne inkrementuje POZÍCIA v tabuľke a zobrazuje sa stav v danom riadku na semaforoch. Pri každej inkrementácii POZÍCIE v tabuľke sa otestuje jednak či sme sa nedostali za povolený rozsah Tabuľky a jednak či nebola prijatá žiadosť o zmenu poradia obsluhy zelenej na jednotlivých cestách.  Rýchlosť zmeny je daná konštantami rotácie je daná konštantami podprogramu Pauza resp. pomer dĺžky jednotlivých kombinácií sa dá znásobiť opakovaným počtom rovnakých riadkov v Tabuľke.  

Zdrojový text programu 1
Zdrojový text programu 2
Príklad_6: Návrat na začiatok

Ukažka využitia časovača na generovanie 1s časových intervalov

Program využíva časovač na to, aby po vynulovaní príznaku SEKUNDA po časovom intervale v dĺžke + sekundy nastavil príznak SEKUNDA na logickú jednotku. V programe použitý podprogram DELAY1S v cykle čaká na nastavenie príznaku SEKUNDA. Po jeho objavení podprogram skončí. program využíva pauzu s dĺžkou 1s na prepínanie obsahu P1 portu tak, že 1sek svieti horna polovica a druhú sekundu spodná polovica bitov portu cyklicky donekonečna.    

Zdrojový text programu
Príklad_7: Návrat na začiatok

Využitie časovača pre dvojciferný dekadický čítač 00 až 99 s 1-sek. intervalom

Program využíva časovač na to, aby po 10 milisekundách prepínal displej a zobrazoval striedavo jednu a potom druhu polovicu dvojciferného dekadického údaja. Okrem toho počíta 100 prerušení ktoré zodpovedajú 1 sekunde a po tomto intervale zvýši obsah dekadického čítača o 1. Čítač využíva úpravu obsahu príkazom DA A, nakoľko zobrazované údaje používaju dekoder BCD kódu zobrazujúci iba dekadické cifry.    

Zdrojový text programu

Návrat na začiatok Univerzálny ukážkový program.

Tento ukážkový program má za úlohu spojiť a využiť všetky možnosti mikroprocesora I2051. Program sa realizuje na školskej skušobnej doske, ktorá má nasledovnú konfiguráciu. Na doske sú tri tlačidlá dávajúce priamu a negovanú hodnotu. Ďalej je tu sedem segmentový dvojitý displej riadený - t.j. zapínaný signálom 0 privedený na vstup anoda1 a anoda2. Displej má jedinú zbernicu a podľa toho ktorá anoda obsahuje hodnotu 0 rozsvieti znak na danej pozícii.

Program robí nasledovnú činnosť. Pri resete vloží do registra B hodnotu 7 (tak sme sa rozhodli) a obsah tohto registra zobrazí ako hexadecimálne číslo na dvojitom displeji. Tlačítkom 1 na doske obsah B registra zvyšujeme o 1 a tlačítkom 2 ho znižujeme. Stav vidíme na displaji. Pri stlačení tlačidlá 3 sa zobrazia tri vodorovné čiary, ktoré po uvolnení tlačidlá zmiznú a obnoví sa pôvodný obsah displeja. Pri zmene obsahu displeja sa obsah B registra zároveň odošle do druhého mikropočítača na identickej doske s úplne identickým programom. Program vykonáva rovnakú činnosť v oboch mikropočítačoch, takže zmeny sa prenášajú navzájom. 

Program využíva prerušenie od dvoch tlačítiek na vyvolanie obsluhy, ktorá zvyšuje a znižuje B register. Zároveň vyvolá podprogram, ktorý po sériovej linke novú hodnotu odošle do druhého mikropočítača. Príznak odoslania vyyvolá prerušenie, ktoré však program bude ignorovať. Naopak po príchode znaku po sériovej linke obslúži prerušenie príjmu dát po sériovej linke a došlé dáta vloží namiesto starých do registra B. Časovač 1 je využívaný pre nastavenie prenosovej rýchlosti 2400 bodov. Časovač 0 je využívaný na opakované prepínanie displejov tak, aby sa polovičku doby zobrazoval horný "nible" (nible=štvorica bitov reprezentujúca jeden hexadecimálny znak v dátovom slove) B registra v ľavom segmente displeja a druhú polovičku času sa zobrazoval spodný nible B registra v pravom segmente displeji. Tato výmena prebieha tak rýchlo, že ľudské oko zmeny nevníma.  

Doska má vyvedené signály portu P3 a P1 na konektory ktoré možno drôtmi prepojiť. Takto sme pripojili tlačítko 1 a 2 na dva vstupy externého prerušenia mikroprocesora a stav tychto tlačítiek program vyhodnocuje vyvolaným prerušením. Stav tlačidlá 3 vyhodnocujeme v nekonečnom cykle hlavného programu. Port P1 sme využili na budenie sedemsegmentového displeja  a to tak, že anodu riadime z portu P3 - využívame tam piny na ktoré by sme pripájali externý zdroj časových signálov pre časovače - kedže ich nepotrebujeme využívame dva voľné bity portu P3 na riadenie anód. Sériovú linku využívame na úrovni TTL t.j. krátkou trojlinkou obsahujúcou Zem, TxD a RxD zapojenými do kríža TxD jednoho na RxD druhého priamo z výstupov jednoho na druhý mikropočítač navzájom. 

Po pochopení tohto programu môžete využívať všetky technické vymoženosti mikropočítača v ďaľších aplikáciách bez problémov sami. 

Zdrojový text programu

         

Návrat na začiatok Prerušovací systém.

Prerušovací systém používa 5 príčin prerušení:
  1. Externé prerušenie od vstupu INT0  
  2. Pretečenie časovača 0
  3. Externé prerušenie od vstupu INT1
  4. Pretečenie časovača 1
  5. Jednotka sériového portu UART  
Obsluha prerušenia na adrese:
  1. 0003H
  2. 000BH
  3. 0013H
  4. 001BH
  5. 0023H

Návrat na začiatok Externé prerušenie.

INT0
INT1
Externé vstupy mikropočítača INT0 (port P3.2) a INT1  (port P3.3) vyvolávajú prerušenia z dôvodu prechodu signálu na ich vstupe z neutrálnej hodnoty "1" na hodnotu "0". Na funkcii prerušovacieho systému sa podielajú 3 pracovné registre:
  1. IE register (Interupt Enable) - (adresa: 0A8h) Register povolenia prerušení s nasledovným významom pracovných bitov:
    7 6 5 4 3 2 1 0
    IE.7 IE.6 IE.5 IE.4 IE.3 IE.2 IE.1 IE.0
    EA -- ET2 ES ET1 EX1 ET0 EX0
    0AFH   0ADH 0ACH   0ABH   0AAH 0A9H 0A8H
    povolenie=1
    zakázanie=0
            povolenie=1
    zakázanie=0
      povolenie=1
    zakázanie=0
    Generálne
    povolenie
      Timer 2 UART  Timer1 vstup ext.preruš. INT1 Timer 0 vstup
    .ext.preruš. INT0

  2. IP register (Interupt Priority) - (adresa  0B8H ) Register riadenie priority prerušení 
    7 6 5 4 3 2 1 0
    IP.7 IP.6 IP.5 IP.4 IP.3 IP.2 IP.1 IP.0
    --- --- PT2 PS PT1 PX1 PT0 PX0
        0BDH 0BCH 0BBH 0BAH 0B9H 0B8H
              základná=0
    vyššia=1
      základná=0
    vyššia=1
        Timer 2      UART Timer1 INT1 Timer 0 INT0

  3. TCON (TimerCONtrol) - (adresa 088H) Register riadenia časovača a ext. prerušení  (LOW 4 bity)
    7 6 5 4 3 2 1 0
    TCON.7 TCON.6 TCON.5 TCON.4 TCON.3 TCON.2 TCON.1 TCON.0
          IE1 IT1 IE0 IT0
        08BH 08AH 089H 088H
            príznak prerušenia INT1 v režime hranou riadenie typu prerušenia INT1 hranou=1 úrovňou=0 príznak prerušenia INT0 v režime hranou  riadenie typu prerušenia INT0 hranou=1 úrovňou=0
    x

 Poznámka: V programoch môžeme používať rovnako názov registra IE ako aj adresu 0A8H pri použití registra A na nastavenie príznakov. 
Rovnako sa dajú použiť v bitových inštrukciách symblické názvy IE.0 až IE.7, a taktiež  sa dajú použiť aj priamo adresy 0A8H až 0AFH. Všetky spomenuté metódy sú rovnocenné, funkčné a zameniteľné. 

Tie isté pravidlá platia aj pre použitie IP registra a TCON registra.

 Poznámka: Register TCON je určený pre riadenie časovača. Napriek tomu 4 spodné bity sú využívané externými prerušeniami INT0 a INT1. 
V režime IT0=1 resp. IT1=1 t.j. pri riadení hranou, nastavujú sa automaticky príznaky IE0 resp. IE1 čím mikropočítač zaregistruje udalosť trvajúcu veľmi krátku dobu. Príznak vyvolá prerušenie a štart obslužného programu na príslušnej adrese vyhradenej prerušovaciemu systému. V tej chvíli sa príznak automaticky zase vynuluje.  

*) časovač 2 používajú niektoré klony mikropočítačov typu 8051.

Príklad inicializácie prerušenia

Program obsahuje na adresách 0003h a 0013h obslužné podprogramy pre prerušenia vyvolané uzemnením pinov P3.2 a P3.3 portu P3 ktorým zodpovedá prerušnie INT0 a INT1. Ich úlohou bude zvyšovať a znižovať obsah registra B. Hlavný program začína návestím start: kde sa uskutoční inicializačná časť programu nastavením režimu prerušenia vyvolávaného dobehovou hranou (t.j. z log 1 do log 0) pomocou príznakov IT0 a IT1. V registri IE sa aktivujú príslušné bity EA - generálne povolenie prerušení a bity EX1 pre INT1 a EX0 pre INT0. Posledný príkaz inicializácie nastaví počiatočnú hodnotu B registra = 0.  Hlavný program pohračuje v nekonečnom cykle kde neustále odosiela hodnotu B registra na port P1 ktorý signalizuje stav hodnoty pomocou svietiacich LED diód. 

 $mod51
          org 0000h
          ljmp start

          org 0003h           ; INT0 /P3.2
          inc B               ; B=B+1
          reti

          org 0013h           ; INT1 /P3.3
          dec B               ; B=B-1
          reti

start:    setb IT0            ; nastav režim INT0 reakcie na hranu
          setb IT1            ;              INT1
          mov  IE,#10000101b  ; povoľ prerušenia - bity:  EA, EX1 a EX0
          mov  B,#0;          ; Nastav štartovaciu hodnotu počítadla B=0
          
opakuj:   mov P1,B            ; Zobraz obsah B na výstupnom porte P1
          ljmp opakuj         ; Nekonečný cyklus hlavného programu

END
  

 

Návrat na začiatok Prerušenie od časovačov.

ČASOVAČ
/ČÍTAČ 0 a 1
Mikropočítač obsahuje dva nezávislé ČASOVAČE-ČÍTAČE. Obidva tieto obvody sú v podstate ČÍTAČE, rozdiel je len v tom, z akého zdroja prichádza budiaci signál. Ak do čítača budú prichádzať v pravidelných intervaloch signály generované vnútornými hodinami mikropočítača, potom čítač plní funkciu ČASOVAČa - jednotlivé impulzy prichádzajú v presných časových odstupoch. Ich počet vlastne odmeriava čas. Druhý režim využíva vstupné porty T0  (P3.4) a T1 (P3.5) na ktoré budú prichádzať externé signály. V tomto prípade obvody ČÍTAČA len spočítajú počet vstupných impulzov t.j. plní funkciu ČÍTAČa. Na funkciu ČASOVAČA-ČÍTAČA vplývajú tieto pracovné registre:
  1. IE register (Interupt Enable) - (adresa: 0A8h) Register povolenia prerušení s nasledovným významom pracovných bitov:
    7 6 5 4 3 2 1 0
    IE.7 IE.6 IE.5 IE.4 IE.3 IE.2 IE.1 IE.0
    EA -- ET2 ES ET1 EX1 ET0 EX0
    0AFH   0ADH 0ACH   0ABH   0AAH 0A9H 0A8H
    povolenie=1
    zakázanie=0
          povolenie=1
    zakázanie=0
      povolenie=1
    zakázanie=0
     
    Generálne
    povolenie
      Timer 2 UART  Timer1 INT1 Timer 0 INT0

  2. IP register (Interupt Priority) - (adresa  0B8H ) Register riadenie priority prerušení 
    7 6 5 4 3 2 1 0
    IP.7 IP.6 IP.5 IP.4 IP.3 IP.2 IP.1 IP.0
    --- --- PT2 PS PT1 PX1 PT0 PX0
        0BDH 0BCH 0BBH 0BAH 0B9H 0B8H
            základná=0
    vyššia=1
      základná=0
    vyššia=1
     
        Timer 2      UART Timer1 INT1 Timer 0 INT0

  3. TCON (TimerCONtrol) - (adresa 088H) Register riadenia časovača a ext. prerušení  (LOW 4 bity)
  4. 7 6 5 4 3 2 1 0
    TCON.7 TCON.6 TCON.5 TCON.4 TCON.3 TCON.2 TCON.1 TCON.0
    TF1 TR1 TF0 TR0        
    08FH 08EH 08DH 08CH        
    Pretečenie čí/ča 1 Spustenie čí/ča 1 Pretečenie čí/ča 0 Spustenie čí/ča 0        

  5. TMOD (Timer/counter MODe control) - (adresa 089H) Register módu časovačov/čítačov
    7 6 5 4 3 2 1 0
    TMOD.7 TMOD.6 TMOD.5 TMOD.4 TMOD.3 TMOD.2 TMOD.1 TMOD.0
    GATE C/ T* M1 M0 GATE C/T* M1 M0
    čí/ča 1 čí/ča 1 čí/ča 1 čí/ča 1 čí/ča 0 čí/ča 0 čí/ča 0 čí/ča 0
    0 blokuje vplyv strobovacieho vstupu INT1  všetko riadi  TR1 v TCON 1=ext. čítač vstup T1 (P3.5) ;   0=int.timer vstup CLK/12  mód čítača 1 -

       00-0
       01-1  
       10-2
       11-3

    0 blokuje vplyv strobovacieho vstupu INT0 všetko riadi TR0 v TCON  1=ext. čítač vstup T0 (P3.4);   0=int.timer vstup CLK/12 mód čítača 0 -  

      00-0 
      01-1  
      10-2   
      11-3

Poznámka: Príznak pretečenia časovača sa nastavuje vo chvíli keď sa má v registri ktorý obsahuje maximálnu hodnotu zvýšiť obsah o 1. Tento údaj už sa nedá zobraziť a register sa vynuluje s príznakom pretečenia.

Príznak pretečenia ostáva nastavený do chvíle kým sa nespustí obslužný program prerušenia. Potom sa automaticky vynuluje. 

Príklad inicializácie prerušenia

Program obsahuje na adrese  001Bh obslužný program, ktorý bude vyvolaný zakaždým keď časovač T1 obdrží 10000 impulzov. Impulzy prichádzajú s frekvenciou 1MHz, t.j. každú 1 milióntinu sekundy a zvyšujú pred nastavenú zápornú hodnotu pracovnej dvojice registrov TH1 a TL1 vytvárajúcich v móde 1 jeden 16 bitový register. K prerušeniu bude dochádzať teda každých 0.01sekundy. Toto prerušenie bude znižovať premennú POČET o 1 z prednastavenej hodnoty 100. Po dosiahnutí hodnoty 0, ktorá nastane raz za sekundu, signalizuje to príznakovým bitom SEK do ktorej zapíše log 1. Hlavný program obsahuje cyklus, ktorý neustále kontroluje príznak SEK a keď zistí, že je nastavený urobí tri veci: Príznak SEK vynuluje, zvýši počítadlo sekúnd v B registri o 1 a zobrazí jeho obsah na porte P1 , na ktorý sú napojené signálne LED diody. 

Samotné nastavenie časovacích obvodov sa uskutoční v inicializačnej časti začínajúcej návestím Start: . Tam sa prednastaví hodnota pracovných registrov časovača TH1 a TL1 pomocou konštánt HIp a LOp. Druhá povinná operácia je nastavenie režimu časovača v pracovnom registri TMOD, tretia povinná operácia je povolenie prerušení v registri IE - konkrétne bity  EA a ET1. Poslednou, štvrtou,  povinnou operáciou je nastavenie príznaku Tr1 v registri TCON, ktorý spustí činnosť časovača (tým, že povolí prechod impulzov z generátora 1MHz).  


$mod51

               POCET  DATA          30h
               HIp    EQU   HIGH(-10000) ; prepinanie displeja 0.01 sek
               LOp    EQU   LOW (-10000) ; prepi
               MAX    EQU           100  ; 0.01 x 100 = 1 sekunda
               KOR    EQU            11  ; Korekcia času obsluhy časovača
               SEK    BIT            00  ; Príznak naplnenia času sekundy

               org 0000h
               ljmp Start

; OBSLUHA PRERUŠENIA ČASOVAČA T1 
; ale aj POCITADLO IMPULZOV 0.01 sek koli meraniu sekundy

               org 001Bh              ; Timer 1
               clr    Tr1             ; stop časovača
               djnz POCET,Pok         ; ak bude POCET=0 prešla 1 sek
               setb   SEK             ; signalizuj sekundu
               mov  POCET,#MAX        ; natav počítadlo 0,01s do 1 s na 100   
          Pok: mov    TH1,#HIp        ; obnov časovač na interval 0.01 sek
               mov    TL1,#LOp+KOR    ; KOREKCIA merania sekundy kôli obsluhe T1
               setb Tr1               ; štart časovača
               reti


               org  0100h
Start:         mov    TH1,#HIp        ; čas prepínania znakov displeja 0.01sek
               mov    TL1,#LOp        ;
               mov   TMOD,#00010001b  ; režimy T0 a T1 mod1
               mov     IE,#10001000b  ; povoľ prerušenia T1
               mov  POCET,#MAX        ; počítadlo prerušení 0.01sek (100 =>1 sek)
               clr    SEK             ; vynuľuj príznak sekundy
               mov      B,#00h        ; v B nuluj čítač sekúnd
               setb   Tr1             ; spust časovač T1

Opakuj:        jbc  SEK, ZOBRAZ       ; ak SEK=1 daj SEK=0, zvýš B a ZOBRAZ 
               jmp  Opakuj            ; ešte nie je sekunda
       ZOBRAZ: inc    B               ; zvýš čítač sekúnd v B registri
               mov   P1,B             ; Zobraz údaj LED diódami na porte P1
               ljmp Opakuj


END
          
  

Návrat na začiatok Prerušenie od sériovej linky.

UART- Sériová linka          Sériovú komunikáciu zabezpečuje plno duplexný kanál integrovaný na čipe mikropočítača 8051, ktorý je schopný zabezpečiť súčasné prijímanie aj odosielanie dát. Minimálny počet vodičov, ktorý je potrebný, sú 3 (RxD, TxD a zem). 
         Prijímané dáta sú spracúvavané posuvným prijímacím registrom z ktorého sa dáta po prijatí 8. bitu prekopírujú do vyrovnávacieho registra. Prijímací register môže prijímať ďaľší znak. Pri čítaní z adresy, ktorá zodpovedá registru SBUF, sa údaje prečítajú z vyrovnávacieho registra.  Zápisom na adresu SBUF sa naplňuje vysielací register. Oba registre sú mapované cez register SBUF umiestnený v oblasti registrov  špeciálných funkcií (SFR) v internej RAM pamäti. Strata dát z dôvodu neskorého odobratia prijatých dát nie je indikovaná, taktiež nie je indikovaná chyba rámca a parity alebo  indikácia prerušenia, ktoré sú zvyčajne  indikované u špeciálnych obvodov. 
         Sériovú komunikácia vyvoláva prerušenia z dôvodu ukončenia odosielania dát ale aj z dôvodu ukončenia prijímania dát
         Sériový vstup a výstup je na úrovni signálov TTL (log 1 = 5V, log 0 = 0V). Bežný počítač typu IBM PC pracuje s úrovňou sériového signálu V.24 - europsky štandard CCITT ( resp. RS 232C - americký štandard) a  preto potrebujeme prispôsobovacie obvody typu MAX 232 resp. MAX 233. Norma RS 232C transformuje log 0 na úroveň +5 až +15V a log 1 na -5 až -15V. Asynchrónny sériový signál má zvyčajne priebeh začínajúci 1 štart bitom  (log. 0) 8 resp. 9 dátovými bitmi (9. je zvyčajne paritný) a 1 alebo 2 stop bitmi (log. 1).
         Po odoslaní resp. prijatí 8. bitu prenášaného 1 byte dát, sériová linka vyvolá prerušenie, ktorého obsluha zabezpečuje spracovanie prijatého resp. odosielaného 1 byte dát. Prerušenia nastavujú registre IE a IP  viď. tabuľky.
         
Sériový kanál môže pracovať v 4 režimoch v závislosti na nastavení registrov SCON a PCON .            
           
  1. IE register (Interupt Enable) - (adresa: 0A8h) Register povolenia prerušení s nasledovným významom pracovných bitov:
    7 6 5 4 3 2 1 0
    IE.7 IE.6 IE.5 IE.4 IE.3 IE.2 IE.1 IE.0
    EA -- ET2 ES ET1 EX1 ET0 EX0
    0AFH   0ADH 0ACH   0ABH   0AAH 0A9H 0A8H
    povolenie=1
    zakázanie=0
        povolenie=1
    zakázanie=0
           
    Generálne
    povolenie
      Timer 2 UART  Timer1 INT1 Timer 0 INT0

  2. IP register (Interupt Priority) - (adresa  0B8H ) Register riadenie priority prerušení 
    7 6 5 4 3 2 1 0
    IP.7 IP.6 IP.5 IP.4 IP.3 IP.2 IP.1 IP.0
    --- --- PT2 PS PT1 PX1 PT0 PX0
        0BDH 0BCH 0BBH 0BAH 0B9H 0B8H
           základná=0
    vyššia=1
           
        Timer 2      UART Timer1 INT1 Timer 0 INT0

  3. SCON register (Serial CONtroll) - (adresa  098H ) Register riadenia sériovej linky 
    7 6 5 4 3 2 1 0
    SCON.7 SCON.6 SCON.5 SCON.4 SCON.3 SCON.2 SCON.1 SCON.0
    SM0 SM1 SM2 REN TB8 RB8 TI RI
     09FH  09EH 09DH 09CH 09BH 09AH 099H 098H
           nepovolený=0
    povolený=1
           
     mód sériovej linky

       00-0
       01-1  
       10-2
       11-3
     

    Povolenie vytvorenia viac procesorovej sériovej zbernice      PRÍJEM Vysielaný 
    9. bit
    Prijatý 9.bit Žiadosť o prerušenie po odoslaní slova Žiadosť o prerušenie po prijatí slova

  4. PCON register (Power CONtrol) - (adresa  087H ) Register riadenie napájania 
    7 6 5 4 3 2 1 0
    PCON.7 PCON.6 PCON.5 PCON.4 PCON.3 PCON.2 PCON.1 PCON.0
    SMOD --- --- --- --- --- PD IDL
     fosc * 2               
    základná=0
    vyššia=1
                       
    Zdvojenie prenosovej rýchlosti                 

MOD 0
Synchrónny režim
, pracuje na frekvencii  fosc / 12  (fosc je udávaný na krištáli oscilátora), prenáša sa 8 bitov. Dáta sú prenášané na spoločnom vedení RxD (P3.0) a synchronizácia je na spoločnom vedení TxD (P3.1). Prvý datový bit sa prenáša D0 a postupne až po D7.



MOD 1
Asynchrónny režim - 8 bitový UART - pracujúci na premennej frekvencii udávanej časovačom T1 nastavenom v MODE 2  (Pozn.: môže aj v MODE 1). Vysielanie je na signálnych vodičoch TxD (P3.1) a príjem na RxD (P3.0). Bity sa prenášajú na 10 intervaloch T  (f=1/T, kde f je prenosová rýchlosť  udávaná v Baudoch.). Štruktúra signálu je: 1 štart bit, 8 datových bitov a 1 stop bit. Prenos dát začína D0 a končí D7. Pri príjme sa STOP BIT ukladá do RB8 príjmového bitu v SCON.  Frekvenciu t.j. prenosovú rýchlosť  zdvojnásobuje nastavený bit (=1) v  SMOD v registri PCON. Presná frekvencia je daná hodnotou v registri TH1 časovača T1 (MOD 2 časovača)

Prenosová rýchlosť = 1/T=  (1+SMOD) /32 * fosc/( 12*[ 256- (TH1)] ). 

MOD 2
Asynchrónny režim - 9 bitový UART - pracujúci na prednastavenej prenosovej rýchlosti fosc/32 resp fosc/64 podľa závislosti na nastavení bitu (=1) v  SMOD v registri PCON . Vysielanie je na signálnych vodičoch TxD (P3.1) a príjem na RxD (P3.0). Bity sa prenášajú na 11 intervaloch T  (f=1/T, kde f je prenosová rýchlosť  udávaná v Baudoch.). Štruktúra signálu je: 1 štart bit, 9 datových bitov a 1 stop bit. Prenos dát začína D0 a končí D8. Pri príjme sa ukladá  9. bit dát do RB8 príjmového bitu v SCON. Pri vysielaní sa odošle bit TB8 registra SCON ako 9. dátový bit- jeho funkcia je univerzálna - najčastejšie sa doň ukladá paritný bit P z PSW registra..

Prenosová rýchlosť = 1/T=  fosc * (1+SMOD) / 64




MOD 3
Asynchrónny režim - 9 bitový UART - pracujúci na premennej frekvencii udávanej časovačom T1 nastavenom v MODE 2 (Pozn.: môže aj v MODE 1). Vysielanie je na signálnych vodičoch TxD (P3.1) a príjem na RxD (P3.0). Bity sa prenášajú na 11 intervaloch T  (f=1/T, kde f je prenosová rýchlosť  udávaná v Baudoch.). Štruktúra signálu je: 1 štart bit, 9 datových bitov (9. môže byť paritný) a 1 stop bit. Prenos dát začína D0 a končí D7. Pri príjme sa ukladá  9. bit dát do RB8 príjmového bitu v SCON. Pri vysielaní sa odošle bit TB8 registra SCON ako 9. datový bit - jeho funkcia je univerzálna - najčastejšie sa doň ukladá paritný bit P z PSW registra. Presná frekvencia je daná hodnotou v registri TH1 časovača T1 (MOD 2 časovača)

Prenosová rýchlosť = 1/T=  (1+SMOD) /32 * fosc/( 12*[ 256- (TH1)] ). 

Vzory hodnôt použítých pri nastavovaní pracovných frekvencií 
pomocou SMOD a TH1 

Frekvencia kryštálu Požadovaná prenosová rýchlosť SMOD TH1 Reálna prenosová rýchlosť Odchýľka
12.000 MHz 9600 1 -79  (F9h) 8923 7%
12.000 MHz 2400 0 -13  (F3h) 2404 0.16%
12.000 MHz 1200 0 -26  (E6h) 1202 0.16%
11.059 MHz 9200 1 -3    (FDh) 19200 0%
11.059 MHz 9600 0 -3    (FDh) 9600 0%
11.059 MHz 2400 0 -12   (F4h) 2400 0%
11.059 MHz 1200 0 -24   (F8h) 1200 0%


Príklad inicializácie prerušenia

Program obsahuje na adresách 0023h obslužný podprogram pre prerušenia vyvolané príznakmi TI a RI v registri SCON, z ktorých TI signalizuje ukončenie odosielania bajtu v registri SBUF, a druhý ukončenie príjmu do registra SBUF. Hlavný program začína návestím start: kde sa uskutoční inicializačná časť programu nastavením registra SCON - mod1 sériovej linky t.j. 8 bitový UART s nastavením prenosovej rýchlosti pomocou časovača T1 a nastavením príznaku REN - povolenia príjmu sériovou linkou. Register TMOD nastavuje režim časovača T1 na mod2 t.j. s automaticky obnovovaním prednastavenej hodnoty v registri TL1 hodnotou v TH1, ktorú nastavíme pri frekvencii oscilátora 12MHz na hodnotu 0F3h aby sme dosiahli prenosovú rýchlosť 2400 baudov. V registri TCON povolíme časovač T1 bitom TR1 , aby sa spustil a nakoniec v  registri IE sa aktivujú príslušné bity EA - generálne povolenie prerušení a bit ES. Posledný príkaz inicializácie nastaví príznak fFreeSBUF na log 1. ktorá bude v hlavnom programe blokovať vysielanie ďalšieho bajtu ak ešte nebol ukončený predošlý prenos. Vo vzorovom programe sú odosielané dve hodnoty do mikropočítača ktorý obsahuje ten istý program. Obsluha prerušenia realizuje príznak TI - signalizujúci že odosielanie sa zrealizovalo nastavením príznaku fFreeSBUF, a realizuje príznak RI vypísaním obsahu SBUF s došlým znakom na port  P1 ktorý signalizuje stav hodnoty pomocou svietiacich LED diód. 


$mod51
           fFreeSBUF   BIT  01h      ; bit. príznak blokuje SBUF počas odosielania (=0)
           
           ORG 0000h                 
           ljmp start

           ORG 0023h                 ; OBSLUHA SÉRIOVEJ LINKY PRÍJEM/VYSIELANIE /TI, RI/
           jbc   TI,DoSBUFfree       ; TI=1? ak ÁNO skoč a zároveň nuluj príznak (clr TI)
           mov   P1,SBUF             ; NIE lebo RI=1 prečítaj došlý znak a ZOBRAZ na P1 
           clr   RI                  ; nuluj príznak RI príčiny prerušenia
           reti 
DoSBUFfree:setb   fFreeSBUF          ; Uvolni blokáciu SBUF na vysielanie
           reti 

           ORG 0100h
start:     mov scon,#01010000b       ; mod1 sériovej linky , povolenie REN na príjem dát
           mov tmod,#00100000b       ; mod2 T1, gate=0, C/T*=T
           mov  th1,#0F3h            ; baud rate 2400
           mov tcon,#01000000b       ; start T1	
           mov   ie,#10010000b       ; povolíme prerušenia sériovej linky
           
           setb   fFreeSBUF          ; Uvolni blokáciu SBUF na vysielanie

; nekonečný cyklus hlavného programu         
opakuj:    mov    B,#01010101b       ; odosielaný znak 1.
           call   PosliZnak          ; odošli znak 
           call   Pockaj             ; chvilku zobrazujeme 
           mov    B,#10101010b       ; odosielaný znak 2.
           call   PosliZnak          ; odošli znak 2
           call   Pockaj             ; chvilku zobrazujeme 
           ljmp   opakuj             ; pokracuj


 PosliZnak:                          ; ODOŠLI ZNAK V B REGISTRI SÉRIOVOU LINKOU 
       W1: jbc  fFreeSBUF, Posli1    ; Ak je SBUF volný okamžite Pošli (fFreeSBUF=0)
           sjmp W1                   ; INAK - Čakaj! a testuj či je SBUF voľný          
   Posli1: mov  SBUF,B               ; odosielaný znak v SBUF automaticky odíde
           ret                       ; návrat
                                     ;(Pozn.: fFreeSBUF=1 vykoná až prerušenie po TI)
 
Pockaj:    mov  R4,#01h              ; pauza cca 1 sek.  
      OP3: mov  R3,#0FFh
      OP2: mov  R2,#0FFh
      OP1: djnz R2,OP1
           djnz R3,OP2
           djnz R4,OP3
           ret

END

 

Návrat na začiatok Schéma nastavovacích pracovných registrov TMOD, TCON, SCON, IE, IP, 
Pracovných registrov časovačov TH1,TL1, TH0,TL0,
a vzťah vstupov T0, T1, INT 0*, INT 1* k týmto registrom

 

 ..
  ..

Author Ing.  JANOUŠEK  Jaroslav.
Copyright © 2003   ManINFO.  All rights reserved.
Revised: marca 20, 2009 .