SZEGEDI TUDOMÁNYEGYETEM Természettudományi Kar Kísérleti Fizika Tanszék Informatikus – Fizikus szak
Mikrokonverterrel vezérelt digitális jelgenerátor fejlesztése Diplomamunka
Készítette: Kopasz Péter Gábor
Témavezetı: Dr. Gingl Zoltán
Informatikus – Fizikus hallgató
egy. adjunktus SZTE, Kísérleti Fizika Tanszék
SZEGED 2006.
1. Tartalmi összefoglaló
Napjainkban
a
digitális
technika
alkalmazása,
használata
a
mindennapok részévé vált. Digitális technikát használunk például, ha telefonálunk, ha használjuk a számítógépet, ha CD lemezt hallgatunk vagy ha DVD filmet nézünk. Gyakran észre sem veszzük, hogy mekkora segítség ez a mindennapokban. Dolgozatom célja, hogy egy igen egyszerő felépítéső, de, nagyon hatékony digitális jelgenerátort építsünk, illetve fejlesszünk. Az eszköz felhasználási területe igen széles lehet, pl.: átviteli függvény vizsgálat; a munka során én a leggyakrabban használt jeltípusokra írtam algoritmusokat, de a késıbbiekben ez bıvíthetı, fejleszthetı. A programot assembly nyelven írtam.
Kulcsszavak: digitális jelgenerátor, mikrokonverter, A/D és D/A átalakító, assembly
2.
Tartalomjegyzék
1. Tartalmi összefoglaló 2. Bevezetés
2
[1,2]
4
3. Elméleti áttekintés [3,4]
6
3.1 A jelgenerátorokról
6
3.2 A D/A konverterekrıl [4]
8
3.3 A 8051-es mikrovezérlı [5,6]
9
3.3.1 Felépítése
9
3.3.2 Belsı és külsı tárolók
11
3.3.3 Speciális funkció regiszterek (SFR)
12
3.3.4 Megszakítások
13
3.4 Az Analog Devices 842-es mikrokonvertere (ADuC 842) [7] 4. Mikrokonverter alapú jelgenerátor fejlesztés
15 21
4.1 A jelgenerálás elve
21
4.2 A jelgenerátor felépítése
22
4.3 Tulajdonságok
23
4.4 A jelek elıállítása
24
4.4.1 Főrész jel
25
4.4.2 Háromszög jel
26
4.4.3 Négyszög jel
27
4.4.4 Szinusz jel
28
4.4.5 Grafikonok
29
4.5. Felhasználói felület
31
4.6. Teszt
35
5. Összefoglalás
37
6. Köszönetnyilvánítás
38
7. Nyilatkozat
39
8. Irodalomjegyzék
40
9. Függelék/melléklet
41
3.
2. Bevezetés [1,2] A
függvénygenerátor
olyan
elektromos
berendezés,
amely
az
elektronikában használatos jelalakok generálására alkalmas. Ezek a jelalakok lehetnek ismétlıdık vagy impulzus formájúak. Az utóbbi esetben valamilyen belsı vagy külsı trigger forrást igényelnek. A kimeneti jelalakot a mérendı készülék bemenetére csatlakoztathatjuk és az átvitt jelbıl következtethetünk a rácsatlakoztatott eszköz helyes vagy helytelen mőködésére. Használhatóak továbbá átviteli függvények mérésére, meghatározására. A továbbiakban ismertetendı eszköz alapja egy mikrokonverter, mert ezzel az egy chippel megvalósítható a digitális jelgenerátor, ugyanis minden szükséges eszközt integráltak rá (A/D, D/A konverter, memória). Régebben lassabbak voltak a mikrovezérlık, de ma már nem korlát a digitális technika, mert nagyon jó a pontossága és nagy elınye még, hogy viszonylag olcsó. A hétköznapokban is fontos szerepet játszik a digitális jelgenerálás. Néhány példával is szeretném ezt alátámasztani: a CD illetve DVD lejátszóban is használnak digitális jelgenerátorokat, a monitorban is a képet három darab jelgenerátor állítja elı. Ez a technika annyira gyakori, hogy mára már minden mobiltelefonban a hangot például digitális jelgenerátor állítja elı.
Analóg vagy digitális? A függvénygenerátorok tipikusan két kategóriába sorolhatóak: analóg vagy
digitális.
Az
analóg
függvénygenerátorok
alapkimeneti
jele
a
háromszögjel. A jel generálása egy kondenzátor feltöltésével és kisütésével történik. Ezáltal lineárisan növekvı illetve csökkenı feszültség keletkezik, ami egy lineáris háromszög jelet állít elı a kimeneten. Az 50%-os kitöltési tényezıvel rendelkezı négyszögjel viszonylag könnyen megkapható, ugyanis a kondenzátor kisülése elıtti értéket illetve a kisülés utáni érték kerül ki a kimenetre. A digitális jelgenerátorok – ami a diplomamunkám tárgyát képezi – egy digital-analóg konvertert (DAC) használnak, hogy elıállítsák a kívánt jelet a memóriában tárolt adathalmazból, értékekbıl. A digitális generátorok a jel frekvenciáját egy belsı órajel-generátorból (általában kvarc-kristály) származtatják. Következésképpen a frekvencia
4.
pontosság és stabilitás magasabb, mint ami egy analóg függvénygenerátortól elvárható. Elınyükhöz tartozik az is, hogy képesek elıállítani tetszıleges alakú jeleket is, természetesen bizonyos határok között. Ez sok alkalmazás számára kedvezı. A
dolgozatom
megvalósítása,
amit
célja, a
a
fentiekben
késıbbiekben
ismertetett
viszonylag
digitális
eszköz
egyszerően
–némi
programmódosítással, vagy új programrészek írásával – lehet fejleszteni, új funkciókat hozzávenni, úgy hogy nem kell változtatni hozzá a külsı megjelenést.
5.
3. Elméleti áttekintés [3,4] 3.1 A jelgenerátorokról
A legtöbb függvénygenerátor kimeneti csatlakozó típusa a generátor frekvencia
tartományától
függıen
más
és
más
lehet.
Általában
a
függvénygenerátorok képesek több mint 20 MHz-es jelek elıállítására és 50 vagy 75 ohmos lezárású BNC csatlakozó aljzatot igényelnek. A speciális rádiófrekvenciás generátorok képesek gigaherzes jelek elıállítására és általában N-dugós kimeneti csatlakozójuk van. Ezek az eszközök,
mint
modulálására
és
általában
a
jelgenerátorok
csillapítására
és
gyakran
képesek képesek
a
kimeneti arra,
hogy
jelek két
határfrekvencia közt frekvenciasöprést végezzenek. Ezzel a tulajdonsággal könnyen meghatározható egy elektronikus készülék átviteli karakterisztikája. Némely generátorok képesek fehér vagy rózsaszín zaj elıállítására is. A legkorszerőbb jelgenerátorok DDS-t (Direct Digital Synthesis) használnak a hullámformák generálásához.
A tetszıleges hullámforma generátorok is
hasonló elven mőködnek, hogy elıállítsanak bármilyen hullámformát, amit amplitúdó értékek sorozatával le tudunk írni. A Direct Digital Synthesis elvén mőködõ jelforrás egy idõrekordot (mintasorozatot) rekonstruálva generál analóg jelet. A numerikus minták könnyen szerkeszthetõek szoftverrel, így - a mintavételezés és kvantálás korlátain belül - valósághő (tetszõleges) vizsgáló jelek elõállítására nyílik mód. (1. ábra)
1. ábra: A DDS mőködési elve[3]
6.
„A DDS blokkvázlata a 2. ábrán látszik. Minden egyes órajel-ciklusban a léptetıregiszter (M) tartalmát hozzáadjuk a fázisregiszter tartalmához. A keletkezett fázishoz tartozó amplitúdóértéket a jelalakot tartalmazó memóriából (RAM vagy ROM), olvassuk ki és egy D/A konverterrel feszültséggé konvertáljuk.
2. ábra: A DDS blokkvázlata [3]
A
digitális
generálás
által
keletkezı
„lépcsık”
miatt
létrejövı
felharmonikusok kiszőrésére egy analóg szőrı szolgál (egy passzív ötödfokú elliptikus szőrı). A szőrı jelentıségét a 3. ábra szemlélteti.
3. ábra: A szőrıvel ill. a szőrı nélkül keletkezı jel
A keletkezı jel frekvenciájának változtatását az M regiszter tartalmának változtatásával lehet elérni (a frekvencia igen gyorsan megváltoztatható, és nem jelentkeznek tranziensek). A kimenet frekvenciája a következı képlettel számolható: FOUT =
M * FDDS 2N
(1)
ahol FDDS a generátor referencia órajele, N pedig a fázisregiszter bitjeinek a száma. A frekvenciafelbontás nagyságát a fázisregiszter hossza határozza meg.”[3] Mivel M értéke általában 32-bites, ezért 232 ≈ 109 az átfogási tartomány. A függvény generátorok kimeneti fokozata végerısítıbıl és kimeneti osztóból áll. A végerısítı hasonlóan a szinuszos generátorokhoz - szélessávú.
7.
A digitális jelgenerátor megvalósítására nagyon sokféle mód létezik. Mi ebbıl a mikrokonverterrel történı megvalósítást választottuk, ugyanis ott egy helyen megvan minden ami kell a jelalakok elıállításához: memória, A/D és D/A konverterek. A következı fejezetben a 8051-es mikrovezérlı tulajdonságait fogom ismertetni, mert amit használunk mikrokonvertert annak a belsı magja ugyan 8052-es, de teljes mértékben kompatibilis a 8051-es mikrovezérlıvel.
3.2 A D/A konverterekrıl [4]
A D/A konverter feladata, hogy egész számmal arányos feszültséget szolgáltasson, jelen esetben a 0V -2,5V-ig tartó tartományt 256 részre osztja, s ennek megfelelı feszültség értékeket állít elı. A konverzió a következı képlet alapján megy végbe: U =Z*
U REF 2b
(2)
ahol UREF a konverter referenciafeszültsége 2b pedig a konverter pontosságára jellemzı egész szám, b a bitek száma, a mi esetünkben b=8. A Z szám értéke 0 és 2b -1 között lehet. D/A konvertert nagyon sok mindenre lehet használni, például: különbözı alakú feszültségjelek elıállítására, feszültséggel vezérelhetı eszközök számítógéppel való vezérlésére, stb. A D/A konvertert kétféleképpen használhatjuk, az egyik, hogy a fix referenciafeszültség mellett változtatjuk a digitális bemenetet, a másik, hogy a referenciafeszültséget változtatjuk. Utóbbi esetben szorzó típusú átalakításról beszélünk, mert a kimenet a referencia és a digitális szám szorzatával arányos. Ezt az utóbbi lehetıséget nem minden D/A konverter biztosítja. A D/A konverterek felbontását az határozza meg, hogy hány bitesek, mert ez a szám adja meg, hogy a feszültség tartomány hány részre oszlik.
8.
3.3 A 8051-es mikrovezérlı [5,6] 3.3.1 Felépítése
A mikroprocesszor nem más, mint egy chipben egy számítógép-egység és annak vezérlése. Ahhoz, hogy ebbıl aztán mőködıképes számítógép legyen, sok kiegészítı áramkörre van szükség: órajel-generátorra (kvarckristály), tárolókra (RAM-ok), fix tárolókra (ROM, PROM, EPROM) amelyekbe a beolvasó program kerül. Ezeken kívül különféle periféria vezérlık is szükségesek, az analóg jelek átalakításához pedig A/D konverterek is kellenek. A mikrokontroller és a mikroprocesszor között az a különbség, hogy a mikrovezérlı tartalmazza a mikroprocesszort és további periféria áramköröket egyetlen egységbe integrálva.
4. ábra: A 8051-es mikrovezérlı blokkvázlata
9.
A 8051-es mikrokontrollernek belsı órajel-egysége van. Az áramkör egy invertáló erısítı, amelynek a be-, és a kimenete az XTAL1 és az XTAL2 lábakhoz csatlakozik (19 és 18-as lábak ). A felhasználáshoz szükséges órajel frekvenciát
a
csatlakoztatott
külsı
áramköri
elemek
határozzák
meg.
Rendszerint erre a célra kvarcot, vagy kerámia-rezonátort használhatunk. Az 5. ábra egy kvarccal stabilizált órajel-generátort mutat.
5. ábra
A belsı oszcillátor kimenete, illetve a bevezetett órajel egy belsı ütemgenerátort hajt meg. Ez állítja elı a szükséges belsı ütemezı jelet, amelynek frekvenciája mindenkori órajel frekvencia fele. A belsı jel ütemezi a mőveleteket. A 8051/8031 típusoknál minden gépi-ciklus hat ütemő, melyeket S1-tıl S6-ig jelölünk. Mindegyik ütem két oszcillátor periódusból - P1 és P2 - áll. Minden gépi-ciklus P tehát 12 órajel-periódusból áll, vagyis az S1P1-el kezdıdik és az S6P2-vel fejezıdik be. A gépi ciklus periódusideje (P) a következı összefüggés alapján számolható ki: P=
12 f
(3)
Az f-et 1/s - ban ( Hz-ben ) helyettesítve a P periódusidıt sec-ban, illetve mikrosecundumban kapjuk. Például ha egy kontrollert 8 MHz-es órajellel mőködtetünk, akkor: P=
12 = 1,5µs 8 * 10 − 6
(4)
. 10
hosszú lesz egy gépi ciklus. A ciklusidı ismeretében egy adott program futási ideje is kiszámolható. A 8051/8031 kontrollerek utasításai 1-3 bájt hosszúak és végrehajtásuk egy vagy két ciklus alatt történik. Kivétel a szorzás (MUL), illetve az osztás (DIV), melyeket a mikrokontroller 4 ciklus alatt hajt végre. 3.3.2 Belsı és külsı tárolók
A 8051 mikrokontroller 64 Kbájt külsı adatmemóriát és 64 Kbájt külsı programmemóriát
tud
kezelni.
A
család
minden
tagjában
van
belsı
adatmemória (RAM ), illetve egyes típusokban belsı programmemória (ROM / EPROM) is található. A 8051 típusú mikrokontroller belsı RAM-ja két 128 bájtos területet tartalmaz: operatív memória (00h – 7Fh) illetve a speciális funkció regiszter memóriát (SFR) (80h – FFh). Az operatív memória további három részre tagolódik: 1. Négy 8 bájtos Regiszter Bank ( BANK0, BANK1, BANK2, BANK3) - A BANK-ok közül mindig csak egy lehet aktív, s ezekhez rendelıdnek az R0,R1,...,R7 regiszterek 2. Bit-címezhetı memória - A bit címezhetı memória 16 bájtja elérhetı bájtos címzéssel is, de a memóriaterület 128 bitje ( 16*8 ) bites változóként külön-külön írható/olvasható, illetve használható bitmőveletek változóiként. 3. általános felhasználású memória - Az általános felhasználású memóriaterület csak bájtos szervezéső. Az operatív memória teljes területe direkt vagy indirekt címzéssel érhetı el. Az
alkalmazások
memóriakapacitása.
széles
Ilyenkor
körében
kell
a
nem
8051-et
elég külsı
a
belsı adat-
tárolók és/vagy
programtárolóval kiegészíteni. Használatuknál figyelni kell arra, hogy a 8051 nem használ várakozó állapotot ( Wait-States ), ezért csak megfelelı sebességő tárolók alkalmazhatók.
. 11
3.3.3 Speciális funkció regiszterek (SFR) A belsı adatmemória 80H - FFH címterületén találhatók az ún. Speciális Funkció Regiszterek ( SFR ). A 8051-es család minden belsı funkciója ezek segítségével vezérelhetı. Itt találhatók a CPU regiszterek (ACC, B, PSW, SP), a címzı regiszterek (PC, DPTR), a portok regiszterei (P0, P1, P2, P3), a belsı perifériák: idızítı/számláló (TMOD, TCON, TH0, TL0, TH1, TL1), soros vonal (SCON, SBUF), megszakítások (IP, IE). Az SFR regiszterek csak direkt címzéssel írhatók/olvashatók. Ezen regiszterek között vannak olyanok, amelyek bitjei is külön-külön kezelhetık. Az SFR-ek elnevezései, funkciói és címei láthatóak az 1. Táblázatban:
Szimbólum
Jelentés
Cím (Hex)
SP
Stack-Pointer
81
DPL
Data-Pointer: LOW bájt
82
DPH
Data-Pointer: HIGH bájt
83
*TCON
Idızítı/Számláló vezérlı regiszter
88
TMOD
Idızítı/Számláló mód-regiszter
89
TL0
0-ás Idızítı/Számláló: LOW bájt
8A
TL1
1-es Idızítı/Számláló: LOW bájt
8B
TH0
0-ás Idızítı/Számláló: HIGH bájt
8C
TH1
1-es Idızítı/Számláló: HIGH bájt
8D
*P1
Port 1
90
PCON
Power vezérlı regiszter
97
*SCON
Soros Port vezérlı regiszter
98
SBUF
Soros port buffer
99
*P2
Port 2
0A0
IE
Megszakítás engedélyezı regiszter
0A8
*P3
Port 3
0B0
*IP
Megszakítás prioritás regiszter
0B8
+*T2CON
2-es Idızítı/Számláló vezérlı regiszter
0C8
+*RCAP2L
2-es Idızítı/Számláló Capture regiszter LOW bájt
0CA
+*RCAP2H
2-es Idızítı/Számláló Capture regiszter HIGH bájt
0CB
+*TL2
2-es Idızítı/Számláló: LOW bájt
0CC
+*TH2
2-es Idızítı/Számláló: HIGH bájt
0CD
*PSW
Programstátusz regiszter
0D0
*ACC
Akkumulátor
0E0
. 12
3.3.4 Megszakítások A 8051 típusnál öt megszakítás forrás és két prioritási szint van. A 8052 típusú mikrokontrollerbe még egy további megszakításforrást (T2) integráltak. Megkülönböztetünk
külsı
és
belsı
megszakítás-forrásokat.
A
külsı
megszakításokat (INT0,INT1) a megfelelı bemenetre (12-es ill. 13-as lábak) adott feszültségszint, vagy negatív él indítja. Az egyes bemenetek szint-, vagy él-érzékenységét a TCON (Timer-Control) regiszter IT0, illetve IT1 bitjeivel lehet megválasztani. Az egyes megszakítások végre-hajtását a TCON.1 (IE0) illetve a TCON.3 (IE1) bitek 1-be írásával engedélyezhetjük. A belsı megszakításokat - az elızıekkel ellentétben - nem külsı, hanem a tokon belüli esemény kezdeményezi. A felhasználó ezért csak közvetetten kezdeményezheti. A belsı megszakításra példa az ES, amelyet a soros vonal indít az RI vagy a TI beíráséval. További belsı megszakítási források még a TF0 és a TF1. Ezeket a megfelelı idızítı/számláló (T0, illetve T1) túlcsordulása indítja. A táblázat foglalja össze a megszakításforrásokat és kezdıcímeiket.
2. Táblázat:
Megszakítás-forrás
Kérı-flag
Kezdı-cím
0-ás külsı megsz.
IE0
0003 H
Timer 0 megsz.
TF0
000B H
1-es külsı megsz.
IE1
0013 H
Timer 1 megsz.
TF1
001B H
Soros vonal megsz.
RI vagy TI
0023 H
A 8052-es mikrokontroller kibıvített megszakítása:
Timer 2 megsz. vagy külsı
TF2 vagy EXF2
töltés
. 13
002B H
A külsı megszakítás-forrás megszakítást kérı jelének LOW, vagy HIGH szintje minden esetben legalább egy teljes gépi ciklus idıtartamáig kell fennálljon.
Csak
ezzel
biztosítható
a
megszakítás-kérés
biztonságos
felismerése. A 8051 megszakítás-vezérlı logikája bármelyik megszakítási kérelem felismerése után egy LCALL utasítást generál. A megszakítás lekezelése tehát a következı lépésekbıl áll: Ellenırzés, hogy kiadható-e az LCALL utasítás. Ha a kérés pillanatában azonos, vagy magasabb prioritású megszakítás kiszolgálása folyik, akkor a kontroller nem ad ki LCALL utasítást. Az alacsonyabb szintő megszakításvégrehajtást egy magasabb prioritású megszakítja. Ha a megszakítás-kérés utasítás végrehajtása közben érkezik, akkor elıször befejezıdik az, és csak utána történik a megszakítás-rutin hívása. - A programszámláló pillanatnyi értékét leteszi a VEREM-be. - A programszámlálót feltölti az aktuális megszakítást kiszolgáló rutin kezdıcímével. - A megszakítás-rutint egy RETI utasítással kell lezárni. Ennek hatására folytatódik a megszakított program végrehajtása. A megszakítás-kiszolgáló rutinokat minden esetben a RETI ( Return from Interrupt
)
utasítással
kell
befejezni.
Ez
rendszernek, hogy egy kiszolgálás befejezıdött.
. 14
jelzi
a
megszakítás-vezérlı
3.4 Az Analog Devices 842-es mikrokonvertere (ADuC 842) [7] Az alábbiakban az ADuC 842-es mikrokonvertert fogom ismertetni. Azért ezt a konvertert használjuk, mert minden olyan dolog, amire szükségünk van megtalálható ebben a chip-ben (memória, A/D, D/A). Ez a chip rendelkezik egy többcsatornás, önkalibráló analóg-digital (A/D) konverterrel, kettı darab digitalanalóg (D/A) átalakítóval, és egy 8052-es maggal, ami teljes 8051-es kompatíbilis utasításkészlettel rendelkezik.
Blokk Diagram
6. ábra: Az ADuC 842-es mikrokonverter blokk vázlata
Mint, ahogy a 6. ábrán is látható a 842-es mikrokonverterre három típusú memóriát integráltak: 62 kB FLASH/EE program memória, 4 kB FLASH/EE adat memória és 256 byte RAM és 2 kB külsı RAM.
. 15
Flash/EE Program memória: 62 kB program memória áll rendelkezésre a program kód futtatásához, amit csak és kizárólag innen lehet futtatni. A programot soros porton keresztül lehet feltölteni a memóriába.
Flash/EE adat memória: Ennek a típusú memóriának 4 kB a mérete, és indirekt módon érhetı el „control regiszterek” használatávall.
Általános célú RAM: Két 128 byte-os memória részre van osztva: alsó és felsı rész. Az alsó részt direkt és indirekt címzéssel is el lehet érni, a felsı részhez viszont csak indirekt címzéssel férhetünk hozzá, mert ugyanazt a címzési területet használja, mint a speciális funkció regiszterek (SFR), ami pedig csak direkt módon címezhetı. Az alsó memóriaterület címtartományait a 7. ábra szemlélteti. A memória legalsó 32 byte-ja 4 részre van osztva, 8 darab regiszter számára (R0tól R7-ig). A verem a belsı memória bármelyik részén lefoglalódhat, és a legnagyobb mérete 2048 byte lehet. Az inicializálás (Reset) során a verem mutató (stack pointer) felveszi a 07h értéket és használat elıtt megnöveli az értékét 08h-ra, ami épp az elsı regiszter címe lesz (R0, BANK1).
7. ábra: A belsı adat memória alsó 128 byte-ja
. 16
Külsı adat memória (External XRAM): Ez a memória terület a MOVX utasítással érhetı el, és mérete pedig meghaladja a 16 Mbyte-ot. Ezt a memóriaterületet használtam a különféle jeleket elıállító algoritmusok által generált pontok tárolására és kiolvasására.
Az ADuC 842-es speciális funkció regiszterei (SFR):
Az ACCUMULATOR (ACC) regisztert matematikai mőveletekhez – összeadás, kivonás, egész számmal való szorzás és osztás – használhatjuk, és az „A” regiszterrel hivatkozunk rá A „B” funkció regisztert az Accumulatorral együtt használjuk a szorzás illetve az osztás mővelet megvalósításához.
Verem mutató (Stack Pointer, SP): A Verem mutató mindig a verem tetejére mutat, és az értéke akkor nı, ha a PUSH utasítással adatot töltünk a verembe, illetve a CALL utasítás hatására.
Data Pointer (DPTR): A Data Pointer három 8-bites regiszterbıl áll: DPP (page byte), DPH (magas byte), DPL (alacsony byte). Ezek memória címeket adnak vissza, és ezáltal tudja a program címezni a külsı és belsı memória területeket, illetve a DPTR-t használjuk még a külsı adat memória címzéséhez is. regiszterként bánhatunk vele (DPTR = DPH, DPL).
. 17
16-bites
Az utasítások legtöbbje egy vagy két órajel ciklus alatt lefut. A programban használt utasításokat illetve, hogy mennyi órajel ciklus alatt fut le, a 3. táblázat tartalmazza. Mnemonic
Leírás
Bytes
Cklus
Aritmetikai ADD A,Rn
Az A-hoz hozzáadja a regisztert
1
1
ADD A, #data
Azonnali hozzáadás
2
2
SUBB A,Rn
A regisztert kivonja A-ból
1
1
INC Rn
A regisztert növeli 1-gyel
1
1
INC DPTR
A data pointer értékét növeli 1-gyel
1
3
DEC Rn
A regiszter értékét csökkenti 1-gyel
1
1
Bitenkénti forgatás a Carry flag-en keresztül
1
1
MOV A,Rn
A regiszter értékét beleteszi az A-ba
1
1
MOV Rn, A
Az A értékét beleteszi a regiszterbe
1
1
MOV A,dir
Dir helyett álló byte-ot teszi bele az A-ba
2
2
MOV A,#data
Az adatot az A-ba teszi
2
2
MOV Rn,#data
Az adatot a regiszterbe teszi
2
2
MOV dir,A
Direkt byte-ba teszi az A-t
2
2
MOV Rn, dir
Direkt byte-ot tesz a regiszterbe
2
2
MOV DPTR,#data
A data pointer értékét írja felül
3
3
MOVC A,@A+DPTR
code mem-bıl A+PDTR helyen lévı értéket teszi A-ba
1
4
MOVX @DPTR,A
Az A értékét a külsı RAM-ba írja a DPTR címen
1
4
MOVX A,@DPTR
A DPTR címen lévı adatot írja az A-ba
1
4
PUSH dir
A verembe tesz
2
2
POP dir
A verembıl olvas
2
2
CLR bit
Törli a konkrét bitet
2
2
SETB bit
Beállítja a konkrét bitet
2
2
CPL bit
Komplementjét veszi a direkt bitnek
2
2
LJMP
Hosszú ugrás
3
4
JMP rel
Feltétel nélküli ugrás
1
3
RET
Szubrutinból való visszatérés
1
4
RETI
Megszakításból való visszatérés
1
4
JNZ rel
Ha az A nem egyenlı 0-val, ugrik a rel-re
2
3
DJNZ Rn, rel
Rn-t csökkenti, és amíg Rn nem egyenlı 0, ugrik
2
3
JB bit, rel
Ha a konkrét bit = 1, akkor ugrik a rel-re
3
4
CJNE A, #data, rel
Amíg A nem egyenlı #data-val ugrik
3
4
Nem csinál semmit (No operation)
1
1
Logikai RLC A Adat mozgatás
Boolean
Elágazások
Egyéb NOP
. 18
A TIMER 2 mőködése:
A Timer 2 egy 16-bites idızítı-számláló, ami lehet esemény idızítı illetve esemény számláló, és a T2CON speciális funkcióregiszterrel lehet beállítani. A Timer 2 három különbözı - Capture, Auto-Reload és BaudrateGenerátor - üzemmódban használható. Az üzemmód kiválasztását a T2CON.0, a T2CON.2, valamint a T2CON.4 és T2CON.5 bitek végzik. Capture üzemmód: Ebben az üzemmódban a TH2 és a TL2 regiszterek tartalma az RCAP2H, ill. az RCAP2L regiszterekbe átírható. Az átírást a T2EX bemenetre ( 2 láb ) adott lefutó él vezérli. A vezérlést az EXEN2 bittel engedélyezhetı vagy tiltható ( a logikai 1 engedélyez ). Az adatátvitellel egyidejőleg a Timer 2 megszakítása is beíródik. Az RCAP2H és RCAP2L regiszterek tartalma szoftverbıl állítható. Mivel a megszakítási folyamat hardvervezérelt, ezért ebben az üzemmódban a külsı esemény idejét vagy frekvenciáját mérhetjük. A Timer 2 megszakítás rutin le tudja kérdezni a TF2 és EXF2 állapotát, és ezáltal megállapítható, hogy mi okozta a megszakítást. Baud Rate üzemmód: A Timer 2 idızítı használható ütemezıjel-adónak is. A Timer 2 túlcsordulását választva a soros átvitel vezérlésére, megoldható az adás és a vétel független ütemezése. Ha a Timer 2-ıt Baudrate opcióba akarjuk állítani, akkor Auto-Reload üzemmódba kell kapcsolni. A számláló túlcsordulása vezérli az RCAP2H és RCAP2L regiszterek tartalmának ismételt betöltését. Ebben az üzemmódban a számláló túlcsordulása nem írja be a TF2 bitet, ezért nem indít megszakítást sem. Ha EXEN2 bitet 1-re állítjuk, akkor a T2EX bemenetre érkezı negatív él megszakítást fog kezdeményezni, de nem tölti fel újból a T2 regiszterit. Így itt a T2EX bemenet különálló megszakításként alkalmazható.
. 19
Auto-Reload üzemmód Ebben az üzemmódban további választási lehetıség van. Itt a Timer 2-ıt lehet számlálóként illetve idızítıként is konfigurálni. A számlálás iránya lehet növekvı vagy csökkenı ami a DCEN (Down Counter Enable) bittel vezérelhetı. Ezt a bitet a T2MOD regiszterrel lehet módosítani. Az üzemmód counter bitje, DCEN alapértelmezésben 0, ami azt jelenti, hogy a Timer 2 növekvı számlálást végez. Az üzemmódban növekvı számlálás van beállítva és amikor az EXEN2 bit értéke 0, akkor a Timer 2 minden túlcsordulásakor az R2CAPx regiszterek tartalma átíródik. A programozott számtartalom 0-tól eltérı, tetszıleges 16-bites érték lehet. Az EXEN2 bit 1 értékénél az átírást a T2EX bemenetre érkezı negatív él is vezérli. A Timer 2 akkor generál megszakítást, ha a TF2 vagy az EXF2 bit értéke 1. A Timer2 FFFFh-nél csordul túl és beállítja a TF2, hogy a következı körbe is megszakítás keletkezzen. Ha bekövetkezett a túlcsordulás akkor a 16-bites értéket rendre visszaírja az RCAP2l, RCAP2H-ból a TL2 és TH2 regiszterekbe. Tulajdonképpen a csökkenı üzemmód is hasonlóan mőködik, ezért az alapértelmezést használtuk.
8. ábra: Timer 2, Auto Reload üzemmód
. 20
4. Mikrokonverter alapú jelgenerátor fejlesztése
Az eszköz 4 típusú jel generálására képes: szinusz-, háromszög-, főrészés négyszögjel, de ez bármikor továbbfejleszthetı szoftveresen. Mindegyik jel 256 darab pontból áll. A memóriából a pontokat egyetlen megszakítás rutin olvassa ki és küldi ki a digital-analog konverterre (D/A), amit 8-bites üzemmódban használunk. Azért volt szükség a Timer 2 megszakításra, mert azzal valósítható meg a periodikus megszakításhívás, s ehhez használtuk a Timer 2-nek az Auto-Reload üzemmódját, s így az RCAP2x regiszter értékétıl függı változtatható frekvenciájú jel állítható elı.
4.1 A jelgenerálás elve Mindegyik jelhez a szükséges pontokat külön algoritmus generálja, és tölti fel a külsı memóriába (XRAM). Adott ∆t idıközönként (ezt a Timer 2 beállítása szabja meg) egy új adat kerül ki a memóriából, s megy a D/A konverterre, az index eggyel vagy M-mel nı. M azt a számot jelenti, hogy mekkora lépéssel olvasunk a memóriából (mindegyik, minden második, stb.). Feladatok: - jelek elıállítása a memóriába
- ∆t beállítása
f osc 4 * (65536 − ( RCAP 2 H , RCAP 2 L) )
- M beállítása - jelgenerálás - felhasználói felület kezelése
. 21
4.2 A jelgenerátor felépítése
A jelgenerátor egy mikrovezérlıbıl, egy LCD kijelzıbıl és egy végerısítıbıl áll. Blokkvázlatát a 9. ábra tartalmazza. Rendelkezik még három darab potenciométerrel és 4 darab nyomógombbal. Egy BNC csatlakozóaljzat is megtalálható a külsı panelen, ide küldjük ki az outputot. A potméterek beolvasása analog – digital átalakítóval történik, úgy, hogy mivel az A/D csak 12-bites üzemmódot tud, ezért az eredmény felsı byte-jának alsó négy bitjét illetve az alsó byte felsı négy bitjét nézem, s így lesz majd 8-bites a felbontás. A gombok beolvasását úgy végzem el, hogy a 2-es port P2.0 – P2.3-ig tartó bitjeit lekérdezem a JB utasítással (jump if bit set).
D/A
A/D
ADuC 842
9. ábra: a jelgenerátor blokkvázlata
. 22
4.3 Tulajdonságok A 842-es mikrokonverter két 12-bites D/A konverterrel rendelkezik (onchip), mindkettı két feszültségtartományban használható: 0V - VREF (2,5V) illetve 0V - AVDD(analog positive supply voltage, 3V vagy 5V). Mindkét feszültség tartományban lehet 8-bites illetve 12-bites üzemmódban használni. A 8-bites üzemmódot használtuk és a 0V - VREF –ig tartó terjedı kimenetet. Ezáltal az amplitúdó pontossága 8-bites, vagyis a 0V - VREF –ig terjedı tartományt 256 részre bontja és a digitális értéknek megfelelı feszültséget küld a kimenetre, tehát az amplítúdópontosság ~0,4%. A frekvenciatartománya körülbelül 0,25 Hz-tıl 16 kHz-ig terjed, a pontossága rendkívül jó a tesztek alapján. A harmonikus torzítás, a felharmónikusok teljesítményének az aránya az alapjel (más meghatározás szerint az összegjel) teljesítményéhez képest. A mi esetünkben ez az arány igen jónak mondható ~01,%.
. 23
4.4 A jelek elıállítása
A leggyakrabban használt jelek megvalósítására írtam programot, de a késıbbiekben bármilyen típusú jel elıállítható ezzel a digitális technikával. Például lehet impulzus alapú is egy trigger jel segítségével. Az algoritmusoknál törekedtem arra, hogy mindegyik külön szubrutinban legyen, illetve az „objektum orientáltságra”, hogy a késıbbiekben egyszerően lehessen például az új jelalakot generáló algoritmust beilleszteni a programba. Ezek miatt az R7 regiszter lett globálisan a pontok száma, az R4 regiszterben tudjuk beállítani az offszet feszültségnek megfelelı értéket. A jeleket egyetlen szubrutin küldi ki a DAC0-ra a külsı memóriából (XRAM) a Timer 2 megszakítás periódusának megfelelıen.
================================ jelkiküldés ================================ megszak: push acc push psw push dph push dpl mov dac0h,#00h ; csak az alsó 8 bitet használjuk mov dph,#0 mov dpl,dac_i ; memo címzés movx a,@dptr ; kiveszi a felso byte-ot a table-bol mov dac0l,a ; beleteszi a dac regiszterbe mov a,dac_i add a,r0 ; leptetes alapeset r0=1 mov dac_i,a clr tf2 clr exf2 pop dpl pop dph pop psw pop acc reti
. 24
4.4.1 Főrész jel
A főrész jelet az alábbi algoritmus generálja, ami az analóg jel elıállításához hasonlóan mőködik, azzal a különbséggel, hogy a kondenzátort itt egy regiszter valósítja meg. Az R7 regiszter kezdıértékének nullát választottunk, mivel az R7 maximális értéke 255 lehet, s csak így érhetı el, hogy a jel 256 pontból álljon. A regisztert a DJNZ utasítással módosítjuk, ami eggyel csökkenti az értékét és figyeli, hogy nullára lecsökkent-e már Az A regiszterbe töltjük bele a pontokat, és a MOVX utasítással helyezzük el a külsı RAM-ban (XRAM). Az A-hoz mindig hozzáadjuk az R6 értékét, ami jelen esetben 1, de ez állítható, ami a háromszög jel miatt szükségeltetik. A két címkét az indokolja, hogy a háromszög jelet a főrészjel felhasználásával állítjuk elı. Ebbıl következik, hogy a „furesz” címke csupán inicializáló részként szerepel.
================================ furesz (10. ábra) ================================ furesz: mov a,r4
; offset
mov r7,#000h ; 256 pont legyen a jel mov r6,#001h ; ezzel lépkedünk frsz:
movx @dptr,a inc dptr add a,r6
; memoléptetés ; r6-val lépkedünk
djnz r7,frsz ret
. 25
4.4.2 Háromszög jel
A háromszög jelet a főrész jelbıl állítjuk elı, úgy hogy az R6 regiszter értékét kettıre állítjuk, azért, hogy gyorsabban emelkedjen, s így minden összeadásnál kettıt ad az elızı értékhez. A felmenı ág 128 pontból áll, a lemenı ág pedig 127-bıl. Beállítjuk az R7 regisztert (pontok száma) és az R6ot, s ezekre hívjuk meg a Főrész jelet generáló algoritmust. A memóriába itt is MOVX utasítással kerülnek bele a pontok. A lemenı ág pedig úgy jön létre, hogy a csúcstól indulva kivonogatunk kettıt minden iterációban, mindaddig amig az R7 regiszter értéke nulla nem lesz.
================================ haromszog (11. ábra) ================================ haromszog: ;inic mov r7,#080h
;128 pont
mov r6,#002h mov a,r4
;offszet
call frsz mov r7,#081h
;127
add a, #001h movx @dptr,a hszog: subb a,r6 movx @dptr,a inc dptr djnz r7,hszog ret
. 26
4.4.3 Négyszög jel
A négyszög jelnél változtatható az amplitúdó és megadható a kitöltési tényezı is. A kitöltési tényezıt az R6 regiszterben kell megadni, a 256 pontból ennyi pont lesz magas feszültségi szinten. Az R7-ben pedig az össze pontok számát tároljuk, és azt is csökkentjük minden „magas” iterációban, s így megmarad, hogy a további pontok alacsony értéket vesznek fel (0V). A B regiszterben állítható az amplitúdó, úgy hogy a 0V - VREF (2,5V) ig terjedı tartományt 256 részre osztjuk és annak megfelelıen, hogy milyen értéket adtunk B-nek, jön ki a feszültség a kimeneten.
================================ negyszog (12. ábra) ================================ negyszog: ;inic mov r7,#000h
; mely
mov r6,#0f0h
; magas
mov a,#001h mov b,#0ffh
; csak egy érték, magas = b
mul ab
; amplitudo
add a,r4
; r4 = offset, hozzáadjuk
magas: movx @dptr,a
; ez megy ki
inc dptr
; memoléptetés
dec r7
; r7 = pontokszáma
djnz r6,magas
; 128-ig magas
mely: mov a,r4 movx @dptr,a inc dptr djnz r7,mely ret
. 27
4.4.4 Szinusz jel
A szinusz jel az egyetlen, amit nem egy konkrét algoritmus generál, hanem egy a kód memóriában elıre definiált táblázatból olvassa be és tölti fel a külsı memóriába a pontokat. A szinusz pontjait az 2π x = 127 * sin + 128 N
(5)
egyenlettel számoltam ki. Az N=256, a pontok száma, 128-at pedig azért kell hozzáadni, hogy ne legyen negatív érték a pontok között.
================================ szinusz (13. ábra) ================================ sinus: ;inic mov r0,#00h
;futó index
mov dptr,#table
; tábla kezdıcím
sin:
mov a,r0
; belerakja r0-t a-ba
movc a,@a+dptr mov dph,#0
;
mov dpl,r0
; memo léptetés
movx @dptr,a inc r0
; kiveszi a felso byte-ot a table-bol
; adat kitolás ; tovabb az also bytehoz
mov a,r0 cjne a,#000h,sin
; elérte a 256 pontot
ret
. 28
4.4.5 Grafikonok
Fûrész jel
2.6
2.4
2.2
2
1.8
feszültség (V)
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0 0
4 1 10
4 2 10
4 3 10
4 4 10
4 5 10
4 6 10
4 7 10
4 8 10
4 9 10
5 1 10 idõ (us)
5 1.1 10
5 1.2 10
5 1.3 10
5 1.4 10
5 1.5 10
5 1.6 10
5 1.7 10
5 1.8 10
5 1.9 10
5 2 10
10. ábra: Főrész jel
Háromszög jel
2.6
2.4
2.2
2
1.8
feszültség (V)
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0 0
4 1 10
4 2 10
4 3 10
4 4 10
4 5 10
4 6 10
4 7 10
4 8 10
4 9 10 idõ (us)
5 1 10
5 1.1 10
11. ábra: Háromszög jel
. 29
5 1.2 10
5 1.3 10
5 1.4 10
5 1.5 10
5 1.6 10
5 1.7 10
5 1.8 10
Négyszög jel
2.6
2.4
2.2
2
1.8
feszültség (V)
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0 0
4 2 10
4 4 10
4 6 10
4 8 10
5 1 10
5 1.2 10
5 1.4 10
5 1.6 10
5 1.8 10
5 2 10
5 2.2 10
5 2.4 10
5 2.6 10
5 2.8 10
5 3 10
5 3.2 10
5 3 10
idõ (us)
12. ábra: 50%-os kitöltési tényezıjő négyszög jel
Szinusz jel
2.6
2.4
2.2
2
1.8
feszültség (V)
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0 0
4 2 10
4 4 10
4 6 10
4 8 10
5 1 10
5 1.2 10
5 1.4 10
5 1.6 10
5 1.8 10 idõ (us)
5 2 10
13. ábra: Szinusz jel
. 30
5 2.2 10
5 2.4 10
5 2.6 10
5 2.8 10
5 3.4 10
4.5. Felhasználói felület Az eszköz jelenleg funkcionálisan teljes tesztverzió, tehát a kinézet és a felhasználói felület is változhat még a késıbbiekben. A menürendszert négyszintesre és közel hasonlóra terveztem mindegyik jelalaknál. Ezeket a 14., 15., 16. és 17. ábrán lehet látni. A fımenüben lehet kiválasztani a 4-féle jelalak egyikét, de ez késıbb változtatható például olyanra, hogy két gombbal pörgı menüként lehessen válogatni az egyes funkciók vagy jeltípusok között. A második szinten lévı menü az mindegyik jelnél megegyezik, itt lehet beállítani a frekvenciát, illetve miután ez megtörtént kiküldeni a jelet a kimenetre az „OK” gombbal, valamint vissza lehet térni mindegyik menübıl a fımenübe a „Vissza” gombbal. A harmadik szint a frekvencia állítási szint, itt lehet kiválasztani az állítás funkciót, s ha megnyomtuk a gombot, akkor bekerülünk a negyedik szintre, ahol is ténylegesen a potenciométerekkel beállítható a kívánt frekvencia. A négyszögjelnél van egy plusz opció is a második szintő menüben, a kitöltési tényezınek a beállítása. Ha mindent beállítottunk, akkor az „Indit” gombbal tudjuk kitenni a kívánt paraméterekkel a jelalakot. A 4.6-os fejezetben a teszt elrendezésrıl láthatunk képeket, a jelgenerátort egy Tektronix TDS 1002-es digitális oszcilloszkópra kötöttem, s néztem a kijövı jelalakot.
. 31
14. ábra: A Fımenü
15. ábra: Második szintő menü
. 32
16. ábra: Harmadik szintő menü
17. ábra: Negyedik szintő menü
. 33
A menüket úgy valósítottam meg, hogy a kódmemóriában definiáltam az egyes felületeket, amiket ki kellett írni a kijelzıre, soronként, ezáltal egyszerőbb és áttekinthetıbb lett a programkód, mert nem betőnként kellett megcímezni az LCD kijelzıt. Minden menünek van egy külön címkéje, ott állítottam be, hogy a kódmemóriában mettıl meddig található meg a keresett menürész.
18. ábra: Külsı megjelenés
. 34
4.6. Teszt
19. ábra: Oszcilloszkópon kimért háromszögjel
20. ábra: Oszcilloszkópon kimért szinuszjel
. 35
21. ábra: Közeli oszcilloszkóp kép a szinuszjelrıl
. 36
5. Összefoglalás
A dolgozat célja, a diplomamunka során kifejlesztett digitális jelgenerátor bemutatása volt. Az eszköz nagy elınye az egyszerő felépítése, könnyen kezelhetısége, a stabilitása, a gyorsasága, a szoftveresen megvalósítható bıvíthetısége, és nem utolsó sorban a relatív olcsósága. A
jelgenerátor
elkészítése
során
az
Analog
Devices
842-es
mikrokonverterét használtam, mert ez a chip rendelkezik minden olyan integrált eszközzel, amire szükségem volt (memória, A/D, D/A konverter). A kijövı jelet különbözı végerısítıkkel tovább lehet majd erısíteni, eltolni a kívánt mértékben. A harmonikus torzítás a mi esetünkben igen jó, 0,1% körüli. Frekvenciatartománya körülbelül 0,25 Hz-tıl 16 kHz-ig terjed, a pontosság a tesztek alapján rendkívül jónak mondható, még kevesebb számú pontból történı generálás esetén is. Célunk volt továbbá, hogy a késıbbiekben az eszköz egyszerően szoftveres
úton
továbbfejleszthetı
legyen,
ennek
tudatában
írtam
az
algoritmusokat, illetve építettem fel a program szerkezetét. Ezáltal sem a külsı megjelenésen,
sem
a
felépítésen
nem
kell
változtatni
új
funkciók
hozzáadásakor. Az eszköz továbbfejleszthetısége rendkívül rugalmas: új funkciók hozzáadása, kevés módosítással több területen történı alkalmazhatósága, bármilyen hullámforma generálható vele, impulzus alapú felhasználás, stb.
. 37
6. Köszönetnyilvánítás
Ezúton szeretném megköszönni Dr. Gingl Zoltánnak a diplomamunkám elkészüléséhez nyújtott segítségét. Szeretnék
még
köszönetet
mondani
kérdéseimmel fordulhattam hozzá is.
. 38
Mingesz
Róbertnek,
hogy
7. Nyilatkozat
Alulírott Kopasz Péter Gábor, informatikus-fizikus szakos hallgató, kijelentem, hogy a diplomadolgozatban foglaltak saját munkám eredményei, és csak a hivatkozott forrásokat (szakirodalom, eszközök, stb.) használtam fel.
Tudomásul veszem azt, hogy szakdolgozatomat/diplomamunkámat a Szegedi Tudományegyetem könyvtárában, a kölcsönözhetı könyvek között helyezik el.
Szeged, 2006. május 12.
Kopasz Péter
. 39
8. Irodalomjegyzék
[1]: Thurlby Thandar Instruments- http://www.tti-arb.com/function-generator.html [2]: http://staff.kzs.hu/ml/fuggvenygeneratorok.htm [3]: Mingesz Róbert: Digitális mőszer fejlesztése az atomi erı mikroszkóp dinamikus üzemmódjai számára (TDK dolgozat) [4]: Dr. Gingl Zoltán: A/D és D/A konverterek (jegyzet) [5]: Roland Dilsch: a 8051 mikrokontroller-család, Bp. : Mőszaki K., 1993 [6]: http://www.aut.bmf.hu/konya/mikro/mcs51_www/index.htm [7]: Analog Devices - http://www.analog.com/en/prod/0,2877,ADUC842,00.html
. 40
9. Függelék/melléklet
A melléklet egy darab floppy (3,5” –ös lemez), rakta az assembly forráskód, a szükséges fordító és a fordítási direktívákat tartalmazó mod842 -es fájl. Szintén a melléklethez tartozik a forráskód kinyomtatva is.
. 41