Univerzita Palackého v Olomouci Přírodovědecká fakulta
Mikroprocesorová technika Milan Henkl Zuzana Veselá
Olomouc 2014
Oponenti: Ing. František Roháč Ing. Antonín Duda
Publikace byla vytvořena v rámci projektu Otevřená síť partnerství na bázi aplikované fyziky, reg. č. CZ. 1.07/2.4.00/17. 0014
1. vydání © Milan Henkl, Zuzana Veselá, 2014 © Univerzita Palackého v Olomouci, 2014 Neoprávněné užití tohoto díla je porušením autorských práv a může zakládat občanskoprávní, správněprávní, popř. trestněprávní odpovědnost. ISBN 978-80-244-4063-7
Obsah Mikroprocesorová technika Úvod do mikroprocesorové techniky 1. Základní pojmy 2. Struktura počítače 3. Vývoj mikroprocesorů 4. Polovodičové paměti 5. Architektura a technické vlastnosti jed.mikr.8051 6. Paměťový prostor 8051 7. Časování 8051 8. Délka instrukcí 8051 9. Čítače- časovače 8051 10. Přerušovací systém 8051 11. Přerušení od časovače 8051 12. Sériový kanál 13. Mikrokontroléry ATMEL 14. Historie osmibitových mikr. a mikrořadičů fy.ZILOG 15. Vstupně- výstupní porty - příloha
4 5 6 7 10 11 14 17 18 19 21 24 25 26 29 29
PROGRAMOVÁNÍ 8051 1. Vývojové diagramy
39
2. Instrukční soubor 3. Programovací techniky 4. Programování LED 5. Programování 7segm. displeje- statického 6. Použití podprogramu 7. Kombinace podprogramů 8. LED - rotace, použití logických instrukcí 9. Vlastní podprogram časového zpoždění 10. Použití časovačů 11. Programování reproduktoru 12. Programování klávesnice 13. Načtení dat tabulkou 14. Programování ATMELU 15. Programování 7segm. displeje- dynamického
42 45 45 50 52 53 56 57 58 62 66 68 69 71
Úvod do mikroprocesorové techniky Mikroprocesorová technika je obor, který se vyvíjí každý den a jeho produkty nás všude kolem nás obklopují. Automatická pračka, mikrovlnná trouba, různé dětské hračky, řízení osvětlení, řízení dopravy - to jen část produktů, spadajících do tohoto skvělého a dynamického oboru. V dalším textu jsou použity některé grafické značky, jejichž význam je následující: Otázka? V textu je kladena otázka s vynecháním místa na dopsání odpovědi.
Vlastní zápis.
V textu je vynecháno potřebné místo na vlastní zápis z hodiny.
Praktická ukázka. V hodině byla užita ukázka a je vynecháno místo na zápis vlastních poznatků
Domácí úkol. Domácí cvičení, které bude kontrolováno a známkováno.
V hledání tajů mikroprocesorové techniky Vám přeji úspěšnou cestu a radost z nových vědomostí.
4
1. Základní pojmy Mikropočítač
-se skládá z funkčních bloků, které se nazývají mikroprocesor, operační paměť a vstupní a výstupní obvody
Hardware
-je technické vybavení počítače, je tvořen funkčními dalšími log.obvody a vodiči
Software
-je programové vybavení počítače
bloky a
Mikroprocesor -jádro počítače(srdíčko), -generuje všechny řídící signály potřebné pro současnou činnost a spolupráci všech funkčních bloků -v závislosti na programu řídí výměnu dat s ostatními funkčními bloky -provádí instrukce -je programovatelný sekvenční automat, vyrobený technologii velké integrace v jednom pouzdře MPU -Microprocessor Unit CPU -Central processor Unit Periférní zaříz. světem Instrukce Operační paměť
-přístroje, umožňující komunikaci mikroprocesoru s okolním
-krok programu -uchovává program a data, která jsou zpracována -uchovává mezivýsledky při výpočtech Sběrnice -skupina několika vodičů ze stejnou funkcí -propojuje mikroprocesor s operační pamětí a V/V obvody dělíme je na: -datová - přenos dat z paměti do MPU a naopak DBUS -adresová -vyslání adresy ABUS -řídící - určuje směr přesunu CBUS Bit -základní jednotka informace (nabývá hodnot 0 ,1) Byte -slabika, skládá se z osmi bitů Word -slovo -počítač zpracovává data po slovech (word), typická délka slova je 8,16 nebo 32 bitů , tj. 1, 2, nebo 4 byty
5
b B
1
0 0 0 1 1 0 0
SLABIKA
Jednoslabikové slovo - slabika = 8 bitů (pro tento případ) Dvouslabikové slovo -
2slabiky = 16 bitů
2. STRUKTURA POČÍTAČE
2.1 Blokové schéma počítače
PAMĚŤ
clock
ALU OUT
Řadič IN
procesor obr.1 Obecná struktura počítače
Struktura počítače se dá obecně rozdělit do 3 bloků – procesor, paměti a vstupně výstupní zařízení.
6
2.2 Popis počítače Hodiny (Clock) generují taktovací signál, který je přiveden do procesoru. Tento signál synchronizuje jednak vlastní procesor, jednak spolupráci procesoru s ostatními částmi počítače. Paměť -blok paměti obsahuje většinou dva typy pamětí ROM obsahuje instrukce zajišťující chod programu nebo konstanty a tabulky používané v programu RWM do této paměti může počítač data zapisovat a číst, ukládá data získané počítačem ze vstupních portů,ukládá mezivýsledky Vstupní portinput port = VSTUP umožňuje zanést do počítače data z vnějšího prostředí (klávesnice,myš, A/D převodník a pod.) Výstupní port-
output port = VÝSTUP informaci na vybraný výstupní port zapíše procesor při provedení instrukce (tiskárna, monitor)
2.3 Rozdělení současných architektur počítače Struktura počítače bývá v současné době provedena dvěma způsoby: Architektura von Neumann – společná paměť pro data i instrukce (klasický PC) Architektura harvardská (harwardská)- rozdělena paměť dat a programu. (většina jednočipů)
3. Vývoj mikroprocesorů 3.1 Technologie výroby mikroprocesorů dříve dvě technologie- bipolární a unipolární bipolární - velká rychlost, velká plocha, malá hustota integrace TTL unipolární - malá rychlost, malá plocha, velká integrace PMOS, NMOS
7
3.2 Hustota integrace IO jsou vyráběné různou hustotou integrace součástek na čipu. Rozeznáváme tyto hustoty integrace : SSI Small Scale Integration - malá hustota integrace MSI Medium Scale Integration - střední hustota integrace LSI Large Scale Integration - velká hustota integrace VLSI Very Large Scale Integration - velmi velká hustota integrace současnost - odstraněna nevýhoda unipolární technologie, zvýšila se rychlost - jen technologie unipolární BiCMOS, 68VLSI - CMOS - Complementary Metal - Oxide Semiconductor
Jaký typ procesoru máš ve svém PC ? Na jaké frekvenci procesor pracuje ?
8
3.3 Vývoj mikroprocesorů firmy INTEL Typ
Rok zavedení
Interní bus (bit)
počet tranzistorů
8080 8088 80286 80386 486DX 486SX
74 79 82 85 89 91
486DX(2,4) 486SL Pentium
92 32 40druhů 386a486 93 64 94
Pentium MMX
96
4,5
Pentium II 97 Klamath Celeron 98 Mendocino
7,5
Pentium II Xeon
98nahrazuje Pentium PRO
Pentium III Pentium IV Pentium 4
99
Celeron Cedar Mill
2001
8 8 16 32 32 32
MIPS 0,2 0,3 1,2 6 20 16,5
134000 275000 1,2 1,185
40
1,2
100
přes 3 mil.
poznámka
mikrovln-ka
neobsahuje koprocesor 2 x rychleji s 3,3V 60, 66 MHz 100,200MH z multimediáln í aplikace zvuk.karta, CD-ROM 266, 300MHz server, prac.stanice
0,18 μm 2miliardy
2003 2005
0,13 μm 65nm
2006 2009
9
700 MHz 1,56GHz 2GHz(o81% r) D352 (3,46) 3,26 GHz
3.4 Pojmy související s mikroprocesory MIPS (Milion Instruction Par Secunda) - milionů instrukcí za sekundu RISC (Reduced Instriction Set Computer) - počítač s omezeným instrukčním souborem CISC (Complex Instruction Set Computer) - počítač s komplexním instrukčním souborem ASIC (Application Specific Integrated Circuits) zákaznické obvody
4. Polovodičové paměti Dělíme je podle mnoha různých hledisek: 4.1 Přístup k buňkám paměti a) b) c)
paměti s libovolným přístupem RAM (Random Access Memory) paměti se sériovým přístupem SAM (Seriál Access Memory) paměti se speciálním přístupem k paměťové buňce: typu zásobník = sklípková paměť LIFO (Last In First Out) – poslední dovnitř, první ven typu fronta FIFO (First In First Out) – první ven první dovnitř 4.2 Možnost změny dat (zápisu) a) paměti RWM (Read Write Memory) - čtení i zápis za provozu, nevýhoda jsou „volatilní“(volatile) = při vypnutí napájení se ztrácí data b) paměti ROM (Read Only Memory) - pouze ke čtení -„nevolatilní“(unvolatile) = data při výpadku se neztrácí c) paměti PROM (Programable ROM) - jednou programovatelné (OTP) d) paměti EPROM (Errassable PROM)- mazatelné ultrafialovým zářením, programovatelná elektricky, má okénko d) paměti EEPROM (Electrically EPROM) =EAPROM = E2PROM programovatelná a mazatelná elektrickým signálem (1000x)
10
4.3 Princip realizace paměťové buňky a, b,
Statické - p.b. tvořena bistabilním KO – data není potřeba obnovovat SRAM, (Static RAM) Dynamické - p.b. je tvořena parazitní kapacitou řídící elektrody tranzistoru MOSFET – data je potřeba pravidelně obnovovat speciálními obvody „refresh“ DRAM (Dynamic RAM)
4.4 Technologie výroby a) Bipolární - TTL - rychlé, jediné napájení, vysoký logický zisk a vysoká rychlost (Schottkyho diody) - ECL - Emitor Coupled Logic - velmi rychlé b) Unipolární - základ tranzistor řízený polem MOS s různými typy kanálů - vysoká hustota integrace
5.Architektura a technické vlastnosti jednočipových mikrořadičů 8051
5.1 Přehled jednotlivých typů mikrořadičů řady 8051 Soubor osmibitových mikrořadičů MCS - 51 tvoří obvody z následující tabulky. Termín „8051“ se často používá jako souhrnné označení všech obvodů řady MCS 51 Obvod 8031AH 8051AH 8751H 80C31 80C51 8032AH 8052AH
Výrobní Technologie HMOS II HMOS II HMOS I CHMOS CHMOS HMOS II HMOS II
Paměť programu na čipu Nemá 4KB-ROM 4KBEPROM Nemá 4KB-ROM Nemá 8 KB – ROM
Paměť dat na čipu 128 B 128 B 128 B 128 B 128 B 256 B 256 B
Obvody 8052 mají na čipu integrovánu větší paměť programu a dat a další šestnáctibitový časovač-čítač.
11
5.2 Pouzdro a rozmístění jednotlivých vývodů mikrořadiče
8051
IO 8051 P1 . 0 1 2 3 4 5 6 7 RESET P3 . 0 1 2 3 4 5 6 7 XTAL2 XTAL1 GND
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
UCC P0 . 7 6 5 4 3 2 1 0 EA ALE PSEN“ P2 . 7 6 5 4 3 2 1 0
5.3 Popis jednotlivých vývodů 8051 P0 . 0 – 7 P2 . 0 – 7 P1 . 0 – 7 P3 . 0 (RxD) 1 (TxD) 2 (INT0) 3 (INT1) 4 (T0) 5 (T1) 6 (WR‘‘) 7 (RD‘‘) XTAL 1,2 RESET EA = TTL = UP ALE PSEN‘‘ UCC GND
datová obousměrná sběrnice, multiplexovaná s dolními bity adresy horní bity adresy není – li vnější paměť, obě brány v / v universální vstup / výstup vstup sériového kanálu výstup sériového kanálu vnější přerušení 0 vnější přerušení 1 vnější hodiny časovače 0 vnější hodiny časovače 1 zápis do vnější paměti dat čtení z vnější paměti dat připojení krystalu nebo vnějších hodin – standard 12 MHz inicializace (počáteční stav) mikropočítače nastavení paměťových prostorů programovací režim týl signálu vzorkuje adresu na sběrnici při instrukci čtení / zápis do vnější paměti přenos z vnější paměti programu napájecí napětí +5V nulový potenciál – zem
12
5.4 Bloková struktura 8051
XTAL1
UCC GND
RESET EA ALE PSEN“ WR“ RD“ INT0 INT1
XTAL2
OSCILÁTOR
ř a d i č
kanál P0 kanál P1 kanál P2 kanál P3 CPU 8b
byte byte byte byte
ROM /EPROM 4 KB
registry SFR
4 x 8 bit paměť programu
(paměť dat)
sériový kanál
TxD RxD
RAM 128 byte
čítač 0 čítač 1
T0 T1
5.5 Popis architektury 8051 MIKROPROCESOR 8051 je 8 bitový jednočipový mikroprocesor s harvardskou strukturou, u které je oddělena programová a datová paměť. 5.5.1 Oscilátor Na vývody XTAL1 a XTAL2 je připojen piezoelektrický rezonátor – „krystal“.Kmitočet oscilátoru u standardního mikroprocesoru 8051 se může pohybovat v rozsahu 1,2 MHz až 12 MHz.U některých nástupců lze spodní kmitočet snížit až k nule , nejvyšší kmitočet může dosáhnout až 33 MHz.(podle typů) 5.5.2 Paměť programu, dat a porty Na čipu procesoru je umístěna vlastní CPU, která je vnitřní společnou sběrnicí propojena s pamětí programu ROM nebo EPROM o kapacitě 4kB(existují i typy bez této paměti), s pamětí dat RAM o kapacitě 128 bytů a se čtyřmi vstupně – výstupními branami P0 – až P3, které zajišťují styk procesoru s vnějšími perifériemi.
13
5.5.3 Připojení vnější paměti Nechceme –li využívat procesor v jednočipové konfiguraci, případně nemůžeme-li(bez vnitřní ROM –EPROM), jsou z procesoru vyvedeny řídící signály pro správu vnější programové /(PSEN) nebo datové /WR a /RD paměti, z nichž každá může mít až 64 kB. 5.5.4 Přerušení Pro snadnější styk s periferiemi je procesor vybaven řadičem přerušení, který zpracovává 5 zdrojů přerušení (2 externí , od každého ze dvou časovačů a od sériového kanálu). 5.5.5 Časovače - čítače Časovače – čítače, které jsou dva ( tři), slouží buď k čítání vnějších impulsů – vstupy T0 ,T1 nebo k realizaci přesných časových intervalů. Mohou být až 16 bitové . 5.5.6 Sériový kanál Sériový kanál slouží pro snazší sériový styk s nadřízenými počítači nebo jinými spolupracujícími procesory. Sériový kanál je duplexní ( obousměrný). 5.5.7 Booleovský procesor Procesor je vybaven Booleovským procesorem, který umožňuje pracovat s jednotlivými bity vnitřní paměti RAM i interních periférií.
6. Paměťový prostor 8051 Harvardská architektura - paměť rozdělena na paměť dat a paměť programu. 6.1 Paměť dat Paměť dat (Data Memory) může být až 64 kB. Vnější paměť dat se používá při provádění instrukce MOVX. Z toho je 256B uvnitř čipu- vnitřní paměť dat. Vnitřní paměť dat - je tvořena 256 B - dolní a horní polovina je tedy 128 B. V dolní polovině paměti dat (0-127) jsou umístěny: 4 registrové banky RB0-RB3. V každé registrové bance je umístěno 8 registrů R0- R7. Při inicializaci systému se nastaví sama banka RB0; RB zabírají 32 B. 16B bitově adresovatelný prostor - s jednotlivými bity mohu pracovat samostatně, je tam tedy 16x8 =128bitů zbývající část do 128B je volný uživatelský prostor V horní polovině paměti dat (128 –255) je umístěno 20(21) SFR
14
6.1.1 Mapa paměti dat Mapa celé vnitřní paměti dat 0 – 255 (celkem 256 B)
Obecně:
Podrobně: celkem zobrazeno 256 Bytů 256
SFR 21 speciálních funkčních registrů
Horní polovina paměti dat
(viz popis níže)
128 127
Volný uživatelský prostor 80 Bytů 48 47 32 31
16 Bytů adresovatelných po bitech (každý bit má svoji adresu) Booleovský prostor RB 3 RB 2 RB 1 RB 0
0 15
Dolní polovina paměti dat
6.1.2 Přehled a popis speciálních funkčních registrů - SFR (Special Function Registers) - speciální funkční registry slouží k nastavování a řízení činnosti 8051. -bit PSW.7 CY příznak přenosu (Carry flag) je nulován /nastavován pomocí hardware nebo software během několika aritmetických a logických instrukcí a je to přenos přes osmý bit -bit PSW.6 AC příznak pomocného přenosu (Auxiliary Carry flag) přenos z dolní poloviny bytu do horní poloviny B -bit PSW.5 F0 příznak nuly je nastavován /nulován pomocí software jako uživatelem definovaný stavový příznak -bit PSW.4 RS1 -bit PSW.3 RS0 bity pro nastavení registrové banky. Bbinární kombinací těchto bitů se nastaví registrová banka, při inicializaci se nastaví RB0 RS1 0 0 1 1
RS0 0 1 0 1
Číslo banky 0 1 2 3
- bit PSW.2 - OV příznak přeplnění(Overflow flag) je nastavován/nulován díky hardware během aritmetických instrukcí k indikaci přetečení - bit PSW.1 neobsazen - nezapojen - bit PSW.0 - P příznak parity (Parity flag) - je nastavován/nulován díky hardwaru v každém instrukčním cyklu.Tento bit indikuje sudou paritu obsahu akumulátoru, tzn.sudý počet jedničkových bitů CY
AC
F0
RS1
RS0
OV
X
P
SP 81H Stack Pointer ukazatel zásobníku je 8 bit registr. Je inkrementován před tím, než se uloží data při provádění instrukcí PUSH a CALL. 6.2 Paměť programu Paměť programu (Program Memory) může být až 64 kB a skládá se z vnitřní a vnější části paměti. Spodní 4kB mohou být umístěny přímo na čipu. Jak je mapa orientována, určuje řídící signál EA. Je-li EA = 1 je vnitřní paměť programu brána od adresy 0 - 0FFFH. Adresy 1000H - FFFFH jsou chápany jako paměť vnější. Je-li EA = 0 je celá paměť programu brána od adresy 0 - FFFFH jako vnější.
16
6.2.1 Mapa paměti programu
7. Časování 8051 7.1 Obecné pojmy Perioda T Strojový cykl SC Instrukční cyklus
IC
nejmenší časový úsek v počítači vypočítá se z frekvence T = 1/f skládá se z několika period skládá se z několika strojových cyklů
7.2 Konkrétně u 8051 Strojový cykl u 8051 se skládá ze 6 stavů označovaných jako S1 - S6. Každý stav je složen ze 2 period, označovaných jako fáze P1 a P2 (PHASE). Tedy strojový cykl se skládá z 12 period oscilátoru.
1T 2T= stav strojový cykl = 12T 17
7.3 Výpočet délky strojového cyklu Pro danou frekvenci oscilátoru f= 12 MHz (což je standardní frekvence) : délka strojového cyklu se vypočítá jako 12 period oscilátoru tSC = 12 T pro f = 12 MHz
T = 1/12 .106 tSC = 12 T = 12/12 . 106 = 1 . 10 –6 = 1 µs
Tedy pro frekvenci oscilátoru 12 MHz trvá jeden strojový cykl 1 mikrosekundu.
8. Délka instrukcí 8051
8.1 Délka instrukcí u 8051 Instrukce u 8051 jsou
jednocyklové dvoucyklové -
jednobytové(MOV A,Rn) dvoubytové (MOV A,#data) jednobytové (RET) jednobytová ince MOVX dvoubytové(PUSH) tříbytové(MOV dir1,dir2) instrukce MUL(násobení) instrukce DIV(dělení)
čtyřcyklové -
Příklad výpočtu délky instrukce DJNZ R1, HOP – Z instrukčního souboru zjistíme, že tato instrukce trvá 2 SC, tedy při f = 12MHz trvá jedno provedení této instrukce 2µs. Tuto instrukci mohu v programování použít k vytváření časových smyček. 8.2 Výpočet délky časové smyčky Pro f=12 MHz tedy 1SC= jedna mikrosekunda Další časové smyčky se vytvářejí a volají jako podprogramy. Chyba, které se dopouštíme je zanedbatelná- přesné časy budeme řešit časovačem. Př. Jedna milisekunda: MS1: CALL M5S CALL M5S RET A podobně.
18
8.3 Provádění instrukcí Obecně: Při práci nejdříve procesor přečte instrukci (hexa znak - operační kód), uloženou v paměti programu z adresy, která se nachází v registru, kterému se říká čítač programu (Program Counter - PC - programový čítač). Potom dojde ke zvýšení PC o jedničku, takže PC nyní ukazuje na další slovo v paměti programu a procesor dekóduje načtenou instrukci, čili zjistí, co má tato instrukce provádět, nakonec procesor instrukci provede. Konkrétně u 8051: Zpracování instrukcí lze vysvětlit pomocí signálu ALE (Address Latch Enable) - povolení zachycení adresy. Tento signál se generuje s konstantní rychlostí 1/6 frekvence oscilátoru, aktivuje se tedy dvakrát během jednoho strojového cyklu, poprvé během S1-P2 až S2-P1 a podruhé během S4 -P2 až S5 - P1. Provádění instrukce jednocyklové začíná při S1P2, kdy se uloží operační znak do registru instrukcí.V případě dvoubytové instrukce se druhý byte čte během stavu S4 téhož strojového cyklu. Pokud je instrukce pouze jednobytová dochází ve stavu S4 také k výběru, avšak přečtený byte se ignoruje a obsah programového čítače se nezvýší.
9. Čítače - časovače 8051 V architektuře je 2x16 bitový čítač-časovač -dále č/č. Index 0 je pro č/č 0 index 1 je pro č/č1. 9.1 Použití č/č 8051 Ze schématu č/č je vidět, že ho lze použít buď ve funkci čítače(C/ T =1 ) nebo ve funkci časovače(C/ T = 0) 9.2 Použití čítače 8051 Čítač načítá impulsy (pravidelné i nepravidelné) ze vstupu T0(1). Impulsy se plní registry č/č. Používá se k počítání impulsů .Zdroj hodin je z vnějšku. 9.3 Použití časovače 8051 Časovač načítá pravidelné impulsy z vnitřních hodin OSC: 12. Při frekvenci 12 MHz, tedy vychází intervaly plnění 1 mikrosekunda. V těchto intervalech se plní registry časovače, takže lze přesně spočítat časovou prodlevu naplnění registru (podle velikosti registru – viz módy). V okamžiku naplnění se nastaví bit naplnění TF0 (TF1) na jedna – sám se nevynuluje.
19
9.4 Spuštění řízení č/č 8051 Řízení sepne kontakt v případě log.jedničky( viz schéma č/č) - ta je na výstupu hradla AND zabezpečena 2 jedničkami – jedna je /TR0 (TR1), druhá je na výstupu hradla OR- ta je na výstupu buď, když je na GATE = 0 nebo INT0 = 0. Pokud nebudeme pracovat s přerušením – vyloučíme INT0. Nejdříve nastavíme SFR TMOD, potom č/č spustíme bitem TR0(TR1) v SFR TCON. 9.5 Speciálně funkční registr TMOD Nastavují se v něm také módy č/č – dle kombinace bitů M1, M0 zvolíme mód, který nám nejvíc vyhovuje.
9.6 Speciálně funkční registr TCON. Registr je určený k řízení obou čítačů- časovačů .
9.7 Logické schéma zapojení čítače-časovače
20
10.Přerušovací systém v 8051
start
přerušení povoleno
ano obslužný program přerušení
návrat do hlavního programu
21
ne
10.1 Princip přerušovacího systému Cílem podsystému přerušení je obsloužit požadavek vyslaný z periferních zařízení nebo z okolí mikropočítače vložením krátké programové obsluhy do probíhajícího programu. 10.2 Přerušovací podsystém 1. Detekuje vznik požadavku na obsluhu. 2. Po povolení přerušení provede předání programového řízení na speciální podprogram zajišťující programové obsloužení vzniklé situace. 3. Po skončení obslužného podprogramu se řízení vrátí do původního programu - systém musí zajistit uschování návratové adresy původního programu před vstupem do obslužného podprogram pro úschovu návratové adresy je využíván zásobník, který slouží i pro uschování adres při volání běžných podprogramů. 10.3 Zdroje přerušení 8051 Procesor řady 8051 rozlišuje 5 zdrojů žádosti o přerušení: 1,2, vnější přerušení INT0 a INT1 (IT0, IT1) 3,4, přerušení od časovače 0 a časovače 1(TF0,TF1) 5 přerušení od sériového kanálu Každý ze zdrojů přerušení je možné individuálně povolit nebo zakázat nastavením nebo vynulováním příslušného bitu v SFR (Interrupt Enable) 10.4 Registr povolení přerušení (Interuption Enable) IE (Interrupt Enable) - registr povolení přerušení – adresa RAM A8H
EA
X
X
ES
ET1
EX1
ET0
EX0
EA - globální povolení přerušení Enable All pokud je EA = 0 je celý přerušovací systém zablokovaný a nemůže být přijata jakákoliv žádost o přerušení ES - povolení přerušení od sériového kanálu ET0 a ET1-povolení přerušení od č/č 01 EX0 a EX1 - povolení vnějšího přerušení
Zamysli se nad příkladem přerušení v počítači.
22
10.5 Adresy přerušení Každý zdroj přerušení má definovanou adresu, na kterou po přijetí žádosti o přerušení, dokončení rozpracované instrukce a uložení návratové adresy do zásobníku, předá procesor řízení. IE0 TF0 IE1 TF1 RI + TI
Vnější přerušení Čítač-časovač Vnější přerušení Čítač-časovač Sériový kanál
0 0 1 1
0003H 000BH 0013H 001BH 0023H
Každý obslužný podprogram zakončujeme instrukci RETI (Return from Interuption). Pro využití přerušení systému mikroprocesoru je nezbytné znát přiřazení priorit jednotlivým přerušením. 10.6 Priorita přerušení Nejvyšší priorita vnější přerušení INT0 ( IE0) časovač 0 (TF0) vnější přerušení INT1(IE1) časovač 1(TF1) Nejnižší priorita sériový kanál ( RI a TI) Vše je řízeno SFR přerušení IP (Ineruption Priorite)
X
X
X
PS
PT1
PX1
PT0
PX0
Otázka priority přerušení se stává důležitou v případech současného přijetí dvou a více žádostí o přerušení. Přerušení s vyšší úrovni priority již nemůže být přerušeno. Žádosti o přerušení (příznaky IE0, IE1, TF0, TF1, RI + TI) se vzorkují v době S5P2 každého strojového cyklu procesoru a vyhodnocují se v následujícím cyklu.
23
11. Přerušení od časovače 8051
11.1 Použití přerušení od časovače Časovač načítá pravidelné impulsy z vnitřních hodin OSC: 12 . Při frekvenci 12 MHz tedy vychází intervaly plnění 1 mikrosekunda. V těchto intervalech se plní registry časovače, takže lze přesně spočítat časovou prodlevu naplnění registru (podle velikosti registru – viz módy).V okamžiku naplnění se nastaví bit naplnění TF0 (TF1) na jedna – sám se nenuluje – nutno nulovat softwerově. Časovač se po spuštění plní v intervalu 1 mikrosekundy (12MHz). Pokud je povoleno přerušení od daného časovače, tak v okamžiku naplnění registrů TL a TH, skočí program na danou adresu obslužného programu. Na této adrese vykoná obslužný program, který je ukončený instrukcí RETI a vrátí se zpět do hlavního programu. Výhodou je, že nemusíme hlídat bit naplnění TF, který jsme museli nulovat. Ten je při přechodu do obslužného programu vynulován automaticky. 11.2 SFR pro přerušení Registr přerušení IE (Interrupt Enable)
EA
X
X
ES
ET1
EX1
ET0
EX0
EA - Enable All globální povolení přerušení ES – povolení přerušení od sériového kanálu ET0 - povolení přerušení od časovače 0 adresa 000Bh ET1 - povolení přerušení od časovače 1 adresa 001Bh EX0 - povolení přerušení vnější 0 EX1 - povolení přerušení vnější 1 Řešení programu přerušení Zadání: Pomocí přerušení od časovače realizujte program blikání portu s LED v 1 s intervalu.
24
12. Sériový kanál
12.1 Rozdělení sériových kanálů Sériový komunikační interface SCI (Serial Comunication Interface) Rozeznáváme dva základní sériové přenosy: 1. ASYNCHRONNÍ 2. SYNCHRONNÍ Asynchronní SCI obsahuje: - START bit - 7-8bitů dat vysílaných od LSB po MSB - STOP bit Délka START bitů a datových bitů se určí z požadované přenosové rychlosti následovně: - doba trvání bitu(s) = 1 / přenosová rychlost (bit/s). Přenos probíhá po jednom vodiči (nepočítáme-li zem). Vysílací strana se označuje TxD (Transmit data). Přijímací strana se označuje RxD (Recieve data). Každé zařízení, které má komunikovat obousměrně má samostatný vysílač a přijímač. Synchronní SCI Synchronizace přijímače a vysílače na začátku přenosu zajišťuje synchronizační znak. Po jeho vyhodnocení probíhá nepřerušovaný přenos znaků bez další synchronizace až do okamžiku přijetí nového synchronizaci znaku. Pokud vysílač nemá k dispozici další data, vysílá automaticky synchronizované znaky. 12.2 Sériový kanál u 8051 výhoda - plně duplexní sériový kanál umístěný na čipu procesoru (vysílat a přijímat může současně) umožňuje komunikaci ve standardním 8 a 9 bitovém režimu asynchronním nebo 8b synchronním režimu přijímací a vysílací reg. sériových portu jsou dostupné jako SBUF v SFR, sér.port může pracovat ve 4 módech v závislosti na naprogramování registru SCON a nejvyššího bitu v registru PCON
25
12.3. SFR sériového kanálu SCI SCON SFR registr
SM0 SM0 a SM1 SM2 REN TB8 RB8 TI RI PCON
SM1
SM2
REN
TB8
RB8
TI
RI
bity k nastavení módů 0-3 víceprocesorová komunikace povolení příjmu(nastavuje se SW) devátý datový bit při vysílání devátý datový bit při příjmu příznak prázdného vysílacího posuvného registru příznak přijatých platných dat SFR registr
SMOD
X
X
X
X
X
PD
IDL
SMOD doplňující bit pro řízení sériového kanálu slouží ke zdvojnásobení jeho přenosové rychlosti PD
POWER DOWN je zastavena činnost celého procesoru včetně periférii i oscilátoru
IDL
-periférie a oscilátor běží dál
13.Mikrokontroléry ATMEL 13.1 Vlastnosti Kompatibilita s Intel 8051 V provedení DIL20 - 1,2,4 kB interní programové FLASH 1000 zápisových cyklů ( mazání – zápis - elektricky) Rozsah napětí od 2,7 do 6 V Oscilátor 0 Hz až 24 MHz 128 bytů vnitřní paměti RAM 15 programovatelných I/O pinů Dva 16-ti bitové čítače/časovače 5 zdrojů přerušení Plně duplexní sériová linka Dvouúrovňová ochrana dat Úsporné režimy napájení Analogový komparátor 26
13.2 Fotografie DIL20, DIL40
13.3.Popis jednočipu ATMEL AT89C2051 Procesor AT89C2051 je určen pro jednoduché aplikace, u kterých není potřeba mnoho I/O pinů a paměti programu a dat (2kB). Oproti standardní řadě x51 obsahuje navíc analogový komparátor se vstupy na P1.0 a P1.1. Jeho výstup je softwarově přístupný na bitu P3.6. Velice dobře je propracován systém ochrany dat. Každý I/O pin může přímo budit LED diodu (až 20mA), takže nejsou potřeba žádné okolní posilovače. => připojením krystalu a dvou kondenzátorů a napájení získáme plně funkční mikropočítač
Význam vývodů portu P3
27
Rozložení vývodů mikrořadiče AT89Cxx51 na pouzdro DIP20 Podrobnější popis naleznete v originálním anglicky psaném PDF souboru (DATASHEET) přímo na www.atmel.com Konstrukce velice jednoduchého programátoru je popsána na HW serveru. 13.4.Blokové schéma jednočipu ATMEL AT89C2051
28
14.Historie osmibitových mikroprocesorů a mikrořadičů ZILOG Americká firma ZILOG vstoupila na trh mikroprocesorů v roce 1973. V době, kdy svět ovládaly obvody Intel 8080, se objevil obvod s typovým označením Z80. Osmibitový mikroprocesor s odlišnou architekturou, založenou na sadě univerzálních registrů, které mohly sloužit pro jakoukoliv funkci, tedy i jako střadač. Architektura umožňovala pružnější přístup k registrům, optimální využití instrukcí a tím i rychlejší chod programu než u procesorů jiných výrobců při stejném hodinovém kmitočtu. Ještě dříve, než IBM dala světu osobní počítače, byla firma Zilog známá počítači Sinclair obsahující mikroprocesor Z80 CPU. Postupem času byl mikroprocesor Z80CPU následován obvody Z80 CTC (Counter-Timer Circuit), Z80 PIO(Parallel Input / Output), Z80 SIO (Seriál Input/Output), Z80 DMA (Direct Memory Access) a dalšími. S rozvojem technologie se měnila struktura obvodů od TTL přes NMOS až po CMOS, zvětšovala se hustota integrace a v jednom pouzdře se slučovalo stále více obvodů. Na konci vývoje stál obvod Z80 IPC (Inteligent Peripheral Controller), který obsahoval procesor, paralelní i sériové vstupně výstupní obvody- porty, oscilátor, čítače. Tedy podle dnes zavedené terminologie – mikrořadič. Obvody řady Z80 tvoří značný podíl na světové produkci mikroprocesorů. Obvody řady Z80 většinou neobsahovaly žádnou paměť kromě základní registrové výbavy. Ani současní pokračovatelé řady, obvody Z180 a 16b Z380 nemají na čipu paměť. To je v tvrdé konkurenci nevýhoda. Čekalo se na nový obvod. Jim se stal obvod řady Z8 – 8b CMOS mikrořadič. Vychází z principu univerzální sady registrů, kterých může být na čipu až 256. Navíc čip obsahuje i paměť pro uložení programu PROM ( OTP- One Time Programmable) – nejméně 512 B nejvíce 32 kB. Dále čip obsahuje dva 14 bitové čítače, dva analogové komparátory, oscilátor a nejméně 14 vstupů/ výstupů. Čip dále obsahuje WATCH DOG TIMER ( hlídací pes), Power On Reset(nulování při zapnutí napájení) a další obvody. Všechny obvody řady Z80 mají jeden shodný instrukční soubor. Po roce 1999 je řada Z8 známá ve více jak stovky provedení, lišících se velikostí paměti, počtem vstupů a výstupů, rychlostí, dovolenou pracovní teplotou. Speciální obvody obsahují i AD a DA převodníky, sériový UART kanál. Jádro Z8 tvoří základ mnoha jednoúčelových obvodů pro řízení klávesnic PC nebo obvodů pro infračervené dálkové ovládání.
15.Vstupně/výstupní porty 8051. Vstupně/výstupní porty nám umožňují připojit k mikroprocesoru cokoli dalšího (tranzistory, LED, tlačítka,...), co pracuje s logickými signály (tj. dvoustavovými - log.0 a log.1). Vstupně / výstupní (v/v) porty jsou slučitelné s TTL/CMOS logikou, což nám tak udává napěťové úrovně pro log.0 a 1. U standardní verze 8051 máme k dispozici 4 v/v porty, z nichž každý má po 8 pinech. Tyto čtyři porty jsou označovány P0, P1, P2 a P3. Pokud chceme označit konkrétní pin určitého portu, pak označení vypadá celkem logicky takto - např. P1.4 , kde 1 před des. tečkou určuje port a 4 za tečkou je číslo konkrétního pinu příslušejícího k portu 1. Místo slova port se někdy můžete setkat s označením brána. Pokud chceme označit jeden konkrétní pin určitého portu, používám označení pin, 29
příp. v/v pin. Jelikož se jednotlivé piny adresují jako bity, můžete se setkat s označením bit, např. bit P1.5. Z toho, že se bavíme o vstupně/výstupních portech vyplývá, že tyto porty (všechny čtyři) jsou obousměrné - můžeme tedy jednotlivé piny všech portů v rámci jednoho programu používat jako vstupní i jako výstupní (viz dále). Porty hardwarově sestávají ze vstupních vyrovnávacích pamětí, klopných obvodů typu D (namapovány v SFR) a výstupních budičů. Vnitřní (funkční) zapojení portů P0 až P3 ukazují obr. 1 až 4.
obr.1
obr.2 30
obr.3
obr.4
31
Stručná charakteristika portů Port 0 jako jediný nemá ve výstupním budiči zvyšovací odpor - jde tedy o obvod s otevřeným kolektorem. Pokud jej chceme použít jako obecné vstupy/výstupy, musíme k pinům připojit externí odpory, jejichž druhý konec připojíme na +Ucc. Port 0 se také může využívat při styku s vnější pamětí - popis najdete v odstavci věnovaném portu 2. Port 1 nemá žádnou alternativní funkci, díky tomu jej můžeme bez nějakého omezení libovolně používat. Port 2 se kromě své normální funkce může využívat spolu s portem 0 ke komunikaci s externí pamětí. K tomuto účelu se využívají jen části obou portů výstupní budiče portu 0 a 2 a vstupní vyrovnávací paměť portu 0. Na portu 0 je časově přepínán výstup nižšího bytu adresy pro externí paměť s datovým bytem, který je zapisován nebo čten z paměti. Port 2 pak vysílá vyšší byte adresy. Tato adresa je tedy 16-bitová, abychom mohli adresovat až 64kB paměti. Port 2 jinak pracuje jako normální port. Podrobnější popis přístupu do vnější paměti najdete na další stránce. Port 3 - všechny piny portu 3 jsou vícefunkční. Kromě standardní funkce navíc tento port poskytuje své piny pro potřeby jiným vnitřním obvodům mikroprocesoru, seznam pinů a jim příslušné alternativní funkce zobrazuje následující tabulka:
Pin
Alternativní funkce
P3.O RXD (serial input) P3.1 TXD (serial output) P3.2 INTO (external interrupt) P3.3 INT1 (external interrupt) P3.4 TO (Timer/Counter O external input) P3.5 T1 (Timer/Counter 1 external input) P3.6 WR (external Data Memory write strobe) P3.7 RD (external Data Memory read strobe) Alternativní funkce pinů portu 3 může být aktivována pouze, pokud bit v SFR příslušný danému pinu obsahuje log.1. Jinak pin zůstává v log.0. Popis vnitřního zapojení a funkce jednotlivých portů Obrázky 1 až 4 ukazují funkční zapojení jednoho pinu každého ze 4 portů. V/V pin tedy tvoří synchronní KO typu D (což je jeden bit v oblasti portů v SFR). Ten načte log.hodnotu z vnitřní sběrnice po příchodu log.1 na vstupu C (z vnitřního signálu CPU - Zápis do KO). Výstup Q klopného obvodu je poslán na vnitřní sběrnici, pokud je aktivní (v log.1) vnitřní signál z CPU - Čtení obsahu KO. Skutečný logický stav pinu samotného je poslán na vnitřní sběrnici, pokud je aktivní vnitřní signál CPU - Čtení stavu pinu. Některé instrukce, které čtou z portu, aktivují signál Čtení obsahu KO, některé instrukce aktivují signál Čtení stavu pinu. 32
Podrobnější informace o těchto instrukcích se dočtete v odstavci věnovaném instrukcím typu "čtení-modifikace-zápis". Jak je vidět z obr.1 a 3, výstupní budiče portu 0 a 2 jsou přepínatelné na vnitřní sběrnici Adresa a Adresa/Data vnitřním signálem CPU - Řízení (v případě, že využíváme přístup k externí paměti). Během přístupu k externí paměti zůstává stav portu 2 (tedy obsah SFR - oblast P2) nezměněn, naopak do odpovídající oblasti SFR portu 0 jsou zapsány jedničky. Jak ukazuje obr.4, pokud KO pinu z portu 3 obsahuje jedničku, výstupní log. úroveň pinu je dána stavem vnitřního signálu Alternativní výstupní funkce. Skutečný log.stav pinu je vždy dostupný na vnitřním signálu CPU - Alternativní vstupní funkce. Porty 1, 2 a 3 mají ve výstupních budičích vnitřní zvyšovací odpory (angl. pull-up). Port 0 má naproti tomu výstupy s otevřeným kolektorem (nemá tedy vnitřní zvyšovací odpory). Každý pin kteréhokoliv portu může být nezávisle používán jako vstupní nebo jako výstupní. Porty 0 a 2 nemohou být používány jako všeobecné v/v piny, pokud jsou používány jako adresově-datová sběrnice při přístupu do externí paměti. Pokud tedy chceme piny použít jako vstupní, KO příslušného pinu musí obsahovat jedničku, což způsobí zavření FET tranzistoru ve výstupním budiči (FET je připojený přes negovaný výstup KO). Potom pro porty 1,2,3 platí, že pin je v úrovní log.1 díky zvyšovacímu odporu, ale může být přestaven do log.0 vnějším zdrojem připojeným k pinu (viz tento odstavec). Port 0 se od ostatních portů liší tím, že nemá ve výstupních budičích vnitřní zvyšovací odpory. Místo odporu je zde druhý FET tranzistor (na obr.1 je to ten horní), který se ale využívá jen když port vysílá jedničky během přístupu k externí paměti (na GATE tranzistoru je log.1). V ostatních případech je FET tranzistor zavřený (na GATE je log.0). Proto piny portu 0, používané jako výstupní, se chovají jako obvod s otevřeným kolektorem. Zápisem log.1 do KO zůstávají oba FET tranzistory zavřeny a pin se tak dostává do stavu vysoké impedance. Protože porty 1, 2 a 3 mají integrované zvyšovací odpory, jsou někdy nazývány jako "pseudoobousměrné". Když jsou nastaveny jako vstupní, jsou ve stavu log.1 a pokud je externě přizemníme, stanou se tak zdrojem proudu. Naproti tomu port 0 se považuje za "skutečně" obousměrný, protože když je nastaven jako vstupní, chová se jako vysokoimpedanční. Po resetu mikroprocesoru jsou do KO všech portů zapsány jedničky (všechny porty jsou tedy nastaveny jako vstupní). Jsou-li do KO následně během programu zapsány log.0, mohou být porty znovu přednastaveny jako vstupní zapsáním jedniček od jejich KO. Zápis do portu: Při vykonávání instrukce, která mění hodnotu KO portu, nová data přijdou do KO během fáze S6P2 posledního cyklu instrukce. Nicméně, KO portu jsou ve skutečnosti vzorkovány jejich výstupními budiči pouze během fáze 1 kteréhokoliv hod. cyklu. Během fáze 2 drží výstupní budiči hodnotu, která byla získána ve fázi 1. Z toho důvodu, nová data v KO portu nepřijdou na výstupní pin portu až do doby následující fáze 1. Další fáze 1 v tomto případě bude až fáze S1P1 dalšího strojového cyklu.
33
Blíže je vše vidět na obr.5.
obr.5 Zápis dat do portu - časový průběh Jestliže změna stavu portu vyžaduje přechod z 0 do 1 u portu 1,2 a 3, zvyšovací odpor je snížen až o dva řády během fází S1P1 a S1P2 cyklu, ve kterém dochází k přechodu z 0 do 1. To je uděláno proto, aby se zvýšila rychlost přechodu. Takto snížený zvyš.odpor může dodat až 100-krát větší proud než při své normální hodnotě. Tady je třeba vědět, že snížení zvyšovacího odporu je umožněno tím, že zvyšovací odpory tvoří FET tranzistory, nikoliv lineární rezistory. Funkce zvyšovacího odporu bude lépe vidět na obr.6.
obr.6 Vnitřní zapojení výstupního budiče portů 1 a 3, port 2 vypadá obdobně (viz text níže) Zvyšovací odpor sestává ze 3 tranzistorů FET s P kanálem (T1,T2,T3). Tzn. při log.0 na GATE bude otevřen, při log.1 bude zavřen. Stávající tranzistor ve výst.budiči (na obr. 2 až 4, na obr.6 označen jako T4) je FET s N kanálem – při log.0 na GATE je tedy zavřen, při log.1 otevřen. Tranzistor T1 je otevřen na 2 hodinové cykly po přechodu z 0 do 1 v KO portu. Když je otevřen, otevře zároveň T3 (přes invertor). Tento invertor a tranzistor plní KO, který tak drží log.1. Pokud pin portu vysílá jedničku (nastaven jako vstupní), může být externím zdrojem (součástkou) přizemněn, což způsobí zavření T3, takže pin pak přechází do stavu vysoké 34
impedance. T2 je velmi malý jakoby zvyš.odpor, který je otevřen vždy, když je T4 zavřený. Je přibližně 10-krát menší než T3. Má tu funkci, že obnovuje log.1 na pinu v případě, že na pinu 1 byla a došlo k její ztrátě vlivem externího zdroje (přizemněním). Port 2 funguje podobně s rozdílem při přístupu do externí paměti - pokud port vysílá adresu, pak při jedničkách v této adrese port ponechává otevřený tranzistor T3 (velký zvyšovací odpor). Připojování pinů portu a jejich zatížení Výstupní budič pinu (potažmo tranzistor T4 z obr.6) portů 1,2 a 3 může být zatížen proudem 1,6 mA, což umožňuje připojit 4 vstupy obvodů LS-TTL, 12 vstupů ALS-TTL, počet vstupů obvodů HC a HCT je omezen jejich vstupní kapacitou (kolem 5 pF). Piny portů 1,2 a 3 mohou být připojeny i na obvody s otevřeným kolektorem, ale přechod z 0 do 1 nebude v tom případě rychlý, protože log.0 na vstupu zavře T3 a přechod bude řízen pouze tranzistorem T2 (velmi malý zvyš.odpor). Při přístupu k externí paměti můžeme na port 0 připojit až 8 LSTTL vstupů. Pokud chceme piny portu používat jako obecné vstupy/výstupy, musíme k nim připojit externí odpory, jejichž druhý konec připojíme na +Ucc. Instrukce "čtení-modifikace-zápis" Některé instrukce, načítající stav portu, čtou obsah KO pinů a některé čtou skutečný stav pinů. Instrukce, které čtou obsah KO namísto aktuálního stavu pinu, tedy načtou hodnotu z KO, změní ji (je-li potřeba) a zpět ji přepíší do KO. Proto se o těchto instrukcích říká, že jsou typu "čtení-modifikace-zápis". Seznam těchto instrukcí naleznete níže. Pokud je cílovým operandem port, příp. jen určitý pin portu, tyto instrukce čtou obsah KO namísto aktuálního stavu portu (všech pinů), příp. jen daného pinu . ANL (log.součin, např. ANL P1, A) ORL (log.součet, např. ORL P2, A) XRL (log.fce nonekvivalence XOR, např. XRL P3, A) JBC (skok a vynulování bitu, je-li bit=1 , např. JBC P1.1, start) CPL (negace bitu, např. CPL P3.0) INC (inkrementace, např. INC P2) DEC (dekrementace, např. DEC P2) DJNZ (dekrementace a skok je-li výsledek<>0, např. DJNZ P3, konec) MOV PX.Y, C (přesun přenosu do pinu Y portu X) CLR PX.Y (vynulování bitu Y portu X) SETB PX.Y (nastavení bitu Y portu X) Na první pohled se může zdát, že poslední 3 instrukce nejsou typu "č-m-z", ale přesto jsou. I když adresují jen jeden pin (bit) portu, načtou celý port (celý byte, všech 8 pinů), modifikují jen adresovaný bit a zapíšou zpět celý byte do klopných obvodů portu. Pro uživatele tento fakt ale není podstatný, důležité pro něj je, to že po těchto 3 instrukcích zůstává stav klopných obvodů ostatních pinů daného portu nezměněn (neovlivněn případným působením připojených externích zdrojů - viz další text).
35
Důvod, proč instrukce typu "č-m-z" vůbec existují, je ten, že díky nim je možné se vyhnout chybné interpretaci napěťové úrovně na pinu. Nejlépe to bude vidět na příkladu - pin portu chceme využít pro spínání tranzistoru. Na pin tedy připojíme bázi tranzistoru (přes odpor). Když do pinu zapíšeme log.1, tranzistor se otevře. Pokud potom CPU bude číst tento pin - jeho aktuální stav a ne obsah jeho KO - načte napětí báze tranzistoru. Protože ale toto napětí po otevření tranzistoru kleslo na nějakých 0,7V, je stav pinu interpretován jako log.0. Pokud ale použijeme instrukci typu "č-m-z", čímž načteme obsah KO daného pinu, dostaneme správnou hodnotu log.1. Piny všech čtyř portů můžeme adresovat dvěma způsoby - buď můžeme adresovat jednotlivé piny portu pomocí bitových instrukcí nebo můžeme adresovat celý port - tedy všech 8 pinů daného portu současně - jako jeden byte. Příklad: bitové adresování bytové adresování setb p1.0 mov p1,a clr p1.0 inc p1 cpl p1.0 anl p1,a jnb p1.0,odskok djnz p1,odskok atd. atd. Ještě jednou si připomeneme, jak lze měnit funkci pinu na vstupní/výstupní. Každý pin kteréhokoliv portu může být nakonfigurován samostatně jako vstupní nebo výstupní. Můžeme ale samozřejmě nastavit jako vstupní nebo výstupní i celý port pomocí jediné instrukce. To, zda bude pin vstupní nebo výstupní, můžeme měnit v rámci programu kolikrát chceme. Jak nastavíme funkci pinu? Pokud má být výstupní, je to jasné - zápisem nuly dostaneme na výstupu (pinu) log.0, zápisem 1 dostaneme na pinu log.1. Pokud má pin fungovat jako vstupní, pak do něj nejprve musíme natvrdo zapsat 1. Pak teprve můžeme z daného pinu načíst aktuální stav pinu pokud je připojený signál v úrovni log.1, načteme 1. Pokud je připojený signál v úrovni log.0, načteme 0. Přesněji řečeno - připojené zařízení (např. tlačítko, báze tranzistoru), jehož stav potřebujeme zjistit a které je připojeno na daný pin, nám buď původně zapsanou jedničku ponechá nebo ji naopak "přizemní". POZN: Po resetu mikroprocesoru jsou ve všech portech zapsány 1 - jsou tedy na nastaveny jako vstupní. Trošku odlišně funguje čtení u portu 0, jak bylo popsáno výše. Na obr.1,2,3,4 a 6 jsou použity české schématické značky hradel až na jednu výjimku. Tou je původní amer.značka
budiče s negací
budiče
Tyto budiče mají povolovací vstup (ten kolmo ke vstupnímu a výstupnímu vývodu). Pokud je na tomto vstupu log.1, vstupní signál může budičem procházet na výstup.
36
Českým ekvivalentem by měla být tato značka
Povolovací vstup je zde přiveden na druhý vstup dvouvstupového hradla AND (NAND). Přesto jsou z důvodu "kompatibility" s tištěnou (i českou) literaturou ponechány v obrázcích původní amer.značky.
37
PROGRAMOVÁNÍ 8051 Úvod do programování Jednočipový mikropočítač řady 8051 je v současné době nepsaným standardem v mikroprocesorové technice. Jeho architektura a instrukční soubor se staly základem pro celou řadu vyšších typů jednočipových mikropočítačů. Úkolem výukového kurzu je popis elementárních programátorských technik a postupů, které je nutno zvládnout pro programování konkrétních aplikací. Výhodou je velmi nízká cena (od 35Kč- 200 Kč) těchto obvodů, takže jsou dostupné jak pro jednotlivce, tak pro firmy. Uživatel, který se chce naučit programovat jednočipy řady 8051 musí znát minimálně blokové schéma architektury tohoto jednočipu , rozumět funkcím jednotlivých bloků (možno dostudovat viz učební texty) . Doporučuji pracovat s instrukčním souborem Tento kurz programování je chápan jako základní a jednotlivé bloky jsou řazeny od nejjednoduššího ke složitějšímu na základě desetileté zkušenosti programování těchto jednočipů ve škole v předmětu mikroprocesorová technika. Vše je vysvětlováno tak, aby 99 % studentů prošlo bez problému. To 1 % jsou Ti, co nechodí do školy.
38
1. VÝVOJOVÉ DIAGRAMY Naše programy a podprogramy využijí pouze několik základních ikonek. Využívám docela dobře zpracované vývojové diagramy ve wordu v nabídce automatických tvarů. Nejdříve si jednotlivé ikonky představíme : Používané diagramy Začátek - konec
Rozhodovací člen
Načtení dat
Spojka - se kreslí při přecházení na další stránku a čísluje se
Volání podprogramu ( použití instrukce CALL)
39
Příklady vývojových diagramů Př.1 Program, který rozsvítí a zhasne všechny LED v intervalu 400ms: OPAK :MOV P1, #00000000b CALL DEL400 MOV P1, #11111111b CALL DEL400 JMP OPAK
;rozsvícení sudých LED ;časová prodleva 400ms ;zhasnutí všech LED ;opakuje se stále dokola
start
rozsv .LED 400ms zhas.LED 400ms
konec
Př.2 K programu, který je tvořen ze 2 podprogramů je vývojový diagram velmi jednoduchý:
S
ZAC:
CALL TRIK CALL PET JMP ZAC
TRIK
PET
K
40
Něco těžšího : Př.3 K programu, který 3krát zopakuje rozsvícení sudých a lichých LED- řešení podprogramem TRIK: MOV R1,#3 TU: MOV P1,#10101010B CALL DEL200 MOV P1,#11111111B CALL DEL200 DJNZ R1,TU RET
;počet opakování ;rozsvícení sudých LED ;časová prodleva 200ms ;zhasnutí všech LED ;opakuje se dokud není registr R1 nulový ;ukončení podprogramu ST Počet opak Rozsv LED
Čas 200ms Zhas LED Čas 200ms
R1=R1-1 NE R1= 0
ANO RET
Shrnutí zásad kreslení vývojových diagramů V podstatě každá instrukce má svoji ikonu. Výjimkou je instrukce DJNZ, která se kreslí 2 ikonami. Ikona pro začátek a konec programu instrukci nemá, přesto se do vývojového diagramu kreslí - je to mezi programátory domluvené pravidlo - tak ho respektujte. Pokud se jedná o podprogram, což poznáme podle instrukce RET na konci, píše se místo textu konec (Př.3). Pokud je vývojový diagram příliš dlouhý a nevejde se na stránku, na konci se maluje kolečko z číslem 1. Toto kolečko z číslem 1 pak začíná na následující stránce a můžeme pokračovat v kreslení vývojového diagramu. Této situaci se budeme snažit vyhnout a programovat efektivně.
41
Ke druhé kapitole se budeme často vracet, protože vývojový diagram bude doprovázet programy u Vašich zkoušek. Pokud se ve vývojovém diagramu opakují ikony stále dokola můžeme nakreslit první 2 potom naznačíme přerušovanou čárou opakování a na závěr dáme poslední 2 ikonky.
start
1.data čas 100ms
poslední data
čas 100ms
konec
2. INSTRUKČNÍ SOUBOR Instrukční soubor tohoto jednočipu lze rozdělit do 4 částí . Jsou to instrukce přesunové, aritmetické, logické a instrukce větvení. Instrukce jsou přehledně seřazeny v tabulce č. 1. V tabulce je použito v záhlaví B = znamená kolik bytů zabírá jednotlivá instrukce ; SC = strojový cykl za kolik strojových cyklů se instrukce provede. (pro 12 MHz krystal se 1SC skládá z 12 period oscilátoru – tedy 1SC trvá 1 mikrosekundu – nutno znát pro výpočet časových prodlev)
42
INSTRUKCE MIKROPOČÍTAČE 8051 PŘESUNOVÉ
činnost
B SC ARITMETICKÉ
MOV @Ri,#data MOV @Ri,A MOV @Ri,dir MOV A,#data MOV A,@Ri MOV A,Rn
(Ri) ←data (Ri) ← (A) (Ri) ←(dir) A ← data A ← (Ri) A ← (Rn)
2 1 2 2 1 1
1 1 2 1 1 1
přičtení jedničky
MOV A,dir MOV C,bit MOV DPTR,#data16 MOV Rn,#data MOV Rn ,A MOV Rn,dir MOV bit,C MOV dir,# data MOV dir ,@Ri
A ← (dir) C ← (bit) DPTR ← data 16 Rn ← data Rn ← (A) Rn ←(dir) bit ← ( C) dir ← data dir ← (Ri)
2 2 3 2 1 2 2 3 2
1 1 2 1 1 2 2 2 2
součet obecně ADD A,#data ADD A,@Ri ADD A,Rn ADD A, dir ADDC A,#data ADDC A,@Ri ADDC A,Rn ADDC A,dir
MOV dir, A MOV dir,Rn
dir ← (A) dir ← (Rn)
2 2
1 2
desítková úprava
MOV dir1,dir2 MOVC A , @A + DPTR MOVC A, @A +PC MOVX @ DPTR,A MOVX @ Ri,A
dir 1 ← dir2 A ← ( (A) + (DPTR) ) A ← ( (A) + (PC ) ) (DPTR ) ← (A) (Ri) ← (A)
3 1 1 1 1
2 2 2 2 2
odečtení obecně
MOVX A ,@ DPTR MOVX A ,@Ri
A ← (DPTR) A ← (Ri)
1 1
2 2
odečtení jedničky
výměna XCH A,Rn XCH A,dir
(A) <> (Rn) (A) <> (dir)
1 2
1 1
XCH A,@Ri XCHD A,@Ri
(A) <> (Ri) (A) <> Ri(b0-b3)
1 1
1 1
práce se zásobníkem PUSH dir POP dir
činnost
B SC
(Ri) ←(Ri) + 1 A ← (A) +1 DPTR (DPTR)+1 Rn← (Rn) + 1 dir ← (dir) +1
1 1 1 1 2
1 1 2 1 1
A ← (A) + data A ←(A) + (Ri) A← (A) +(Rn) A←(A) + dir A←(A)+C+data A←(A)+C+(Ri) A←(A)+C+(Rn) A←(A)+C+(dir)
2 1 1 2 2 1 1 2
1 1 1 1 1 1 1 1
A na desitk.tvar
1
1
A←(A)-C-data A←(A)-C-(Ri) A←(A)-C-(Rn) A←(A)-C-(dir)
2 1 1 2
1 1 1 1
DEC @Ri
(Ri)←(Ri) -1
1
1
DEC A DEC Rn DEC dir
A←(A) - 1_ Rn←(Rn) -1 dir←(dir)-1
1 1 2
1 1 1
AB ←(A)*(B)
1
4
AB ←(A) : (B)
1
4
INC @Ri INC A INC DPTR INC Rn INC dir
DA A SUBB A,#data SUBB A,@Ri SUBB A,Rn SUBB A, dir
Násobení a dělení MUL AB DIV AB
(SP) <>(dir) SP= SP +1 (dir)← (SP) SP= SP 1
2
2
2
2
43
LOGICKÉ
činnost
B SC
činnost
B SC
CLR A
A← 0
1
1
CLR C CLR bit
C←0 bit ← 0
1 2
1 1
XRL A , # data
A ← (A ) ≠data
2
1
XRL A ,@Ri XRL A , Rn
A ← (A) ≠ (Ri ) A ← (A) ≠ (Rn)
1 1
1 1
SETB C SETB bit
C←1 bit ← 1
1 2
1 1
XRL A, dir XRL dir , # data
A ← (A) ≠ (dir ) dir ← (dir ) ≠ data
2 3
1 2
CPL C
C ← /C
CPL A
A ← /A
1
1
XRL dir, A
dir ← (dir) ≠ (A)
2
1
1
1
CPL bit RL A
bit ← /bit
2
1
ACALL adr11
SP←n.adr.,PC-adr.
2
2
rotace A vlevo
1
1
LCALL adr16
SP←n.adr,PC- adr.
3
2
RLC A RR A RRC A
rotace A a C vlevo rotace A vpravo rotace A a C vpravo
1 1 1
1 1 1
RETI RET AJMP adr11
navrat - preruseni navrat podprogr PC ← adresa (2k)
1 1 2
2 2 2
SWAP A
rotace A čtyřikrát
1
1
LJMP adr16
PC ← adresa (64k)
3
2
ANL A , #data
A ← (A) & data
2
1
PC← PC + rel.adr.
2
2
ANL A , @ Ri
A ←( A) & (Ri)
1
1
SJMP rel(128,127) JMP @ A + DPTR
PC←((A)+(DPTR))
1
2
ANL A , Rn
A ←(A) & (Rn)
1
1
JZ kód,rel
skok při A = 0
2
2
ANL A , dir ANL C , bit ANL C , /bit ANL dir, #data ANL dir, A
A ← (A) &(dir) C ← C & (bit) C ← C & /(bit) dir ← (dir) & data dir ← (dir) & (A)
2 2 2 3 2
1 2 2 2 1
JNZ kód,rel JC kód,rel JNC kód,rel JB bit,rel JNB bit,rel
skok při skok při skok při skok při skok při
2 2 2 3 3
2 2 2 2 2
ORL A, # data
A ← (A) or data
2
1
JBC bit,rel
skok při bit=1a nulo
3
2
ORL A, @Ri ORL A, Rn ORL A, dir ORL C, bit ORL C,/bit ORL dir , A
A ← (A) or (Ri) A ← (A) or (Rn) A ← (A) or (dir) C ← (C ) or (bit) C ← (C ) or (/bit) dir ← (dir ) or (A)
1 1 2 2 2 3
1 1 1 2 2 2
CJNE @Ri,#data,rel CJNE Rn,#data,rel CJNE A,# data,rel CJNE A,dir,rel DJNZ Rn,rel DJNZ dir,rel
skok při nerovnosti skok při nerovnosti skok při nerovnosti skok při nerovnosti0 dec(Rn),skok nerov dec(dir),skok nerov
3 3 3 3 2 3
2 2 2 2 2 2
ORL dir, # data
dir←(dir) or (data)
2
1
NOP
prázdná instrukce
1
1
tabulka č.1 Vysvětlivky : = rovná se @ nepřímá adresa Rn registr R0 - R7 # data 8- 8 bitové data ≠ nerovná se or logický součet Ri registr R0 - R1 # data 16 - 16 bitové data přiřazení & logický součin dir přímá adresa C - příznak CARRY rel návěstí bit číslo bitu (př.P1.1) 44
VĚTVENÍ
A≠ 0 C≠ 0 C= 0 bit = 1 bit = 0
3. PROGRAMOVACÍ TECHNIKY Programování je sestaveno od nejednodušších praktik k nejsložitějším. Pro začátek programování použijeme pro realizaci časových smyček (různé časové prodlevy) podprogram DELAY.INC, který je k dispozici. V další části si takový podprogram vytvoříme sami. Celý kurz programování je směřován na praxi a je vytvořen tak, aby po jeho absolvování jsme uměli ovládat přípravky s LED, se statickou SEDMISEGMENTOVKOU, REPRODUKTOR a KLÁVESNICI a dynamickou SEDMISEGMENTOVKOU. Naučíme se používat podprogramy, vytvoříme si své časové smyčky i časové smyčky realizované časovačem. Tak jdeme na to !
4. PROGRAMOVÁNÍ LED LED jsou v tomto případě zapojeny anodou na plus , takže ji rozsvěcujeme nulou +
0
LED připojujeme na port P1 nebo P3( přípravku EASY SOFT) , na který je připojeno 8 LED(7. - 0.) Základní program na rozsvícení všech LED ( 1 – zhasnutá , 0 – rozsvícená) - je použit port P1 1.úroveň program se opakuje stále dokola
L1S - rozsvícení a zhasnutí všech LED v intervalu 1s SEM: MOV P1,#00000000b ;rozsvícení všech LED CALL DEL1S ;podprogram časového zpoždění 1s MOV P1,#11111111b ;zhasnutí všech LED CALL DEL1S ;podprogram časového zpoždění 1s zacyklení programu- opakování stále dokola INCLUDE(DELAY.INC) :vložení podprogramu čas.zpoždění není instrukce!!!!!! END ;ukončení překladu
45
Podprogram časového zpoždění DELAY.INC (zatím ho nezkoumej- ber ho jako fakt) nabízí několik časových smyček, odpovídajících návěstím DEL1S délka 1sekundy DEL800 délka 0,8s DEL400 délka 0,4s DEL200 délka 0,2s DEL100 délka 0,1s DEL1MS délka 1ms Instrukcí ACALL(používáme CALL) vyvoláme podprogram, který musí být ukončen instrukcí RET- návrat z podprogramu - viz dále. DELAY.INC RB3 equ 11b DEL1S: acall DEL200 DEL800: acall DEL400 DEL400: acall DEL200 DEL200: acall DEL100 DEL100: push acc mov a,#100 DELAY: acall DEL1MS dec a cjne a,#0,DELAY pop acc ret DEL1MS: push PSW ;schovej puvodni RB orl PSW,#RB3 shl 3 ;nastav Register Bank = 3 mov r7,#0 djnz r7,$ mov r7,#0c6h djnz r7,$ pop PSW ;obnov Register Bank ret Časové smyčky jsou potřebné, protože délka jedné instrukce je kolem 1- 3 mikrosekund (oko by tuto změnu nezaznamenalo)! L400 rozsvícení a zhasnutí všech LED v intervalu 400ms na portu P1 SEM: MOV P1,#00000000B ;rozsvícení všech LED CALL DEL400 ;časová smyčka 400 ms MOV P1,#11111111B ;zhasnutí všech LED CALL DEL400 ; časová smyčka 400 ms JMP SEM ; zacyklení – skok na návěstí include(DELAY.inc) ; vložení podprogramu čas.zpož. není instrukce!!!!!! END ; ukončení překladu
46
L800 rozsvícení a zhasnutí všech LED v intervalu 800ms SEM: MOV P1,#00000000B CALL DEL800 MOV P1,#11111111B CALL DEL800 JMP SEM include(DELAY.inc) END
;rozsvícení všech LED ;časová smyčka 800 ms ;zhasnutí všech LED ; časová smyčka 800 ms ; zacyklení – skok na návěstí ;vložení podprogramu čas.zpož.není instrukce!!!!!! ; ukončení překladu
HAD1 rozsvěcování LED postupně od nejvyšší k nejnižší(po 1 LED) v intervalu 100 ms SEM: MOV P1,#01111111B ;rozsvícení 7. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#10111111B ;rozsvícení 6. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11011111B ;rozsvícení 5. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11101111B ; rozsvícení 4. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11110111B ;rozsvícení 3. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11111011B ;rozsvícení 2. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11111101B ;rozsvícení 1. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11111110B ; rozsvícení 0. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#00000000B ;rozsvícení všech LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11111111B ;zhasnutí všech LED CALL DEL100 ;časová smyčka 100 ms JMP SEM ; zacyklení – skok na návěstí INCLUDE(DELAY.INC) ; vložení podprogramu čas.zpož. END ; ukončení překladu
47
HAD2 postupné rozsvěcování LED od 7. po 0. SEM: MOV P1,#01111111B ;rozsvícení 7. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#00111111B ; rozsvícení 7.6. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#0001111B ;rozsvícení 7.6.5. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#00001111B ; rozsvícení 7.6.5.4. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#00000111B ;rozsvícení 7.6.5.4.3. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#00000011B ; rozsvícení 7.6.5.4.3.2. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#00000001B ;rozsvícení 7.6.5.4.3.2.1. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#00000000B ;rozsvícení7.6.5.4.3.2.1.0. LED CALL DEL100 ;časová smyčka 100 ms MOV P1,#11111111B ;zhasnutí všech LED CALL DEL100 ;časová smyčka 100 ms JMP SEM ; zacyklení – skok na návěstí 2.úroveň zacyklení na místě - program se provede jen jednou
L4C1 -rozsvícení a zhasnutí všech LED v intervalu 400ms
S
rozsv LED MOV P1,#00000000B CALL DEL400 MOV P1,#11111111B CALL DEL400 SEM: JMP SEM
;rozsvícení všech LED ;časová smyčka 400 ms ;zhasnutí všech LED ;časová smyčka 400 ms ;zacyklení – skok na návěstí
400ms zhasni LED 400ms
zacykli
Podobně přemístěním návěstí na poslední řádek docílíme zacyklení jakéhokoliv programu(zacyklení na místě).
48
K
3.úroveň zacyklení na místě - program se provede x krát Počet opakování programu se provádí pomocí instrukce DJNZ Rn,rel, která je složena ze dvou instrukcí DECREMENT JUMP NO ZERO (odečti jedna z registru Rn , ptej se jestli je registr nulový, pokud ne, skoč na dané návěstí(rel), pokud ano, jdi na další následující instrukci. Počet registrů je 8 , R7 - R0 (pro jednu registrovou banku - možno použít RB0 - RB3)
Rn= Rn-1
vývojový diagram
NE Rn= 0
ANO
L4C5 - rozsvícení a zhasnutí všech LED v intervalu 400ms 5 x
MOV R1, #5 HOP: MOV P1,#00000000B CALL DEL400 MOV P1,#11111111B CALL DEL400 DJNZ R1,HOP SEM: JMP SEM
INCLUDE(DELAY.INC) END
;počet opakování programu X= 5 ;rozsvícení všech LED ;časová smyčka 400 ms ;zhasnutí všech LED ;časová smyčka 400 ms ;opakuj dokud registr R1 není 0 ;zacyklení – skok na návěstí
; vložení podprogramu čas.zpož. ; ukončení překladu
Číslo v registru R1 mi udává kolikrát chci program zopakovat(v složitějších programech hlídej čísla registrů - aby se nepřepisovaly).
49
5. Programování SEDMISEGMENTOVÉHO DISPLEJE - statického 0. 5.
6.
4.
1. 2.
3.
7.
Součástka je složena ze 7 segmentů (8. segment je tečka) , každý segment představuje LED – rozsvěcuje se nulou – stejně jako LED (pro případ, že LED je zapojena trvale anodou na plus Ucc) Segmenty znaku, který chceš rozsvítit, musíš aktivovat „0“. Segment připojujeme na port P1 nebo P3 přípravku EASY SOFT. 1.úroveň
program se opakuje stále dokola
SCISLA zobrazování čísel 0 - 9 v intervalu 400ms ZAC: MOV P1,#01111001B ;rozsvícení čísla 1 CALL DEL400 MOV P1,#00100100B ;rozsvícení čísla 2 CALL DEL400 MOV P1,#00110000B ;rozsvícení čísla 3 CALL DEL400 MOV P1,#00011001B ;rozsvícení čísla 4 CALL DEL400 MOV P1,#00010010B ;rozsvícení čísla 5 CALL DEL400 MOV P1,#00000010B ;rozsvícení čísla 6 CALL DEL400 MOV P1,#01111000B ;rozsvícení čísla 7 CALL DEL400 MOV P1,#00000000B ;rozsvícení čísla 8 CALL DEL400 MOV P1,#00011000B ;rozsvícení čísla 9 CALL DEL400 MOV P1,#01000000B ;rozsvícení čísla 0 CALL DEL400 ;časová smyčka 100ms MOV P1,#11111111B ;zhasnutí všech segmentů CALL DEL400 JMP ZAC ;zacyklení – opakuj stále dokola INCLUDE(DELAY.INC) ;vložení podprogramu čas.zpož END ; ukončení překladu
50
SPISM zobrazení písmen A b C d E ZAC: MOV P1,#10001000B CALL DEL400 MOV P1,#10000011B CALL DEL400 MOV P1,#11000110B CALL DEL400 MOV P1,#10100001B CALL DEL400 MOV P1,#10000110B CALL DEL400 MOV P1,#11111111B CALL DEL400 JMP ZAC INCLUDE(DELAY.INC) END
v intervalu 400ms ;rozsvícení písmena A ;časová smyčka 400ms ;rozsvícení písmena b ;rozsvícení písmena C ;rozsvícení písmena d rozsvícení písmena E ;zhasnutí všech segmentů ;zacyklení – opakuj stále dokola ; vložení podprogramu čas.zpož. ; ukončení překladu
Tímto způsobem můžeme zobrazit jakékoliv znaky, které nám sedmisegmentovka umožňuje. Pro další použití si vytvoříme krátký program zobrazení znaku AHOJ v intervalu 400 ms, opakující se stále dokola, tentokrát data posíláme na port P3. AHOJ zobrazení písmen A H O J v intervalu 400ms ZAC: MOV P3,#10001000B ;rozsvícení písmena A CALL DEL400 ;časová smyčka 400ms MOV P3,#10001001B ;rozsvícení písmena H CALL DEL400 MOV P3,#11000000B ;rozsvícení písmena O CALL DEL400 MOV P3,#11100000B ;rozsvícení písmena J CALL DEL400 MOV P3,#11111111B ;zhasnutí všech segmentů CALL DEL400 JMP ZAC ;opakuj stále dokola INCLUDE(DELAY.INC) ;vložení podprogramu časového zpoždění END ;ukončení překladu 2.úroveň zacyklení na místě - program se provede jen jednou Tuto akci lze provést stejně jako u příkladu s LED. My si zde vysvětlíme další možnost použití podprogramu.
51
6. Použití podprogramu Z předešlého programu AHOJ vytvoříme podprogram AHOJP velmi jednoduše na konci programu místo skoku JMP zapíšeme instrukci RET - návrat z podprogramu - pro lepší pochopení odlišíme návěstí SEG. AHOJP zobrazení písmen A H O J v intervalu 400ms –řešení podprogramem SEG: MOV P3,#10001000B ;rozsvícení písmena A CALL DEL400 ;časová smyčka 400ms MOV P3,#10001001B ;rozsvícení písmena H CALL DEL400 MOV P3,#11000000B ;rozsvícení písmena O CALL DEL400 MOV P3,#11100000B ;rozsvícení písmena J CALL DEL400 RET ;návrat z podprogramu Program ze stejnou funkcí teď bude vypadat takto - možné jsou dvě základní varianty: Výsledný efekt bude totožný a je na programátorovi, kterou variantu a kdy použije 1.varianta - podprogram je naincludován - vložen z jiného místa ZAC: CALL SEG ;volání - realizace výpisu textu JMP ZAC ;opakování dokola INCLUDE(AHOJP.ASM) ;vložení procedury - podprogram realizující dané zadání INCLUDE(DELAY.INC) ;načtení podprogramu časových prodlev END ;ukončení překladu 2.varianta - podprogram je vypsán pod hlavním programem ZAC: CALL SEG ;volání - realizace výpisu textu JMP ZAC ;opakování dokola SEG: MOV P3,#10001000B ;rozsvícení písmena A CALL DEL100 ;časová smyčka 100ms MOV P3,#10001001B ;rozsvícení písmena H CALL DEL100 MOV P3,#11000000B ;rozsvícení písmena O CALL DEL100 MOV P3,#11100000B ;rozsvícení písmena J CALL DEL100 RET ;návrat z podprogramu INCLUDE(DELAY.INC) ;načtení podprogramu časových prodlev END ;ukončení překladu V obou příkladech je z hlavního programu odskočeno do podprogramu návěstím SEG (instrukcí CALL)a po dosažení instrukce RET se program vrací do hlavního programu na další instrukci (v našem případě JMP ZAC).
52
Pokud chceme realizaci programu pouze jednou bude v tomto případě program vypadat takto : CALL SEG ;volání - realizace výpisu textu ZAC: JMP ZAC ;opakování dokola INCLUDE(AHOJP.ASM) ;vložení procedury - podprogramu INCLUDE(DELAY.INC) ;vložení podprogramu časových smyček END ;ukončení překladu Zacyklení na místě - program se provede X krát Stejný program -výpis textu AHOJ - zopakujeme třeba 4x - počet opakování uložíme například do registru R3 AHOJ4 (pro realizaci jsem si vybrala 1.variantu - naincludování podprogramu odjinud MOV R3, #4 ;počet opakování podprogramu ZAC: CALL SEG ;volání - realizace výpisu textu DJNZ R3,ZAC ;opakování dokud není registr R3 nula SEM: JMP SEM ;zacyklení na místě - zrealizuje se jen 4krát INCLUDE(AHOJP.ASM) INCLUDE(DELAY.INC) END Z tohoto programu můžeme dále vytvořit podprogram, který bude v sobě skrývat celé zadání tedy 4x zopakuj výpis textu a potom ho kombinovat s dalším podprogramem- viz dále. AHA4P zobrazení písmen A H O J 4 x v intervalu 400ms –řešení podprogramem HOT : MOV R3, #4 ;počet opakování podprogramu ZAC: CALL SEG ;volání - realizace výpisu textu DJNZ R3,ZAC ;opakování dokud není registr R3 nula RET Hlavní program tedy vypadá takto: CALL HOT TU: JMP TU INCLUDE(AHA4P.ASM) INCLUDE(DELAY.INC) END
7. Kombinace podprogramů Vyzkoušejme si nyní nabyté vědomosti v praxi. Zrealizujme program, který na portu P1 3x rozsvítí a zhasne sudé LED a na portu P3 se 5 x rozsvítí číslo 1. V intervalu třeba 200 ms. Vše realizujme pomocí 2 podprogramů a opakujme stále dokola. Ukážeme si obě dvě varianty: Podprogram, realizující LED nazvěme LED3.ASM a bude začínat návěstím TRIK. Podprogram, realizující SEG nazvěme SEG5.ASM a bude začínat návěstím PET.
53
Hlavní program 1.varianta : ZAC: CALL TRIK CALL PET JMP ZAC Include(LED3.asm) Include(SEG5.asm) Include(DELAY.inc) END Tato varianta předpokládá, že podprogramy jsou uloženy pod předem určenými názvy. Hlavní program 2.varianta : ZAC: CALL TRIK CALL PET JMP ZAC jednotlivé podprogramy jsou“ tady“ vypsány ( zkontroluj, že jsou ukončeny RET) Pozor na návěstí bloku opakování - nesmí být stejná (TU-TAM) Pokud jsi to zvládl -a, zkus ještě celé zadání zopakovat třeba 2x a všechny LED a SEGMENTY rozsviť. LDSG2 Třeba varianta 1: MOV R7, #2 ;počet opakování celého programu TADY:CALL TRIK ;realizace 3 x LED CALL PET ;realizace 5 x číslo 1 DJNZ R7,TADY ;opakuj dokud není R7 nulový ZAC: MOV P1,#000000000B ;rozsviť všechny LED MOV P3,#00000000B ;rozsviť všechny SEGMENTY JMP ZAC ;zajisti jejich rozsvícení Include(LED3.asm) Include(SEG5.asm) Include(DELAY.inc) END Jedno upozornění : Počet opakování celého programu nemůže mít stejný registr(R7) jako jednotlivé podprogramy(R1). Došlo by k přepisu. Registr by se vynuloval a při dalším odečtení 1 se nastaví na maximum, což je 255. Nezapomeň to hlídat !!!!! Že jsi udělal - a chybu poznáš podle toho, že se ti program opakuje dokola a neprovede se jen 2x.
54
Jedno zjednodušení: rozsvícení portů převedeme do dalšího podprogramu ROZSV.ASM s návěstím ROZ. Bude to vypadat takto: MOV R7, #2 ;počet opakování celého programu TADY:CALL TRIK ;realizace 3 x LED CALL PET ;realizace 5 x číslo 1 DJNZ R7,TADY ;opakuj dokud není R7 nulový ZAC: CALL ROZ JMP ZAC ;zajisti jejich rozsvícení ;podprogram můžeme vepsat přímo ROZ: MOV P1,#000000000B ;rozsviť všechny LED MOV P3,#00000000B ;rozsviť všechny SEGMENTY RET Include(LED3.asm) Include(SEG5.asm) Include(DELAY.inc) END Úplně nejjednodušeji by mohl tento program vypadat tak, že bych z programu OPAK2 udělali podprogram(to už umíme). A hlavní program realizující stejné zadání by vypadal takto: S CALL HLAV START:JMP START
HLAV ZACYK
K
HLAV: MOV R7, #2 ;počet opakování celého programu TADY:CALL TRIK ;realizace 3 x LED CALL PET ;realizace 5 x číslo 1 DJNZ R7,TADY ;opakuj dokud není R7 nulový ZAC: MOV P1,#000000000B ;rozsviť všechny LED MOV P3,#00000000B ;rozsviť všechny SEGMENTY RET ;ukončení podprogramu Include(LED3.asm) Include(SEG5.asm) Include(DELAY.inc) END Tak to jsou tedy podprogramy. Je na každém z nás , jak moc je budeme využívat. Z mé praxe vím, že je prima, když každý problém řeším zvlášť. Vše je pak přehledné a když hledám chybu, vím přesně, kde je. Mnohem jednodušší jsou i vývojové diagramy. Je to oříšek, kterému se studenti brání. Dnes, v době předdefinovaných tvarů je to velmi jednoduché( viz kapitola 1).
55
8. LED – ROTACE využití logických instrukcí Než začneme s dalším přípravkem, vrátíme se na chvíli k LED a ukážeme si využití logických instrukcí RR A, RL A a SWAP A. Zatím jsme program rotace (posun) LED vytvořili pouhým vypsáním dat na port - viz program LEDKY - HAD1. Program je možno velmi elegantně vyřešit pomocí instrukce rotace. Jedinou nevýhodou je, že nelze rotovat přímo na portu, ale jen akumulátorem - hlavním registrem A. Pro stejný efekt jako v programu HAD1 použijeme rotaci doprava RR A. HAD1R – rotace 7. LED do pozice 0. –stále dokola MOV P1,#01111111B ;načtení prvních dat -rozsvícení 7.LED CALL DEL100 ;zobrazení dat MOV A,P1 ;přesun portu do akumulátoru HUP: RR A ;rotace akumulátoru doprava MOV P1,A ;výsledek rotace přesuň do portu P1 CALL DEL100 ;zobraz výsledek JMP HUP ;opakuj stále dokola Include(DELAY.inc) END Tento program rotuje stále dokola. My však již umíme počet rotací omezit. Tak to zkusme. HAD1R7 – rotace 7. LED do pozice 0. LED jen jednou – potom všechny LED zhasni MOV R1,#7 ;počet opakování rotací MOV P1,#01111111B ;načtení prvních dat -rozsvícení 7.LED CALL DEL100 ;zobrazení dat MOV A,P1 ;přesun portu do akumulátoru HUP: RR A ;rotace akumulátoru doprava MOV P1,A ;výsledek rotace přesuň do portu P1 CALL DEL100 ;zobraz výsledek DJNZ R1,HUP ;opakuj dokud není R1 nulový MOV P1,#11111111B ;zhasnutí všech LED HAP: JMP HAP ;zacykli na místě Include(DELAY.inc) END
56
9. VLASTNÍ PODPROGRAM ČASOVÝCH PRODLEV Naše programátorské umění je na takové výši, že se můžeme pustit do vytvoření svého podprogramu časových prodlev - nazvěme si ho CAS.ASM a opustit DELAY.INC, který vypadá složitě, ale zas tak složitý není. Náš program bude vycházet stejně jako program delay.inc z volání menších časových smyček a jejich skládání za sebe. Sestavme si podprogram časových prodlev 0,5ms, 1 ms , 100ms, 200ms, 500ms a 1 s. Trocha teorie :pro frekvenci krystalu f=12 MHz je délka jednoho strojového cyklu tedy SC= jedna mikrosekunda , protože 1SC=12 T = 12 x 1/12 MHz = 1 mikrosekunda. Jestliže chápeš princip instrukce DJNZ, měl by jsi lehce pochopit jak se sčítají doby trvání instrukcí do výsledných mikrosekund. Délky trvání jsou vyznačeny v instrukčním souboru - ve sloupci SC. Časová prodleva 0,5ms M5S: MOV R0,#248 1 SC HOP: DJNZ R0,HOP 496 SC 248*2= NOP 1 SC ;prázdná instrukce RET 2 SC 500 mikrosekund Další časové smyčky se skládají - vytvářejí a volají jako podprogramy . Časová prodleva 1ms MS1: CALL M5S CALL M5S RET Celý podprogram CAS.ASM tedy bude vypadat takto : M5S: MOV R0,#248 ;časová prodleva 0,5ms HOP: DJNZ R0,HOP NOP RET MS1: CALL M5S ;časová prodleva 1ms CALL M5S RET MS100: MOV R1,#100 ;časová prodleva 100ms SK: CALL MS1 ;nutno použít jiný registr(R0) DJNZ R1,SK ;MS5 a došlo by k přepisování RET MS200: CALL MS100 ;časová prodleva 200 ms CALL MS100 RET MS500: CALL MS200 ;časová prodleva 0,5s CALL MS200 CALL MS100 RET S1: CALL MS500 ;časová prodleva 1s CALL MS500 RET
57
Tímto způsobem můžeme vytvářet jakoukoliv časovou prodlevu od 1 mikrosekundy (pro frekvenci krystalu 12 MHz). Pro menší čas bychom museli použít krystal s vyšší frekvencí (pro f=24 MHz je délka 1SC = 0,5μs ). Dopouštíme se sice chyb, které jsou tvořeny délkou volání podprogramu (CALL 2SC), chyby se mohou nasčítat, museli bychom si podprogram pustit v animaci programu a dopočítat přesně na mikrosekundy. Záleží k čemu tento podprogram využijeme. Pokud potřebujeme přesné časové prodlevy využijeme časovač 8051 viz dále. Zda Ti podprogram funguje, vyzkoušíš tak, že místo podprogramu delay.inc includujeme cas.asm. Třeba program rotace se změní jen ve volání návěstí - 100 ms - odpovídá návěstí MS100 a na konci (to už nejsou instrukce, ale říká se jim pseudoinstrukce- include náš název podprogramu): MOV R2,#7 ;počet opakování rotací(jiný než R0 a R1) MOV P1,#01111111B ;načtení prvních dat -rozsvícení 7.LED CALL MS100 ;zobrazení dat MOV A,P1 ;přesun portu do akumulátoru HUP: RR A ;rotace akumulátoru doprava MOV P1,A ;výsledek rotace přesuň do portu P1 CALL MS100 ;zobraz výsledek DJNZ R2,HUP ;opakuj dokud není R1 nulový HAP: JMP HAP ;zacykli na místě Include(CAS.ASM) END Pokud potřebujeme přesné časy použijme časovače 8051. Hurá do toho!!!!!!
10. POUŽITÍ ČASOVAČŮ V základní řadě 8051 máme k dispozici 2 rovnocenné čítače - časovače. My se zde budeme zabývat pouze funkcí časovače. Podrobný popis viz kniha1. Princip vytvoření časové prodlevy pomocí časovače je plnění registru (jehož velikost si můžeme zvolit sami ) přesnými časovými impulsy (1 mikrosekunda -pro 12 MHz krystal. Registry se dají přednastavovat, takže časové smyčky lze velmi snadno dopočítat na mikrosekundu. Teď co nejednodušší popis registru TMOD : máme 2 rovnocenné registry časovače 1 a 0 (rozlišují se indexem) Registr TMOD - nastavení módů časovačů Časovač 0 GATE C/T b7 GATE C/T
b6
Časovač 1 M1 b5
M0
GATE C/T
b4
b3
b2
M1 b1
M0 b0
-umožňuje nastavit čítač vstupem vnějšího přerušení INTx = 0 časovač řízen pouze TRx = 1 časovač řízen pomocí TRx i Onyx - Nastavuje se funkce čítače a časovače = 0 jde o časovač = 1 jde o čítač
58
M1 a M0 Nastavení módu čítače - dvěma bity v registru TMOD 0
2 3
M1
M0
CHARAKTER REGISTRU
0
0
1 1
0 1
13 bitový 16 bitový 8 bitový 2x8
8192 = 8k 65 535 = 64k 256
Registr TCON - řízení časovačů TF 1
TR 1
TF 0
TR 0
IE 1
b7
b6
b5
b4
b3
IT1 b2
IE 0
IT 0
b1
b0
TR 0,1
spuštění čítače nastavení bitu na 1, vypnutí čítače nastavením bitu na 0
TF 0,1
nastaví se na 1 při přetečení maximální hodnoty čítače dané módem
IE 0,1
přijetí vnějšího přerušení IT 0,1 - konfigurace přerušení
Upozornění : zkušení programátoři se na mě budou zlobit, že nevysvětluji princip hned pomocí přerušení. Učitelská praxe mě ale naučila, že všichni studenti pochopí princip hlídání TFx, ale jen někteří studenti metodu přerušení od časovače. Je potom na nich aby si sami zvolili jak budou časové smyčky vytvářet. Realizace podprogramu 1s pomocí časovače: Program řešíš na základě pochopené teorie o časovačích (kniha1) 1, zvolím si mód (v podstatě lze zvolit jakýkoliv) podle délky prodlevy a vypočítáme si počet naplnění registrů. Pro dlouhé prodlevy - volím 16 bitový mód (65 536 mikrosekund).Výpočet pak vypadá takto : 1s : 65536 μs=15,2 =15 - počet naplnění (zatím zaokrouhlíme) 2, nastavím mód v registru TMOD, vynuluji registry časovačů 3, spustím časovač TR0= 1 4, nastavím počet naplnění do registru 5, vynuluji bit naplnění TF0 - sám se nenuluje a nastaví se na 1, když je registr naplněný 6, testuji bit naplnění TF0, dokud není 1 - registr se stále plní, stále testuji, až je jedna odečtu jedničku z počtu naplnění 7, pokud je to podprogram ukončím RET 8, mám hotový podprogram 1s a teď ho použijeme pro blikání LED
59
CS1I
S1: START: HOP: SEM:
MOV TMOD,#00000001B SETB TR0 MOV R0,#15 CLR TF0 JNB TF0,SEM DJNZ R0,HOP RET
;nastaveni 1.modu č. 0 -16 bit registr ;spuštení č. 0 ;počet naplnění registru č. 0 ;nulovaní bitu naplnění ;testovani bitu naplnění č. 0 ;cyklus 15 naplnění registru = 1s
Vyzkoušej si program pro blikání LED a volej S1( čas pro blikání 1s) Tento podprogram je ale nepřesný, protože se v něm nepočítá s délkou instrukcí. Pro úplnou přesnost je potřeba podprogram projet v animaci a dopočítat - takto : PŘEDNASTAVENÍ ČASOVAČE Pokud naplnění vychází 15,2 musíme opakovat 16 x - zaokrouhlíme nahoru. 15x65 536= 983040 mikrosekund naplníme časovač 16 x 65536=1048576 mikrosekund a rozdíl mezi sekundou a výsledkem uložíme do registrů časovače TL0 a TH0. Potom program jednou dojede naplnění a 15x se naplní plně oba registry. Výpočet:1048576-10000000=48576 –převedeme do hexa soustavy na BDC0 H- tedy v TL0=C0 H a TH0=BD H. Pokud provedeme ( v programu EASY SOFT) animaci v DEBUG F9 –skutečný čas tohoto podprogramu je 1,000012s.Protože chceme čas úplně přesně snížíme dolní registr o 12 –tedy na CCh . Nyní nám hodiny při animaci ukážou přesně 1 s. Podprogram nyní dostává tuto podobu: S1:
znovu
MOV TMOD,#00000001B MOV TL0,#0CCH MOV TH0,#0BDH SETB TR0 MOV R1,#16 HOP: CLR TF0 SEM: JNB TF0,SEM DJNZ R1,HOP CLR TR0 RET
;nastavení módu 16 bitového ;přednastavení dolního registru ;přednastavení horního registru ;spuštění časovače 0 ;Počet kolikrát se registr naplní (16x) ;vynulování bitu naplnění ;testuje nulovost registru časovače ;dokud není registr R1 rovný nule ;zastaví časovač 0 ;návrat z podprogramu
Podprogramy různých časových smyček se budou lišit jen v nastavení módu registru a ve výpočtu přednastavení. Nezapomeň, že máš-li 8 bitový registr (mód 2) přednaplňuješ pouze registr TL0, protože TH0 vůbec v tomto módě není využit !!! Někteří studenti používají rádi pouze 16 bitový registr a pořádně přednaplňují, já mám raději pro krátké časy mód 8 bitový - který lze lehce počítat z hlavy. Přednaplnění může mít pak podobu desítkového čísla. Ještě jedna rada, pro výpočty a převody soustav používáme vědecké kalkulačky v PC(v příslušenství) - výborná a hned po ruce.
60
POUŽITÍ ČASOVAČŮ – JEJICH PŘERUŠENÍ Tak teď program s přerušením od časovače 0 . Výhoda těchto programu je v tom, že nemusím hlídat a nulovat bit naplnění TF, ale v okamžiku naplnění daného registru sám program odskočí na adresu , která je předem daná. Pro časovač 0 je to 000BH pro časovač 1 001BH. No teď slibovaný program a kousek teorie Činnost :časovač se po spuštění plní v intervalu 1 mikrosekundy (pro12MHz krystal). Pokud je povoleno přerušení od daného časovače, tak v okamžiku naplnění registrů TL a TH skočí program na danou adresu obslužného programu. Na této adrese vykoná obslužný program, který je ukončený instrukcí RET I a vrátí se zpět do hlavního programu. Výhodou je , že nemusíme hlídat bit naplnění TFx , který jsme museli nulovat. Ten je při přechodu do obslužného programu vynulován. Registr přerušení IE (Interrupt Enable) EA
-
-
ES
ET1
EX1
ET0
EX0
EA - Enable All globální povolení přerušení – pokud pracujeme s přerušením nutno nastavit na 1 ET0 - povolení přerušení od časovače 0 adresa 000Bh – povolit přerušení nastavením na 1 ET1 - povolení přerušení od čaovače 1 adresa 001Bh REALIZACE BLIKÁNÍ LED – ČAS REALIZOVÁN PŘERUŠENÍM OD ČASOVAČE Zadání : Pomocí přerušení od časovače realizujte program blikání všech LED na P1 v 1s intervalu. LI1S Org 0H ;nastavení adres JMP PROG ;nastavení adresy hlavního programu – aby byl až za obslužným programem ORG 0BH INC R1 RETI PROG:MOV TMOD, #01h ;časovač 0 MOD 1 – 16 bitový SETB EA ;povolena všechna přerušení SETB ET0 ;povoleno přerušení od časovače 0 MOV A, #0 ;nachystej data na port TU: MOV R1,#0 ;počítadlo opakování je vynulované MOV P1,A ;zobraz data na port – nuly rozsvěcují, jedničky zhasínají LED SE: SETB TR0 ;spusť časovač 0 CJNE R1, #16,SE ;při naplnění registru program skočí na obslužný program přerušení, kde se +1 CPL A ;po zopakování 16 x se zneguje A – místo 0 jsou tam samé 1 JMP TU ;skok znovu po uplynutí doby 1s END Jediný problém, který musíš pochopit je ten, že adresy přerušení jsou hned na začátku. Proto hlavní program musíš psát až jako další blok (JMP PROG). 61
11. PROGRAMOVÁNÍ REPRODUKTORU Některé instrukce jsou takzvaně instrukce bitové, protože pracují s jedním bitem (P1.0 - nultý bit portu 1) - ty budeme používat při programování reproduktoru. Př. SETB P1.0 , CLR P1.0 Na rozdíl od instrukce např. RR A – to je instrukce bytová – pracuje najednou s celým bytem. V celém instrukčním souboru si vyznač hvězdičkou * instrukce bitové. PRINCIP GENEROVÁNÍ ZVUKU Analogový signál nahrazujeme v číslicové technice obdélníkovým signálem, tedy vysíláním jedničky a nuly po dobu půlperiody. Délku půlperiody si vypočítáme ze zadané frekvence.
T-perioda Reproduktor je ovládán pouze jedním bitem (kromě dvou napájecích vodičů) . Reproduktor je v našem případě připojen na 0. tý bit portu (P1,P3). Plynulý tón f= 500 Hz F500 Řešení : 1,z frekvence vypočítáme periodu T= 1/f T= 1/500=2 ms 2,z periody vypočítáme půlperiodu T/2 =1ms 3,po dobu půlperiody vysíláme 1 4, po dobu půlperiody vysíláme 0 Program má tedy tuto podobu: TON500: SETB P1.0 ;vysíláme jedničku na P1.0 CALL MS1 ;doba půlperiody pro f = 500Hz CLR P1.0 ;vysíláme nulu na P1.0 CALL MS1 ;doba půlperiody pro f =500 Hz JMP TON500 ;plynulý tón f = 500Hz include(CAS.ASM) ;podprogram vlastních časů , kde máme 1ms END Časy, realizující půlperiody v tónech můžeme includovat přímo z již vytvořených podprogramů (pokud jsou v nich obsaženy) nebo si časy vytvoříme jako podprogramy pod hlavním programem.
62
Lehkou úpravou vytvoříme program pro plynulý tón 1000Hz. F1000 TON1000: SETB P1.0 ;vysíláme jedničku na P1.0 CALL M5S ;doba půlperiody pro f = 1000Hz CLR P1.0 ;vysíláme nulu na P1.0 CALL M5S ;doba půlperiody pro f =1000 Hz JMP TON1000 ;plynulý tón f = 1000Hz include(CAS.ASM) ;podprogram vlastních časů , kde máme 0,5ms vytv END Můžeme se pustit do tónu určité délky, vše už známe jen to teď dáme všechno dohromady . Pro zadanou délku určitého tónu je potřeba vypočítat počet period, které budete za sebou generovat. Jsou dvě možnosti výpočtu počtu period. Buď frekvenci vynásobíme délkou tónu nebo délku tónu vydělíme délkou periody. Příklad pro délku tónu 0,2 s a frekvenci 500 Hz, je počet period 100. Tedy musíme vyslat za sebou 100 period T, aby byl tón dlouhý 0,2s. Generování symetrického tónu SYMT
0,2 s a 0,2 s ticho – stále dokola
0,2s 0,2s Hlavní program si rozdělíme na dva podprogramy: první řeší tón 0,2s frekvence 500Hz, druhý řeší prodlevu – ticho délky 0,2s. ST: CALL TON ;realizace 100 T tónu 500Hz CALL TICHO realizace ticha 200ms JMP ST ;opakování dokola TON: MOV R7,#100 ;počet opakování period 0,2s x 500 = 100 HLP: CALL PER ;realizace jedné periody DJNZ R7,HLP ;opakování 100 x RET PER: SETB P1.0 ;vysíláme jedničku na P1.0 CALL MS1 ;doba půlperiody pro f = 500Hz CLR P1.0 ;vysíláme nulu na P1.0 CALL MS1 ;doba půlperiody pro f =500 Hz RET ;jen jedna perioda f= 500Hz TICHO: CALL MS200 RET include(CAS:ASM) END Několik postřehů : K realizaci jedné periody jsem využila předešlý program pro plynulý tón, ze kterého jsem vytvořila podprogram pro jednu periodu. K opakování počtu period jsem použila registr R7 – kdybych použila registr R0 nebo R1 , který využívá podprogram CAS.asm, docházelo by k přepisování registrů. Časy, které potřebujeme, si samozřejmě můžeme vytvořit samostatně jako podprogramy - třeba i časovačem.
63
Generování symetrického tónu FSYMT
0,25 s a 0,25 s ticho – stále dokola
ST:
CALL TON ;realizace 125 T tónu 500Hz CALL TICHO realizace ticha 200ms JMP ST ;opakování dokola TON: MOV R7,#125 ;počet opakování period 0,25s x 500 = 125 HP: CALL PER ;realizace jedné periody DJNZ R7,HP ;opakování 125 x RET PER: SETB P1.0 ;vysíláme jedničku na P1.0 CALL MS1 ;doba půlperiody pro f = 500Hz CLR P1.0 ;vysíláme nulu na P1.0 CALL MS1 ;doba půlperiody pro f =500 Hz RET ;jen jedna perioda f= 500Hz TICHO: CALL MS200 ;časová smyčka 200Ms CALL MS50 ;časová smyčka 50ms RET MS50: MOV R2,#50 ;časová prodleva 50ms KS CALL MS1 ;nutno použít jiný registr než R0,který je v podprogramu DJNZ R2,KS RET include(CAS:ASM) END V čem je program jiný ? Místo opakování 100 x, opakujeme 125 x. Ticho se prodloužilo o 50ms, takže v podprogramu ticha nám přibyl podprogram MS50. Ten jsme si museli napsat nově. Pokud se Vám to povedlo, měli by jste slyšet opravdový oznamovací telefonní tón. Jak budeme řešit generování nesymetrického tónu 0,25s tón a 0,25 s ticho 0,75s tón, 0,75s ticho – stále dokola (f = 500 Hz) ? FNES
0,25s 0,25s 0,75s 0,75s Řešení: První část tónu (0,25,-0,25) je již vyřešena v předcházejícím programu. Druhá část tónu (0,75- 0,75) se dá poskládat v tomto případě z prvního tónu. NS: CALL TON1 ;první část tónu (0,25s –0,25s) CALL TON2 ;druhá část tónu (0,75s – 0,75s) JMP NS ;stále dokola zní dva různě dlouhé tóny stejné frekvence TON1:CALL TON ;realizace 125 T tónu 500Hz CALL TICHO ;realizace ticha 250ms RET ;opakování dokola TON: MOV R7,#125 ;počet opakování period 0,25s x 500 = 125 HOP: CALL PER ;realizace jedné periody DJNZ R7,HOP ;opakování 125 x RET
64
PER: SETB P1.0 CALL MS1 CLR P1.0 CALL MS1 RET TICHO:CALL MS200 CALL MS50 RET
;vysíláme jedničku na P1.0 ;doba půlperiody pro f = 500Hz ;vysíláme nulu na P1.0 ;doba půlperiody pro f =500 Hz ;jen jedna perioda f= 500Hz ;časová smyčka 200Ms ;časová smyčka 50ms
MS50: MOV R2,#50 SK: CALL MS1 DJNZ R2,SK RET TON2:CALL TON CALL TON CALL TON
;časová prodleva 50ms ;nutno použít jiný registr než R0, ;zajistí opakování
CALL TICHO CALL TICHO CALL TICHO RET Include(CAS:ASM) END
;realizace 125 T tónu 500Hz ;realizace 125 T tónu 500Hz ;realizace 125 T tónu 500Hz = dohromady 0,75s tónu2 ;realizace ticha 250ms ;realizace ticha 250ms ;realizace ticha 250ms = dohromady 0,75 s ticha
Generování nesymetrického tónu dvou frekvencí tón f= 1000 Hz délky 0,4s a 0,4s ticho, ihned potom vygenerujte tón f = 2000 Hz délky 0,1s a 0,1s ticho. Vše na portu F2TONY
0,4s
0,4s
0,1s 0,1s
Doporučuji řešit 2 podprogramy !!!! Všechny zadané a vypočítané data si přehledně zobrazíme v tabulce – žlutě jsou vyznačeny zadané hodnoty, ostatní jsou vypočítané Frekven perioda ce 1000 Hz 1ms
půlperio da 0,5ms
délka tónu 0,4s
2000 Hz 0,5 ms
0,25 ms
0,1s
počet realizovaných period 400 = provedu 2x 200 200
délka prodlevy 0,4s = 0,2s 0,1s
2x
Jestli je Vám vše jasné, pak můžete začít kombinovat a vytvářet různé tóny, různých délek a frekvencí. Je možno se pustit do načítání tónu z tabulky a vytvořit i písničky. Pokud by jste chtěli kombinovat zvuk s jiným přípravkem, připisujete jenom další podprogramy a hlídáte si porty.
65
Kdyby jste chtěli třeba k předešlému programu 2 tónu přidat rotaci LED, připíšete do hlavního programu další podprogram, který vyřešíte. ST:
CALL FR1 CALL FR2 CALL ROTACE JMP ST
realizace frekv. 1000Hz délky 0,4s a prodlevy ticha 0,4s ;realizace frekv. 2000Hz délky 0,1s a prodlevy ticha 0,1s ;realizace rotace LED na druhém portu
Kdybychom chtěli celý program zopakovat 2x ( třeba i ten s rotací), vytvoříme si z něho podprogram a 2x zavoláme a zacyklíme na místě. Druhá možnost je přes registr a opakování pomocí DJNZ. Takže: 1.varianta (vypisuji jen hlavní program s jedním podprogramem) CALL ST ;realizace 1x CALL ST ;realizace 1x KO: JMP KO ;zacyklení na místě ST: CALL FR1 ;frekvence 1000Hz délky 0,4s a ticha 0,4s CALL FR2 ; frekvence 2000Hz délky 0,1s a ticha 0,1s CALL ROTACE ;realizace rotace LED RET 2.varianta MOV R4,#2 ;počet opakování hlavního programu S1: CALL FR1 ; frekvence 1000Hz délky 0,4s a ticha 0,4s CALL FR2 ; frekvence 2000Hz délky 0,1s a ticha 0,1s CALL ROTACE ;realizace rotace LED DJNZ R4,S1 ;zabezpečení, že program pojede jen 2x ST: JMP ST
12. PROGRAMOVÁNÍ KLÁVESNICE Klávesnici si můžete zakoupit v různém provedení – vždy je to ale určitý počet řádků a určitý počet sloupců. Každý sloupec nebo řádek se musí ovládat jedním bitem, takže pro náš 8 bitový port můžeme ovládat maximálně 4 x 4 .Náš přípravek má 3 sloupce x 4 řádky – každý sloupec, každý řádek je připojen na jeden pin portu. Vycházíme ze zadaného schématu. Dle hardwarového zapojení vidíme, že je nutno postupně poslat na jednotlivé sloupce 0 a pak programem testovat řádek po řádku, jestli se tato nula nedostala na pin příslušného řádku - při zmáčknutí klávesy se propojí - zkratuje sloupec s řádkem.
piny
10
1
66
Na pinu 10 je napájení Ucc, na pinu 1 je zem. Na pinu 2 jsou vyvedeny data7 – a tak dál ( vynechaný je pin 5 – data 4) Zkusíme nejdříve program, kde po zmáčknutí klávesy 1 (na portu 1) se zobrazí na sedmisegmentovce (na portu3)číslo 1 a po 100ms zhasne. KLAV1 ZAC:
MOV P1,#11011111b
skok:
JB P1.3,skok MOV P3, #11111001b
;inic.levého sloupce(na sloup klav 1 pošleme „0“) ;test zmáčknutí klávesy ;je – li klav 1 zmač dojde k zobrazení čísla na (7sgm) ;čas rozsvícení 100ms ;zhasnutí všech segmentů ;znovu čekej na zmáčknutí
CALL MS100 MOV P3, #11111111b JMP ZAC
Nová je instrukce JB bit,hop - tato instrukce testuje na co je nastaven daný bit – pokud je roven „1“, skáče na návěstí hop, pokud je roven „0“, jde dál a provede se další instrukce. Opakem je instrukce JNB – nastuduj a vyznač v instrukčním souboru. Pro lepší pochopení si vybereme 3 klávesy v různých sloupcích a zadání by mohlo vypadat třeba takto: Po zmáčknutí klav 1 se zobrazí číslo 1, po zmáčknutí klav 5 se zobrazí číslo 5, po zmáčknutí klav 9 se zobrazí číslo 9. Všechny 3 klávesy jsou umístěny v rozdílných sloupcích, proto musíme každý sloupec nejdřív inicializovat – tedy pošleme na něho 0 a na ostatní piny jedničky. Program může být řešen třeba takto : KLAV3 ZAC: MOV P1,#11011111b JB P1.3,KL5 dochází ke MOV P3,#11111001b KL5: MOV P1,#10111111b JB P1.2,KL9 MOV P3,#10010010b číslo 5 KL9: MOV P1,#01111111b bit P1.7 JB P1.1,ZAC MOV P3,#10010000b 9 na P3 JMP ZAC
;inicializace levého sloupce ;test zmáčknutí klávesy -po zmáčknutí ;je – li zmáčknuta klav 1 dojde k zobr.í čísla ;inicializace prostředního sloupce ;test, jestli se nula nedostala na P1.2 ;pokud byla zmáčknuta klav 5, zobrazí se ;zapnutí pravého sloupce –posíláme „0“ na ;test, jestli se nula nedostala na P1.1 ;pokud byla zmáčknuta klav 9, zobr se číslo
;program nezapomeň správně zacyklit – musí se stále opakovat a testovat ;všechny klávesy Lehce si můžete dodělat zobrazení znaků po zmáčknutí všech kláves. Na stejném programu si můžeme ukázat jednoduchou kombinaci klávesnice zvuk. Necháme v akci stejné klávesy, jen po jejich zmáčknutí se nebudou zobrazovat znaky, ale na portu P3 bude připojen reproduktor a budou se z něho ozývat různé tóny. pro přehlednost budou tóny vyřešeny podprogramy.
67
KLAVZV ZAC: MOV P1,#11011111b JB P1.3,KL5 CALL ZVUK1 KL5: MOV P1,#10111111b JB P1.2,KL9 CALL ZVUK2 KL9: MOV P1,#01111111b JB P1.1,ZAC CALL ZVUK3 JMP ZAC
;inicializace levého sloupce (na sloupec, kde je ;test zmáčknutí klávesy ;je – li klav 1 dojde k vygenerování tónu 1 ;zapnutí prostředního sloupce – ;test, jestli se nula nedostala na P1.2 zmáčknuta klav 5, dojde k vygenerování tónu 2 ;zapnutí prostředního sloupce ;test, jestli se nula nedostala na P1.1 ;zmáčknuta klav 9, dojde k vygenerování tónu 3 ;program nezapomeň správně zacyklit – musí se stále opakovat a testovat Tímto jednoduchým způsobem si můžete vytvořit malý zvukový klavír. Každá klávesa bude vydávat jiný tón. Takže už se blížíme ke konci základního kurzu programování jednočipů řady 8051. Nedá mi to a jako předposlední kapitolu uvedu již nástavbu, která bude pro šikovné programátory hračkou - načtení dat tabulkou – uvedu co nejjednodušší program na pochopení – rozsvěcování znaků na 7 segmentovce , který umíme jednoduše z kapitoly o sedmisegmentovce. Výhodou načtení dat je to, že data máme umístěny v tabulce a znaky lehce měníme, přičemž program upravíme jen lehce nebo vůbec. Pro ty začátečníky doporučuji si projíždět základní kurz stále dokola, vytvářet si další kombinace a své znalosti si ověřovat buď na nepájivém poli (naprogramovaný ATMEL) nebo na skutečných přípravcích, které si sami vyrobíte – viz 4.část projektu
13. NAČTENÍ DAT TABULKOU TAB
MOV DPTR,#TAB MOV R0,#0FFH START: MOV A,R0 INC A CJNE A,#10,SEM CLR A SEM: MOV R0,A MOVC A,@A+DPTR MOV P1,A CALL S1 JMP START TAB: DB 01000000B DB 01111001B DB 00100100B DB 00110000B DB 00011001B DB 00010010B DB 00010010B DB 01111000B DB 00000000B DB 00010000B INCLUDE(CAS.ASM) END
;do 16 bit registru se načte adresa tabulky ;naplnění registru R0 ;hodnota registru R0 se přesune do akumulátoru A ;přičtení 1- v prvním okamžiku se akumulátor =0 ;porovnávám hodnotu v akumulátoru s číslem 10 ;pokud se hodnoty rovnají dojde k vynulovánía ;pokud se hodnoty nerovnají, hodnota A se ;do A se přesune obsah součtu A a DPTR ;zobrazení na port P1 ;čas 1sekundy ;opakování stále dokola ;libovolná data
68
Jiná možnost je (aby se nemusely počítat řádky tabulky), umístit se na konec tabulky hodnota třeba FF a ptáme se zda jsme už na konci. Tabulka pak může mít různý počet řádků pro stejný program.
14. PROGRAMOVÁNÍ ATMELU - realizace na nepájivém poli Pokud jste praktici, pusťte se do výroby programátoru , kupte si jednočip AT89C2051 (přibližná cena okolo 35,- Kč) a zkoušejte programy naprogramovat ( vydrží až 1000 mazání – programování) do tohoto šikovného 20 nožičkového jednočipu a realizujte na nepájivém poli. Pokud potřebujete více pinů je tu k dispozici DIL 40 AT 89C51 Teď trocha teorie : ATMEL Kompatibilita s Intel 8051 V provedení DIL20 - 1,2,4 kB interní programové FLASH (1000 zápisových cyklů) Rozsah napětí od 2.7 do 6 V Oscilátor 0 Hz až 24 MHz 128 bytů vnitřní paměti RAM 15 programovatelných I/O pinů Dva 16-ti bitové čítače/časovače 5 zdrojů přerušení Plně duplexní sériová linka Dvouúrovňová ochrana dat - úsporné režimy napájení Analogový komparátor AT89C2051( doporučuji s ním začít) Procesor AT89C2051 je určen pro jednoduché aplikace, u kterých není potřeba mnoho I/O pinů a paměti programu a dat (2kB). Oproti standardní řadě x51 obsahuje navíc analogový komparátor se vstupy na P1.0 a P1.1. Jeho výstup je softwerově přístupný na bitu P3.6. Velice dobře je propracován systém ochrany dat. Každý I/O pin může přímo budit LED diodu (až 20mA), takže nejsou potřeba žádné okolní posilovače. => připojením krystalu a dvou kondenzátorů získáme plně funkční mikropočítač. Podrobnější popis naleznete v originálním anglicky psaném PDF souboru (DATASHEET) přímo na www.atmel.com Konstrukce velice jednoduchého programátoru je popsána na HW serveru Rozložení vývodů pouzdro DIP20
Na
mikrořadiče
AT89Cxx51
na
závěr ukázka postupu naprogramování a realizace nejjednoduššího programu s LED.
69
Programování jednočipu ATMEL AT89C2051 Je to jednočip s pamětí EEPROM – takže elektricky programujeme i mažeme. Zadání : Odladěný program LED (třeba program LEDKYHAD1) naprogramujte do jednočipu a sestavte zapojení, zrealizujte na nepájivém poli. Postup : (možností je více – volím ten nejpodrobnější ) 1, Odlaďte program LED - vznikne PROGRAM.ASM 2, při kompilaci vzniká soubor PROGRAM.HEX 3, Do patice programátoru vložíš ATMEL 4, Zvolíš operaci – čtení – pokud je jednočip prázdný – výpis bude tam FF FF FF 5, Pokud není prázdný, dáš operaci mazání a vymažeš 6, Znovu přečteš - musí být vymazaný 7, Otevřeš PROGRAM.HEX (z disku) 8, Dáš operaci programování, zkontroluj zápis 9, Sestavíš na nepájivém poli zapojení 10,Kontrola– oživíš – nezapomeň 5V !!!!!!!!!!!!!!!! 11, Zkontroluj si hodnotu krystalu ( 6 nebo 12 MHz), vyměň ho za druhý a sleduj změnu. Zapojení ATMEL AT89C2051 8xLED R2- R9
R1 1 RESET
C3 C1
20
P1.7
Ucc 4 5 P3.7
C2 10
P1.0
Ucc = 2,7 - 6 V obvod: Krystal: Výstup:
3 = (10÷47) μF R1 = 8k2 C1, C2 = 33 pF krystal 6÷12 MHz 8 x LED R2 – R9 … do 1kΩ
70
UCC
15.
PROGRAMOVÁNÍ
SEDMISEGMENTOVÉHO
DISPLEJE
-
dynamického Dynamická sedmisegmentovka je tvořena třemi 7segmentovými displeji
D7 D6 D5 D4 D3 D2 D1 D0 Piny bytu jsou obsazeny: -tři sedmisegmentové zobrazovače, buzené multiplexním způsobem -D7- nezapojen -D6- aktivujeme "O" aktivuje se levý segment -D5- aktivujeme "O" aktivuje se prostřední segment -D4- aktivujeme "O" aktivuje se pravý segment -D3- D0-bity až určují zobrazovaný znak - BCD kód Potupné rozsvěcování 1 2 3 na třech segmentech MUL123 Nejdříve si rozsviť na jednom segmentu 1, na druhém 2, na třetím 3. Zobrazování zrychli tak, aby se zdálo, že všechny tři znaky se zobrazují současně. Pokud se Ti to podařilo –pochopil jsi multiplexové zobrazování!!! Malá nápověda: HOP: MOV P1,#00110001b CALL MS200 MOV P1,#01010010b CALL MS200 MOV P1,#01100011b CALL MS200 JMP HOP Teď nás čeká realizace programu načítání 0-9,0-99,0-999 Výsledný program by měl zobrazovat postupně od 0 –999. N999 ;načítání 0-999 start : mov r1,#11100000b ;nastaví nulu do pravého segm. mov r2,#11010000b ;nast. 0 do stredního segmentu mov r3,#10110000b ;nast. 0 do levého segmentu pok: inc r1 ;pričte do r1 1 cjne r1,#11101010b,zobraz ;test jestli je už v r1 desítka mov r1,#11100000b inc r2 cjne r2,#11011010b,zobraz 71
zobraz: zo:
del : smycka:
mov r2,#11010000b inc r3 cjne r3,#10111010b jmp start mov r7,#0ffh mov p1,r1 call del mov p1,r2 call del mov p1,r3 call del djnz r7,zo jmp pok mov r0,#255d djnz r0,smycka ret
,zobraz ;do r7 nastavuje rychlost načítání
;
Začneme postupně – nejdříve od 0-9,potom 0-99. Malá nápověda :budeme přičítat 1 pomocí INC a kontrolovat poslední stav –tedy 9(vlastně 10- tu už nebudeme zobrazovat pomocí CJNE, proč ne pomocí DJNZ?
Použitá literatura: Kniha1
Skalický
– Mikroprocesory řady 8051
72
Ing. Milan Henkl Zuzana Veselá
Mikroprocesorová technika Výkonný redaktor prof. RNDr. Zdeněk Dvořák, DrSc. et Ph.D. Odpovědná redaktorka Vendula Drozdová Technická redakce autor Návrh a grafické zpracování obálky Jiří Jurečka Publikace ve vydavatelství neprošla technickou ani jazykovou redakční úpravou Vydala a vytiskla Univerzita Palackého v Olomouci Křížkovského 8, 771 47 Olomouc www.vydavatelstvi.upol.cz www.e-shop.upol.cz
[email protected] 1. vydání Olomouc 2014 Ediční řada – Studijní opora ISBN 978-80-244-4063-7 Neprodejná publikace vup 2014/230