Váení zákazníci, dovolujeme si Vás upozornit, e na tuto ukázku knihy se vztahují autorská práva, tzv. copyright. To znamená, e ukázka má slouit výhradnì pro osobní potøebu potenciálního kupujícího (aby ètenáø vidìl, jakým zpùsobem je titul zpracován a mohl se také podle tohoto, jako jednoho z parametrù, rozhodnout, zda titul koupí èi ne). Z toho vyplývá, e není dovoleno tuto ukázku jakýmkoliv zpùsobem dále íøit, veøejnì èi neveøejnì napø. umisováním na datová média, na jiné internetové stránky (ani prostøednictvím odkazù) apod. redakce nakladatelství BEN technická literatura
[email protected]
9.3
SÉRIOVÝ PORT MIKROKONTROLÉRU 8051
Interní sériový port mikrokontroléru 8051 umoòuje jednoduché a bezproblémové spojení mikrokontroléru s poèítaèem PC. Protoe je port navren jako autonomní hardwarový UART, je procesor volný pro jiné úkoly. Pro pøesnìjí pochopení programování je tøeba se podívat na registr speciálních funkcí sériového portu. K inicializaci portu se musí naplnit vhodnými parametry registr SCON. SCON (SFR 98h)
60
60
60
5(1
7%
5%
7
5L
SM0, SM1: Bity sériového reimu (serial mode) urèují pracovní reim: 0 0 reim 0: 8bitový posuvný registr 0 1 reim 1: 8bitový UART, pøenosová rychlost urèená èasovaèem Timer 1 1 0 reim 2: 9bitový UART, 375 kBaudù pøi 12 MHz 1 1 reim 3: 9bitový UART, pøenosová rychlost urèená èasovaèem Timer 1 SM2: vícepoèítaèový reim REN: Receiver Enable, povolení pøijímaèe TB8: Transmitted bit 8, pro 9bitový reim RB8: Received bit 8, pro 9bitový reim TI: Transmitter Interrupt, 1 pøi úspìném ukonèení pøenosu: RI: Receiver Interrupt, 1 po pøíjmu znaku Datový registr sériového portu je SBUF (SFR 099h). Ve skuteènosti se za SBUF skrývají dva registry, a to vysílací (výstupní) datový registr a pøijímací (vstupní) datový registr. Vysílání se prostì zahájí zápisovým pøístupem na registr SBUF. Naopak pøijatý byte mùe být ze SBUF pøeèten. V 9bitovém reimu je vdy tøeba brát ohled na 9. bit (TB8 nebo TR8) v registru SMOD. Ve vìtinì pøípadù se pouívá pracovní reim 1, tedy 8bitový UART s pøenosovou rychlostí danou èasovaèem 1. Osmibitový datový tok je zahajován startbitem a uzavøen stopbitem. Pøenosová rychlost je 1/16 (SMOD = 1) nebo 1/32 (SMOD = 0) frekvence pøebìhù èasovaèe 1. SMOD je bit s nejvyí váhou v registru PCON (Power Control, SFR 87h), který je jinak urèen k øízení reimu power-down (sníení napájecího výkonu). PCON (SFR 87h)
602'
±
±
±
*)
*)
3'
,'/
SMOD: GF1, GF2: PD: IDL:
A
1 = nízká pøenosová rychlost , 0 = vysoká pøenosová rychlost Volnì pouitelná návìtí (flags) Reim sníení pøíkonu (power-down) Reim dynamického zastavení (idle modus) B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
199
Výroba hodinového signálu pro sériový port vyaduje nejprve naprogramování èasovaèe 1 (timer 1). Oba èasovaèe obvodu 8051 mají kadý dva 8bitové èítací registry, které je mono plnit a pøeèíst. TL0 (SFR 8Ah): èasovaè 0, nií byte TH0 (SFR 8Ch): èasovaè 0, vyí byte TL1 (SFR 8Bh): èasovaè 1, nií byte TH1 (SFR 8Dh): èasovaè 1, vyí byte Vlastnosti èasovaèù jsou øízeny registry TCON (SFR 88h) a TMOD (SFR 89h). Pomocí TMOD se nastavuje pracovní reim. TMOD (SFR 89h)
*DWH
&7
0
0
*DWH
&7
0
0
ýtWDþ
ýtWDþ
Gate: C/T: 0: M1 a M0: 0 0 0 1 1 0 1 1
Pøísluný èítaè se uvolòuje vývodem INT0, popø. INT1. èasovaè, 1: èítaè Pracovní reim 13bitový èasovaè/èítaè 16bitový èasovaè/èítaè 8bitový èasovaè/èítaè, automatické plnìní Jen pro èítaè 0: dva oddìlení 8bitové èítaèe
Èasovaè 1 má jako volnobìný èítaè naèítat interní hodinové impulsy 8051. Nastavíme jej proto jako èasovaè v reimu 2. Pøi kadém pøebìhu se èítaè znovu naplní pøedem nastavenou hodnotou. Kadý èítaè se startuje svým bitem TR v registru TCON. TCON obsahuje i flagy (pøíznaky) pøebìhù obou èasovaèù a ètyøi øídicí bity k øízení pøeruení pomocí vývodù INT0 a INT1. TCON (SFR 88h)
7)
75
7)
75
,(
,7
,(
,7
TF1: TR1: TF0: TR0: IE1: IT1: IE0: IT0:
200
pøíznak pøebìhu pro èasovaè 1 zapnutí èasovaèe 1 pøíznak pøebìhu pro èasovaè 0 zapnutí èasovaèe 0 pøeruení na INT1 se spoutìním hranou pøíznak pøeruení pro INT1 pøeruení na INT0 se spoutìním hranou pøíznak pøeruení pro INT0 B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
A
Pro provoz èítaèe ve funkci generátoru pøenosové rychlosti je pouze tøeba nastavit spoutìcí bit TR1. Ten je bitovì adresovatelný a dosaitelný pod bitovou adresou 8 Eh. Nejprve se vak musí pøi zastaveném èítaèi nastavit potøebný dìlicí pomìr. V reimu 2 obsahuje vyí byte èítaèe TH1 hodnotu pro opakované plnìní, která se pak pøi kadém pøebìhu znovu zavede do vlastního registru èítaèe TL1. Pro pøenosovou rychlost 9600 baudù je pøi nahozeném bitu SMOD potøebná hodinová frekvence 16 × 9,6 kHz = 153,6 kHz. Protoe èítaè naèítá interní hodinovou frekvenci pøíkazù rovnou 1/12 frekvence krystalu, je pøi frekvenci krystalu rovné 11,0592 MHz tøeba nastavit dìlení èíslem 6: 11059,2 kHz / 12 / 6 / 16 = 9,6 kHz Dìlicí faktor 6 dostaneme pøi hodnotì opakovaného plnìní èítaèe 256 6 = 250 = FAh, protoe se èítá nahoru. Listing COM51.ASM ukazuje kompletní program. K inicializaci se nejprve pøísluné registry naplní svými øídicími parametry. Hlavní program pak pouívá ji jen dva podprogramy SEND (vysílání) a EMPF (pøíjem). Pøijímací rutina EMPF se nejprve dotazuje na bit RI, dokud nepøijde znak. Potom se naète pøijímací buffer SBUF a RI se shodí. Vysílací rutina SEND se naopak dotazuje na bit TI, dokud se úplnì nezpracuje poslední vysílaný znak. Pak se vysílaný byte zapíe do vysílacího bufferu SBUF a tím se nastartuje vysílaè UART. ;Seriovy port mikrokontroleru 8051 ;11,059MHz, 9600 Baud #include 8051.H .org 0000H ANFANG INIT
NEXT
EMPF
A
mov clr mov mov anl orl setb mov setb orl
SP,#60H TR1 TH1,#0FAH TL1,#0FAH TMOD,#0FH TMOD,#20H TR1 SCON,#50H TI PCON,#80H
acall mov anl orl Mov acall sjmp
EMPF P1,A P3,#0EFH P3,#10H A,P1 SEND NEXT
jnb mov clr ret
RI,EMPF A,SBUF RI
(COM51.ASM)
;nastavit stackpointer ;zastavit Timer 1 ;6 do prebehu: 9600 Baud ;Timer1: 8 bitù, auto-reload ;spustit Timer 1 ;InitRS232 ;SMOD=1 ;vystup portu ;strob-impuls na P3.4 ;cist stav portu
B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
201
SEND
Listing 9.4
jnb clr mov ret .end
TI,SEND TI SBUF,A
Pouití sériového portu CD:\Kniha\Kap09\TasmKap9\COM51.ASM
Kadý pøijatý byte se pøedá na port 1. Následuje krátký strobovací impuls na P3.4 (linka T0). Potom program pøeète stav portu 1 a vyle pøeètený byte pøes sériový port zpìt. Tak je realizován paralelnì-sériový pøevodník, který je mono pouít buï jen pro výstupy portu, jen pro ètecí pøístupy na port nebo pro smíený provoz. Vechny vstupní linky musí být pøi vysílání nahozeny na vysokou úroveò a tím být ve stavu s vysokou impedancí. Vysílaná hodnota 255 (FFh) napøíklad zpùsobí, e celý port bude k dispozici jako vstupní port a bude se provádìt ètení. Funkci programu je mono otestovat pomocí programù pro pouití se sériovými vysílaèi a pøijímaèi pøedstavených ji v kapitole 4.
9.4
KONTROLÉROVÝ UART
Mikrokontrolérový UART byl pøedstaven v praktické aplikaci ji v kapitole 4.5. Zde uvedeme jen potøebný pracovní program. Jako náhrada za UART 6042 musí mít kontrolér oddìlené vývody pro vstup a výstup. Port 3 se èásteènì pouívá pro sériovou komunikaci a není volnì k dispozici. Protoe vak není nutná ádná pamì RAM, zùstává celá datová a adresní sbìrnice volná. Tím je opìt k dispozici port 0 a port 2. Port 0 se svými elektrickými parametry lií od ostatních portù, protoe nemá ádné interní zdvihací odpory. Pro pouití jako výstup by bylo nutno zapojit externí zdvihací odpory. Chybìjící zdvihací obvody mohou být pro digitální vstupy nevýhodou, protoe není mono pøímo pøipojovat kontakty nebo spínaèe. Z toho dùvodu zde jako vstupní port pouijeme port 1. Port 2 je výstupní port mikrokontrolérového UART. I zde je nutno pro nìkteré aplikace zapojovat zdvihací odpory, protoe porty dodávají jen malý proud. Výstupní budiè ULN2803 (viz kap. 4.6) napø. vyaduje dodateèné odpory 3,3 kW proti Vcc, aby byl k dispozici dostateèný proud. Mikrokontrolérový UART je mono pomocí propojek, zapojených na P3.2 a P3.4 proti zemi, nakonfigurovat celkem pro ètyøi pøenosové rychlosti. Bez propojek se pouije 1200 baudù, na P3.2 lze zvolit 9600 baudù, na P3.3 19200 a na P3.4 nejvyí monou pøenosovou rychlost 57600 baudù. P3.5 slouí jako strobovací výstup se zápornými impulsy pro kadý pøijatý byte. ;UART-Controller 8051 ;11,059MHz, 9600 Baud #include 8051.H .org 0000H ANFANG INIT B1200
202
mov clr mov
SP,#60H TR1 TH1,#0D0H
(UART51.ASM)
;nastavit stackpointer ;zastavit Timer 1 ;delic 48, 1200 baudu
B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
A
mov jb mov mov jb mov mov jb mov mov anl orl setb mov setb orl
TL1,#0D0H P3.2,B19200 TH1,#0FAH TL1,#0FAH P3.3,B57600 TH1,#0FDH TL1,#0FDH P3.4,INIT2 TH1,#0FFH TL1,#0FFH TMOD,#0FH TMOD,#20H TR1 SCON,#50H TI PCON,#80H
acall mov clr setb Mov acall sjmp
EMPF P2,A P3.5 P3.5 A,P1 SEND NEXT
EMPF
jnb mov clr ret
RI,EMPF A,SBUF RI
SEND
jnb clr mov ret .end
TI,SEND TI SBUF,A
B9600 B19200 B57600 INIT2
NEXT
Listng 9.5
9.5
;Jumper 9600? ;delic 6, 9600 baudu ;Jumper 19200? ;delic 3, 19200 baudu ;Jumper 57600? ;delic 1, 57600 baudu ;Timer1: 8-Bit-Auto-Reload ;spustit Timer ;InitRS232 ;SMOD=1 ;vystup portu Port 2 ;strobovaci impuls na P3.5 ;cist stav portu 1
Mikrokontrolérový UART (Uart51.asm) CD:\Kniha\Kap09\TasmKap9\Uart51.asm
PARALELNÍ PØÍSTUPY NA SBÌRNICI
K buzení periferních zaøízení na adresní a datové sbìrnici procesoru pøes sériový port jsme v kapitole 5 pøedstavili paralelní sbìrnici rozhraní (Interface Bus). Pouitý øadiè sbìrnice jsme pokládali za speciální integrovaný obvod, ani bychom se zabývali programem kontroléru. Zde nyní pøedstavíme pouitý software. Program Pibus.asm byl vyvinut pomocí vývojového systému ES52-Flash. Vechny vývody sbìrnice jsou na 40pólové kontaktní litì na kraji desky, take k pohodlnému propojení s pøídavnými zaøízeními je mono pouít plochý kabel. Mikrokontrolér AT89S8252
A
B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
203
je ale mono naprogramovat i ve vývojovém systému a pak jej umístit na speciální desce spolu s pøídavnými zaøízeními. Vyvinutý program je mimo to vhodný i pro levnìjí mikrokontrolér 8751. Obvykle se kontrolér 8051 obrací na sbìrnici prostøednictvím pøíkazù MOVX. Signály :5 a 5' se pøitom generují automaticky. Data a spodních osm adres se multiplexovanì vydávají na datovou sbìrnici, kdeto horních osm adresních signálù se vytváøí staticky na portu 2. Mohli bychom pouít adresní støadaè, napø. 74HC573, který je k dispozici pro buzení RAM na vývojové desce. Abychom mohli tuto souèástku uetøit a realizovat opravdové jednoèipové øeení, vytváøí se vechny signály pomocí pøístupù na porty. Tím máme také monost vyrábìt i dalí pøeddekódované povolovací signály s poadovaným èasováním. Vechny signály jsou pomalejí ne signály generované pomocí MOVX, to vak v dùsledku spojení pøes sériový port, které je stejnì pomalejí, nehraje ádnou roli. Port 2 slouí jako adresní sbìrnice pro dolních sedm adresních linek A0
A6. Pøijatý adresní byte je celý pøiveden na port, take se na P2.7 objeví i bit smìru dat. Port 0 slouí jako datová sbìrnice. Musí se ovem brát v úvahu, e port nemá obvyklé zdvihací (pullup) odpory. V závislosti na aplikaci mohou tedy být nutné externí zdvihací odpory. Vechny øídicí signály se vytváøejí na portu 3. P3.7 a P3.6 slouí jako linky 5' a :5. Protoe na portu 3 jsou i sériové datové linky, jsou k dispozici jetì ètyøi linky jako povolovací linky Y0 a Y3. Vechny signály jsou v klidu na úrovni High. ;Seriovy port kontroleru 8051 ;11,059MHz, 9600 baudu ;Rozhrani s paralelni sbernici #include 8051.H .org 0000H ANFANG
mov
SP,#60H
INIT
clr mov mov anl orl setb mov setb orl
TR1 TH1,#0FAH TL1,#0FAH TMOD,#0FH TMOD,#20H TR1 SCON,#50H TI PCON,#80H
acall mov jb mov acall mov mov acall clr nop
EMPF r3,A ACC.7,Lesen P2,A EMPF P0,A A,r3 CS P3.6
NEXT
204
(PIbus.ASM)
;nastavit stackpointer (Anfang = zacatek) ;zastavit Timer 1 ;6 do prebehu: 9600 baudu ;Timer1: 8-Bit-Auto-Reload ;spustit Timer ;InitRS232 ;SMOD=1 ;prijem adresy ;ulozeni adresy ;bit cteni? (lesen = cteni) ;staticka adresa ;prijem dat ;vystup dat ;adresa ;/CS na Port 1 ;/WR = 0
B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
A
setb mov sjmp
P3.6 P3,#255 NEXT
;/WR = 1 ;vsechny /CS = 1
mov mov mov mov mov acall clr nop mov setb mov acall sjmp
DPL,A DPH,A P2,A P0,#255 A,r3 CS P3.7
;A0...A6 (lesen = cteni) ;+ A8...A14 ;staticka adresa ;datova sber. s vys. impedanci ;adresa ;/CS na Port 1 ;/RD = 0
A,P0 P3.7 P3,#255 SEND NEXT
;cist data ;/RD = 1 ;vsechny /CS = 1 ;vyslat vysledek
anl mov anl jnz clr subb jnz clr subb jnz clr subb jnz clr ret
A,#127 P1,#255 A,#0F0h Y1 P3.2 A,#16 Y2 P3.3 A,#16 Y3 P3.4 A,#16 Y4 P3.5
;oblast 0...127 ;vsechny linky /CS 1 ;oblasti 16 adres ;0...15 ;Y0 = 0 ;dalsi skupina ;16...31 ;Y1 = 0 ;dalsi skupina ;32...47 ;Y2 = 0 ;dalsi skupina ;48...63 ;Y3 = 0
EMPF
jnb mov clr ret
RI,EMPF A,SBUF RI
SEND
jnb clr mov ret .end
TI,SEND TI SBUF,A
Lesen
CS
Y1 Y2 Y3 Y4
Listing 9.6
(empfangen = prijimat)
Øídicí program pro rozhraní s paralelní sbìrnicí (Pibus.asm) CD:\Kniha\Kap09\TasmKap9\PIbus.ASM
Hlavní program pracuje v nekoneèné smyèce, v ní se vdy nejprve pøijímá adresní byte. V závislosti na bitu s nejvyí váhou se provede buï operace zápisu nebo po skoku na Lesen (ètení) operace ètení. Spoleènì vyuívaný podprogram CS zajiuje pøeddekódování ètyø adresních oblastí a vytvoøení signálu Y. Pøi zápisu se jako druhý
A
B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
205
byte pøijme datový byte a vydá se na P0. Teprve potom se vytvoøí signál CS a :5. Výpoèet adresních signálù po pøíjmu datového bytu vyaduje doèasné uloení pøijatého adresního bytu. Pøi ètení bytu ze sbìrnice se nejprve vygeneruje adresa, potom signál 5' a pøípadný signál Y. Tím obvod pøídavného zaøízení pøivede na sbìrnici svá data, která se pøeètou ètecím pøístupem mikrokontroléru na port 0. Program pøi opakovaných zápisových pøístupech provádí prakticky prùbìnì pøepínání mezi adresními a datovými byty. V principu pøi tom mùe dojít k zámìnì napøíklad v dùsledku programového pøeruení na stranì PC. Pøi novém startu by se datový byte interpretoval jako adresa. Tomu vak lze snadno zabránit provedením prázdného (dummy) ètecího pøístupu pøi startu programu. Protoe pøi ètení je v kadém smìru jen jeden byte, je po nìm kontrolér v definovaném stavu. Listing 9.7 ukazuje jednoduchý pøíklad programu v jazyce Visual Basic. Je mono popsat a naèítat vechny adresy v oblasti 0 a 127. Dalí pøíklady jsou uvedeny v kapitole 5. Private Sub Form_Load() OPENCOM "COM2:9600,N,8,1" SENDBYTE 128 Dummy = READBYTE SENDBYTE 128 Dummy = READBYTE End Sub Private Sub Form_Unload(Cancel As Integer) CLOSECOM End Sub Private Sub Read_Click() SENDBYTE Val(Text1.Text) + 128 'cteni adresy Text3.Text = Str$(READBYTE) End Sub Private Sub Write_Click() SENDBYTE Val(Text1.Text) SENDBYTE Val(Text2.Text) End Sub
Listing 9.7.
Obr. 9.7
206
'Adresa 'Data
Zápis a ètení pøes sbìrnici
Pøístup na sbìrnici programem v jazyce Visual Basic B. KAINKA: MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ PC
A