Beágyazott vezérlők tervezése dspic33 eszközökkel MPLAB-X

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "Beágyazott vezérlők tervezése dspic33 eszközökkel MPLAB-X"

Átírás

1 KANDÓ KÁLMÁN VILLAMOSMÉRNÖKI KAR Beágyazott vezérlők tervezése dspic33 eszközökkel MPLAB-X ÓE-KVK 2117 Budapest, 2014.

2 Tartalom Bevezető dspic33 általános áttekintése Hardver felépítés (általános áttekintés) Programozói modell, memóriatérkép Címzési módok Közvetlen (Immediate) címzési mód Bit címzési mód File register címzési mód Register direct címzési mód Register indirect címzési mód Utasításkészlet Adatmozgató utasítások Bitmanipulációs utasítások Vezérlésátadó utasítások Feltétel nélküli ugrások Szubrutinhívások Feltételes vezérlésátadó utasítások Veremtár kezelő utasítások Aritmetikai utasítások Összeadás Kivonás Szorzás DSP utasítások Címkék, szimbólumok Direktívák Explicit címke értékadás Címke hatókörének megváltoztatása Forrásnyelvi programok beillesztése Konstans adatok tárolása a programmemóriában Szekciók dspic beépített eszközeinek kezelése

3 3.1. Órajel generátor Beépített perifériák Egyszerű I/O portok Időzítő (Timer) modulok SPI kommunikációs port A/D konverter dspicdemó kártya felépítése Tápellátás Processzor programozás és RESET funkció Digitális I/O perifériák Analóg bemenet Analóg jel helyreállítás digitális mintákból MPLAB-X fejlesztői környezet Általános áttekintés Projekt szerkezete A fordítás, flash programozás és hibakeresés menete Fordítás, összefűzés, vagyis build Flash programozás Hibakeresés - debug Lépésenkénti program futtatás Mintapéldák Egyszerű ciklusszervezés Komplex ciklusszervezés Órajel beállítás Egyszerű I/O portok (LED és SW) D/A konverter használata SPI interfészen Mellékletek Rövidítések jegyzéke Irodalom

4 Bevezető Kedves Olvasó! Ez a jegyzet az Áramkör tervezés című tantárgyhoz készült és útmutatást ad a laborgyakorlatok elvégzéséhez, de semmiképpen sem pótolja az előadáson és a laborgyakorlatokon elhangzottakat. Az itt megszerzett tudást a Kedves Hallgató kamatoztatni fogja a Híradástechnika III. (Digitális Jelfeldolgozás) tantárgynál is! Jelen jegyzetben a célunk az, hogy egyszerűen és érthetően bemutassuk a dspic33 fejlesztői környezetét, és alapismeretet adjunk a beágyazott vezérlők szoftver fejlesztéséhez. A tárgyalt mikrovezérlő (pontosabban SignalController ) a Microchip dspic33f Family Data Sheet (DS70165E) és a dspic30f/33f Programmer s ReferenceManual (DS70157B) dokumentumainak, illetve azok módosított kiadványainak böngészésével tanulhatók meg mélyebben. Az említett dokumentumok letölthetők a címről. A jegyzettel kapcsolatos észrevételeket köszönettel várjuk a wuhrl.tibor@kvk.uni-obuda.hu vagy a gyanyi.sandor@kvk.uni-obuda.hu címre! Az alkalmazott rövidítéseketa könyv végén a Rövidítések jegyzéke részben adtuk meg. Külön köszönetet szeretnénk mondani a könyv szakmai lektorának, Kún Gergelynek, aki sok szakmai észrevétellel, alkotó kritikával tette jobbá jegyzetünket. Eredményes, kitartó munkát kívánunk! Szerzők 3

5 1. dspic33 általános áttekintése A laboratóriumi gyakorlatokon a dspic33fj256gp710 SignalController eszközt használjuk, így elsősorban ennek a chipnek a fontosabb hardver jellemzőit és programozhatóságát vizsgáljuk. A SignalController (szokás még DSC mozaikszóval is jellemezni, mint Digital SignalController) elnevezés némi magyarázatra szorul. A DSC-k olyan kategóriájú mikrovezérlők, melyek számos digitális jelfeldolgozó algoritmus implementálását hardveresen támogatják, általában tartalmaznak A/D konvertert, és DSP algoritmusokhoz illeszkedő utasításokat is megvalósított bennük a gyártó. Mindez alapján nevezhetnénk ezeket az eszközöket jelfeldolgozó processzoroknak is, de mégsem tesszük, mivel az utasítás végrehajtási sebességük alacsonyabb a napjainkban megszokott jelfeldolgozó processzorokénál. A dspic33fj család maximálisan 40 millió gépi utasítás végrehajtására képes másodpercenként (40 MIPS), ez nem kevés, de a DSP-knek nevezett eszközök több száz, vagy ezer MIPS utasítás végrehajtó sebességgel rendelkeznek Hardver felépítés (általános áttekintés) A bemutatásra kerülő chip TQFP100 tokozású. Az eszköz számos beépített perifériával rendelkezik, ezért a 100 kivezetés kevésnek bizonyul, ezért szinte minden kivezetés (természetesen a tápellátás, MCLR kivételével) multifunkciós. A chip működési feszültsége 2,5V, azonban a rugalmasabb használat érdekében ezt egy belső stabilizátorral állítják elő, ami 3V és 3,6V közötti feszültséget igényel. A tápellátás általában 3,3V feszültségről történik, ez jól illeszkedik egyéb digitális áramkörök igényeihez is, ennek megfelelően a digitális ki-, és bemenetek is ilyen szintekkel dolgoznak. Minden digitális I/O port 5V toleráns, ami azt jelenti, hogy a digitális bemenetekre üzemszerűen 5V-os rendszerből érkező logikai szinteket kapcsolhatunk. Kimeneti üzemmód esetén, ha azt OD-nek (Open Drain) állítjuk be, akkor az 5V kompatibilis kimeneti jelszint 5V-ra kapcsolt felhúzó ellenállással kialakítható. 4

6 1. ábra: dspic33fj256gp710 tokozása, kivezetései A dspic33fj256 jelfeldolgozó processzor belső felépítése Harvard architektúrájú (a programot tároló memóriaszegmens az adattárolótól mint azt számos mikrovezérlőnél már megszoktuk fizikailag elkülönül). Az egyes gépi utasítások 24 bit hosszúak, a programszámláló regiszter (PC) pedig szintén 24 bites, azonban ebből csak 22 bit a tényleges cím. Alegértékesebb bit (b23) figyelmen kívül marad, a legkisebb helyértékű bit pedig mindig 0 értékűnek látszik. Ennek az a magyarázata, hogy a 24 bit programmemória szervezés kettő 16 bites egységből áll, ami külön-külön rendelkezik önálló címmel. Az alsó 16 bit mindig páros című, a felső 16 pedig páratlan címen érhető el. A felső 16 bit természetesen nem valódi 16 bit, ennek a szónak a felső 8 bitje úgynevezett phantom byte, mely tartalmát, ha 5

7 megvizsgáljuk, mindig logikai 0 -kat kapunk. A lineárisan címezhető programmemória 4M x 24 bit (a 2^23 8M területet jelentene, de mivel a PC legalsó bitje mindig 0, ezért minden utasítás végrehajtásakor kettővel inkrementálódik). A mikrovezérlőbe épített programmemória mérete típustól függ, a dspic33fj256 esetén a programmemória 256 kbyte méretű (valamivel több, mint utasítás). A belső adattároló memória mérete 64 kbyte (a 16 bites adatsín miatt 32kx16 bit kialakítású), mely byte és szó szervezésben is elérhető. Lehetőségünk van két darab 32 kbyte méretű memória blokk használatára is, melyek elnevezése X és Y. Mindkét blokk saját, egymástól független cím generátorral (AGU AddressGeneration Unit) rendelkezik. Ennek elsősorban bizonyos DSP utasításoknál van jelentősége, ami jelentős műveleti sebesség növekedést eredményez. Az aritmetikai és logikai egységhez (ALU) két 40 bites akkumulátor kapcsolódik. A dspic33f eszközökbe jelentős számú perifériát is beépítettek, melyek a teljesség igénye nélkül a következők: 12 bites A/D konverter (1 vagy 2 darab); soros szinkron kommunikációs interfészek (2db SPI, 2db I2C); soros aszinkron kommunikációs interfészek (2db UART, 2db CAN) impulzus szélesség modulátor (PWM); 9db Timer egység. Az egyes belső építőelemek és azok BUS rendszerű összeköttetéseit az alábbi ábra, a dspic33f blokkséma szintű felépítése, mutatja: 6

8 2. ábra: dspic33fj256gp710 belső felépítése Az egyes perifériák konkrét áttekintését a 3.2 fejezetben tesszük meg, előtte fontos megismerkednünk a programozói modellel, a memória térképpel és a címzési módokkal. 7

9 1.2. Programozói modell, memóriatérkép A programozás megkezdéséhez elengedhetetlen, hogy megismerjük a processzor magot és a hozzá szervesen kapcsolódó regisztereket, az egyes regiszterek bitjeit. Az egyes perifériák és a hozzájuk kapcsolódó speciális célú regiszterek ismerete nélkül is megkezdhetjük a munkát, azok használatát a munka során külön-külön is megtanulhatjuk. A munka regiszterekre (Working Registers) W0 W15 néven hivatkozhatunk, mindegyik munkaregiszter 16 bites, általános adatmozgatásra és bizonyos műveletek elvégzéséhez alkalmazhatjuk. A W15 regiszter kiemelt fontosságú, ez a regiszter a veremtár mutató (Stack Pointer), így e regiszter általános célú használatáról szinte minden esetben le kell mondanunk. A munkaregiszterek közül további néhánynak is speciális funkciója is van, amelyeket a későbbiekben ismertetünk. A legfontosabb és legáltalánosabban használt regiszterek összefoglalását a következő ábrán láthatjuk: 8

10 3. ábra:dspic33f fontosabb regiszterei A dspic33f család tagjai típustól függően más-más méretű belső, adattárolásra alkalmas statikus RAM-ot tartalmaznak. A család legkisebb tagja 8 kbyte, míg a legnagyobb tagja 32 kbyte méretű RAM-ot tartalmaz (címzés tekintetében a RAM területhez tartoznak a különleges feladatú regiszterek is, így az SFR terület a szabadon felhasználható RAM méretét csökkenti). Az adatmemória szervezése 16 bites, de byte-os elérés is lehetséges, ezért a RAM 9

11 minden byte-ja saját memóriacímmel rendelkezik. Minden 16 bites szó két byte-ból áll. A 16 bites szó elérésnek (legyen az írás, vagy olvasás) páros címűnek kell lennie, vagyis az EA<0>= 0 1. Páratlan cím használata 16 bites szó írás- és olvasás esetén címzési hibát eredményez, ami egy szinkron megszakítási eseményt, úgynevezett trap -et generál. A címzés az AGU-val (AddressGeneration Unit) történik. Az adatmemória alsó fele (amikor az EA<15>= 0 ) tényleges adatmemória elérésre használható, míg a felső 32k terület (amikor az EA<15>= 1 ) programmemória olvasásra (a Program SpaceVisibility PSV üzemmód használatával) fenntartott. A dspic33f család legnagyobb tagjai, például dspic33fj256gp710, 32 kbyte belső memóriát tartalmaznak. A memória struktúra hasonlít a kisebb kiépítésű típusok kialakításához, de az X RAM címtartománya itt 0x0800 0x47FF (ami 16 kbyte), az Y RAM-é pedig 0x4800 0x77FF (8 kbyte). A DMA RAM mérete ugyan nem változott, de a címtartománya igen (0x7800 0x7FFF). A fennmaradó 0x8000 0xFFFF tartományra a programmemória lapozás valósítható meg. Az adatmemória alsó 8k területe kiemelt jelentőségű, úgynevezett Near Data Space. Ez a tartomány (0x0000 0x1FFF) 13 bites címmel közvetlenül elérhető. A teljes SRAM terület elérés természetesen 16 bites címmel címezhető, ami közvetlen memóriacímzés (MemoryDirectAddressing), vagy indirekt címzési mód lehet. Ez utóbbinál valamely munkaregisztert (W0-W15) használjuk cím pointernek. Az adatmemória elérés szempontjából kiemelt fontosságú, hogy a CPU mag két adatterületet lát (láthat), melyet X-nek és Y-nak nevezünk. Mindkét területet egymástól szeparált, belső BUS-on érheti el a CPU mag az egyes DSP utasítások (úgynevezett MAC Multiply and Accumulate osztályú utasítások) végrehajtásakor. Ez lehetővé teszi azt, hogy egy ciklus alatt két 16 bites adathoz férjünk hozzá, ami növeli a jelfeldolgozó algoritmusok sebességét, így azok hatékonyságát. Minden dspic33f eszköz tartalmaz egy 2 kbyte méretű, két-portos ( DualPorted ) RAM-ot, mely az Y RAM végén helyezkedik el. Ezt a memóriaterületet a CPU és bizonyos perifériák egyszerre, egymás akadályozása nélkül képesek elérni a DMA (Direct Memory Access) vezérlő közreműködésével. Ez a DMA RAM címtartomány szintén típusfüggő tulajdonság, a RAM terület végén helyezkedik el. 1 EA EffectiveAddress, a belső adatmemória eléréshez használt cím, mely 16 bit hosszúságú. 10

12 Érdekes és kiemelt fontosságú téma a program memóriából történő adat olvasás. Mint ismeretes, a Harvard architektúrájú processzorok adat és program memóriája fizikailag elkülönül. A dspic33f család esetében bonyolítja a helyzetet, hogy a két memória szó hosszúsága is eltérő. A programmemória 24 bites, míg az adatmemória 16 bites szervezésű. A dspic33f tervezői ezt a problémát kétféle megoldással hidalták át.a programmemória területről lehetőségünk van közvetlenül is a konstans adatok olvasására az erre kialakított speciális utasításokkal. A TBLRDL utasítás az alsó 16 bit, a TBLRDH utasítás a felső 16 bit olvasására szolgál, ez utóbbi utasítás természetesen a phantom byte 0 értékét is szolgáltatja. A másik megoldás a PSV használata, ekkor az adatmemória felső 32k címtartományába belapozható egy programmemória részlet. A 0x8000 0xFFFF (32 kbyte) területre mintegy 16k szó programterület lapozható. A programmemória ilyen típusú eléréséhez a PSV (Program SpaceVisibility) bitet 1 -be kell állítani, mely bit a CORCON regiszter 2. bitje. Azt, hogy az adatmemória felső 32k szegmensében mely programmemória részlet legyen látható, a PSVPAG (Program SpaceVisibilityPage) regiszterben adjuk meg. A PSVPAG regiszter 8 bites, így összesen 256 lapot tudunk definiálni. Minden lap mérete a programmemóriában 16k szó. Az alábbi ábrán egy példát láthatunk a program memória leképezésére. 4. ábra: Programmemória láthatósága az adat RAM felső 32k területén A veremtár (stack) az adatmemória olyan része, amelyet a CPU LIFO (LastInFirst Out) tárként képes alkalmazni. A veremtárból mindig az utoljára oda elhelyezett adat hívható elő először, mint arra a LIFO elnevezés is utal. A futó program a megfelelő utasítások segítségével képes itt átmeneti adatokat tárolni, a CPU a szubrutinhívások és a megszakítások 11

13 kiszolgálása előtt ide helyezi az aktuális programfutási helyet (a PC regiszter értékét, illetve megszakítások esetén egyéb jelzőbitek értékét is). A LIFO tárak nagy előnye, hogy mindössze a verem tetejét kell tárolni, így megvalósításához egyetlen általában veremtár mutató (Stack Pointer) néven ismert regiszter szükséges. A Stack Pointer a dspic33f esetében nem különálló regiszter, hanem a W15 munkaregiszter funkcionál Stack Pointerként. Mivel megváltoztatása sok galibát okozhat, ezért adattároló regiszterként csak a lehetséges következmények figyelembe vételével szabad használni. Minden, munkaregisztereket használni tudó utasítás képes operandusként igénybe venni a W15 regisztert. (Megjegyzendő, hogy a veremtárba adatot mentő PUSH utasítás helyett a fordítóprogram egy W15-öt használó MOV utasítást fordít). A W15 mindig a 16 bites, szavas (word) szervezésű verem első szabad rekeszére mutat. A reset jel 2 a W15-be 0800h (0x0800) értéket tölt, ami a RAM-ban az SFR utáni terület kezdetét jelenti. A verem a memóriában a felsőbb memóriacímek felé terjeszkedik, ha adatot tárolunk bele (PUSH), vagy szubrutint hívunk, esetleg programmegszakítás lép életbe (visszatérési cím kerül elmentésre). Az eszközbe beépítettek továbbá egy SPLIM (Stack Pointer Limit) regisztert, melyben megadhatjuk, hogy a veremtárunk meddig terjeszkedhet a memóriában. Ha a W15 (veremtár aktuális mutatója) értéke eléri az SPLIM értékét (vagy 0x800-nál kisebb értéket vesz fel), akkor egy speciális esemény (trap) keletkezik. A dspic33f architektúra kialakítása úgy történt, hogy a magasabb szintű programnyelvek (különösen a C programozási nyelv) gépi kódra fordítása minél egyszerűbben lehetséges legyen. Emiatt a CPU támogatja a paraméterátadás, illetve a szubrutinok helyi (local) változóinak veremtárban történő egyszerű tárolását és elérését. Ehhez egy újabb regiszterre van szükség, amelynek StackFrame Pointer az elnevezése, de ezt is egy munkaregiszter valósítja meg. A W14 feladata ennek tárolása, be- illetve visszaállítása speciális utasításokkal történik (LNK és ULNK) Címzési módok A dspic33f alapvetően négyféle adat címzési módot ismer, amelyeket az egyes utasítások operandusaiban, az adat forrásának vagy céljának meghatározásakor lehet használni: Immediate; File Register; 2 A processzor RESET nevű kivezetésére kapcsolt inicializáló jel 12

14 RegisterDirect; Register Indirect Közvetlen (Immediate) címzési mód A címzési mód használatakor az utasítás már önmaga tartalmazza az egyik (vagy az egyetlen) operandus konstans értékét. Ez az érték már a fordítási folyamatkor kialakul, és futási időben nem változtatható meg. Az Immediate címzési módot assembly nyelven a konstans elé kerülő # karakter jelzi. Használható önmagában is, de tipikusan a másik három címzési móddal kombinálva, több operandusos utasítások használják. A konstans mérete az utasítás típusától függ. Lehet 1, 4, 5, 6, 8, 10, 14 vagy 16 bit méretű, és néhány utasítás előjeles számként értelmezi Bit címzési mód Mikrovezérlők esetében kiemelt jelentőséggel bírnak a bitmanipuláló utasítások. A dspic33f családban ez a címzési mód tulajdonképp a közvetlen adat Immediate címzési módjához sorolt, de jelentősége miatt külön tárgyaljuk. A címzés célja az, hogy közvetlenül elérjünk egy bitet, és megvizsgálhassuk (logikai 1 vagy 0 értékű-e), valamint módosíthassuk annak tartalmát anélkül, hogy a regiszter többi bitje megváltozna. Természetesen mindez bitcímek nélkül, úgynevezett maszkolási technikával is megvalósítható lenne, de ekkor több utasítás végrehajtása lenne szükséges a kívánt eredmény eléréséhez. A Microchip az egyes bitek elérésének módját ötletesen oldotta meg, a bitcím valójában kettő címből áll. Először meg kell adnunk azt, hogy mely 16 bites egységben (szóban) található a címezni kívánt bit, majd ezt követően egy 4 biten ábrázolt konstanssal kell hivatkoznunk az előzőleg megjelölt szó kívánt bitpozíciójára egy közvetlen adattal File register címzési mód A címzési mód során az adatmemória egy előre meghatározott része jelölhető ki a művelet egyik operandusaként. Az utasítás végrehajtása során a CPU innen tölti be a művelet egyik operandusát, vagy a művelet eredményét ide tárolja. A legtöbb utasítás az adatmemória alsó 8kB méretű darabját (amelynek Near RAM a neve) képes csak File Register címzési móddal elérni. Kivételt képez a MOV utasítás, amely a teljes, 64kB méretű tartományt képes ebben a címzési módban elérni. A címzési mód segítségével az adatmemóriát lehetséges byte (az utasítás 8 bitet mozgat) vagy word (az utasítás 16 bitet mozgat) méretű elemekként is kezelni, ez alól ismét kivétel a MOV utasítás, amely csak 16 bites egységben képes ilyen címzési 13

15 móddal adatokat mozgatni. A File Register címzési módot használó utasítások egyik operandusa mindig a WREG (DefaultWorkingRegister), a másik pedig a kijelölt memóriarekesz. Azon utasításoknál, ahol a WREG megadása nem szerepel (egy operandusos), ott az eredmény tárolása az egyik bemeneti adatot szolgáltató memóriarekeszben történik (beolvasás-művelet-visszaírás), míg ha az utasításban mind a WREG, mind a File Register szerepel, akkor a művelet eredménye a WREG-ben tárolódik, a másik bemeneti adatot szolgáltató memóriarekesz tartalma pedig változatlan marad Register direct címzési mód Ez a címzési mód lehetőséget ad arra, hogy a W0-W15 munkaregiszterekben tárolt adatokat elérje az utasítás. A címzési mód bármelyik operandus helyén előfordulhat és használható mind a byte, mind a szó szélességű műveletekben. A cikluskezelő és vezérlésátadó utasítások is képesek operandusként használni, így a register direct címzési móddal rugalmas folyamatvezérlés is végezhető Register indirect címzési mód Ez a dspic33f legrugalmasabb és legsokoldalúbban használható címzési módja. A Register indirect címzési mód használatával az utasítás az egyik munkaregisztert tudja az adatmemória egy rekeszének megcímzésére használni és így elérni annak a rekesznek a tartalmát. A sokoldalúságot növeli, hogy a CPU hatféle módon képes a címzésre használt címet kiszámolni: Mód Szintaktika Leírás No modification [Wn] A művelet operandusa a Wn (0<=n<=15) regiszter által megcímzett memóriarekesz tartalma lesz. Byte módban 8 bit, szó módban 16 bit elérése lehetséges. Pre-Increment [++Wn] A művelet operandusa a Wn által megcímzett memóriarekesz tartalma lesz, azonban a művelet végrehajtása ELŐTT a Wn értékét NÖVELI. Byte módban a növelés mértéke 1, míg szó módban 2. Pre-Decrement [--Wn] A művelet operandusa a Wn által megcímzett memóriarekesz tartalma lesz, azonban a művelet végrehajtása ELŐTT a Wn értékét CSÖKKENTI. Byte módban a csökkentés mértéke 1, míg szó 14

16 módban 2. Post-Increment [Wn++] A művelet operandusa a Wn által megcímzett memóriarekesz tartalma lesz, azonban a művelet végrehajtása UTÁN a Wn értékét NÖVELI. Byte módban a növelés mértéke 1, míg szó módban 2. Post-Decrement [Wn--] A művelet operandusa a Wn által megcímzett memóriarekesz tartalma lesz, azonban a művelet végrehajtása UTÁN a Wn értékét CSÖKKENTI. Byte módban a csökkentés mértéke 1, míg szó módban 2. RegisterOffset [Wn+Wb] A művelet operandusa a Wn és a Wb értékének összeadásából keletkező számmal megcímzett memóriarekesz tartalma lesz. Wn és Wb regiszterben tárolt adat nem változik meg.kizárólag csak adatmozgató (MOV) utasításban használható! LiteralOffset [Wn+x] A művelet operandusa a Wn és az x konstans (-512 és +511 közötti értékkel) összeadásából keletkező számmal megcímzett memóriarekesz tartalma lesz. Wn értéke nem változik meg. Kizárólag csak adatmozgató (MOV) utasításban használható! 15

17 2. Utasításkészlet A dspic33f család utasításkészlete meglehetősen összetett, csoportosításuk nehéz. Több utasítás több funkcióval bír, ezért ha csoportokat állítunk fel, akkor sok olyan utasítást találunk majd, melyek több csoportba is besorolhatók. A szokásos irányelvek alapján a következő csoportokat határoztuk meg: Adatmozgató utasítások; Bitmanipulációs utasítások; Vezérlésátadó utasítások; Veremtár kezelő utasítások; Aritmetikai utasítások; DSP utasítások. Szintén ebben a fejezetben tárgyaljuk a címkéket és szimbólumokat, valamint a fordító programnak szóló direktívákat, de kihangsúlyozzuk, hogy ezek nem a programozott eszköz (jelen esetben dspic) utasításai! Természetesen a fontosabb utasításokat a következőkben áttekintjük, de előtte nézzük meg az assembly programozás szintaktikáját, fontosabb helyesírási szabályait. Az Assembler által megkövetelt programsor-szintaktika: [címke]: [mnemonic operandusok] [;megjegyzés] A címke egy tetszés szerinti érték tárolására szolgál, amely értékre a későbbiekben a címke használatával lehet hivatkozni, így a program írója jobban megjegyezhető, sokatmondó neveket adhat a tárolt értékeknek. A címke gyakran egy utasítás fizikai helyét (annak címét) jelöli. A címke hossza tetszőleges lehet, valamennyi karakter számít. A címkében szerepelhetnek alfanumerikus karakterek (betűk és számok), illetve az aláhúzás (_) és a pont (.) karakterek. A címke nem kezdődhet számmal, a kis- és nagybetű különböző értéket jelöl, tehát a címke nem egyezik meg a Címke szimbólummal. A címke definícióját szükségszerűen egy kettőspontnak kell követnie, whitespace karakter (tabulátor, szóköz) nem állhat a címke és a kettőspont között! A címkéket a fordító a fordítás során értékkel ruházza fel, amit a linker az összefűzés során elhelyez a gépi kódú utasításokban (például az utasítás fizikai címére). 16

18 A címke deklarációnál fontos tudnunk, hogy a hatóköre egy fájlon belül tart alapesetben, vagyis lokális. Ez azt jelenti, ha programunk több forráskód fájlból áll, akkor ugyanazt a címke elnevezést nyugodtan deklarálhatjuk fájlonként, azok egymást zavarni nem fogják. Viszont ha egy forrásfájlon belül kétszer, vagy többször szeretnénk deklarálni azonos névvel címkét akkor fordításkor doubledefined hibaüzenetet kapunk. A címkékkel később részletesebben is foglalkozunk (lásd 2.7 alfejezet) Előfordulhat olyan helyzet is, hogy az egyik forrásfájlban megírt programrészletre szeretnénk hivatkozni egy másik forrásfájlban megírt programban. Ez a lokális hatókör miatt nem lehetséges, hiszen az egyik fájlban lokális hatókörrel deklarált címke a másik fájlból nem látható! Ilyen esetekben meg kell változtatnunk a címke hatókörét, globálissá kell tenni azt. A globálissá tétel a.global direktívával tehető meg (a fontosabb direktívákkal a későbbiekben a2.8 alfejezetben bővebben foglalkozunk). A mnemonic egy tetszőleges assembly utasítás, amely a fordító számára meghatározza, milyen gépi kódot kell a mikroprocesszor számára fordítani. Az assembly utasítások általában a gépi műveletre utaló angol szó, vagy annak rövidítése, esetleg több angol szóból képzett mozaikszó, például: MOV adatmozgatásra utal, a move szóból képzett; BTSS Bit Test SkipifSet; RETURN szubrutinból visszatérést jelenti. Az assembly sor végén opcionálisan megjegyzést írhatunk. A pontosvessző (;) karaktert követő karakter sorozatot a fordító program figyelmen kívül hagyja, az ide írt komment a programozó saját feljegyzéseit tartalmazhatja, ezzel megkönnyítheti saját, és a kollégái munkáját. Az assembly programírásnál határozottan javasoljuk a beszédes kommentek készítését! Az operandusok olyan értékek, amelyek a lefordított utasítások végrehajtását határozzák meg, kijelölik a műveletek bemeneti, kimeneti (tárolási) értékeit. Egy mnemonik után (utasítástól függően) akár több operandus is lehet, melyeket egymástól vesszővel (,) kell elválasztani. Ha a vessző hiányzik, akkor a fordító figyelmeztető üzenetet jelenít meg, és megpróbálja a lehetséges kombinációk figyelembe vételével elvégezni a fordítást. Az operandusok lehetnek konstansok, file regiszterek, regiszterek, feltétel kódok, cél- és akkumulátor meghatározók. 17

19 2.1. Adatmozgató utasítások Az adatmozgató utasításokkal az adatmemória, a programmemória, illetve a regiszterek között mozgathatók adatok. Az adatmozgatás lehetséges mind byte (.B jelölő használata), mind szó (.W jelölő használata) szélességű adatcellák között. Abban az esetben, ha a.b vagy a.w jelölőt elhagyjuk, akkor az adatmozgató utasítás alapértelmezetten szavas lesz, vagyis 16 bit adat mozgatása valósul meg az utasítás végrehajtásakor. Az általános adatmozgató utasítások valamely címzési mód alkalmazásával kettő operandust jelölnek meg, a forrás operandust és a cél operandust. Byte-os adatmozgatás esetén a szintaktika: MOV.B forrás,cél Példa: MOV.B #123,W0 ;A W0 regiszter alsó 8 bitje felveszi a 123 ;decimális értéket. MOV.B [W0++],W1 ;A W1 regiszter alsó 8 bitje felveszi a W0 által ;megcímzett memóriarekesz (8 bit) tartalmát. A ;művelet után W0 értéke eggyel nő. MOV.B 0x1234,W0 ;A W0 regiszter alsó 8 bitje felveszi a 0x1234 ;közeli adatmemóriában (Near RAM) található ;memóriarekesz tartalmának értékét. Szavas adatmozgatás esetén a szintaktika: MOV.W MOV forrás,cél forrás,cél A.W jelölő elhagyható, ekkor a forrás és a cél operandus alapértelmezetten 16 bites. A RAMban található operandusok esetén a 16 bites szavak 2 byte-ból állnak, ahol a tárolási sorrend: LSByte, MSByte, tehát a kisebb memóriacímen az alacsonyabb helyi értékű byte található. A 16 bites adatmozgató műveletek esetén a memóriarekesz kijelölésére használt szám mindig szó határra kell mutasson (vagyis mindig párosnak kell lennie!), helytelen cím esetén egy Addresserror kivétel keletkezik. 18

20 Példa: MOV.W #0x1234,W0 ;A W0 regiszter felveszi a 1234 hexadecimális ;értéket. MOV.W [W0++],W1 ;A W1 regiszter felveszi a W0 által megcímzett ;memóriarekesz (16 bit) tartalmát. A művelet ;végrehajtása után W0 értéke kettővel nő. MOV.W 0x1234,W0 ;A W0 regiszter a 0x1234 közeli adatmemóriában ;(Near RAM) található memóriarekesz tartalmának ;értékét veszi fel. MOV W0,W1 ;A W1 regiszter felveszi a W0 regiszter értékét. W0 ;regiszter értéke változatlan marad. Az adatmozgatásoknál lehetőség adódik 32 bit, vagyis dupla szó mozgatására is. Ez esetben az utasítás végrehajtása dupla időt vesz igénybe az előzőleg bemutatott byte-os és szavas mozgatásokhoz viszonyítottan. Ezek az utasítások a.d jelölőt használják, a forrás és a cél operandus az első 16 bites szó címét jelenti: MOV.D forrás,cél Példa: MOV.D W2,W6 ;A W2 regiszter tartalma a W6-ba, ;a W3 regiszter tartalma pedig a W7-be töltődik. A Microchip az egyes adatcserélő utasításokat is az adatmozgató utasítások csoportjához rendelte: EXCH forrás,cél A fenti esetben valójában mindkét operandus forrás és cél is egyben. Az operandusoknál kizárólag a register direct címzést alkalmazhatjuk, vagyis mindkét operandusnak valamely W munkaregiszternek kell lennie. Példa: 19

21 EXCH W2,W6 ;A W2 regiszter tartalma és a W6 tartalma ;felcserélődik. A dspic33faritmetikai egysége kettő darab akkumulátorral rendelkezik (ACC_A és ACC_B, melyekre röviden A, vagy B jelöléssel hivatkozunk). Mindkét akkumulátor 40 bites hosszúságú < bit>. Mivel az akkumulátorokat a CPU DSP egysége kezeli és bitszélességük eltér a 16 bites architektúra tároló elemeinek méretétől, ezért szükség van olyan utasításokra, amelyek a CPU munkaregisztereiből, vagy az adatmemória tároló rekeszeiből töltik fel az akkumulátorokat. LAC forrás,akkumulátor LAC forrás,#eltolás,akkumulátor A kijelölt akkumulátort feltölti a forrás által szolgáltatott adatokból. A forrásadatokat előjeles törtszámnak tekinti az utasítás, és az akkumulátort automatikusan előjelhelyesen kiterjeszti. Az eltolás értéke opcionálisan megadható (alapértelmezés szerinti értéke nulla), az adatfeltöltés az itt definiált bitszámmal eltolva történik. A shift értéke -8 és +7 között változhat, a negatív érték balra, a pozitív érték pedig jobbra történő aritmetikai eltolást jelent. A forrás helyén a register direct és register indirect címzési módok használhatók, ez utóbbiaknál természetesen használhatóak a pre-, és a post increment és decrement is. A mnemonik a LoadACcumulator kifejezés rövidítése. Példa: LAC [W4++],#-3,B ;A W4 regiszter által megcímzett memóriarekesz ;értékének eltolása balra 3 bittel, majd az ;eredmény betöltése a B akkumulátorba. A ;művelet végrehajtása után a W4 által ;megcímzett memóriarekesz tartalma nem ;változik meg, viszont W4 értéke kettővel nő. LAC [--W2],#7,A ;A W2 regiszter értékének kettővel történő ;csökkentése, majd az így megcímzett ;memóriarekesz értékének eltolása jobbra 7 20

22 ;bittel. A kapott eredmény betöltése az A ;akkumulátorba. A művelet végrehajtása után a ;W2-2 érték által megcímzett memóriarekesz ;tartalma nem változik meg. SAC akkumulátor,cél SAC akkumulátor,#eltolás,cél A kijelölt akkumulátor < > bitjét tárolja a cél által kijelölt helyre. Az eltolás értéke opcionálisan megadható (alapértelmezés szerinti értéke nulla), az adattárolás az itt definiált bitszámmal eltolva történik. A shift értéke -8 és +7 között változhat, a negatív érték balra, a pozitív érték pedig jobbra történő aritmetikai eltolást jelent. A cél helyén a register direct és a register indirect címzési módok használhatók. A mnemonik a StoreACcumulator kifejezés rövidítése. Példa: SAC A,#4,W5 ;Jobbra tolja az A akkumulátort 4 bittel, majd az ;ACCA[31:16] biteket áttölti a W5 regiszterbe. SAC B,#-4,[W5++] ;Balra tolja a B akkumulátor tartalmát, majd az ;ACCB[31:16] biteket áttölti a W5 által megcímzett ;memóriarekeszbe. A művelet végrehajtása után W5 ;értéke kettővel nő Bitmanipulációs utasítások A bitmanipulációs utasítások segítségével lehetséges egy bit értékét megváltoztatni úgy, hogy a többi bit állapotáról semmilyen információval nem szükséges rendelkeznie a programnak. A bitmanipuláló utasításokkal lehetséges bitek állapota alapján programelágazások kezelése is. Ekkor egy bit állapota alapján módosítjuk, vagy nem módosítjuk a programszámláló értékét. Ezen utasításokat feltételes vezérlésátadó utasítások tárgyalásánál ismertetjük. A következő utasításban a kijelölt bitet nullázzuk: 21

23 BCLR.B cél,#bitszám A célban megadott adattároló elem (byte) bitszám sorszámú bitjének értékét nullára állítja. A cél helyén file register, register direct és register indirect címzési módok használhatók, a bitszám pedig 0 és 7 között mozoghat. A mnemonik a Bit CLeaR kifejezés rövidítése. Példa: BCLR.B 0x1233,#4 ;A közeli memória ( Near RAM ) 0x1233 címen ;található memóriarekeszének negyedik bitjét ; 0 értékkel tölti fel. ;Ha a rekesz tartalma 0xff volt a művelet ;előtt, utána az érték 0xef lesz. BCLR.B [W0+W1],#7 ;Az adatmemória W0 és W1 regiszterek értékének ;összeadásából keletkező számmal címzett ;rekesz tartalmának hetedik bitje 0 értéket ;vesz fel. W0 és W1 értéke nem változik. BCLR.W BCLR cél,#bitszám cél,#bitszám A célban megadott adattároló elem (szó) bitszám sorszámú bitjének értékét nullára állítja. A cél helyén File Register, RegisterDirect és Register Indirect címzési módok használhatók, a bitszám pedig 0 és 15 között mozoghat. A mnemonik a Bit CLeaR kifejezés rövidítése. Példa: BCLR.W 0x1234,#14 ;A közeli memória ( Near RAM ) 0x1234 címen ;található memóriarekeszének tizennegyedik ;bitjét 0 értékkel tölti fel. Ha a rekesz ;tartalma 0xffff volt a művelet előtt, utána ;az érték 0xbfff lesz. BCLR [W0++],#7 ;Az adatmemória W0 regiszterének értékével ;megcímzett rekesz tartalmának hetedik ;bitje 0 értéket vesz fel. W0 értéke a ;művelet után kettővel nő. 22

24 BSET.B cél,#bitszám A célban megadott adattároló elem (byte) bitszám sorszámú bitjének értékét egyre állítja. A cél helyén file register, register direct és register indirect címzési módok használhatók, a bitszám pedig 0 és 7 között mozoghat. A mnemonik a Bit SET kifejezés rövidítése. Példa: BSET.B 0x1233,#4 ;A közeli memória ( Near RAM ) 0x1233 címen ;található memóriarekeszének negyedik bitjét ; 1 értékkel tölti fel. ;Ha a rekesz tartalma 0xee volt a művelet ;előtt, utána az érték 0xfe lesz. BSET.B [W0+W1],#5 ;Az adatmemória W0 és W1 regiszterek értékének ;összeadásából keletkező számmal címzett ;rekesz tartalmának ötödik bitje 1 értéket ;vesz fel. W0 és W1 értéke nem változik. BSET.W BSET cél,#bitszám cél,#bitszám A célban megadott adattároló elem (szó) bitszám sorszámú bitjének értékét egyre állítja. A cél helyén file register, register direct és register indirect címzési módok használhatók, a bitszám pedig 0 és 15 között mozoghat. A mnemonik a Bit SET kifejezés rövidítése. Példa: BSET.W 0x1234,#14 ;A közeli memória (Near RAM ) 0x1234 címen ;található memóriarekeszének tizennegyedik ;bitjét 1 értékkel tölti fel. Ha a rekesz ;tartalma 0x00ff volt a művelet előtt, ;utána az érték 0x40ff lesz. 23

25 BSET [W0--],#7 ;Az adatmemória W0 regiszterének értékével ;megcímzett rekesz tartalmának hetedik bitje ; 1 értéket vesz fel. W0 értéke a művelet ;után kettővel csökken. BTG.B cél,#bitszám A célban megadott adattároló elem (byte) bitszám sorszámú bitjének értékét az ellentettjére állítja (ha ott egyes bit volt, akkor nullázza, ha nulla, akkor pedig egyre állítja). A cél helyén file register, register direct és register indirect címzési módok használhatók, a bitszám pedig 0 és 7 között mozoghat. A mnemonik a Bit ToGgle kifejezés rövidítése. Példa: BTG.B 0x1233,#4 ;A közeli memória ( Near RAM ) 0x1233 címen ;található memóriarekeszének negyedik bitjét ;ellenkező értékre állítja. Ha a rekesz ;tartalma 0xee volt a művelet előtt, utána az ;érték 0xfe lesz. BTG.B [W4+W5],#5 ;Az adatmemória W4 és W5 regiszterek értékének ;összeadásából keletkező számmal címzett ;memóriarekesz tartalmának ötödik bitjét ;ellenkező értékre állítja. W4 és ;W5 értéke nem változik. BTG.W BTG cél,#bitszám cél,#bitszám A célban megadott adattároló elem (szó) bitszám sorszámú bitjének értékét az ellentettjére állítja (ha ott egyes bit volt, akkor nullázza, ha nulla, akkor pedig egyre állítja). A cél helyén file register, register direct és register indirect címzési módok használhatók, a bitszám pedig 0 és 15 között mozoghat. A mnemonik a Bit ToGgle kifejezés rövidítése. Példa: 24

26 BTG.W 0x1234,#14 ;A közeli memória ( Near RAM ) 0x1234 címen ;található memóriarekeszének tizennegyedik ;bitjét ellenkező értékre állítja. Ha a rekesz ;tartalma 0x00ff volt a művelet előtt, utána ;az érték 0x40ff lesz. BTG [W0--],#7 ;Az adatmemória W0 regiszterének értékével ;megcímzett rekesz tartalmának hetedik bitjét ;ellenkező értékre állítja. W0 értéke a ;művelet után kettővel csökken Vezérlésátadó utasítások A vezérlésátadó utasítások segítségével a normál működés során utasításonként kettővel növekvő PC regiszter (ami mindig a következő, végrehajtandó utasítás címére mutat) értéke megváltoztatható, vagyis a program egy másik részletére adható át a vezérlés. A vezérlésátadó utasításokat több szempont szerint csoportosíthatjuk: ugrások, szubrutinhívások. Másik szempontrendszer szerint is elvégezhetjük a csoportosítást: feltételes vezérlésátadás, feltétel nélküli vezérlésátadás. Az ugrás típusú vezérlésátadás esetén a PC regiszter tartalmának átírásával a CPU az utasítások végrehajtását az új címen folytatja, miközben nem jegyzi fel a vezérlésátadó utasítás helyét. A szubrutinhívás típusú vezérlésátadás esetén az ugrással ellentétben a CPU feljegyzi a szubrutinhívás utáni utasítás címét (a veremtár LIFO működési elve kiválóan alkalmas egymásba ágyazott hívások visszatérési címének tárolására), így lehetőség van a szubrutin végén innen folytatni a program végrehajtását. A másik szempont szerinti csoportosítás alapja az, hogy a vezérlés átadása minden körülmények között megtörténik-e (feltétel nélküli vezérlésátadás) vagy csak bizonyos feltétel bekövetkezte esetén (feltételes vezérlésátadás). Ekkor a program elágazhat, a feltétel teljesülése esetén a megadott címen, míg a feltétel nem teljesülése esetén a vezérlésátadó utasítást követő utasítással folytatódik a program futtatása. 25

27 A fent felsorolt szempontrendszer figyelembevételével a dspic33f vezérlésátadó utasításait a következő alcímek alatt mutatjuk be: feltétel nélküli ugrások; szubrutin hívások; feltételes vezérlésátadó utasítások Feltétel nélküli ugrások BRA BRA relatív_cím Wx Az utasítás végrehajtása után a vezérlés a PC+2+2*relatív_cím (vagy a megadott munkaregiszterben tárolt érték) képlettel számított címen található utasításra adódik. Természetesen a fordítóprogramok esetén az ugrás helyét, és az ugrás hivatkozását címkével tehetjük meg. A relatív cím 16 bites kettes komplemens kódban ábrázolt számérték lesz, így az ábrázolható számtartomány és közé esik. A mnemonic a BRAnch (elágazás) szó rövidítése. Példa: VCIKLUS: BRA VCIKLUS ;Ez egy végtelen ciklus. GOTO cím A GOTO utasítással a programmemória teljes címtartományában ugorhatunk, nincs megkötés az ugrás távolságát illetően. Az utasítás gépi kódja két szóból álló, mely tartalmazza a 23 bites ugrási címet is. Példa: GOTO TAVOL ;A végrehajtás a TAVOL címen folytatódik. TAVOL: ;A végrehajtás itt folytatódik. GOTO indirekt cél Indirekt ugrás, a indirekt cél által megjelölt címre. A cél helyén csak register direct címzés állhat. A végrehajtás során a PC[22:16] regiszterbitekbe nulla kerül, míg a PC[15:1] bitek 26

28 helyére a megadott munkaregiszter megfelelő bitjei. A PC legkisebb helyértékű bitje mindig nulla, így a munkaregiszter legkisebb helyi értékű bitje figyelmen kívül marad, vagyis a programmemória alsó utasításának bármelyikére adható a vezérlés. Példa: MOV #IDE,W0 ;W0-ba kerül az IDE címke értéke GOTO W0 ;A vezérlés erre a címre kerül.... IDE: ;A végrehajtás itt folytatódik Szubrutinhívások Szubrutin hívás esetén megjegyezzük, hogy honnan hívtuk a lefuttatni kívánt rutint, majd abból történő visszatéréskor a hívás helye utáni helyről folytatjuk a programfuttatást. Ezzel a módszerrel olyan hatékony és kompakt rutinokat készíthetünk, melyek a programunk több helyén beszúrhatók a futtatásba. A szubrutin hívása, vagyis a rutinra történő vezérlés átadás a CALL -lal történhet. CALL cím Az utasítás elérése után (utasítás fetch ciklus) a programszámláló regiszter (PC) a CALL utasítást követő utasítás programmemória címére mutat. Az utasítás végrehajtása során az aktuális PC regiszter tartalma a veremtárba kerül (LSB először, majd a következő 2 magasabb helyi értékű byte, végül egy nulla értékű byte, így minden visszatérési cím 4 byte-ot foglal a veremtárban). A mentést követően a CPU a PC tartalmát felülírja a CALL utasításban definiált címmel, elugrik a címnek megfelelően. A veremtárban (stack-ben) a visszatérési cím elhelyezkedése a következő: 27

29 5. ábra: Veremtár állapota a CALL utasítást követően Példa: CALL SZUBR ;Szubrutin hívása a SZUBR címkének megfelelő ;címen. A visszatérés a RETURN segítségével ;lehetséges. RCALL relatív_cím Működése megegyezik a CALL cím utasításéval, de az ugráscím megadása a PC aktuális értékéhez képest relatívan, és közötti értékekkel történik, hasonlóan a BRA relatív_cím utasításhoz. A mnemonik a Relative CALL angol kifejezés rövidítése. Példa: RCALL SZUBR ;Szubrutin hívása a SZUBR címkének megfelelő ;címen. A relatív cím értékét a fordítóprogram ;számolja ki, amennyiben az az ábrázolási ;tartományon belül helyezkedik el. A ;visszatérés a RETURN segítségével lehetséges. 28

30 CALL cél Indirekt szubrutinhívás a cél által megjelölt címre. A cél helyén csak register direct címzés állhat. A végrehajtás során a PC[22:16] regiszterbitekbe nulla kerül, míg a PC[15:1] bitek helyére a megadott munkaregiszter megfelelő bitjei. A PC legkisebb helyértékű bitje mindig nulla, ezért a munkaregiszter legkisebb helyi értékű bitje figyelmen kívül marad, vagyis a programmemória alsó utasításának bármelyikére adható a vezérlés. A visszatérési cím tárolása ugyanúgy a veremtárban történik, mint a CALL cím utasítás esetén. Példa: MOV #SZUBR,W1 ;W1-be kerül a SZUBR címke értéke CALL W1 ;A vezérlés erre a címre kerül. VISSZA:... SZUBR: RETURN ;A végrehajtás itt folytatódik. ;A szubrutin végén a RETURN visszavisz a ;hívás utáni utasításra. (VISSZA címkéhez) RCALL cél Indirekt szubrutinhívás a cél által megjelölt címre. A cél helyén csak register direct címzés állhat. A végrehajtás során a megadott munkaregisztert a CPU kettővel megszorozza, majd hozzáadja a PC aktuális értékéhez. A visszatérési cím tárolása ugyanúgy a veremtárban történik, mint a többi szubrutinhívás esetén. Példa: MOV #-1,W1 ;W1-be kerül a relatív cím értéke (ez jelen ;esetben a szubrutint hívó utasítás címe lesz, ;ezért ez a program így értelmetlen, de a ;mechanizmust jól mutatja) CALL W1 ;A vezérlés újra erre a címre kerül. 29

31 RETURN A veremtárban (stack) tárolt visszatérési cím (remélhetően ez van a stack tetején) betöltődik a PC-be. A PC 24 bites, a verem viszont csak 16 bites értékeket képes tárolni, így a visszatérési cím két szóban (2*16 biten) tárolódik, a stack pointer (W15) tartalma ekkor néggyel csökken. Példa: RETURN ;A veremtár felső 3 byte-ja PC-be töltődik, ;W15 (a Stack Pointer) értéke néggyel csökken. RETLW.B #konstans,cél Visszatérés a szubrutinból, egyidejűleg egy konstans betöltése a cél által kijelölt munkaregiszter alsó 8 bitjébe. A cél helyén csak register direct címzési mód használható. A PC regiszter és a veremtár kezelése ugyanolyan, mint a RETURN utasítás esetén. A konstans előjel nélküli egész szám lehet, ami 0 és 255 közötti értékkészletet jelent. A mnemonik a RETurnwithLiteralinWorkingregister angol kifejezés rövidítése. Példa: RETLW.B #12,W0 ;A W0 alsó 8 bitje a 12 decimális ;értéket veszi fel, a veremtár felső 3 ;byte-ja PC-be töltődik, W15 (a Stack ;Pointer) értéke néggyel csökken. RETLW.W RETLW #konstans,cél #konstans,cél Visszatérés a szubrutinból, egyidejűleg egy konstans betöltése a cél által kijelölt munkaregiszterbe. A cél helyén csak register direct címzési mód használható. A PC regiszter és a veremtár kezelése ugyanolyan, mint a RETURN utasítás esetén. A konstans 10 bites, előjel nélküli egész szám lehet, ami 0 és 1023 közötti értékkészletet jelent. A.W jelölő el is hagyható. A mnemonik a RETurnwithLiteralinWorkingregister angol kifejezés rövidítése. Példa: RETLW.W #355,W2 ;A W2 a 355 decimális ;értéket veszi fel, a veremtár felső 3 30

32 ;byte-ja PC-be töltődik, W15 (a Stack ;Pointer) értéke néggyel csökken. RETFIE A megszakítás (interrupt) alapvetően egy aszinkron esemény által kiváltott szubrutinhívás, így látszólag elegendő lenne egy RETURN utasítás is a visszatérésre. Azonban a megszakítások esetén különböző prioritási és reteszelő mechanizmusok is működésbe lépnek, amelyek helyes működéséhez szükséges tudatni a megszakítás szubrutin befejeződésének tényét. Emellett a dspic33f megszakítási rendszere a megszakítási szubrutin meghívásakor egyéb információkat is elhelyez a veremtárban, ezért a megszakítási szubrutin végén egy külön utasítással kell visszatérni a megszakított programhoz. A RETFIE utasítás a veremtár tetejéről a következő adatokat állítja vissza: A verem tetején található 16 bites érték felső 8 bites részét a STATUS regiszter alsó 8 bitjének helyére tölti. A verem tetején található 16 bites érték hetedik bitjét a CORCON regiszter harmadik bitjének (IPL3) helyére tölti. A verem tetején található 16 bites érték alsó 7 bites részét a PC (Program Counter) legfelső hét bitjének helyére tölti <16-22>. A veremben található következő 16 bites értéket a PC alsó 16 bitjének helyére tölti. A mnemonik a RETurn From IntErrupt angol kifejezés rövidítése. Példa: RETFIE ;A veremtár megfelelő 24 bitje PC-be töltődik, a ;STATUS és CORCON regiszterek megfelelő bitjeinek ;visszaállítása megtörténik, W15 (a ;Stack Pointer) értéke néggyel csökken, az ;interrupt mechanizmus a megszakítást befejezettnek ;tekinti. 31

33 Feltételes vezérlésátadó utasítások A feltételes vezérlésátadó utasításoknál, mint az a nevében is szerepel, a vezérlésátadás egy feltétel teljesülés, illetve nem teljesülés esetén valósul meg. Az ilyen típusú utasításokkal feltételes programelágazásokat készíthetünk. BRA feltétel,relatív_cím Egy olyan relatív ugrás, amely végrehajtása során a CPU teszteli a feltételt, majd ennek teljesülése esetén kiszámítja a PC és a megadott relatív érték által meghatározott ugráscímet, és a PC értékét ennek megfelelően állítja be. A feltétel nem teljesülése esetén a vezérlés a BRA feltétel, relatív_cím utasítást követő utasításra kerül. Az alábbiakban összefoglaljuk a lehetséges feltételeket: BRA C,relatív_cím: a feltétel akkor igaz, ha az átvitelbit (Carryflag) értéke 1 állapotú. A mnemonik a BRAnchifCarry angol kifejezés rövidítése. BRA NC,relatív_cím: a feltétel akkor igaz, ha az átvitelbit (Carryflag) értéke 0 állapotú. A mnemonik a BRAnchifNotCarry angol kifejezés rövidítése. BRA GE,relatív_cím: a feltétel akkor igaz, ha a negative (N) bit és az overflow(ov) bitek állapota megegyezik egymással. A mnemonik a BRAnchifsignedGreaterthanorEqual (ugrás, ha előjelesen nagyobb, vagy egyenlő) angol kifejezés rövidítése. BRA GEU,relatív_cím: a feltétel akkor igaz, ha az átvitelbit (Carryflag) értéke 1 állapotú. A mnemonik a BRAnchifUnsignedGreaterthanorEqual (ugrás, ha előjel nélkül nagyobb, vagy egyenlő) angol kifejezés rövidítése. Az utasítás helyett a fordítóprogram a BRA C,relatív_cím utasítást fordítja. BRA GT,relatív_cím: a feltétel akkor igaz, ha a (!Z&&N&&OV) (!Z&&!N&&!OV) logikai függvény értéke igaz. Vagyis a negative (N) és overflow (OV) bitek állapota megegyezik egymással, és a zero (Z) bit állapota nem 0. A mnemonik a BRAnchifsignedGreater Than (ugrás, ha előjelesen nagyobb) angol kifejezés rövidítése. BRA GTU,relatív_cím: a feltétel akkor igaz, ha a carry (C) bit értéke 1, míg a zero (Z) bit értéke 0 állapotú. A mnemonik a BRAnchifGreater Than Unsigned (ugrás, ha előjel nélkül nagyobb) angol kifejezés rövidítése. BRA LE,relatív_cím: a feltétel akkor igaz, ha a zero (Z) bit értéke 1, vagy a negative (N) és overflow (OV) bitek értéke egymástól különböző. A mnemonik a 32

34 BRAnchifsigned Less thanorequal (ugrás, ha előjelesen kisebb vagy egyenlő) angol kifejezés rövidítése. BRA LEU,relatív_cím: a feltétel akkor igaz, ha a zero (Z) bit értéke 1, vagy a carry (C) bit értéke 0. A mnemonik a BRAnchif Less thanorequalunsigned (ugrás, ha előjel nélkül kisebb vagy egyenlő) angol kifejezés rövidítése. BRA LT,relatív_cím: a feltétel akkor igaz, ha a negative (N) és overflow (OV) bitek értéke egymástól különböző. A mnemonik a BRAnchif Less Than signed (ugrás, ha előjelesen kisebb) angol kifejezés rövidítése. BRA LTU,relatív_cím: a feltétel akkor igaz, ha a carry (C) bit értéke 0 állapotú. A mnemonik a BRAnchif Less Than Unsigned (ugrás, ha előjel nélkül kisebb) angol kifejezés rövidítése. BRA N,relatív_cím: a feltétel akkor igaz, ha a negative (N) bit értéke 1 állapotú. A mnemonik a BRAnchifNegative (ugrás, ha negatív) angol kifejezés rövidítése. BRA NN,relatív_cím: a feltétel akkor igaz, ha a negative (N) bit értéke 0 állapotú. A mnemonik a BRAnchifNotNegative (ugrás, ha nem negatív) angol kifejezés rövidítése. BRA OV,relatív_cím: a feltétel akkor igaz, ha az overflow (OV) bit értéke 1 állapotú. A mnemonik a BRAnchifOVerflow (ugrás, ha túlcsordult) angol kifejezés rövidítése. BRA NOV,relatív_cím: a feltétel akkor igaz, ha az overflow (OV) bit értéke 0 állapotú. A mnemonik a BRAnchifNotOVerflow (ugrás, ha nem volt túlcsordulás) angol kifejezés rövidítése. BRA Z,relatív_cím: a feltétel akkor igaz, ha a zero (Z) bit értéke 1 állapotú. A mnemonik a BRAnchifZero (ugrás, ha nulla) angol kifejezés rövidítése. BRA NZ,relatív_cím: a feltétel akkor igaz, ha a zero (Z) bit értéke 0 állapotú. A mnemonic a BRAnchifNotZero (ugrás, ha nem nulla) angol kifejezés rövidítése. A fentieken kívül még léteznek feltételes BRA utasítások, ezekről a Microchip programreferencia katalógusa ad tájékoztatást. A jelzőbitek beállítását általában az Aritmetikai és Logikai Egység által végrehajtott utasítások végzik el a feltételes vezérlésátadó utasítások pedig ennek eredményétől függően végzik feladatukat. 33

35 BTSC cél,#bitszám Speciális vezérlésátadó utasítás. A cél helyén található operandus bitszám által meghatározott sorszámú bitjének állapotát ellenőrzi, és ha a megadott bit értéke 0, akkor átlépi a következő utasítást. A cél helyén file register, register direct és registerindirect címzési módok használhatók, a bitszám pedig 0 és 15 között mozoghat. A mnemonik a Bit Test SkipifClear kifejezés rövidítése. Példa: BTSC W0,#4 ;Ellenőrzi W0 b4 bitjét. Ha a bit 1, akkor az ;EGY címke, ha a bit értéke 0, akkor a NULLA ;címke után folytatódik a program. GOTO EGY ;Ha a bit 1, akkor ezt az utasítást ;végrehajtja. NULLA: ;Ha a bit 0, akkor az előző utasítást kihagyta ;a végrehajtás során, így itt folytatódik a ;program. BTSS cél,#bitszám Speciális vezérlésátadó utasítás. A cél helyén található operandus bitszám által meghatározott sorszámú bitjének állapotát ellenőrzi, és ha a megadott bit értéke 1, akkor átlépi a következő utasítást. A cél helyén file register, register direct és registerindirect címzési módok használhatók, a bitszám pedig 0 és 15 között mozoghat. A mnemonik a Bit Test SkipifSet kifejezés rövidítése. Példa: BTSS W0,#4 ;Ellenőrzi W0 b4 bitjét. Ha a bit 1, akkor az ;EGY címke, ha a bit értéke 0, akkor a NULLA ;címke után folytatódik a program. GOTO NULLA ;Ha 0, akkor ezt az utasítástvégrehajtja. EGY: ;Ha a bit 1, akkor az előző utasítást kihagyta ;a végrehajtás során, így itt folytatódik aprogram. 34

36 2.4. Veremtár kezelő utasítások A dspic33f veremtár kezelése kényelmesen használható, segítségével könnyen fordíthatók C nyelvű programok gépi kódra. A fejezet a veremtárat adattárolás céljára használó utasításokat ismerteti. LNK #érték Létrehoz egy helyi adattároló keretet (Frame), érték byte méretben. A működés során először elmenti a W14 munkaregiszter aktuális értékét a veremtárba. A W15 aktuális értékét áttölti W14-be, majd W15-öt megnöveli az operandusként átadott értékkel. A használatához tekintsük át az alábbi programrészletet: PUSH W0 PUSH W1 PUSH W2 CALL FUGGVENY Ekkor a FUGGVENY nevű szubrutin a veremtárban a következő állapotot találja (tételezzük fel, hogy a W15 az inicializálás utáni 0x0800 címet tartalmazta): 0x800 W0 alsó 8 bit W0 felső 8 bit 0x802 W1 alsó 8 bit W1 felső 8 bit 0x804 W2 alsó 8 bit W2 felső 8 bit 0x806 PC[7:0] PC[15:8] 0x808 PC[23:16] A W15 aktuális értéke 0x80a. A FUGGVENY nevű szubrutin a LNK utasítás segítségével igényelhet a veremtárban a helyi változói számára tárterületet. A megvalósítás roppant egyszerű, az alábbi példában 4 byte igénylése történik: FUGGVENY: LNK #4 Ekkor a veremtár állapota a következőképpen fog kinézni: 35

37 0x800 W0 alsó 8 bit W0 felső 8 bit 0x802 W1 alsó 8 bit W1 felső 8 bit 0x804 W2 alsó 8 bit W2 felső 8 bit 0x806 PC[7:0] PC[15:8] 0x808 PC[23:16] x80a W14 alsó 8 bit W14 felső 8 bit 0x80c Helyi változó1 Helyi változó1 0x80e Helyi változó2 Helyi változó2 Vagyis, az LNK hatására a CPU elmenti a StackFrame Pointer (W14) aktuális értékét a veremtárba, W15 értékét betölti W14 regiszterbe, majd a W15 értékét megnöveli a kívánt értékkel, ilyen módon lefoglalva a szükséges helyet a veremtárból. A W14 értéke az első helyi változó tárolási helyére mutat, így egyszerű register indirect címzési móddal elérhető. A helyi változók a [W14+n] formátumban érhetők el, a hívó program által a verembe helyezett paraméterek (a példában a W0, W1 és W2) pedig a [W14-12], [W14-10] és [W14-8] formátumban. ULNK Egy LNK utasítással a veremben, adattárolási céllal létrehozott keretet szünteti meg. Először a W15 regiszterbe tölti a W14 StackFrame Pointer értékét, majd a verem tetején található 16 bites értéket (W14 előzőleg mentett állapotát) visszatölti W14-be. A W15 ezután a szubrutin visszatérési címére mutat.a következő példában megnézzük, hogy az LNK utasításnál ismertetett FUGGVENY szubrutinból visszatérni a következő programrészlettel lehet: ULNK RETURN PUSH cél A célt elhelyezi a veremtár tetején. A cél helyén a register direct és register indirect címzési módok használhatók. Az utasítást a fordítóprogram egy MOV cél,[w15++] utasításra fordítja, disassemblálás során is a MOV utasítás fog megjelenni. Fontos, hogy a PUSH utasítás kizárólag szó üzemmódban működik! Példa: 36

38 PUSH W5 PUSH [W4++] ;A veremtár tetejére W5 értéke kerül. ;A veremtár tetejére a W4 regiszter által ;megcímzett memóriarekesz tartalma kerül, a művelet ;végrehajtása után W4 értéke kettővel nő. PUSH [W3+W5] ;A veremtár tetejére a W3 és W5 regiszterek ;összeadása után keletkező érték által ;megcímzett memóriarekesz tartalma kerül, a művelet ;végrehajtása után W3 és W5 értéke nem változik. PUSH.D cél A cél által megjelölt 4 byte-ot elhelyezi a veremtár tetején. A cél helyén kizárólag csak register direct címzési mód használható, bizonyos megkötésekkel: itt csak páros sorszámú munkaregiszter állhat! A PUSH.D utasítás végrehajtása során először a megjelölt, majd a következő sorszámú munkaregisztert helyezi el a veremtárban. Példa: PUSH.D W0 ;A veremtár tetejére a W0, majd a W1 regiszter ;kerül. PUSH.D W14 ; A veremtár tetejére a W14, majd a W15 regiszter ;kerül. PUSH.S Elhelyezi a fő regisztereket egy speciális tároló helyre (shadow). A fő regiszterek a következők: W0, W1, W2, W3 munkaregiszterek, C (carry), Z (zero), OV (overflow), N (negative) és DC STATUS jelzőbitek. A shadow terület csak egy regiszterkészletet tartalmaz, tehát többszöri mentésre nem alkalmas, az itt tárolt értékek közvetlenül nem érhetők el. Példa: PUSH.S ;Ashadowregiszterek felveszik W0, W1, W2, W3, W4 ;és a megfelelő jelzőbitek állapotát. 37

39 POP cél A veremtár tetején található 16 bites értéket elhelyezi a cél által kijelölt helyen. A cél helyén a registerdirect és register indirect címzési módok használhatók. Az utasítást a fordítóprogram egy MOV [--W15],cél utasításra fordítja, disassemblálás során is a MOV utasítás fog megjelenni. Fontos, hogy a POP utasítás kizárólag szó üzemmódban működik! Példa: POP W5 ;A veremtár tetején található érték W5-be kerül. POP [W4--] ;A veremtár tetején található érték a W4 regiszter ;által megcímzett memóriarekeszbe, a művelet ;végrehajtása után W4 értéke kettővel csökken. POP [W3+W5] ;A veremtár tetején található érték a W3 és W5 ;regiszterek összeadása után keletkező érték által ;megcímzett memóriarekeszbe kerül, a művelet ;végrehajtása után W3 és W5 értéke nem változik. POP.D cél A veremtár tetején található 4 byte-ot elhelyezi a cél által megjelölt helyre. A cél helyén kizárólag csak registerdirect címzési mód használható, bizonyos megkötésekkel: itt csak páros sorszámú munkaregiszter állhat! A POP.D utasítás végrehajtása során először a verem tetején található 2 byte kerül a megjelölt munkaregiszternél eggyel nagyobb sorszámú munkaregiszterbe, majd a következő 2 byte a megadott munkaregiszterbe. Példa: POP.D W0 ;A veremtár tetejéről a W1, majd a W0 regiszterbe ;kerül az adat. POP.D W12 ;A veremtár tetejéről a W13, majd a W12 ;regiszterbe kerül az adat. 38

40 POP.S A shadow területről betölti a fő regiszterekbe az ott tárolt értékeket. A fő regiszterek a W0, W1, W2, W3 munkaregiszterek, C (carry), Z (zero), OV (overflow), N (negative) és DC STATUS jelzőbitek. Példa: POP.S ;A W0, W1, W2, W3, W4 és a megfelelő jelzőbitek ;felveszik a shadowregiszterek állapotát Aritmetikai utasítások A dspic33f architektúra egész és fixpontos tört számábrázolású számok (amelyek lehetnek előjeles vagy előjel nélküli formában) közti aritmetikai műveleteket támogat. Az aritmetikai egység két részre bomlik, a normál MCU (ezt szokták ALU-nak jelezni a dspic33 blokksémákon) és a DSPegységre(ezt szokták DSP engine -nek jelölni). Az MCU csak 16 és némely művelet esetén 32 bites értékekkel tud dolgozni, míg a DSP motor utasításai hatékonyan kezelika két darab 40 bites akkumulátor regisztert is. A regiszterekben megjelenő értékek a számábrázolás módjától függően mást és mást jelenthetnek. A dspic33f által használt számábrázolási módok a következők: előjel nélküli egész; előjeles egész; előjel nélküli tört; előjeles tört. Előjel nélküli számábrázolások Regiszter Egész számábrázolási Tört számábrázolási Tört felbontás mérete tartomány tartomány 16-bit 0 és között 0 és (1.0-2^-16)között x 10^-5 32-bit 0 és között 0 és (1.0-2^-32)között x 10^-10 Az előjel nélküli számábrázolás kétféleképp valósulhat meg, egész vagy tört számábrázolással. Az egész ábrázolás a legegyszerűbb, ekkor a reprezentált számot a megfelelő bitek helyértékei adják meg. Tízes számrendszerbe alakításhoz az egyes bitek 39

41 helyértékeit kell összeadni. Az alábbi táblázat egy 16 bites érték helyértékeit (kettőnek a bit sorszámára emelt hatványai) foglalja össze: b15 b14 b13 b12 b11 b10 b9 b b7 b6 B5 b4 b3 b2 b1 b Az előjel nélküli tört számábrázolás a dspic33f sorozat esetében az aritmetika vonatkozásában nem bír különösebb jelentőséggel, hiszen az összes műveletet ugyanúgy kell végezni, mint az egész ábrázolás esetében. Természetesen az egyes bitek értelmezése másképp történik az előjel nélküli egész és tört számoknál. Az ábrázolható számtartomány 0 és (1-2^16) között van, a képzeletbeli tizedesvessző a legértékesebb helyértékű bit előtt helyezkedik el. b15 b14 b13 b12 b11 b10 b9 b8 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256 b7 b6 b5 b4 b3 b2 b1 b0 1/512 1/1024 1/2048 1/4096 1/8192 1/ / /65536 Említést érdemel, hogy az analóg-digitális átalakító (ADC) képes 10, illetve 12 bites előjel nélküli tört formátumban is kimeneti eredményt szolgáltatni. Természetesen a bitek értelmezés különbözősége miatt ekkor a 16 bites regiszterbe a 10, illetve a 12 bites adatok a felső bitpozíciókba kerülnek. Előjeles számábrázolás Regiszter Egész számábrázolási Tört számábrázolási Tört felbontás mérete tartomány tartomány 16-bit és között -1.0 és (1.0 2^-15) között x 10^-5 32-bit és -1.0 és (1.0-2^-31)között x 10^-10 40

42 között 40-bit és és ( ^-31) x 10^ között között Az előjeles számábrázolás alapja az, hogy a legértékesebb helyértékű bitet (MSB) nevezzük ki előjelnek. Ennek 0 állapota esetén az ábrázolt szám pozitív, míg 1 állapota esetén az ábrázolt szám negatív. Egy tetszőleges 16 bites bináris számot az előjeles egész számábrázolásnak megfelelően a következő helyértékek szerint lehet értelmezni: b15 b14 b13 b12 b11 b10 b9 b b7 b6 b5 b4 b3 b2 b1 b A jelfeldolgozó hálózatok struktúrájához jobban illeszkedik az előjeles tört számábrázolási mód. Ez hasonlít az előjeles egész ábrázoláshoz, azonban az értelmezéshez használt helyértékek mások. A dspic33f által használt törtábrázolás fixpontos, vagyis a képzeletbeli tizedesvessző mindig ugyanott helyezkedik el, mégpedig közvetlenül az előjelbit mögött. Ezt a módot 1.15 (vagy 32 bites módban 1.31) néven is ismerik. Az egyes helyértékek 16 bit esetén: b15 b14 b13 b12 b11 b10 b9 b8-1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 b7 b6 b5 b4 b3 b2 b1 b0 1/256 1/512 1/1024 1/2048 1/4096 1/8192 1/ /32768 Példaként vegyük a következő 16 bites értéket, és vizsgáljuk meg, hogy az egyes számábrázolási módokban milyen értéket reprezentál: 41

43 (0x8080). Ha ezt előjel nélküli 16 bites decimális számként értelmezzük, akkor a következő műveletet kell elvégeznünk (a 0 bitek helyének megfelelő 0*helyérték tagokat az egyszerűség kedvéért elhagytuk): 1* *128 = Ha előjeles 16 bites egészként, akkor az érték: 1*(-32768)+1*128 = Előjel nélküli törtszámként ha értelmezzük: 1*(1/2)+1*(1/512) = Végül, ugyanez a szám előjeles törtszámként: 1*(-1)+1*(1/512) =

44 Összeadás ADD.B operandus1,operandus2,cél Összeadja az operandus1 és operandus2 alsó 8 bitjének értékeit és az eredmény alsó 8 bitjét betölti a cél által megjelölt helyre. Az operandus1 helyén csak register direct, operandus2 helyén register direct, register indirect és közvetlen adat (maximum 10 bites érték) címzési módok, míg a cél helyén register direct és register indirect címzési módok állhatnak. Példa: ADD.B W0,W1,W2 ;A W2 munkaregiszter alsó 8 bitjének ;helyére a W0 és a W1 ;tartalmának összege töltődik. ADD.B W0,#15,[W2++] ;A W2 regiszter által megcímzett ;memóriarekeszbe betölti a W0 értékének ;15-el megnövelt értékét (alsó byte-ra ;csonkolva). A művelet végrehajtása után ;W2 értéke eggyel nő. ADD ADD.W operandus1,operandus2,cél operandus1,operandus2,cél Összeadja az operandus1 és operandus2 értékeit és az eredményt betölti a cél által megjelölt helyre. Az operandus1 helyén csak register direct, operandus2 helyén register direct, register indirect és közvetlen adat (maximum 10 bites érték) címzési módok, míg a cél helyén register direct és register indirect címzési módok állhatnak. Példa: ADD W0,W1,W3 ;A W4 munkaregiszter értéke ;felveszi a W0 és a W1 ;tartalmának összegét. ADD.W W0,#15,[W2++] ;A W2 regiszter által megcímzett ;memóriarekeszbe betölti a W0 értékének 43

45 ;15-el megnövelt értékét. A művelet ;végrehajtása után W2 értéke kettővel ;nő. ADDC ADDC.W operandus1,operandus2,cél operandus1,operandus2,cél Működése hasonló az ADD utasításhoz, azonban az összeadás eredményéhez még hozzáadja a Carry flag aktuális értékét. Segítségével 16 bitesnél nagyobb méretű számok összeadása is lehetségessé válik. Példa (2 db 32 bites szám összeadása): ADD W0,W2,W0 ;W0=W0+W2, CY=1, ha az eredmény nem fér ;el 16 biten ADDC W1,W3,W1 ;W1=W1+W3+Carry Kivonás SUB.B operandus1,operandus2,cél Kivonja az operandus1 -ből az operandus2 alsó 8 bitjének értékeit és az eredmény alsó 8 bitjét betölti a cél által megjelölt helyre. Az operandus1 helyén csak register direct, operandus2 helyén register direct, register indirect és közvetlen adat (maximum 8 bites érték) címzési módok, míg a cél helyén register direct és register indirect címzési módok állhatnak. Példa: SUB.B W0,W1,W2 ;A W2 munkaregiszter alsó 8 bitjének ;helyére a W0 és a W1 ;tartalmának különbsége töltődik. SUB SUB.W operandus1,operandus2,cél operandus1,operandus2,cél Kivonja az operandus1 -bőlaz operandus2 értékeit és az eredményt betölti a cél által megjelölt helyre. Az operandus1 helyén csak register direct, operandus2 helyén register 44

46 direct, register indirect és közvetlen adat (maximum 10 bites érték) címzési módok, míg a cél helyén register direct és register indirect címzési módok állhatnak. Példa: SUB W0,W1,W3 ;A W4 munkaregiszter értéke ;felveszi a W0 és a W1 ;tartalmának különbségét. SUB.W W1,#10,[W0++] ;A W0 regiszter által megcímzett ;memóriarekeszbe betölti a W1 értékének ;10-el csökkentett értékét. A művelet ;végrehajtása után W0 értéke kettővel ;nő. SUBB SUBB.W operandus1,operandus2,cél operandus1,operandus2,cél Működése hasonló a SUB utasításhoz, azonban a kivonás eredményéből még kivonja a Carry flag aktuális értékének negáltját. Segítségével 16 bitesnél nagyobb méretű számok kivonása is lehetségessé válik. Példa (2 db 32 bites szám kivonása): SUB W0,W2,W0 ;W0=W0-W2, CY=0, ha az eredmény nem fér ;el 16 biten SUBB W1,W3,W1 ;W1=W1-W3-neg(Carry) Szorzás A dspic33f processzorok a szorzás műveletét többféle módon képesek elvégezni. Attól függően, hogy mely egység (MCU ALU vagy DSP motor) végzi a szorzást különböző mnemonik tartozik a művelethez. Most az ALU által végzett szorzást vizsgáljuk. A szorzás művelete megegyezik az egész és a fixpontos tört számábrázolás esetén, azonban erősen különbözik a kettes komplemens ábrázolás (előjeles számok) használatakor. Vegyük példának a következő műveletet: 0.5*-0.5=

47 A következő táblázat segít az operandusok értelmezésében (csak a legértékesebb 8 bitet megtartva, a többi bit 0 értékű, így nem változtatja meg a művelet eredményét): bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 Érték , , , (A) (B) Low(A*B)= High(A*B)=0.375 Látható, hogy az eredmény nem az elvárt -0.5 lett, hanem Nem csak az érték nem stimmel, de még az előjele sem. A kettes komplemens ábrázolású számok szorzásához tehát különböző módon kell eljárni, az előjel figyelembe vételével. Emiatt a dspic különböző típusú szorzási utasításokat alkalmaz attól függően, hogy az operandusok előjeles vagy előjel nélküli számábrázolást használnak. A rugalmasságot növeli, hogy a szorzás művelet két operandusa eltérő ábrázolású is lehet, így összesen négyféle szorzó utasítás áll rendelkezésre. MUL.SS operandus1,operandus2,cél Összeszorozza az operandus1 és operandus2 helyen tárolt értékeket, mint előjeles egész számokat, majd az eredményt a cél helyen tárolja. Az operandus1 helyén csak register direct, operandus2 helyén register direct és register indirect címzési módok használhatók. Az eredmény tárolási helye ( cél ) csak register direct lehet, a munkaregiszterek közül is csak a páros sorszámúak. Ennek oka az, hogy 16 bites számok szorzatának mérete 32 bites lesz, ami természetesen nem fér el egyetlen 16 bites regiszterben. Emiatt a 32 bites eredmény alacsonyabb helyértékű 16 bitje kerül a megadott regiszterbe, a magasabb helyértékű 16 bit pedig az eggyel magasabb sorszámú regiszterbe. A MUL.SSmnemonik az angol MULtipleSigned and Signed szavak rövidítése. Az U betűvel az előjel nélküli (Unsigned) operandusok jelölése történik. MUL.SU operandus1,operandus2,cél 46

48 Összeszorozza az operandus1 és operandus2 helyen tárolt értékeket, majd az eredményt a cél helyen tárolja. Az operandus1 előjeles, míg az operandus2 előjel nélküli egész számként értelmezett. Az utasítás egyebekben megegyezik a MUL.SS utasítással. MUL.SU operandus1,#konstans,cél Működése megegyezik az előző utasítással, de egy 0 és 31 közti konstans szám szerepelhet a második operandus helyén. MUL.US operandus1,operandus2,cél Összeszorozza az operandus1 és operandus2 helyen tárolt értékeket, majd az eredményt a cél helyen tárolja. Az operandus1 előjel nélküli, míg operandus2 előjeles egész számként értelmezett. Az utasítás egyebekben megegyezik a MUL.SS utasítással. MUL.UU operandus1,operandus2,cél összeszorozza az operandus1 és operandus2 helyen tárolt értékeket, majd az eredményt a cél helyen tárolja. Az operandus1 és az operandus2 is előjel nélküli egész számként értelmezett. Az utasítás egyebekben megegyezik a MUL.SS utasítással. MUL.UU operandus1,#konstans,cél Működése megegyezik az előző utasítással, de egy 0 és 31 közti konstans szám szerepelhet a második operandus helyén. Példa: MUL.SS W0,W1,W12 ;A W0 és a W1-ben található a szorzó és ;a szorzandó 16 bites előjeles egész ;szám, az eredmény pedig a W12 és a W13 ;regiszterekben tárolódik, hiszen két 16 ;bites szám szorzásánál az eredmény akár ;32 bitesre is duzzadhat. MUL.UU W0,#12,W4 ;A W0-ban található előjel nélküli egész ;számot megszorozza 12-vel, majd az ;eredményt a W4 és W5 regiszterekben ;tárolja. 47

49 2.6. DSP utasítások A DSP utasításokat a dspic33 úgynevezett DSP motor blokkja hajtja végre. Az eredmények ekkor valamely akkumulátorban fognak keletkezni. A DSP motor utasításai meglehetősen hatékonyak, egy gépi ciklus alatt több művelet valósulhat meg párhuzamosan, például két szám szorzása és két adat mozgatása. Fontos tudnunk, hogy a DSP motor utasítások végrehajtását a CORCON regiszter egyes bitjeinek állása befolyásolhatja! ADD ADD operandus1,#eltolás,a operandus1,#eltolás,b Hozzáadja az ACC_A vagy ACC_B tartalmához az operandus1 tartalmát, az eredmény az ACC_A-ban, vagy ACC_B-ben tárolódik. Az eltolás egy -8 és +7 közti szám, az összeadás előtt ennyi bittel jobbra (pozitív érték) vagy balra (negatív érték) eltolja az operandus1 -ben tárolt értéket. Az eltolás aritmetikai (az előjelbitet változatlanul hagyja) megadása opcionális, elhagyása esetén az alapértelmezett érték: 0 (nincs biteltolás). Az operandus1 helyén register direct, register indirect címzési módok használhatók, előjeles számként értelmezettek. Az akkumulátor módosítása ennek figyelembevételével történik. Példa: ADD W0,#2,A ;ACC_A és W0 értéke összeadódik, majd két ;bittel jobbra tolódik (vegyük figyelembe, hogy az ;eltolás aritmetikai és előjel kiterjesztéssel ;történik!) és az eredmény ACC_A-ban tárolódik. ; Ha ACC_A értéke 3 0x7000, W0 értéke ; 0x8000volt a művelet előtt,akkor az eredmény ;ACC_A-ban 0x5000 lesz. 3 Az ACC_A és az ACC_B 40 bites. A fenti esetben az akkumulátor értékadás a < > bitpozíciókra értendő! 48

50 ADD akkumulátor Összeadja a két akkumulátor (ACC_A és ACC_B) értékét, és az eredményt betölti az akkumulátor helyen megadott (A vagy B) helyre. Példa: ADD A ;Az ACC_A és az ACC_B tartalmának összege az ;ACC_A-ba töltődik. ADD B ;Az ACC_A és az ACC_B tartalmának összege az ;ACC_B-be töltődik. Abban az esetben, ha a szorzás műveletét a DSP motor utasításával (MPY) szeretnénk végrehajtani, akkor ügyelnünk kell a CORCON regiszter IF bitjére, mert ez fogja meghatározni azt, hogy az összeszorzandó adatok egész (IF= 1 ), vagy tört (IF= 0 ) számként értelmezettek. MPY operandus1*operandus2,akkumulátor Összeszorozza az operandus1 és operandus2 értékeket, majd az eredményt eltárolja az akkumulátor helyen. Az akkumulátor az A (ACC_A) vagy B (ACC_B) értéket veheti fel. Az operandus1 és operandus2 nem választható meg szabadon, kizárólag az alábbi munkaregiszterekkel végezhető el a szorzás: W4*W5 W4*W6 W4*W7 W5*W6 W5*W7 W6*W7 Az operandusok között a * jel szerepel, az operandusok sorrendjét felcserélni nem lehet. A fenti szorzás egész és tört számokra értelmezhető. Az eredmény automatikusan 40 bites akkumulátorban tárolódik a bit0. bit31. bitpozícióban. Példa: MPY W4*W5,A ;W4 és W5 szorzata ACC_A-ba kerül. 49

51 Az MPY utasítás segítségével négyzetre emelés is megvalósítható, ekkor az összeszorzandó operandusok a következők lehetnek: W4*W4 W5*W5 W6*W6 W7*W7 Fontos megemlíteni, hogy a fentiekben az MPY utasítás nem minden paraméterezését adtuk meg. A szorzás művelet végzésekor kettő adatmozgatásra is lehetőség van ugyanezen gépi ciklus alatt! MPY operandus1*operandus2,akkumulátor,forrás1x,cél1x,forrás2y,cél2y A DSP direkt struktúrák programozásához jól illeszkedik a MAC utasítás, mely a Multiply and ACcumulate szavakból származik. Ezzel az utasítással hatékonyan alakíthatjuk ki az IIR struktúrák előre, és visszacsatoló ágának összegző csomópontjait, valamint FIR előre csatolásokat, konvolúció számításokat. A MAC szintaktikája megegyezik az MPY utasításoknál megismertekkel: MAC operandus1*operandus2,akkumulátor,forrás1x,cél1x,forrás2y,cél2y A MAC utasítás a megadott kettő operandus összeszorzás eredményét az utasításban megjelölt akkumulátorhoz (A vagy B) hozzáadja Címkék, szimbólumok A mikroprocesszor a gépi kódú programban a vezérlésátadáshoz kizárólag relatív (a vezérlésátadó utasításhoz képest előre- vagy hátrafelé mutató), illetve abszolút (a programmemória egy adott rekeszére mutató) címeket tud felhasználni. Ezek számításához vagy felhasználásához ismerni kell az adott utasítást tároló memóriarekesz címét. Ezeket a címeket a programot készítő személy meglehetősen nehezen tudná fejben tartani, ráadásul a program fejlesztése során meg is változhatnak (meg is változnak). Ugyanez a probléma az adatmemóriában tárolt elemekkel (változókkal) kapcsolatban is fennáll, nagyon könnyű elveszni az adatmemória rekeszei között. Az assembly nyelvben emiatt bevezették a szimbólum vagy más néven a címke fogalmát, amelyek rövid szöveges azonosítók.ezeket a fordítóprogram kezeli, használatukkal a 50

52 tényleges címek helyett csupán a szimbolikus neveket kell megjegyeznünk. A címkéknek a compiler vagy a linker fog végső értéket adni a fordítás és az összefűzés során, így a gépi kódú program ezen értékek alapján fog elkészülni. Fordítás közben változóként használhatók, futási időben azonban már nem léteznek. A címkékhez kétféle módon lehet értéket rendelni: implicit, vagy explicit módon. Az implicit értékadás tipikusan a program- és az adatmemória felhasználásához kötődik. A fordítóprogram mindkét memóriatípust úgynevezett szekciókra (section) bontja, amelyek egybefüggő kódrészletet vagy változókat tartalmaznak. Minden ilyen szekcióhoz tartozik egy tárolási mutató, amely az egyes elemek tárolási címét tartalmazza. Ez a szekción belüli relatív cím, minden elem lefordításakor automatikusan növekszik, a tárolt elem méretétől függően. Az implicit értékadás során a sor elején deklarált címkével jelezzük a fordítóprogram számára, hogy a címkéhez ezt a tárolási mutatót szeretnék rendelni értékként..org 0x200 ;A tárolási mutatóhoz a 0x200 értéket rendeli c1: nop ;c1 értéke 0x200 lesz c2: nop ;c2 értéke 0x202 lesz (minden utasítás páros címen) goto c1 ;Fordítás után: goto #0x200 lesz belőle Az implicit címkék értéke lehet abszolút, vagy relatív. Ha közvetlenül nem adjuk meg az adott szekció kezdőcímét, akkor a végső értéket az ilyen implicit címkékhez a linker fogja összerendelni, ekkor dől el, hogy a programmemóriában hova kerül a szekció. Ilyenkor a címkék értéke relatív. Ellenben, ha rendelkezünk az utasítás kezdőcíméről (mint a fenti példában), akkor a címkék abszolút címet kapnak, ilyenkor a linker már nem befolyásolja a szekció kezdetét. Ez esetben természetesen nekünk kell gondoskodnunk a szekciók elhelyezéséről, illetve arról, hogy ezek ne kerüljenek konfliktusba egymással. Az explicit értékadásnál mi magunk rendelünk egy konkrét értéket a címkéhez, így a fordításkor a címke értéke mindig ugyanez lesz. Felmerül a kérdés, hogy erre mi szükség van? Ha mi magunk adjuk a címkének az értéket, akkor tetszőlegesen magát az értéket is felhasználhatnánk. A magyarázat egyszerű, lehetnek olyan értékek, amelyek bár konstansnak látszanak, de valamilyen okból később megváltozhatnak. Könnyebb megérteni egy példán keresztül. A dspic sorozatban rengeteg típusú mikrovezérlő áll rendelkezésre, különböző perifériákkal. A perifériák beállítása, vezérlése az SFR területen található regiszterekkel 51

53 történik, amelyek az adatmemória alsó 2-4kB területén helyezkednek el, és a címükkel hivatkozhatunk rá. A dspic 33FJ256GP710A típus esetében a 0. DMA csatornához tartozó vezérlő regiszter a 0x380 címen helyezkedik el, tehát ha értéket akarunk neki adni, akkor valahogyan így járhatunk el: MOV MOV #0,W0 W0,0x380 A két utasítás közül az első tölti be W0-ba a regiszter kívánt értékét, míg a második ezt az értéket tölti be a vezérlő regiszterbe (erre azért van szükség, mert nem lehetséges közvetlenül egy konstans értéket mozgatni egy SFR-be). Tételezzük fel, hogy a fenti kódrészletet a program több pontján is kell használni, így előfordulási száma jelentős lesz. Mindaddig nincs probléma, amíg maradunk az adott mikrovezérlő típusnál, de máris gondot okoz, ha például váltunk egy korszerűbb típusra. A dspic 33EP256MC506 típus esetében bár az assembly program ugyanúgy működik rajta a 0. DMA csatorna vezérlőregisztere a 0xB00 címre került. Tehát elő kell keresni az összes olyan kódrészletet, ami a régi címre hivatkozik, és mindenhol le kell cserélni az újra. Ilyen esetben jön jól az explicit értékadás, egyszerűen definiálunk egy címkét (mondjuk DMA0CON néven), majd hozzárendeljük a 0x380 értéket. A kérdéses kódrészlet ezután: MOV MOV #0,W0 W0,DMA0CON Ha pedig a DMA0CON más címre kerül, akkor egyszerűen átírjuk az értékadást, a fordító pedig az összes hivatkozásnál már az új címet fogja használni. Említést érdemel, hogy az SFR-ek esetén nincs szükségünk erre, mivel a Microchip a fordítóprogrammal együtt rendelkezésre bocsátja a definíciós állományokat valamennyi vezérlő típushoz. Saját fejlesztéseknél viszont érdemes a módszert használni. Fontos megemlíteni, hogy a címkék különböző hatókörrel (scope) rendelkezhetnek. Alaphelyzetben egy forrásállományban definiált címke csak abban a forrásban érhető el, vagyis lokális hatókörű. Ha másik modulban is szeretnénk elérni, akkor meg kell változtatni a hatókört globálissá. 52

54 2.8. Direktívák A fordítás során előfordulnak olyan problémák, amelyek feloldásához a fordítóprogramnak segítségre van szüksége. Az előző fejezetben említett explicit címke értékadás is egy ilyen feladat, de említhetnénk még a lokális/globális hatókör meghatározást is. Ezt tisztán az assembly nyelv segítségével nem tudjuk megoldani, ezért a fordítóprogram további eszközöket biztosít a programozó számára. Az ilyen eszközök a forrásnyelvi programban elhelyezett szövegrészek, amelyek kicsit hasonlítanak az assembly nyelvű utasításokhoz (például lehetnek operandusai), de nem az assembly nyelv részei, tisztán a fordítóprogramhoz kötődnek. Ezeket nevezzük direktíváknak, az MPLAB-X esetében könnyű felismerni őket, mindig a. (pont) karakterrel kezdődnek. A következőkben ismertetjük a legfontosabb direktívákat és bemutatjuk használatukat Explicit címke értékadás Ilyen esetekben a címke értékét nem a mögötte álló utasítás vagy változó tárolási címe határozza meg, hanem egy külön utasítással mi adjuk meg: SYMBOL1=1.equ SYMBOL1,2.set SYMBOL1,3.equiv SYMBOL2,4 Az első módszer hasonlít a magas szintű (C, Java) programnyelvekben megismert módhoz. A következő három már a direktívák közé sorolható, első operandusuk a címke neve, a vessző utáni második operandus pedig a címkéhez rendelt érték. Az első három módszer egyenértékű, a címke viszont tetszőleges számban újra ellátható másik értékkel (újradefiniálható). Az.equiv direktíva konstansok definiálását teszi lehetővé, ha egy ilyen módszerrel létrehozott címkét próbálunk újradefiniálni, akkor fordítási hibát kapunk. Egy címke értékének egy másik címkét is megadhatunk, viszont ebben az esetben a hozzárendelt címkét már korábban definiálni kell! Címke hatókörének megváltoztatása Mint azt korábban említettük, a címkék hatóköre alaphelyzetben lokális, vagyis csak az adott modulban (az.s kiterjesztésű forrásprogram állományban) rendelkezik értékkel. Ez akkor okoz gondot, ha egy másik programmodulban is szeretnénk ezt felhasználni, ilyenkor a másik 53

55 modulban egy hibaüzenetet fogunk kapni. A megoldás a címke hatókörének megváltoztatása globálissá, amit egy direktíva segítségével végezhetünk el..global SYMBOL1 Ez a direktíva a SYMBOL1 címkét globálissá teszi. A másik modulban ahol a SYMBOL1 címkét felhasználni kívánjuk jeleznünk kell a fordítóprogramnak és a linkernek, hogy amikor erre a címkére hivatkozunk, akkor ne a helyi címkék között keresse az értéket..extern SYMBOL1 Ez az utasítás jelzi a rendszernek, hogy a SYMBOL1 címke definícióját egy külső modul végezte el Forrásnyelvi programok beillesztése Tegyük fel, hogy van egy általunk készített, kipróbált, jól működő programrészletünk. Általánosan írtuk meg, így több, különböző programban is kiválóan működik. Amikor szükségünk van rá, akkor a megfelelő forrásprogramba másoljuk. A megoldás látszólag tökéletes, azonban vannak vele kisebb problémák: Feleslegesen tartalmazza összes munkánk ugyanazt a kódrészletet. Ha mégis módosítanunk kell rajta (például mégis találunk benne hibát), akkor az összes olyan programunkban ki kell javítanunk, amiben felhasználtuk. Ez magával hozhatja a verziók különbözőségét. Hogyan tudunk ezen felülemelkedni? A fordítóprogram erre is kínál megoldást, a több helyen felhasználandó programmodult be tudjuk hivatkozni programunkba..include "p33fj256gp710.inc" A.include direktíva a hivatkozott állományt fordítás közben beépíti a programba, mintha azt mi magunk másoltuk volna oda Konstans adatok tárolása a programmemóriában Időnként előfordul, hogy a programban olyan adatokat kell felhasználni, amelyek értékét már a program írásakor ismerjük. Képzeljünk el egy olyan feladatot, amelyben egy képzeletbeli nyomtatóra kell egy szöveget kiírnunk. Hogyan járjunk el? Először is, minden egyes 54

56 karakterhez (a szöveg betűihez) hozzá kell rendelni egy kódot. Szerencsére ez a probléma már annak idején, a telex feltalálásakor felmerült, és azóta szabványossá vált az ott használt ASCII kódtábla, amely az angol ABC kis- és nagybetűihez, a számokhoz és az írásjelekhez is hozzárendel egy-egy közti számot. Képzeletbeli programunk nagyjából így nézne ki: MOV #65,W0 ; A betű CALL SendToPrinter ;Kiírás nyomtatóra MOV #66,W0 B betű CALL SendToPrinter ;Kiírás nyomtatóra ;és így tovább, a többi karakterrel Nem túl gazdaságos és elegáns megoldás. Kézenfekvő lenne, ha a szöveget karakterenként tárolnánk a programmemóriában, majd egy ciklussal kiolvasnánk onnan, és a szubrutint meghívva elküldenénk a nyomtatónak. Ezzel annyi probléma van csak, hogy assembly utasítások segítségével nagyon nehezen tudnánk szöveget vagy egyéb konstans adatot megadni a fordítónak. Szerencsére erre a célra is rendelkezésre állnak direktívák..byte 0x00,123,0b00100 A direktíva a vesszővel elválasztott operandusokatkiértékeli, majd ezeket a programmemóriában tárolja.a fordítóprogram a 24 bites memóriarekesz alsó 16 bitjét fogja csak használni, a felső 8 bit értéke 0 lesz, így a programmemória folyamatosan növekvő címein lesz elérhető a tárolt tartalom. Mivel itt byte tárolás történik, az operandus értékek el kell, hogy férjenek 8 biten. Az operandusok megadása bármelyik, a fordító által ismert számrendszerben történhetnek..word 0x1234,12710,0b fixed ,0.75 A direktíva a vesszővel elválasztott számokat a.byte direktívához hasonlóan kiértékeli, majd a programkódba tárolja 16 bites értékként. Ennek megfelelően a számoknak el kell férniük 16 biten. A.word egész számokat tárol, míg a.fixed tizedes törteket (fixpontos 1.15 ábrázolásban). 55

57 .ascii "Some text".asciz "Some text with trailing zero" Ez a direktíva a leghasznosabb szövegek tárolásakor. Az idézőjelek közé zárt szöveg összes karakterének ASCII kódja fog a programmemória egymást követő címein tárolódni.a fordítóprogram a 24 bites memóriarekesz alsó 16 bitjét fogja csak használni, a felső 8 bit értéke 0 lesz. A.asciz direktíva a szöveg utolsó karaktere után még egy 0 értéket is tárol, ezzel jelezve a szöveg végét, így a kiírató programok ezt használhatják végjelként (ez megegyezik a C programnyelvben a szövegek tárolási módszerével) Szekciók Mind a program-, mind az adatmemória szekciókra osztható, amelyek feltöltését a linker program végzi, a lehetőségekhez képest összefüggő területeket létrehozva. A szekciók használatának nagy előnye az, hogy így egy modulon belül definiálhatók a logikailag összetartozó paraméterek (például a modulhoz tartozó változók, pufferek), így a forráskód sokkal áttekinthetőbbé válik. Az assembly forrásnyelvi programban megadható, hogy az adott programrészlet vagy változóterület melyik szekcióba kerüljön. Nézzünk egy példát (utasítások nélkül):.text reset: Instruction block1.section.libc,code Instruction block2.section mysection,code Instruction block3.section.libdsp,code Instruction block4 Az Instruction block utasítások csoportját jelöli, a szekciókat pedig a.text.libc mysection.libdsp 56

58 nevekkel jelöljük. Ezek közül a legtöbb gyárilag definiált név, a mysection szekciót pedig mi hoztuk létre. A gyári szekciók tárolási sorrendje adott (a linker script tartalmazza), így a lefordított és összefűzött kód fizikai tárolása a következőképpen fog kinézni: 0x0000 GOTO reset Reset vector 0x0004 0x01fc IVT entries AIVT entries Interrupt vector table 0x0200 Instruction block2.libc section 0xXXXX Instruction block4.libdsp section 0xXXXX 0xf8000 Instruction block1 Instruction block3 Configuration registers.text section mysection section Látható, hogy a forrásprogramban elfoglalt sorrend megváltozik, a.libc és.libdsp szekciók tárolása alacsonyabb címtartományban történik, mint a.text és a mysection szekcióké. A szekciók nem csak a programmemóriában értelmezhetők, az adatmemória is felosztható, gyárilag is több szekció áll rendelkezésre. A két legfontosabb: Inicializált adat ( data ). Az itt található memóriaváltozóknak indításkor egy rövid programmodul kezdőértéket ad. Ezt a programmodult a linker automatikusan hozzáfűzi programunkhoz. Nem inicializált adat ( bss ). Az itt található memóriaváltozók nem kapnak kezdőértéket, ez a feladat a programunkra hárul. Fontos dolog az értékadás, nem támaszkodhatunk arra, hogy azok kezdőértéke bekapcsolás után 0 lesz! Az adatszekciók nyitásakor kiegészíthetjük a direktívát a near kulcsszóval, ekkor a fordítóprogram úgy allokálja a szekció kezdetét, hogy az az alsó 8kB (near RAM) területre kerüljön. Nézzünk egy egyszerű példát:.text ;Program szekcióra vált MOV #0,W0 ;W0=0 MOV W0,s1 ;s1 változó értéke 0 lesz.section bss,near ;Adatszekcióra (near RAM) vált 57

59 s1:.space 2 ;2 byte lefoglalása.text ;Visszavált program szekcióra A programrészlet definiál egy s1 nevű címkét, amelynek értéke egy near RAM memóriarekesz címe lesz, ami számára 2 byte területet is lefoglal. A fentieken kívül még rengeteg hasznos direktíva áll rendelkezésre, javasoljuk a vonatkozó Microchip dokumentáció használatát! 58

60 3. dspic beépített eszközeinek kezelése Ebben a fejezetben a teljesség igénye nélkül néhány, a dspic chip-en belül rendelkezésre álló eszközt és annak működését tekintjük át Órajel generátor A dspic33f sorozat hétféle órajel forrást képes a működéséhez felhasználni: FRC (Fast RC) oszcillátor; FRC oszcillátor egy PLL-el (a PLL programozható frekvenciasokszorozó funkciót lát el); Primary (elsődleges) oszcillátor, aminek külső frekvencia meghatározó eleme (XT: rezgőkvarc, HS: nagy sebességű rezgőkvarc) van a dspic33f OSC1 és OSC2 lábára kötve, vagy pedig külső órajel generátor (EC), ami a dspic33f OSC1 lábára csatlakozik; Primary oszcillátor PLL-el; Másodlagos (LP: lowpower) oszcillátor, ami az energiatakarékos üzemmódhoz szolgáltatja az órajelet; LPRC oszcillátor, belső alacsonyfrekvenciás RC oszcillátor; FRC oszcillátor frekvenciaosztóval. A használt oszcillátor típusát az OSCCON[14:12] regiszterbitek kombinációja határozza meg, az alábbi táblázatnak megfelelően: Kombináció Használt oszcillátor 000 FRC oszcillátor 001 FRC oszcillátor PLL-el kiegészítve 010 Elsődleges oszcillátor (XT, HS, EC) 011 Elsődleges oszcillátor (XT, HS, EC) PLL-el kiegészítve 100 Másodlagos oszcillátor 101 LPRC oszcillátor 110 Elsődleges FRC oszcillátor, 16-os osztóval kiegészítve 111 Elsődleges FRC oszcillátor, n osztóval kiegészítve A következő ábrán látható a CPU ezen részének felépítése: 59

61 6. ábra: dspic33f oszcillátor áramköre Az FRC oszcillátor egy, a chipbe integrált 7,37 MHz-en futó RC oszcillátor. Ennek használatával a dspic33f képes külső, frekvencia meghatározó alkatrészek nélküli működésre. Az ilyen felépítésű oszcillátorok frekvenciapontossága természetesen elmarad a rezgőkvarc által nyújtott pontosságtól. Az elsődleges oszcillátor (PrimaryOscillator), mely működéséhez külső frekvencia meghatározó elem szükséges, háromféle üzemmódban tud működni: 1. XT: a frekvencia meghatározó elem rezgőkvarc, 3 MHz és 10 MHz közötti frekvenciával, a kristályt az OSC1 és OSC2 kivezetésekhez kell kapcsolni. 2. HS: a frekvencia meghatározó elem nagy sebességű rezgőkvarc, 10 MHz és 40 MHz közti frekvenciával, az OSC1 és OSC2 kivezetésekhez csatlakoztatott. 3. EC: külső órajel, 0,8 MHz és 64 MHz közti frekvenciával, az OSC1 lábra kell kapcsolni. Mind az FRC, mind az elsődleges oszcillátor mögé bekapcsolható egy PLL, amennyiben az oszcillátor 1,6 MHz és 16 MHz tartományba eső frekvenciájú jelet szolgáltat. A PLL 60

62 fázisdetektora, a sokszorozási arány és a feszültségvezérelt oszcillátor utóosztója konfigurálható, így a PLL kimenetének frekvencia tartománya széles határok között (25 MHz és 160 MHz) változtatható. Az oszcillátor (illetve a PLL, ha ezt a konfigurációs bitek beiktatják) kimeneti jelét egy programozható frekvenciaosztó osztja le. Ezt a frekvenciát egy kettes osztó felezi, így alakul ki az eszköz órajele (FCY). A dspic33f architektúra maximum 40 MHz-es FCY frekvenciát engedélyez. A külső, másodlagos oszcillátor, vagy a belső LPRC oszcillátor állítja elő az alacsony fogyasztású (lowpower) módban használt órajelet. A belső LPRC oszcillátor Hz frekvenciájú, a másodlagos oszcillátor órajelét az SOSCI és SOSCO lábakra csatlakoztatott Hz frekvenciára hangolt rezgőkvarc állítja be. Az LPRC oszcillátor biztosítja a WatchdogTimer és a Fail-SafeClock Monitor órajelét is. Az órajel előállító egység blokkvázlata az alábbi ábrán látható: 7. ábra: Órajel előállító egység A PLL bekapcsolt állapota mellett az oszcillátor kimeneti frekvenciája a következő összefüggéssel határozható meg: F OSC M PLLDIV 2 Fin Fin N1 N2 ((PLLPRE 2) 2^(PLLPOST 1)) A fenti összefüggésben a következő helyettesítéseket használtuk fel: M = PLLDIV+2 N1 = PLLPRE+2 N2 = 2^(PLLPOST+1) 61

63 Az összefüggésben a többi jelölés definíciója: Fin: az FRC vagy elsődleges oszcillátor frekvenciája PLLDIV: a PLLFBD regiszter 0-8 bitje, a PLL visszacsatolás osztója (a frekvenciasokszorozás értéke) PLLPRE: a CLKDIV regiszter 0-4 bitje, a PLL fázisdetektor bemeneti osztója (bemeneti frekvenciaosztó) PLLPOST: a CLKDIV regiszter 6-7 bitje, a PLL VCO kimeneti osztója (kimeneti frekvenciaosztó) Az FCY reciproka a TCY, ami egy gépi ciklusidőt jelent. Az FCY értékét az Fosc értékéből vezethetjük le: FCY = Foszc / 2 (a PS jelölésű eszközök esetén: FCY = Foszc / 4) Az órajel számításra nézzünk egy példát! A példában nem használunk külső oszcillátort, csak a beépített Fast RC oszcillátort. Ennek Fin frekvenciája 7,37 MHz. A cél az, hogy a dspic33f CPU utasítás ciklus frekvenciája (FCY) 33 MHz környéki legyen. Első lépésben határozzuk meg a CPU típusának ismeretében az Fosc értékét: F OSC FCY 2 33MHz 2 66MHz Tudjuk, hogy: vagyis M Fosc Fin (N1 N2) M 66MHz 7,37MHz (N1 N2) Tehát három olyan számot kell keresnünk, amelyekkel elvégezve a fenti műveletet, megkapjuk a 66MHz-es értéket. A probléma egyszerűsíthető, ha figyelembe vesszük azt a tényt, hogy N2 csak 2, 4 vagy 8 értékeket vehet fel, így érdemes N2 meghatározásával kezdeni a megoldást, de nem szabad megfeledkeznünk arról, hogy az egyes belső pontokon az órajel értékeknek a katalóguslapban megadott tartományokba kell esniük: 66MHz N2 7,37MHz M N1 62

64 A 7. ábra alapján látható, hogy az N2 osztót megvalósító PLLPOST egység bemenetén 100MHz és 200MHz közötti órajel engedélyezett. Ez az N2 lehetséges értékei közül a 4-et és a 8-at kizárja, hiszen előbbivel 264MHz, utóbbival 528MHz frekvenciát kellene előállítani a szorzóáramkörrel, amit a hardver nem képes. Ezért N2 értéke 2-re adódik, és az egyenlet az alábbi formára egyszerűsödik: vagyis: 66MHz 2 7,37MHz 17,91 = M/N1 M N1 illetve: 17,91 * N1 = M Ebből kell két olyan értéket meghatároznunk, ami egyfelől megfelel a változók lehetséges értékeinek (2<N1<33, 2<M<513), másrészt pedig a meghatározott osztásértékekkel az egységek kimenetén megjelenő frekvencia elfogadható a hardver számára. Ez utóbbi feltétel a szorzóáramkör bemenetén a legerősebb, hiszen oda csak 0,8 és 8 MHz közötti frekvencia kerülhet. A PLLPRE kimenetén Fin felénél nagyobb frekvenciájú órajel nem állhat elő, így csak az alsó határfrekvenciát kell figyelemmel kísérni. Ez 2 és 9 közötti N1 értéket engedélyez. Ezek közül kell olyan értéket kiválasztani, ami a 17,91-el összeszorozva a legközelebb van egy egész számhoz (mivel M, N1 és N2 is csak egész ábrázolású lehet, ezért óhatatlanul kerekíteni kell az eredményt, ami frekvencia pontatlansághoz vezet). A legközelebb az N1=2 értéknél járunk egy egész számhoz (35,82), azonban érdemesebb a kezdeti osztót minél nagyobb értékkel kivitelezni, így az N1=9 értéket célszerű választani (161,19). Ez alapján M értékére kerekítéssel 161-et kapunk. Tehát: N2=2; PLLPOST = 0; N1=9; PLLPRE=7; M=161; PLLDIV=159; Visszahelyettesítve az eredeti frekvencia meghatározó összefüggésbe: Fosc = Fin * (PLLDIV+2)/((PLLPRE+2) * 2^(PLLPOST+1)) Fosc = 7.37MHz * (159+2)/(7+2) * 2^(0+1) 63

65 Fosc=7.37MHz * 161/(9*2) = 7.37MHz * = 65.92MHz Ebből FCY egy kettes osztással adódik: FCY = 65,92MHz/2 = 32,96MHz A példánkban látható, hogy a megadott bemeneti frekvencia használata mellett 0,04 MHz eltéréssel tudjuk előállítani a kívánt, 33 MHz-es CPU órajelet. Természetesen ehhez az is szükséges, hogy az órajel forrása a beépített FRC oszcillátor legyen, és a PLL használata is engedélyezett állapotba kerüljön Beépített perifériák A dspic33 család eszközei típustól függően számos beépített perifériát tartalmaznak. Ebben a fejezetben csak néhány periféria tárgyalására van lehetőségünk (a labormunka során használt eszközöket tekintjük át): Egyszerű I/O portok; Időzítő (Timer) modulok; SPI kommunikációs port; A/D konverter Egyszerű I/O portok A dspic33f valamennyi kivezetése (kivéve a VDD, VSS, MCLR és az OSC1/CLKIN lábakat) megosztottan, általános I/O portként, vagy a beépített perifériák ki- és bemeneteként funkcionálnak. Ez azt jelenti, hogy a dspic33f egyes kivezetései programozhatóan konfigurálhatók, ilyen módon rugalmas konfigurációt lehetővé téve (ha például nincs szükségünk A/D átalakítóra, akkor az AD konverter lábait is használhatjuk digitális ki- vagy bemenetként). A kivezetések multiplexereken keresztül kapcsolhatók át a periféria illetve a párhuzamos I/O között. A CPU logikája megakadályozza a téves konfigurálást is, amely során egy párhuzamos kimenetként használt kivezetésre egy periféria bemenete kapcsolódna. Valamennyi I/O port bemenete Schmitt triggeres, ami a bemeneti zajérzékenységet csökkenti. Összesen 7 darab 16 bites regiszter alkalmas digitális I/O funkcióra (PORTA, PORTB, PORTC, PORTD, PORTE, PORTF, PORTG), mely regiszterek nem minden bitje implementált. Az alábbi ábra egy port egy PIN-jének, (ami programozói szemmel 1 bitnek látszik) felépítését mutatja: 64

66 8. ábra: A dspic33f I/O portjainak felépítése A megfelelő portbitek digitális I/O feladatra való használatát a megfelelő beállításokkal kell kezdeni. Egy port működését 4 regiszteren keresztül lehet befolyásolni ( x jelöli a port azonosítóját): TRISx segítségével lehet a port egyes bitjeit ki- vagy bemeneti irányra definiálni. Ha a TRISx 16 bitje közül valamelyikre 1 értékét írunk, akkor a PORT megfelelő bitje bemenetté válik, a TRISx adott bitjére 0 értéket írva pedig a kimenetté. A TRISx regiszter írható és olvasható is, olvasáskor a kivezetésre beállított irányt lehet kiolvasni. A TRIS regiszterek bitjei a processzor RESET-et hatására 1 értékre állnak, vagyis az általános I/O-k bemenetként viselkednek a bekapcsolást követően. PORTx: a digitális I/O port ki- és bemeneti regisztere. Tartalmát olvasva közvetlenül a kivezetés logikai állapota olvasható le, a tartalmát felülírva viszont a kimeneti tároló (LATx) állapotát lehet megváltoztatni. A kimeneti tároló tartalma akkor is megváltozik, ha a port nincs a kivezetésre kötve (más periféria használja), vagy ha bemenetként definiált. LATx: a port kimeneti tárolója. Tetszőleges adatot ide írva megváltoztatható a kimeneti tároló állapota, amely a kivezetésen csak akkor jelenik meg, ha a port I/O használatban van, és az kimenetként definiált. ODCx: a port megfelelő bitjét Open Drain üzemmódra állítja, amellyel nagyobb kimeneti feszültségeket is képes a kivezetés kezelni (például egy +5V TTL szintekkel 65

67 működő eszközt). Az ODCx regiszter nem áll rendelkezésre azokon a portokon, amelyek analóg funkcionalitással is rendelkeznek. Lehetséges az I/O portokhoz tartozó kivezetések megváltozását megszakítással jelezni a CPU számára, így akár 24 külső megszakítási forrást felhasználva. Az alábbi rövid példaprogram elvégzi a PORTD konfigurálását olyan módon, hogy az alsó 8 bit kimenet, a felső 8 bit pedig bemenet legyen: CLR LATD ;PORTDlatch regiszterének törlése MOV #0xFF00,W0 ;D0-D7 bitek kimenetként, D8-D15 bemenetként MOV W0,TRISD ;1=bemenet, 0=kimenet A kimeneti bitek kezelése a bitkezelő utasítások segítségével lehetséges: BCLR PORTD,#1 ;A PORTD b1 bitjének 0-ra állítása NOP BSET PORTD,#2 ;A PORTD b2 bitjének 1-re állítása Fontos megjegyeznünk, hogy a pipeline működés miatt, ha egy portregiszterrel bármilyen műveletet végzünk, legyen az a fenti példa szerinti bitmanipulációs művelet, vagy akár byteos, vagy szavas adatmozgatás, egy utasításnyi időt várnunk kell, mielőtt ezen port bármilyen regiszterével újabb utasítást végeznénk! A fenti példában a BCLR és a BSET utasítás közti NOP-nak ez a magyarázata Időzítő (Timer) modulok A dspic33f kilenc időzítő egységet tartalmaz, amelyből az első számú (Timer1) működése különbözik a többitől. Az egység blokkvázlatát a következő ábra mutatja. 66

68 9. ábra: A dspic33f TIMER1 felépítése A Timer1 a TCS (Timer1 ClockSourceSelect) bit 1 állapota esetén az órajelet a másodlagos oszcillátorból kapja, 0 állapot esetén pedig a rendszer órajeléből. A TGATE (Timer1 Gated Time AccumulationEnable) bit 0 állapota esetén a rendszer órajele akadálytalanul jut a bemenetre, míg 1 állapot esetén csak a másodlagos oszcillátor jelének logikai magas állapota esetén (kapuzás). Az így kapott órajel a TON (Timer1 On) bit állapotától függően jut el az előosztóra (ha a TON 0 értékű, akkor a Timer1 nem kap órajelet, tehát áll). Az előosztó 1, 8, 64 és 256 mértékű frekvenciaosztást képes végezni a TCKPS (Timer1 Input ClockPrescaleSelect) bitcsoport állapotától függően. Ezután a TSYNC (Timer1 ExternalClockSynchronizationSelect) bit állásától függően szinkronizáció ( 1 állapot) történik. Az így előálló órajel kerül rá a TMR1 (Timer1) számlálóra, amelynek tartalmát a CPU bármikor képes kiolvasni. A TMR1 és a szabadon programozható PR1 regiszterek értékét egy komparátor hasonlítja össze, egyenlőség esetén a komparátor kimenete nullázza a TMR1 számlálót, egyúttal beállítja a T1IF (Timer1 InterruptFlag) bitet, ami a megfelelően engedélyezett megszakítás elfogadás esetén megszakítja a program futását. Ismert frekvenciájú órajellel táplálva a TMR1 számlálót (ez biztosítható, ha a rendszer órajelből indulunk ki, és megfelelő előosztó értéket állítunk be), a PR1-ben beállított értéket elérve keletkezik megszakítás, emiatt a Timer1 kiválóan alkalmas rendszeresen bekövetkező események kiváltására. A Timer1 konfigurációs regisztere a T1CON, felépítését a következő ábra mutatja be. 67

69 10. ábra: A T1CON SFR bitjei A dspic33f eszközökbe Timer2/3, Timer4/5, Timer6/7, és Timer8/9 32 bites timer-pár modult építettek, melyek akár két egymástól független működésre is képes, 16 bites eszközre választhatók szét (például a 32 bites Timer2/3, Timer2-re és Timer3-ra). Egy 32 bites timer modul blokkvázlata látható a következő ábrán: 11. ábra: 32 bites TIMER kialakítás A Timer2/3, Timer4/5, Timer6/7, és Timer8/9 eszközöknek három működési módja értelmezhető: 68

70 2db független kialakítású 16 bites Timer; Egy 32 bites Timer; Egy 32 bites szinkron számláló. A dspic33f-be épített A/D konverterek szempontjából a Timer3 és a Timer5 kiemelt jelentőségű, segítségükkel az ADC-k mintavételezés ütemezése (vagyis a mintavételi frekvencia) kristálypontosan egy kívánt értékre állítható. A szétválasztott Timer felépítése (jelen esetben a Timer2) a következő ábrán látható: 12. ábra: 16 bites TIMER kialakítás (TIMER2) A timerek működési módjának beállítása szintén speciális célú regiszterekkel, a TxCON (T2CON, T4CON, T6CON vagy T8CON), valamint a TyCON (T3CON, T5CON, T7CON vagy T9CON) regiszterekkel történhet. A TxCON bitjei a következők: 13. ábra: A TxCON regiszter felépítése (x=2,4,6 vagy 8) Az egyes bitek jelentése a következő: TON <15.> - Timer ON bit 32 bites üzemmódban: 1 Timer x/y fut; 0 Timer x/y áll. 69

71 16 bites üzemmódban: 1 Timer x fut; 0 Timer x áll. TSIDL <13.> - Timer Stop inidlemode bit Abban az esetben, ha ez a bit 1, és a CPU-t Idle módba kapcsoljuk, akkor az adott Timer x/y, vagy a Timer x is Idle módba kerül. A bit 0 -ba állításával pedig azt érhetjük el, hogy Idle módban a Timer folytatja a működést, vagyis aktív marad. TGATE <6.> - TimerxGated Time AccummulationEnable bit A TCS bit 1 értéke esetén ez a bit hatástalan, de ha TCS = 0, akkor segítségével a Timerx működése kapuzható: 1 Timer akkumuláció engedélyezett; 0 Timer akkumuláció tiltott. TCKPS <5. 4.> - Timer Input PrescaleSelect bit Két bit segítségével a Timerx órajel előosztása határozható meg: 11 = 1: = 1:64 01 = 1:8 00 = 1:1 T32 <3.> - TimerModeSelect bit 1 a Timer x és a Timer y egy 32 bites timerként (Timer x/y) működik; 0 a Timer x és a Timer y kettő 16 bites timerként működik. TCS <1.> - TimerxClockSourceSelect bit Ezzel a bittel választhatjuk ki az adott Timer órajel forrását: 1 külső órajel forrás a TxCK lábon (a számlálás a felfutó élre történik); 0 belső órajel a forrás (FCY) 70

72 A TyCON bitjei a következők: 14. ábra: A TyCON regiszter felépítése (y=3,5,7 vagy 9) A TyCON bitek kizárólag 16 bites üzemmódban értelmezhetők, 32 bites működés esetén hatástalanok! Az egyes bitek jelentése a következő: TON <15.> - Timer ON bit 1 Timer y fut; 0 Timer y áll. TSIDL <13.> - Timer Stop inidlemode bit Abban az esetben, ha ez a bit 1, és a CPU-t Idle módba kapcsoljuk, akkor az adott Timer y is Idle módba kerül. A bit 0 -ba állításával pedig azt érhetjük el, hogy Idle módban a Timer y folytatja a működést, vagyis az aktív marad. TGATE <6.> - Timer y Gated Time AccummulationEnable bit A TCS bit 1 értéke esetén ez a bit hatástalan, de ha TCS = 0, akkor segítségével a Timer y működése kapuzható: 1 Timer akkumuláció engedélyezett; 0 Timer akkumuláció tiltott. TCKPS <5. 4.> - Timer Input PrescaleSelect bit Két bit segítségével a Timer y órajel előosztása határozható meg: 11 = 1: = 1:64 01 = 1:8 00 = 1:1 TCS <1.> - TimerxClockSourceSelect bit Ezzel a bittel választhatjuk ki az adott Timer órajel forrását: 1 külső órajel forrás a TxCK lábon (a számlálás a felfutó élre történik); 0 belső órajel a forrás (FCY) 71

73 SPI kommunikációs port Az SPI (SerialPeripheralInterface) BUS-t a Motorola cég fejlesztette ki. Az SPI BUS négyvezetékes, kétirányú (duplex) elsősorban integrált áramkörök közti kommunikációs céllal kialakított kommunikációs csatorna. Az SPI BUS segítségével számos periféria, például A/D, D/A konverter, EEPROM, LCD stb. illeszthető a jelfeldolgozó CHIP-hez. Az átviteli mód szinkron soros kommunikáció. 15. ábra: SPI kommunikáció idődiagramja A kommunikációt szinkronizáló eszköz mindig a master. A kommunikációs sínen egyszerre csak egy master eszköz, és egy vagy akár több slave működhet (több slave egyidejű működése esetén a kommunikáció csak speciális módon folyhat). Több slave eszköz kapcsolódhat a sínre, de közülük mindig csak egy változtathatja meg az adatvezeték állapotát, az aktív eszközt minden esetben a master eszköz jelöli ki az erre szolgáló vezetékkel, melyet Chip Select-nek (CS), vagy Slave Select-nek (SS) neveznek. A master eszköznek a kommunikációs jelvezetékeken kívül annyi CS kimeneti porttal kell rendelkeznie, ahány slave eszköz került felfűzésre az SPI buszon. A kommunikációs vonalak a következők: SI Serial Input SO Serial Output SCLK SerialCLocK A slave eszköz soros ki- és bemenetét gyakran DI Data Input DO Data Output elnevezést kapja. 72

74 A master és slave eszköz kivezetéseit, valamint a kommunikációs vonalakat gyakran (az egyértelműség kedvéért) a MOSI Master Output Slave Input MISO Master Input Slave Output elnevezésekkel illetik. 16. ábra: SPI busz blokkvázlata (bal oldalon a master, jobb oldalon a slave eszköz) A jelvezetékeken a vonali kódolás NRZ TTL, a jelszintek mindig a közös nullponthoz (GND) viszonyítottak. Az adatátvitelt a master által szolgáltatott SCLK jelvezetéken megjelenő órajel ütemezi. A dspic33f az SPI kommunikációt hardveresen támogatja, a dspic33fj256gp710 CHIP például két beépített SPI interfészt (SPI1 és SPI2) tartalmaz. Mindkét SPI modul egy-egy 16 bites shift regisztert foglal magába, melyet SPI1SR, illetve SPI2SR-nek jelölnek. A shift regiszter segítségével léptethetjük be (IN) és léptethetjük ki (OUT) az adatokat. A katalóguslapban gyakran találkozhatunk az SPIxSR jelöléssel (ezt a jelölést mi is alkalmazzuk a továbbiakban), ahol az x értéke értelemszerűen 1 vagy 2 lehet. Mindkét SPI modul tartalmaz továbbá egy-egy buffer regisztert (SPIxBUF). Az SPI modul konfigurálása az SPIxCONF regiszter bitjeinek állításával történik. Az SPI modul állapotát jelző státuszbiteket az SPIxSTAT regiszter tartalmazza. Az interfész fizikai rétegét 4 vezeték alkotja: SDIx (Serial Data Input); 73

75 SDOx (Serial Data Output); SCKx (Shift ClocKin/out); SSx (Slave Select). Az SDI vezeték minden esetben bemeneti jelvezeték, melyen az órajel ütemében fogadja a CHIP az adatokat. Az SDO jelvezeték kimeneti, melyen a CHIP az órajel ütemében lépteti ki az adatot. Az SCK jelvezeték ki-,vagy bemeneti órajel vezeték, attól függően, hogy a dspic33f SPI interfésze Master vagy Slave módban működik. Az SPI interfész működése során 8, vagy 16 bit információ lép ki az SDOx jelvezetéken az SPIxSR regiszterből és ezzel egyidőben 8, illetve 16 bit lép be az SDIx vezetéken. Abban az esetben, ha az átvitel befejeződött, akkor az adott interfészhez tartozó SPIxIFflag 1 -be billen, ami megszakításkérést generál. Az SPIx interfészhez tartozó megszakításkérés engedélyezés és tiltás az SPIxIE bittel valósulhat meg. Az SPI modul a vétel tekintetében duplán pufferelt. Komplett byte vételét követően a vett adat átmásolásra kerül az SPIxSR-ből az SPIxBUF regiszterbe. Túlcsordulás esetén az újonnan érkező adat elvész, a problémát az SPIROV bit jelzi. Az SPI modul adása szintén duplán pufferelt. A felhasználói program az SPIxBUF-ot írja, mely automatikusan átmásolódik az SPIxSR-be, ha az üres. 17. ábra: A dspic33f SPI kommunikációs modulja 74

76 A dspic33f SPI moduljának beállítása Master módba a következő lépésekből áll: 1. Megszakítás használata esetén - Töröljük az SPIxIF bitet (IFSn regiszterben); - Beállítjuk 1 -be az SPIxIE bitet (IECn regiszterben); - Beállítjuk a megszakításhoz tartozó prioritást az SPIxIP bitek segítségével. 2. A kívánt működést beállítjuk az SPIxCON regiszterbe (MSTEN bit-et 1 -be) 3. Töröljük az SPIROV bitet. 4. Engedélyezzük az SPI működését az SPIEN bit 1 -be állításával (SPIxSTAT byte 15. bitje). 5. Az adni kívánt adatot beírjuk az SPIxBUF-ba. (Az adás és a vétel az SPIxBUF írását követően megkezdődik). A dspic33f SPI interfészét Master módban használva az SPI órajelet a mikrovezérlő állítja elő. Az órajel frekvenciáját programozható osztókkal állíthatjuk be. A programozható osztó két tagból, primary és secondary-ból áll (SPIxCON1 SFR-ben kaptak helyet). Az alap órajel a processzor FCY jele. A modul működési frekvenciája a következő módon számítható ki: F SCK FCY Primary Secondary A dspic33 SPI moduljának beállítása Slave módba a következő lépésekből áll: 1. Töröljük az SPIxBUF regisztert. 2. Megszakítás használata esetén: - Töröljük az SPIxIF bitet (IFSn regiszter); - Beállítjuk 1 -be az SPIxIE bitet (IECn regiszterben); - Beállítjuk a megszakításhoz tartozó prioritást az SPIxIP bitek segítségével. 3. A kívánt működést beállítjuk az SPIxCON1 és az SPIxCON2 regiszterbe (Az MSTEN bit-et 0 -ba állítjuk). 4. Töröljük az SMP bitet. 5. Abban az esetben, ha a CKE bit 1, akkor az SSEN bit-et (SPIxCON regiszter 7. bit) 1 -be kell állítanunk ahhoz, hogy engedélyezzük az SSx-et (Slave Select kivezetés). 6. Töröljük az SPIROV bitet. 7. Engedélyezzük az SPI működését az SPIEN bit 1 -be állításával. 75

77 SPI modul működés beállítását az adott modul speciális funkciójú regisztereivel (SFR) tehetjük meg.az SPI státusz regiszter azspixstat, melynek bitjeit a következő ábra szemlélteti: 18. ábra: A dspic33f SPIxSTAT SFR bitjei Az SPIxSTAT regiszter bitjei és jelentése a következő: Bit Bit jelentése: SPIEN 1 engedélyezi az SPI modul működését, soros kommunikációs portnak konfigurálja az SCKx, SDOx, SDIx és SSx kivezetéseket; 0 tiltja az SPI működést. SPISIDL 1 a dspic33f IDLE módba kapcsolása esetén az SPI modul is leáll; 0 a CHIP IDLE módba állítását követően az SPI periféria működőképes marad. SPIROV Vételi túlcsordulást jelző FLAG 1 túlcsordulás esemény jelzése; 0 nincs túlcsordulás. SPITBF Adási buffer telítettségét jelző FLAG (Automatikusan 1 -be áll, amikor a CPU az SPIxBUF területre ír, az SPIxTXB-t tölti, valamint automatikusan 0 -ba vált, amikor az SPIx modul az SPIxTXB-ből az adatot a kimeneti shift regiszterbe, az SPIxSR-be írja.) 1 adás még nem kezdődött meg, az SPIxTXB-ben adat található; 0 adás megkezdődött, az SPIxTXB üres. SPIRBF Vételi buffer megtelt állapotát jelző FLAG 1 a vétel befejeződött, az SPIxRXB-ben adat található; 0 a vétel még nem fejeződött be, az SPIxRXB üres. (Automatikusan áll 1 -be, amikor az SPIx adatot mozgat a vételi shift regiszterből, az SPIxSR-ből az SPIxRXB-be) 76

78 Az SPI kontrol1 regiszter azspixcon1, melynek bitjeit a következő ábra szemlélteti: 19. ábra: A dspic33f SPIxCON1 SFR bitjei Az SPIxCON1 regiszter bitjei és jelentése a következő: Bit Bit jelentése: DISSCK Az SCKx kivezetés tiltható (kizárólag Master módban értelmezett), 1 SPI belső órajel tiltott, a kivezetés normál I/O-ként működik; 0 az SPI belső órajel engedélyezett. DISSDO Az SDOx kivezetés tiltható ezzel a bittel. 1 SDOx tiltott, a kivezetés normál I/O-ként működik; 0 az SDOx működése engedélyezett, azt az SPIx modul kontrollálja. MODE16 16 bites, illetve byte-os működési mód választás. 1 a kommunikációs szó hossza 16 bit; 0 a kommunikációs szó hossza 8 bit. SMP Bemenő adat mintavételi fázisát meghatározó bit. Konfigurálásra ez a bit kizárólag az SPI modul Master módjában használható, Slave módban ezt a bitet törölni kell. 1 a bemenő adat mintavételezése a kimenő adat végén következik be; 0 a bemenő adat mintavételezése a kimenő adatbit közepénél történik. CKE Órajel él kiválasztó bit. 1 a kimeneti adat az SDOx kivezetésen az órajel aktív-nyugalmi átmeneténél következik be; 0 a kimeneti adat az SDOx kivezetésen az órajel nyugalmi-aktív átmeneténél történik. 77

79 SSEN CKP MSTEN SPRE<2:0> PPRE<1:0> (Az órajel nyugalmi és az aktív állapot beállítását lásd a CKP bitnél!) (A CKE bit nem használatos, ha az SPI interfészt keretszervezett módban használjuk, ekkor a CKE-t 0 -ba kell állítani. A keretszervezett mód beállítást lásd az FRMEN bit leírásánál!) Slave üzemmódban a Slave Select engedélyezés. 1 -SSx kivezetés engedélyezett; 0 -SSx tiltott. Órajel polaritást beállító bit. 1 órajel nyugalmi állapota = magas (H) szint, aktív állapota = L; 0 órajel aktív állapota = magas (H) szint, nyugalmi állapota = L; Master/Slave üzemmód kiválasztó bit. 1 Master; 0 Slave. Kizárólag Master módban értelmezett, órajel előosztó (Secondary) programozáshoz : 1 osztásarány; : 1 osztásarány; : 1 osztásarány Kizárólag Master módban értelmezett, órajel előosztó (Primary) programozáshoz : 1 osztásarány; 10 4 : 1 osztásarány; : 1 osztásarány; : 1 osztásarány; A kontrol2 regiszter elnevezése azspixcon2: 20. ábra: A dspic33f SPIxCON2 SFR bitjei 78

80 Az SPIxCON2 regiszter bitjei és jelentése a következő: Bit FRMEN SPIFSD FRMPOL FRMDLY Bit jelentése: Keretszervezett SPI üzemmód beállító bit. 1 Keretszervezett SPIx működés, ebben az esetben a SSx kivezetést keret szinkron impulzus kivezetésnek használjuk; 0 Keretszervezett működés tiltott. Keret szinkron impulzus irányt beállító bit. 1 Keret szinkron impulzus bemenet a SSx (Slave); 0 Keret szinkron impulzus kimenet a SSx (Master). Keret szinkron impulzus polaritást beállító bit. 1 aktív magas szint a keret szinkron impulzus; 0 aktív alacsony szint a keret szinkron impulzus. Keret szinkron impulzus él választó bit. 1 keret szinkron impulzus egybeesik az első bit órajelével; 0 keret szinkron impulzus megelőzi az első bit órajelét A/D konverter A dspic33 két független A/D konverterrel rendelkezik, amelynek elnevezése ADC1 és ADC2. Mindkét konverterhez saját regiszterek tartoznak, ezért a katalóguslapokban például a következő elnevezést találjuk: ADxPCFG, ahol az x=1, vagy 2 érték lehet. Az A/D konverterek felépítését a következő ábra mutatja. 79

81 21. ábra: A dspic33f ADC1 belső felépítése A dspic33 mikrovezérlő összesen 32 analóg bemenettel rendelkezik, amelyek közül bármelyik rákapcsolható az ADC1 modul bemenetére egy analóg multiplexer segítségével. Az ADC2 konverter bemenetére csak az AN0-AN15 bemenetek multiplexelhetők. Az A/D átalakító 4 független mintavevő és tartó (S/H) áramkörrel rendelkezik, amelyek egyidejűleg 4 analóg bemenet kezelését teszik lehetővé. Az ADC áramkörök a fokozatos közelítés elvén működnek (SAR SuccessiveAppRoximation), amely 10 vagy 12 bites digitális értékre konvertálásra képes. Fontos megemlíteni, hogy 12 bites üzemmódban csak a CH0 S/H áramkör képes működni, míg 10 bites üzemmódban mind a 4 csatorna. A mintavételezési és 80

82 átalakítási sebesség 1,1MSample/s 10 bites, míg 5,5MSample/s 12 bites módban. Az A/D konverterek referenciafeszültségét lehet külön lábakon biztosítani (VRef+ és VRef-), illetve bizonyos AN bemeneteken is. A mintavétel történhet automatikusan, de akár indíthatjuk azt a felhasználói programból is. A konverzió befejeződését a konverter modul egy bit beállításával jelzi, mely eseményhez, akár megszakítást is rendelhetünk. Az analóg bemeneti értéknek megfelelő bináris szám kimeneti formátuma négyféle lehet: előjeles egész vagy tört, illetve előjel nélküli egész vagy tört. A mikrovezérlő kivezetései közül analóg működésre az AD1PCFGH, AD1PCFGL, AD2PCFGL regiszterek bitjeinek 0 -ra írásával állíthatjuk be a kiválasztottakat. Ha a bit 0 értékű, akkor a kivezetés analóg, ha 1 értékű, akkor digitális I/O. Az ADC2 csak 16 kivezetés közül tud választani, ezért az ADC2PCFGH regiszter nem létezik. 22. ábra: A dspic33f ADCxPCFGL SFR bitjei A következő lépésben az egyik mintavevő és tartó áramkör bemenetére kell kapcsolni egy megfelelő analóg bemenetet. Ezt a hozzárendelést az ADxCHS0 (Channel 0) vagy az ADxCHS123 regiszterek módosításával érhetjük el. Az ADxCHS0 regiszter és bitjei: 23. ábra: A dspic33f ADxCHS0 SFR bitjei 24. ábra: A dspic33f ADxCHS123 SFR bitjei 81

83 Ezután be kell állítani az A/D átalakító üzemmódját, amire az ADxCON1, ADxCON2 és ADxCON3 regiszterek szolgálnak. 25. ábra: A dspic33f ADxCON1 SFR bitjei Az ADON bit <15.> 1 értékre állításával kapcsolhatjuk be az adott A/D konvertert, a 0 érték az adott konverter kikapcsolását eredményezi. Nagyon fontos, hogy mindig kikapcsolt A/D konvertert konfiguráljunk, és miután befejeztük a működési módok beállítását, csakis ezután kapcsoljuk be, például a BSET AD1CON1,#ADON utasítással! ADSIDL bit <13.>, abban az esetben, ha ez a bit 1, és a CPU-t Idle módba kapcsoljuk, akkor az A/D konverter is Idle módba kerül. A bit 0 -ba állításával pedig azt érhetjük el, hogy Idle módban az A/D konverter folytatja a működést, vagyis aktív marad. Az AD12B bit <10.> segítségével választhatjuk ki, hogy az A/D konverter egy csatornás, 12 bites módban ( 1 ), vagy négy csatornás 10 bites módban ( 0 ) működjön. A FORM bitek <1.-0.> segítségével határozhatjuk meg a konverziós eredmény számábrázolás módját: FORM<1:0> bit Számábrázolási mód: 1 1 Előjeles tört 1 0 Tört 0 1 Előjeles egész 0 0 Egész Az ASAMP bit <2.> (auto start bit) 0 értékre állítása esetén a konverzió akkor indul, amikor a SAMP bitet <1.> 1 értékre állítjuk. A konverzió végét a DONE státusz bit 1 értékre váltása fogja jelezni. 82

84 26. ábra: A dspic33f ADxCON2 SFR bitjei Az ADxCON2 regiszterben VCFG<2:0> bitekkel határozhatjuk meg a mintavevő/tartó áramkör referenciafeszültségét, mely a következő lehet: VCFG<2:0> bit ADREF+ ADREF AVDD AVSS 1 x x AVDD AVSS Ext.Vref+ AVSS AVDD Ext.Vref Ext.Vref+ Ext.Vref- Az A/D konverter működtető órajelét (annak forrását) az ADxCON3 regiszterben állíthatjuk be. 27. ábra: A dspic33f ADxCON3 SFR bitjei Az A/D konverter számára a következő áramkör állítja elő az órajelet: 83

85 28. ábra: A dspic33f A/D konverter órajele Az A/D konvertert alapvetően háromféle módszerrel használhatjuk. Lehetséges kézi indítással, vagyis az alkalmazói program indítja a mintavételezést, majd pedig a konverziót. Timer eszköz eseménye indítja a konverziót. autoconvert üzemmód, ekkor az előző konverzió után automatikusan indul a mintavételezés, a mintavételezés végén pedig a konverzió. A konverzió befejeződése után kezdődik elölről a folyamat. Az alábbiakban az egyes üzemmódokhoz tartozó mintabeállításokat ismertetjük. A példákban az ADC1 konvertert használjuk. 84

86 Programvezérelt konverzió Ebben az üzemmódban a mintavételezést a SAMP bit 1 értékűre állításával kezdeményezheti a program. Ennek a bitnek a nullázása leválasztja a mintavevő-tartó áramkört a bemenetről, és automatikusan elindítja a konverziót. A konverzió végét a DONE bit 1 értékre billenése, illetve egy megszakítás jelzi (amennyiben az engedélyezett). MOV #0xfff7,W0 ; PORTB = digitális; RB3 = analóg ;(aluláteresztő szűrőre kapcsolódik) MOV W0,AD1PCFGL MOV #0x0700,W0 ; előjeles tört<98>='11' MOV W0,AD1CON1 ; SAMP bit = 0 befejezi a mintavételt ;és indítja a konverziót MOV #0x0003,W0 ; RB3-at CH0 bemenetére kapcsolja MOV W0,AD1CHS0 ; (AN3 bemenet) CLR AD1CSSL MOV #0x0002,W0 ; Kézi mintavétel, Tad = 2 Tcy MOV CLR W0,AD1CON3 AD1CON2 BSET AD1CON1,#ADON ; ADC bekapcsolása Szinkronizált konverzió Lehetőség van arra, hogy a dspic33f-be épített AD konverterek (ADC1 és ADC2) mintavételezésének és konverziójának ütemezését általános időzítő eszközzel (úgynevezett GP TIMER-rel) határozzuk meg. Az ADC1 esetén a Timer3, míg az ADC2 esetén a Timer5 időzítőt alkalmazhatjuk erre a feladatra. A TIMER-rel ütemezett konverzió beállítását az ADxCON1 regiszter SSRC (SampleClockSourceSelect) bitjeivel (ADxCON1 <7-5>) végezhetjük, melyeket ekkor ra kell állítani. A Timer3 és Timer5 leírását lásd a Timerek alfejezetben! 85

87 MOV #0x0030,W0 ;Összes ANx láb analóg, kivéve AN20/RA12 és AN21/AN13 MOV W0,AD1PCFGH ;amelyek a PORTE 0 és 1 bitjei MOV #0xfff7,W0 ;PORTB valamennyi bitje digitális, kivéve PORTB3 MOV W0,AD1PCFGL ;(aluláteresztő szűrő) MOV #0b ,W0 ;A/D konverter üzemmódja: ;AD12B=1->12 bites A/D ;FORM=11->Előjeles törtszám ábrázolás ;SSRC=010->timerszinkronizáció ;ASAM=1->autosample MOV W0,AD1CON1 ;ADON=0->ADC ideiglenesen kikapcsolva MOV #0x0003,W0 ;RB3/AN3 rákapcsolása a CH0 bemenetére MOV W0,AD1CHS0 ;vagyis az aluláteresztő szűrőre CLR AD1CSSL ;Bemenetiscan letiltása MOV #0x0110,W0 ;Autosample 1 TAD ideig MOV W0,AD1CON3 ;TAD=16 TCY CLR AD1CON2 ;CH0 kiválasztása, nincs DMA BSET AD1CON1,#ADON BSET IEC0,#AD1IE ;ADC1 bekapcsolása ;ADC1 megszakítás engedélyezése Autoconvert üzemmód Ebben az üzemmódban beállítható a mintavételezés ideje, illetve maga az A/D konverter órajele (amit a rendszerórajelciklusainak számában adnak meg). A mérés végét egy megszakítás jelzi, a kiszolgáló szubrutin kiolvashatja a pufferből a konvertált értéket, miközben a konverter már a következő mintavett jel feldolgozását végzi. A mintavételezési frekvenciát a konverter bitszélessége (a példában 12 bit), illetve a TAD ciklusidő mértéke határozza meg. 86

88 MOV #0x0030,W0 ;Összes ANx láb analóg, kivéve AN24 és AN25 MOV W0,AD1PCFGH ;amelyek a PORTE 0 és 1 bitjei MOV #0xfff7,W0 ;PORTB valamennyi bitje digitális, kivéve PORTB3 MOV W0,AD1PCFGL ;(aluláteresztő szűrő) MOV #0b ,W0 ;A/D konverter üzemmódja: ;AD12B=1->12 bites A/D ;FORM=11->Előjeles törtszám ábrázolás ;SSRC=111->auto konverzió ;ASAM=1->autosample MOV W0,AD1CON1 ;ADON=0->ADC ideiglenesen kikapcsolva MOV #0x0003,W0 ;RB3/AN3 rákapcsolása a CH0 bemenetére MOV W0,AD1CHS0 ;vagyis az aluláteresztő szűrőre CLR AD1CSSL ;Bemenetiscan letiltása MOV #0x0125,W0 ;Autosample 1 TAD ideig MOV W0,AD1CON3 ;TAD=37 TCY CLR AD1CON2 ;CH0 kiválasztása, nincs DMA BSET AD1CON1,#ADON BSET IEC0,#AD1IE ;ADC1 bekapcsolása ;ADC1 megszakítás engedélyezése 87

89 4. dspicdemó kártya felépítése A laboratóriumi munkához a MicrochipdsPICDEM demó kártyát használjuk, melyre dspic33fj256gp710 kontrollert csatlakoztattunk. A demó kártya kialakítását a következő ábra szemlélteti: 29. ábra: dspicdem demó kártya felépítése Néhány fontos építőelemet a fenti ábrán beszámozással jelöltünk, melyek a következők: 1. Stabilizált tápfeszültséget beállító jumper (J5), segítségével 3,3V és 5V állítható be. Jelen esetben a használt dspic33 processzor 3,3V DC táplálást igényel, ezért a J5 jumpertnyitott állapotban kell hagyni! 2. Stabilizátor IC. 3. DC tápcsatlakozó (9V stabilizálatlan egyenfeszültség bemenet). 4. Tápfeszültség polaritás felcserélés esetén védelmet jelentő diódahíd. 5. Vdd ellenőrzésére szolgáló mérőpont khz kristály, mely jelen esetben a dspic 73. és 74. kivezetéseihez kapcsolódik 88

90 7. Poweron LED, mely áramkorlátozó ellenálláson keresztül a stabilizált tápfeszültségre kapcsolódik. 8. Y1 kristály (7,37 MHz), mely a dspic 63. és 64. kivezetéseihez kapcsolódik. 9. Y3 kristály hely, jelenleg üres, nem használjuk. 10. PIM csatlakozó tüskesor, ide kapcsolódik a dspic33 processzor). 11. Fejlesztői (prototype) felület. 12. U4 integrált áramkör nincs beültetve, nem használjuk. 13. Potenciométer, melynek csúszkája az RB2/AN2 dspic kivezetésre kapcsolódik, az ellenállás két vége pedig a GND-re és a Vdd-re csatlakozik. 14. Analóg bemenet és digitális potenciométer kimeneti pont. Az analóg bemenet egy műveleti erősítős áramkörön keresztül az RB3/AN3 dspic kivezetésre csatolja a jelet. 15. U5 duál műveleti erősítő, melyből aktív RC aluláteresztő szűrők lettek kialakítva. Az egyik fokozat a bemenő jel sávkorlátozását, míg a másik a digitális potenciométer leosztott feszültéségét szűri. 16. U2 integrált áramkör, SPI interfészen programozható digitális potenciométer (MCP41010). 17. P2 csatlakozó sor (kétsoros 1# kiosztású). Ez a csatlakozó sor a processzor számos kivezetését teszi hozzáférhetővé, erre a csatlakozóra építettük a 12 bites D/A konvertert és az analóg helyreállító szűrő áramkört (lásd később). A csatlakozó kiosztását lásd a következő ábrán! 18. Nyomógombok, melyek lenyomott állapotban logikai 0 szintet adnak az RA12, illetve az RA13 portra. 19. J4 jumper a 4db LED közös Katódja ezen keresztül kapcsolódik a GND-re. 20. LED-ek (4db), melyek az RD4 RD7portra kapcsolódnak. 21. MCLR nyomógomb (Master CLeaR), segítségével a processzor újraindítható. 22. RJ11 csatlakozó aljzat az ICD3 fejlesztő eszköz csatlakoztatásához. 23. UART RS232 szintillesztő áramkör. 24. D9 RS232 csatlakozó. 89

91 30. ábra: dspicdem kártya kétsoros csatlakozó kiosztása 4.1. Tápellátás A demó panel saját tápstabilizátor áramkörrel rendelkezik. Az egyenirányított, szűrt 9V-os feszültséget a J2 tápcsatlakozón kapcsolhatjuk az áramkörre. A CR1 graetz jóvoltából a pozitív és negatív polaritás felcserélhető. A C3, C4 és C5 kondenzátorok a zavarok szűrését végzik. Abban az esetben, ha a C4 kapacitása nagyobb lenne, akkor puffer funkciót is elláthatna, így az áramkör akár váltakozó feszültségű adapterről is üzemelhetne, de az alkalmazott 470µF a puffer funkcióhoz nem elegendő. A stabilizálást a változtatható kimenő feszültségű LM317 áteresztő tranzisztoros stabilizátor IC végzi. Az áramkör IN (3.) és OUT (2.) kivezetései közötti feszültség és a rajta átfolyó áram szorzatát, mint hőteljesítményt a chip eldisszipálja. A stabilizált feszültség jelen kapcsolásban 3,3V, illetve 5V lehet a J5 jumper állásától függően. Katalógusadat alapjána kimenő feszültség (TP1 mérőponton) nyitott J5 állapotban: ( ) Az összefüggésben az Iadj áram a stabilizátor ADJ kimenetén kifolyó áram értéke. 31. ábra: Tápstabilizálás 90

92 A stabilizátor kimeneten a C11 és C6 kondenzátorok szűrési feladatokat látnak el. A D1 LED a bekapcsolt állapotot indikálja. Az analóg áramköröknek további RC szűréssel (R10, C7, C8) tisztított tápfeszültség áll elő a +VAN ponton, ami beállítástól függően +3,3V illetve +5V lehet Processzor programozás és RESET funkció A dspic33 processzort a demó kártyában programozhatjuk az erre alkalmas (például ICD2, ICD3, Pickit stb.) fejlesztő eszközzel. A programozó eszköz csatlakoztatásához RJ11 aljzat áll rendelkezésre. 32. ábra: Programozó csatlakozó Az In-circuit programozás a PGD és PGC soros kommunikációs vonalakon történik. A programozó vezérli a processzor MCLR (Master Clear), reset vonalát is. A demó panelon helyet kapott egy MCLR elnevezésű nyomógomb is, mely segítségével a dspic újraindítható. Ez a nyomógomb szintén a MCLR vonalat vezérli. 33. ábra: MCLR nyomógomb áramköre Az S3 nyomógomb megnyomásakor az R1 ellenálláson keresztül a MCLR vonalat 0 jelszintre húzza. Az R1 ellenállás védelmi szerepet tölt be, hiszen ha a demó kártyához 91

93 programozó eszköz is csatlakozik, akkor az MCLR jelvezeték vezérlésére az is képes, és így ellentétes jelszintet adó kimenetek szembekapcsolása jöhet létre Digitális I/O perifériák A dspicdem demó kártya egyszerű I/O periféria kialakításokat tartalmaz, 2db nyomógombot, 4db LED-et és egy soros aszinkron kommunikációs csatoló interfészt. A nyomógombok az RA12 és RA13 processzor lábakhoz kapcsolódnak, mely portlábak 4,7kOhm felhúzó ellenállással magas szintet biztosítanak a bemeneteken abban az esetben, ha a nyomógomb felengedett állapotú. A nyomógomb lenyomásával az adott portláb alacsony szintre kerül. A párhuzamos kondenzátorok a soros ellenállásokkal együtt integráló tagot alkotnak, amelyek a pergésmentesítés feladatára szolgálnak. A nyomógombok mikrokapcsolók érintkezői rugóként viselkednek, ezért egy átkapcsolási folyamat során nem egyetlen átmenetet produkálnak, hanem a rugó exponenciálisan csillapodó ide-oda pattanásával többet is, amely téves működést okozhat (szaknyelven ezt a hatást hívják pergésnek). Szerencsére ezek a kontaktusok gyorsan lejátszódó hatásúak, így jól lehet ellenük védekezni. Fontos megemlíteni, hogy a demo panel nyomógombjai a dspic PORT A regiszterének 12 és 13 sorszámú bitjeire csatlakoznak, ez a port viszont alaphelyzetben analóg bemenetként működik, így a gombok használatához a megfelelő lábakat először digitális I/O módra kell konfigurálni! 34. ábra: Nyomógomb illesztés A demó panel 4db LED-je a dspic kontroller RD4, RD5, RD6 és RD7 portjára kapcsolódik 470 Ohm értékű áramkorlátozó ellenállásokon keresztül. A LED-ek katódjai közösítettek és a J4 jumperenkeresztül kapcsolódnak a GND-re. 92

94 35. ábra: LED illesztés A dspic33fj256gp710 kettő UART interfésszel rendelkezik, melyből az UART1 RF3 (U1TxD) és az RF2 (U1RxD) porthoz a MAX3232 szintillesztő áramkör kapcsolódik. A szintillesztő segítségével megvalósul az RS232 szintillesztés a soros aszinkron kommunikációsporton. A MAX3232 illesztő a 3,3V-os tápfeszültséget megkétszerezi, és a kétszerezett pozitív feszültség (kb +6V) mellett kétszerezett negatívat (kb -6V) is előállít. Erre azért van szükség, mert az RS232 jelvezetéken a logikai 1 -hez negatív, míg a logikai 0 -hoz pozitív NRZ szimbólum tartozik. Meg kell jegyezzük, hogy a normál RS232 szint ±12V értékű, de az RS232 bemenet komparálás ±3V-nál történik meg, így a ±6V-os szimbólumok alkalmazása a szabvány tűrésen belül van, legfeljebb az áthidalható távolság kisebb, mintha a névleges feszültség értékeket alkalmaznánk. 36. ábra: UART RS232 szintillesztés 93

95 A feszültség kétszerezés és a negatív kétszerezett szimbólum előállítás kondenzátorok (C28, C29, C30, C32) feltöltésével, majd a feltöltött kondenzátorok megfelelő összekapcsolásával történik, melyet a MAX3232 chip végez Analóg bemenet A demó kártya analóg bemeneteihez a LINE feliratú tüskesoronlehet hozzzáférni, de a kényelmesebb csatlakoztatás érdekében a bemenetet RCA csatlakozóval ( RCA2 ) is elláttuk(lásd a következő alfejezetbena bővítő panel elvi kapcsolási rajzát!). Az analóg jel a C16 DC leválasztást biztosító kondenzátoron keresztül jut a műveleti erősítőből kialakított aktív RC aluláteresztő szűrőre. Az R15 R16 ellenállások fél tápfeszültséget (1,65V) állítanak elő, melyre ráül a DC komponenstől mentes bemenő jel. Fontos tudnunk, hogy az analóg tápfeszültség értéke most 3,3V, mivel a dspic33 processzor 3,3V-ról üzemel (lásd tápegység). A műveleti erősítőből álló másodfokú aluláteresztő szűrő feladata lenne a bemenő jel sávkorlátozása. A sávkorlátozó szűrőre a követelmény akkor fogalmazható meg, ha ismert bejövő jel spektrumképe, a mintavételi frekvencia és a digitalizálást végző A/D konverter karakterisztikája, ez utóbbinál az LSB-hez tartozó jelszint. A sávkorlátozás jelentősége az, hogy segítségével betartsuk a Shannon mintavételi tételt (2*fmax fm) és elkerüljük a spektrum átlapolódást. Ez úgy érhető el, hogy a bejövő jel nemkívánatos komponenseit az A/D konverter LSB-hez tartozó jelszint értéke alá csillapítjuk. 37. ábra: Bemeneti jel aluláteresztő szűrője 94

96 Az aluláteresztő szűrő kimenete az RB3/AN3 dspicportra vezeti a szűrt és fél tápfeszültségre ültetett analóg jelet Analóg jel helyreállítás digitális mintákból A dspicdem Starter Demo jelfeldolgozó kártyát 12 bites D/A konverterrel (MCP4822) és analóg helyreállító szűrő áramkörrel (LTC1569-7) egészítettük ki. Az áramkör kétsoros egy raszteres kiosztású tüskesorral csatlakozik a Demo kártyához. Az áramkör elvi rajzát az alábbi ábrán adjuk meg: 38. ábra: 12 bites D/A konverter és helyreállító szűrő A D/A konverter programozásához az MCP4822 megismerése szükséges. Ez SPI interfészen illeszthető a mikrovezérlőhöz, jelen esetben a dspic-hez. 95

97 39. ábra: 12 bites D/A konverter belső felépítése és lábkiosztása A digitális mintákat, valamint a vezérlő biteket 16 bites szóban kell az SPI BUS-on a D/A konverternek továbbítani. A kommunikációban a dspic33 a master. A CS kivezetéstadspic G portjának 9. bitje vezérli (Slave Select), mely jelvezeték alacsony szintbe húzásával engedélyezzük a D/A konverter digitális interfészét és egyben befagyasztjuk az analóg kimenetet, melyen a korábbi kódszónak megfelelő feszültségszint marad mindaddig, míg a CS = 0. Az MCP4822 áramkör kétcsatornás, az A és a B csatornához külön-külön egy-egy adatregiszter tartozik. A kimenő jelszint értéke a VREF feszültségből származtatott, melynek értéke 2,048V. A referencia feszültséget a D/A konverter chip a belső stabilizátor áramkörének segítségével állítja elő, melyet 2^12 = 4096 részre osztunk fel lineárisan, így minden lépcső nagysága 0,5mV értéknek adódik. A GainLogic segítségével egy, vagy kétszeres erősítés állítható be. Kétszeres erősítés esetén egy lépcsőnagyság 1mV lenne, de a kialakított áramkörünk csak 3,3V tápfeszültségről üzemel, ezért a kétszeres erősítés kiválasztás túlvezérlést eredményez, mivel ekkor az elvileg elvárt maximális kimenő jelszint érték 4,096V értékű! A leküldött 16 bites adatformátum és az egyes bitek, valamint jelentésük a következő ábrán láthatók: 96

98 40. ábra: 12 bites D/A konverternek küldendő kódszó A 16 bites vezérlő kódszómsb-je (15. bit) dönti el, hogy a küldött kódszó az A, vagy a B csatornának címzett-e. Ha ezt a bitet 0 -ba állítjuk, akkor a D11-D0 12 bites adat az Input RegisterA -ba kerül. Vizsgáljuk meg figyelmesen az elvi kapcsolási rajzot! Itt láthatjuk, hogy az A kimenetet (MCP kivezetést) használtuk fel, és ennek jelét vezettük tovább az analóg szűrő (LTC bemenet) áramkörre, vagyis a programkódunk írásakor ezt a bitet mindig 0 -ban kell tartanunk. A 14. bit nem használt, a katalóguslap ajánlása szerint ezt a bitet is 0 -ba illik állítani. A 13. bit a GA, melyet ha 0 -ba állítunk, akkor a választott erősítés kétszeres lesz, 1 -be állítás esetén pedig egyszeres. A tápfeszültség korlát miatt a laboratórium áramkörének programozásakor ezt a bitet mindig 1 értékűnek válasszuk. Az MCP4822 áramkörnek létezik egy alvó (shut down) állapota, melyet a vezérlő kódszó 12. bitjének 0 -ba állításával érhetünk el. Természetesen működés közben ezt a bitet mindig tartsuk 1 értéken. A bit a D/A konverterbe töltendő konvertálandó adatot jelenti. Most példaként vizsgáljuk meg azt az esetet, ha a D/A konverterbe a 0x3123 kódot töltjük. A felső négy bit ekkor 0011 értéket veszi fel, ami a következőt jelenti: A csatorna regiszterébe töltjük a mintát; Egyszeres erősítést alkalmazunk; A chip aktív (nem shut down) állapotban van. 97

99 Az alsó 12 bit 0x123 hexadecimális értéke (fenti ábrán D szám) decimálisan 291. Mindez alapján a kimenő feszültségünk értéke VREF*291/4096 = 0,1455 V lesz. A maximális kivezérlés a 0xFFF adat (D0 D11) letöltésével érhető el, ami az előző beállítások mellett 0,5mV-tal kevesebb, mint a referencia feszültség értéke. Most vizsgáljuk meg az SPI kommunikációt picit részletesebben! A dspic eszköz a Master, míg a D/A konverter a kommunikációban a Slave. Ez azt jelenti, hogy a kommunikációt a dspic kezdeményezi (-CS = 0 -ba állítással), és az órajelet is a dspic szolgáltatja. 41. ábra: 12 bites D/A konverter és a dspic kommunikációja az SPI-on A D/A konverterbe léptetett bitek az órajel felfutó élének hatására tárolódnak. Az első belépő bit a konverterbe (SDI bemeneten) a A/B, vagyis az MSB-t lépteti ki elsőnek a dspic az SDO-n. A CS = 1 -be váltás hatására fog megjelenni a VOUT kimeneten az aktuálisan betöltött D0-D11 kódszónak megfelelő feszültségszint. A D/A konverter kimenet ( A csatorna) és az analóg helyreállító szűrő bemenet a JP1 JUMPER-enkeresztül csatlakozik, így ezen a ponton a szűretlen jel mérésére van lehetőség. 98

100 42. ábra: Analóg helyreállító szűrő chip blokksémája és kivezetései A szűrő törésponti frekvenciája a REXT ellenállással hangolható. Mivel a DIV/CLK kivezetést az áramkörünkben a pozitív tápfeszültségre (+3,3V) kapcsoltuk, ezért a törésponti frekvencia (fcutoff) értéke khz-ben, a következő összefüggéssel határozható meg: A mérőpanelon a CN1 JUMPER sor segítségével az R5, R6, R7 és R8 ellenállások közül választhatunk REXT-et, így négyféle töréspont állítható be a rövidzár JUMPER áthelyezésével. 99

101 5. MPLAB-X fejlesztői környezet Az MPLAB-X egy integrált fejlesztőkörnyezet (Integrated Development Environment,IDE), amely a Microchip mikrovezérlőire való alkalmazások készítését támogatja. Az IDE magában foglal minden, a program begépelésétől az elkészített alkalmazás teszteléséig, hibajavításáig szükséges elemet. Maga a fejlesztőkörnyezet a Netbeans nevű, Java alapú IDE-re épül, a Microchip biztosítja hozzá a PIC-specifikus elemeket (fordítóprogramok, linkerek, debuggerek). A rendszer Linux, Windows és Mac OSX operációs rendszer alatt is rendelkezésre áll. Struktúrája nyitott, képes többféle fordítóprogrammal és debuggerrel is együttműködni, így többféle programozási nyelv támogatása is biztosított (a dspic eszközökhöz az XC16 nevű fordítóprogram érhető el, ez az Assembly és a C nyelveket ismeri). Természetesen a hardware közeli elemek széles skálája is használható, a jegyzetben az ICD3 (In Circuit Debugger) programozó és hibakereső eszköz használatán keresztül mutatjuk be a fejlesztés menetét Általános áttekintés Az MPLAB-X a legtöbb korszerű fejlesztő környezethez hasonlóan a készítendő alkalmazás elemeit úgynevezett projektekben tárolja. Egy ilyen projekt logikai struktúraként képzelhető el, a fájlrendszerhez hasonló módon. Tartalmazhat mappákat (folder), az alkalmazás részeit alkotó fájlokat, valamint a fordítás elvégzéséhez szükséges egyéb állományokat is. Ennek megfelelően a futtatható programkód előállítása a projektben tárolt adatok felhasználásával történik. Fontos meghatározni néhány alapfogalmat: Gépi kód: bináris adathalmaz, amelyben az adott mikroprocesszor által dekódolható utasítások találhatók. Szekvenciális állomány, tárolása a processzor programmemóriájában történik, a tényleges futtatáshoz először ezt be kell oda tölteni. Forráskód: egy szöveges állomány, amelyben a programozó személy által használt programozási nyelv szintaktikája alapján készült program részletek találhatók. Önmagában nem alkalmas futtatásra, ahhoz először le kell fordítani, erre szolgál a fordítóprogram. Tárgykód: a fordítóprogram képes lenne a forráskód értelmezésével közvetlenül gépi kódot előállítani, azonban ez több okból sem szerencsés. Egyrészt így a fordításkor rendelkezésre kellene, hogy álljon a program előállításához szükséges összes 100

102 forráskód, ez azonban nem mindig megoldható. Több fejlesztőcég állít elő programkönyvtárakat ( library ), amelyek forráskódját nem kívánják nyilvánossá tenni, ilyen esetben problémás lenne a használatuk. A másik hátránya ennek a koncepciónak az, hogy így minden egyes fordításkor a teljes forrásállomány újra fordítása lenne szükséges, ez nagyméretű forrás esetén rengeteg időt venne el a fejlesztőtől (csak a példa kedvéért, egy Linux kernel teljes fordítása egy korszerű számítógépen, 4 processzormag egyidejű használatával is mintegy 40 percet vesz igénybe. Képzeljük el, hogy a fejlesztés során minden egyes módosítás után ennyi időt kellene eltölteni!). A leggyakoribb megoldás a tárgykód használata, amely egy előfordított formátumot takar. Ebben az utasítások már gépi kódként tárolódnak, azonban az operandusok közül sok még nem, emiatt az ilyen modulok a programmemóriában viszonylag kis erőforrás felhasználással átpozícionálhatók. Linker: mivel a gépi kód előállítása több lépésben, tárgykód használatával valósul meg, ezért a fordítóprogram nem állítja elő közvetlenül a futtatható kódot, ezt külön műveletként kell megtenni. A linker feladata éppen ez, egy vagy több tárgykód állomány összefűzésével, és a szükséges operandusok megfelelő értékének beállításával elkészíti a futtatható állományt. Az összefűzés nagyságrendekkel gyorsabb művelet, mint a fordítás, ezért fejlesztés közben kisebb az okozott kényelmetlenség. Az összefűzés járulékos műveletét természetesen a fejlesztőkörnyezet automatikusan elvégzi. Build, make: a fordítás és összefűzés műveleteinek elnevezése. A make a GNU fordítókörnyezetek kedvelt parancsa, így ragadt ez a név az intelligens fordítási opcióra. A Make elvégzi a projekt forrás- és a hozzájuk tartozó, korábbi fordításokból származó tárgykódjainak vizsgálatát. Ha a forráskód módosítási dátuma frissebb, mint a tárgykódé ami azt jelenti, hogy az előző fordítás óta változott a tartalma akkor újra lefordítja a forráskódot. Ha az összes forráskód modul fordítása naprakész, akkor a tárgykód modulokból összefűzi a gépi kódot Projekt szerkezete Az MPLAB-X indítása után az alábbi képernyőhöz hasonló fogad bennünket: 101

103 43. ábra MPLAB-X kezdőképernyő A projekt szerkezete a bal oldali hasábban található mezőben látható, a projektünk alapvetően 3 különböző típusú fájlból fog állni: Assembly nyelvű forrás fájl (kiterjesztése.s ), ez tartalmazza a forráskódot text alapú, a Source files virtuális mappában helyezkedik el; Assembly szintaktikájú fejlécfájl (.inc kiterjesztésű), ezekben találhatók a fontos szimbólum definíciók, többek a használt processzor címke és regiszternevei text alapú, a Header files virtuális mappában helyezkedik el; Linker script fájl (.gld kiterjesztésű), ebben találhatók a kiválasztott processzorhoz tartozó konfigurációs beállítások, IVT kitöltését, a veremtár és az egyéb memóriaszegmensek automatikus méretezését segítő leírók text alapú, a Linker files virtuális mappában helyezkedik el. Egy tetszőleges program készítésének első lépése a projekt létrehozása, ez fogja össze a fordításhoz, futtatáshoz szükséges állományokat egyetlen logikai egységbe. A projekt tárolása a számítógép fájlrendszerében, külön mappában történik. Az MPLABX képes egyidejűleg több projektet is aktív állapotban tartani (a bal oldali projekt területen ( Projects fül) ezeket egymás alatt listázza), azonban mindig csak egy projektet lehet fordítani, debug funkciókat 102

104 használni. Ez a fő projekt, kiválasztani a projekt területen, a nevére jobb egérgombbal kattintva, majd a feltűnő menüben a Set as main project pontot választva lehet. A projektnyitást a File menüpont New Project pontjának (vagy Ctrl+Shift+N) választásával kezdhetjük meg. Első lépés: Choose Project, a projekt sablon kiválasztása A Categories-nél válasszuk a MicrochipEmbedded et; A Project -nél pedig a Standalone Project -et. Továbblépéshez nyomjunk Next -et. 44. ábra Projekt típus kiválasztása Második lépés: eszköz kiválasztása A Family -nél válasszuk a 16bit DSCs (dspic33) A Device -nál válasszuk a dspic33fj256gp710 típust. Továbblépéshez nyomjunk Next -et. 45. ábra: Mikrovezérlő kiválasztása 103

105 Harmadik lépés: SelectTool, a debugger/programmer eszköz típusának kiválasztása Válasszuk ki a fejlesztő eszközt a Hardware tool - nál: ICD3. (A laborban ilyen eszköz áll rendelkezésre). Továbblépéshez nyomjunk Next -et, ekkor a hatodik lépésre ugrunk (más rendszerek esetén több beállítás szükséges, de most a 4. és 5. lépés kimarad). 46. ábra: Programozó/debugger eszköz kiválasztása Hatodik lépés: SelectCompiler, a fordítóprogram típusának kiválasztása Most a fordítóprogram és a hozzá tartozó linker típusát kell kiválasztanunk. Ezek együttesen alkotják az eszközök láncát (Toolchain). A CompilerTools -nál az XC16-ot válasszuk, ez képes assembly és C programozási nyelvű forrásprogramok fordítására is. Használata ingyenes, de a C programok optimalizálását csak a fizetős 47. ábra: A fordítóprogram kiválasztása változat végzi el. Nyomjunk Next -et a továbblépéshez! 104

106 Hetedik lépés: a projekt nevének, és tárolási helyének beállítása 48. ábra: Projektadatok beállítása Adjunk a projektnek nevet és adjuk meg (válasszuk ki) a tárolási hely elérési útvonalát. A projekt név megadása a Project name mezőben történhet, itt kerüljük az ékezetes karaktereket. A munka mappa kiválasztása a Browse -rakattintva indulhat, a cél mappa az asztalon lévő dspic_work nevű mappa legyen! Az Encoding -nak UTF- 8 -at javasoljuk. Továbblépéshez a Finish - re kell kattintani. A projekt egyes paramétereinek megváltoztatásához a File menüpont Project Properties menüpontra kattintásával van lehetőségünk. Ahhoz, hogy a munkát megkezdhessük, a projekthez hozzá kell rendelni a forrás file-t, a linker script-et és az include file-t. A projekt területen, a projekt elemeit tartalmazó struktúránál kattintsunk a jobb egérgombbal a Source Files virtuális mappára, majd válasszuk ki az Add Existing Item (meglévő állomány hozzáadása) vagy a New (új állomány létrehozása) lehetőséget. Emellett egy egész mappa tartalmát is a projekthez tudjuk adni, ha például egy komplett projektet szeretnék importálni. A New menüpont újabb lehetőségeket kínál fel, több, különböző állománytípus létrehozását végezhetjük el. Fontos megemlíteni, hogy a forrásmappában található állományok különböző kiterjesztésűek lehetnek, ettől függően a program készítésére alkalmazott programnyelv is eltérhet (párhuzamosan készíthetünk assembly vagy C nyelvű programmodulokat, ezek képesek egymással együttműködni). 105

107 Az Add existing item választásakor a fájlrendszerben kereshetjük meg a kívánt forrásállományt, és rendelhetjük hozzá projektünkhöz. Az alábbi példában a már létező LEDblink.s nevű assembly forrást választjuk ki: 49. ábra: Forrásfájl hozzáadása projekthez Válasszuk ki a forrásfájlt, majd ugyanígy járjunk el a LinkerFiles virtuális mappa esetében is, válasszuk ki a mikrovezérlőhöz tartozó linker scriptet (például: p33fj256gp710.gld), majd a HeaderFiles virtuális mappához rendeljük hozzá a header állományt(például: P33FJ256GP710.inc). Miután a szükséges fájlokat létrehoztuk, vagy a meglévőket hozzáadtuk a projekthez, a Source Files virtuális mappában található forrásfájl nevére kattintsunk duplán, mely hatására a fejlesztői környezet editorában megnyílik a forrásprogram, és az így szerkeszthető lesz. Az ablakok az ablak szegélyek megfogásával (bal egér gomb nyomva tartása mellett) átméretezhetők, több szerkesztésre megnyitott fájl esetében a szerkesztő külön fülekkel jelöli az állományokat, ezekre kattintva lehet váltani köztük. 50. ábra: Az MPLAB-X szövegszerkesztője 5.3. A fordítás, a flash programozás és a hibakeresés menete A forrásprogram gépi kódra alakítása többlépcsős feladat, emellett pedig szükség van az elkészült kód mikrovezérlőbe töltésére is. Ha programunk esetleg tartalmaz hibákat 106

Beágyazott vezérlők tervezése dspic33 eszközökkel MPLAB-X

Beágyazott vezérlők tervezése dspic33 eszközökkel MPLAB-X KANDÓ KÁLMÁN VILLAMOSMÉRNÖKI KAR Beágyazott vezérlők tervezése dspic33 eszközökkel MPLAB-X ÓE-KVK 2117 Budapest, 2014. Tartalom Bevezető... 3 1. dspic33 általános áttekintése... 4 1.1. Hardver felépítés

Részletesebben

Járműfedélzeti rendszerek I. 3. előadás Dr. Bécsi Tamás

Járműfedélzeti rendszerek I. 3. előadás Dr. Bécsi Tamás Járműfedélzeti rendszerek I. 3. előadás Dr. Bécsi Tamás ATmega128 CPU Single-level pipelining Egyciklusú ALU működés Reg. reg., reg. konst. közötti műveletek 32 x 8 bit általános célú regiszter Egyciklusú

Részletesebben

Számítógépek felépítése, alapfogalmak

Számítógépek felépítése, alapfogalmak 2. előadás Számítógépek felépítése, alapfogalmak Lovas Szilárd, Krankovits Melinda SZE MTK MSZT kmelinda@sze.hu B607 szoba Nem reprezentatív felmérés kinek van ilyen számítógépe? 2 Nem reprezentatív felmérés

Részletesebben

Az interrupt Benesóczky Zoltán 2004

Az interrupt Benesóczky Zoltán 2004 Az interrupt Benesóczky Zoltán 2004 1 Az interrupt (program megszakítás) órajel generátor cím busz környezet RESET áramkör CPU ROM RAM PERIF. adat busz vezérlõ busz A periféria kezelés során információt

Részletesebben

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység Mikroprocesszor CPU C Central Központi P Processing Számító U Unit Egység A mikroprocesszor általános belső felépítése 1-1 BUSZ Utasítás dekóder 1-1 BUSZ Az utasítás regiszterben levő utasítás értelmezését

Részletesebben

VI. SZOFTVERES PROGRAMOZÁSÚ VLSI ÁRAMKÖRÖK

VI. SZOFTVERES PROGRAMOZÁSÚ VLSI ÁRAMKÖRÖK VI. SZOFTVERES PROGRAMOZÁSÚ VLSI ÁRAMKÖRÖK 1 Az adatok feldolgozását végezhetjük olyan általános rendeltetésű digitális eszközökkel, amelyeket megfelelő szoftverrel (programmal) vezérelünk. A mai digitális

Részletesebben

Mintavételes szabályozás mikrovezérlő segítségével

Mintavételes szabályozás mikrovezérlő segítségével Automatizálási Tanszék Mintavételes szabályozás mikrovezérlő segítségével Budai Tamás budai.tamas@sze.hu http://maxwell.sze.hu/~budait Tartalom Mikrovezérlőkről röviden Programozási alapismeretek ismétlés

Részletesebben

Aritmetikai utasítások I.

Aritmetikai utasítások I. Aritmetikai utasítások I. Az értékadó és aritmetikai utasítások során a címzési módok különböző típusaira látunk példákat. A 8086/8088-as mikroprocesszor memóriája és regiszterei a little endian tárolást

Részletesebben

találhatók. A memória-szervezési modell mondja meg azt, hogy miként

találhatók. A memória-szervezési modell mondja meg azt, hogy miként Memória címzési módok Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről) a program utasításai illetve egy utasítás argumentumai a memóriában találhatók. A memória-szervezési

Részletesebben

Bevezetés az informatikába

Bevezetés az informatikába Bevezetés az informatikába 3. előadás Dr. Istenes Zoltán Eötvös Loránd Tudományegyetem Informatikai Kar Programozáselmélet és Szoftvertechnológiai Tanszék Matematikus BSc - I. félév / 2008 / Budapest Dr.

Részletesebben

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1 INFORMATIKAI RENDSZEREK ALAPJAI (INFORMATIKA I.) 1 NEUMANN ARCHITEKTÚRÁJÚ GÉPEK MŰKÖDÉSE SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1 Ebben a feladatban a következőket fogjuk áttekinteni: Neumann rendszerű számítógép

Részletesebben

Digitális rendszerek. Utasításarchitektúra szintje

Digitális rendszerek. Utasításarchitektúra szintje Digitális rendszerek Utasításarchitektúra szintje Utasításarchitektúra Jellemzők Mikroarchitektúra és az operációs rendszer közötti réteg Eredetileg ez jelent meg először Sokszor az assembly nyelvvel keverik

Részletesebben

A 32 bites x86-os architektúra regiszterei

A 32 bites x86-os architektúra regiszterei Memória címzési módok Jelen nayagrészben az Intel x86-os architektúrára alapuló 32 bites processzorok programozását tekintjük. Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről)

Részletesebben

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT Eddig Tetszőleges

Részletesebben

Digitális technika VIMIAA01 9. hét

Digitális technika VIMIAA01 9. hét BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT Eddig Tetszőleges

Részletesebben

I. C8051Fxxx mikrovezérlők hardverfelépítése, működése. II. C8051Fxxx mikrovezérlők programozása. III. Digitális perifériák

I. C8051Fxxx mikrovezérlők hardverfelépítése, működése. II. C8051Fxxx mikrovezérlők programozása. III. Digitális perifériák I. C8051Fxxx mikrovezérlők hardverfelépítése, működése 1. Adja meg a belső RAM felépítését! 2. Miben különbözik a belső RAM alsó és felső felének elérhetősége? 3. Hogyan érhetők el az SFR regiszterek?

Részletesebben

Architektúra, megszakítási rendszerek

Architektúra, megszakítási rendszerek Architektúra, megszakítási ek Mirıl lesz szó? Megszakítás fogalma Megszakítás folyamata Többszintű megszakítási ek Koschek Vilmos Példa: Intel Pentium vkoschek@vonalkodhu Koschek Vilmos Fogalom A számítógép

Részletesebben

Adatok ábrázolása, adattípusok

Adatok ábrázolása, adattípusok Adatok ábrázolása, adattípusok Összefoglalás Adatok ábrázolása, adattípusok Számítógépes rendszerek működés: információfeldolgozás IPO: input-process-output modell információ tárolása adatok formájában

Részletesebben

DSP architektúrák dspic30f család memória kezelése

DSP architektúrák dspic30f család memória kezelése DSP architektúrák dspic30f család memória kezelése Az adatmemória Az adatmemória 16 bites, két külön memóriazóna van kiépítve, az X és az Y memória, mindkettőnek címgeneráló egysége és adat sínrendszere

Részletesebben

Programozott soros szinkron adatátvitel

Programozott soros szinkron adatátvitel Programozott soros szinkron adatátvitel 1. Feladat Név:... Irjon programot, mely a P1.0 kimenet egy lefutó élének időpontjában a P1.1 kimeneten egy adatbitet ad ki. A bájt legalacsonyabb helyiértéke 1.

Részletesebben

A mikroprocesszor felépítése és működése

A mikroprocesszor felépítése és működése A mikroprocesszor felépítése és működése + az egyes részegységek feladata! Információtartalom vázlata A mikroprocesszor feladatai A mikroprocesszor részegységei A mikroprocesszor működése A mikroprocesszor

Részletesebben

1. Az utasítás beolvasása a processzorba

1. Az utasítás beolvasása a processzorba A MIKROPROCESSZOR A mikroprocesszor olyan nagy bonyolultságú félvezető eszköz, amely a digitális számítógép központi egységének a feladatait végzi el. Dekódolja az uatasításokat, vezérli a műveletek elvégzéséhez

Részletesebben

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD) Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD) Bevezetés A laborgyakorlatok alapvető célja a tárgy későbbi laborgyakorlataihoz szükséges ismeretek átadása, az azokban szereplő

Részletesebben

DSP architektúrák dspic30f család

DSP architektúrák dspic30f család DSP architektúrák dspic30f család A Microchip 2004 nyarán piacra dobta a dspic30f családot, egy 16 bites fixpontos DSC. Mivel a mikróvezérlők tantárgy keretén belül a PIC családdal már megismerkedtetek,

Részletesebben

Programozás alapjai. 10. előadás

Programozás alapjai. 10. előadás 10. előadás Wagner György Általános Informatikai Tanszék Pointerek, dinamikus memóriakezelés A PC-s Pascal (is) az IBM PC memóriáját 4 fő részre osztja: kódszegmens adatszegmens stackszegmens heap Alapja:

Részletesebben

Adatelérés és memóriakezelés

Adatelérés és memóriakezelés Adatelérés és memóriakezelés Jelen nayagrészben az Intel x86-os architektúrára alapuló 32 bites processzorok programozását tekintjük. Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről)

Részletesebben

Számítógépek felépítése

Számítógépek felépítése Számítógépek felépítése Emil Vatai 2014-2015 Emil Vatai Számítógépek felépítése 2014-2015 1 / 14 Outline 1 Alap fogalmak Bit, Byte, Word 2 Számítógép részei A processzor részei Processzor architektúrák

Részletesebben

A mikroprocesszor egy RISC felépítésű (LOAD/STORE), Neumann architektúrájú 32 bites soft processzor, amelyet FPGA val valósítunk meg.

A mikroprocesszor egy RISC felépítésű (LOAD/STORE), Neumann architektúrájú 32 bites soft processzor, amelyet FPGA val valósítunk meg. Mikroprocesszor A mikroprocesszor egy RISC felépítésű (LOAD/STORE), Neumann architektúrájú 32 bites soft processzor, amelyet FPGA val valósítunk meg. A mikroprocesszor részei A mikroprocesszor a szokásos

Részletesebben

Labor gyakorlat Mikrovezérlők

Labor gyakorlat Mikrovezérlők Labor gyakorlat Mikrovezérlők ATMEL AVR ARDUINO 1. ELŐADÁS BUDAI TAMÁS Tartalom Labor 2 mikrovezérlők modul 2 alkalom 1 mikrovezérlők felépítése, elmélet 2 programozás, mintaprogramok Értékelés: a 2. alkalom

Részletesebben

Nagy Gergely április 4.

Nagy Gergely április 4. Mikrovezérlők Nagy Gergely BME EET 2012. április 4. ebook ready 1 Bevezetés Áttekintés Az elektronikai tervezés eszközei Mikroprocesszorok 2 A mikrovezérlők 3 Főbb gyártók Áttekintés A mikrovezérlők az

Részletesebben

Labor gyakorlat Mikrovezérlők

Labor gyakorlat Mikrovezérlők Labor gyakorlat Mikrovezérlők ATMEL AVR ARDUINO 1. ELŐADÁS BUDAI TAMÁS 2015. 09. 06. Tartalom Labor 2 mikrovezérlők modul 2 alkalom 1 mikrovezérlők felépítése, elmélet 2 programozás, mintaprogramok Értékelés:

Részletesebben

7.2.2. A TMS320C50 és TMS320C24x assembly programozására példák

7.2.2. A TMS320C50 és TMS320C24x assembly programozására példák 7.2.2. A TMS320C50 és TMS320C24x assembly programozására példák A TMS320C50 processzor Ez a DSP processzor az 1.3. fejezetben lett bemutatva. A TMS320C50 ##LINK: http://www.ti.com/product/tms320c50## egy

Részletesebben

Operandus típusok Bevezetés: Az utasítás-feldolgozás menete

Operandus típusok Bevezetés: Az utasítás-feldolgozás menete Operandus típusok Bevezetés: Az utasítás-feldolgozás menete Egy gépi kódú utasítás általános formája: MK Címrész MK = műveleti kód Mit? Mivel? Az utasítás-feldolgozás általános folyamatábrája: Megszakítás?

Részletesebben

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak

Részletesebben

ATMEL ATMEGA MIKROVEZÉRLŐ-CSALÁD

ATMEL ATMEGA MIKROVEZÉRLŐ-CSALÁD Misák Sándor ATMEL ATMEGA MIKROVEZÉRLŐ-CSALÁD Nanoelektronikai és Nanotechnológiai Részleg DE TTK v.0.1 (2007.02.13.) 1. előadás 1. Általános ismeretek. 2. Sajátos tulajdonságok. 3. A processzor jellemzői.

Részletesebben

Az AVR programozás alapjai. Előadja: Both Tamás

Az AVR programozás alapjai. Előadja: Both Tamás Az AVR programozás alapjai Előadja: Both Tamás Fordító C nyelven programozunk Ehhez az AVR-GCC fordító áll rendelkezésre Ennek használatához a WinAVR-t kell telepíteni Teljes értékű C fordító, minden megengedett,

Részletesebben

Mintavételezés tanulmányozása. AD - konverzió. Soros kommunikáció

Mintavételezés tanulmányozása. AD - konverzió. Soros kommunikáció Mintavételezés tanulmányozása. AD - konverzió. Soros kommunikáció A gyakorlat célja A gyakorlat során a dspic30f6010 digitális jelprocesszor Analóg Digital konverterét tanulmányozzuk. A mintavételezett

Részletesebben

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása A fordítóprogramok szerkezete Forrásprogram Forrás-kezelő (source handler) Kódoptimalizálás Fordítóprogramok előadás (A,C,T szakirány) Lexikális elemző (scanner) Szintaktikus elemző (parser) Szemantikus

Részletesebben

5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI

5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI 5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI 1 Kombinációs hálózatok leírását végezhetjük mind adatfolyam-, mind viselkedési szinten. Az adatfolyam szintű leírásokhoz az assign kulcsszót használjuk, a

Részletesebben

Számítógépek felépítése, alapfogalmak

Számítógépek felépítése, alapfogalmak 2. előadás Számítógépek felépítése, alapfogalmak Lovas Szilárd SZE MTK MSZT lovas.szilard@sze.hu B607 szoba Nem reprezentatív felmérés kinek van ilyen számítógépe? Nem reprezentatív felmérés kinek van

Részletesebben

Balaton Marcell Balázs. Assembly jegyzet. Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született.

Balaton Marcell Balázs. Assembly jegyzet. Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született. Balaton Marcell Balázs Assembly jegyzet Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született. 1. Regiszterek Regiszterek fajtái a. Szegmensregiszterek cs (code):

Részletesebben

Assembly programozás levelező tagozat

Assembly programozás levelező tagozat Assembly programozás levelező tagozat Szegedi Tudományegyetem Képfeldolgozás és Számítógépes Grafika Tanszék 2011-2012-2 Tematika Assembly nyelvi szint. Az Intel 8086/88 regiszter készlete, társzervezése,

Részletesebben

1 Doszpi

1 Doszpi ADDLW Konstans hozzáadása W-hez ADDLW k Állított jelződitek: C, DC, Z A 8 bites k konstans hozzáadása W értékéhez; az eredmény a W-be kerül. ADDWF W és f összeadása ADDWF f, d Állított jelződitek: C, DC,

Részletesebben

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix 2. Adattípusonként különböző regisztertér Célja: az adatfeldolgozás gyorsítása - különös tekintettel a lebegőpontos adatábrázolásra. Szorzás esetén karakterisztika összeadódik, mantissza összeszorzódik.

Részletesebben

A számítógép alapfelépítése

A számítógép alapfelépítése Informatika alapjai-6 számítógép felépítése 1/8 számítógép alapfelépítése Nevezzük számítógépnek a következő kétféle elrendezést: : Harvard struktúra : Neumann struktúra kétféle elrendezés alapvetően egyformán

Részletesebben

A Számítógépek felépítése, mőködési módjai

A Számítógépek felépítése, mőködési módjai Mechatronika, Optika és Gépészeti Informatika Tanszék Kovács Endre tud. Mts. A Számítógépek felépítése, mőködési módjai Mikroprocesszoros Rendszerek Felépítése Buszrendszer CPU OPERATÍV TÁR µ processzor

Részletesebben

Labor 2 Mikrovezérlők

Labor 2 Mikrovezérlők Labor 2 Mikrovezérlők ATMEL AVR - ARDUINO BUDAI TAMÁS 2015. 09. 06. Tartalom Mikrovezérlők Mikrovezérlők felépítése, működése Mikrovezérlő típusok, gyártók Mikrovezérlők perifériái Mikrovezérlők programozása

Részletesebben

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

sallang avagy Fordítótervezés dióhéjban Sallai Gyula sallang avagy Fordítótervezés dióhéjban Sallai Gyula Az előadás egy kis példaprogramon keresztül mutatja be fordítók belső lelki világát De mit is jelent, az hogy fordítóprogram? Mit csinál egy fordító?

Részletesebben

Bevezetés a számítástechnikába

Bevezetés a számítástechnikába Bevezetés a számítástechnikába Megszakítások Fodor Attila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék foa@almos.vein.hu 2010. november 9. Bevezetés Megszakítások

Részletesebben

Számítógép felépítése

Számítógép felépítése Alaplap, processzor Számítógép felépítése Az alaplap A számítógép teljesítményét alapvetően a CPU és belső busz sebessége (a belső kommunikáció sebessége), a memória mérete és típusa, a merevlemez sebessége

Részletesebben

MSP430 programozás Energia környezetben. Kitekintés, további lehetőségek

MSP430 programozás Energia környezetben. Kitekintés, további lehetőségek MSP430 programozás Energia környezetben Kitekintés, további lehetőségek 1 Még nem merítettünk ki minden lehetőséget Kapacitív érzékelés (nyomógombok vagy csúszka) Az Energia egyelőre nem támogatja, csak

Részletesebben

A programozás alapjai 1 Rekurzió

A programozás alapjai 1 Rekurzió A programozás alapjai Rekurzió. előadás Híradástechnikai Tanszék - preorder (gyökér bal gyerek jobb gyerek) mentés - visszaállítás - inorder (bal gyerek gyökér jobb gyerek) rendezés 4 5 6 4 6 7 5 7 - posztorder

Részletesebben

A mikroszámítógép felépítése.

A mikroszámítógép felépítése. 1. Processzoros rendszerek fő elemei mikroszámítógépek alapja a mikroprocesszor. Elemei a mikroprocesszor, memória, és input/output eszközök. komponenseket valamilyen buszrendszer köti össze, amelyen az

Részletesebben

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe Mechatronika és mikroszámítógépek 2017/2018 I. félév Bevezetés a C nyelvbe A C programozási nyelv A C egy általános célú programozási nyelv, melyet Dennis Ritchie fejlesztett ki Ken Thompson segítségével

Részletesebben

PIC18xxx utasításkészlet

PIC18xxx utasításkészlet 1 PIC18xxx utasításkészlet A PIC 18xxx mikrovezérlők kiterjesztett utasításkészlettel rendelkeznek. A legtöbb utasítás egyszavas (16 bit), de létezik 3 kétszavas utasítás is. Mindegyik egyszavas utasítás

Részletesebben

Segédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez

Segédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez Segédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez Sándor Tamás, sandor.tamas@kvk.bmf.hu Takács Gergely, takacs.gergo@kvk.bmf.hu Lektorálta: dr. Schuster György PhD, hal@k2.jozsef.kando.hu

Részletesebben

MPLAB IDE - SIM - - Rövid ismertető a használathoz - Kincses Levente 3E22 89/ November 14. Szabadka

MPLAB IDE - SIM - - Rövid ismertető a használathoz - Kincses Levente 3E22 89/ November 14. Szabadka MPLAB IDE - SIM - - Rövid ismertető a használathoz - 3E22 89/2004 2006. November 14 Szabadka - 2 - Tartalomjegyzék TARTALOMJEGYZÉK 3 SIMULATOR I/O 4 SIMULATOR STIMULUS 4 STIMULUS VEZÉRLŐ (CONTROLLER) 5

Részletesebben

OPERÁCIÓS RENDSZEREK. Elmélet

OPERÁCIÓS RENDSZEREK. Elmélet 1. OPERÁCIÓS RENDSZEREK Elmélet BEVEZETÉS 2 Az operációs rendszer fogalma Az operációs rendszerek feladatai Csoportosítás BEVEZETÉS 1. A tantárgy tananyag tartalma 2. Operációs rendszerek régen és most

Részletesebben

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED AWK - szintaxis, vezérlési szerkezetek Operációs rendszerek 11. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Csuvik

Részletesebben

Mutatók és mutató-aritmetika C-ben március 19.

Mutatók és mutató-aritmetika C-ben március 19. Mutatók és mutató-aritmetika C-ben 2018 március 19 Memória a Neumann-architektúrában Neumann-architektúra: a memória egységes a címzéshez a természetes számokat használjuk Ugyanabban a memóriában van:

Részletesebben

Programozási segédlet DS89C450 Fejlesztőpanelhez

Programozási segédlet DS89C450 Fejlesztőpanelhez Programozási segédlet DS89C450 Fejlesztőpanelhez Készítette: Fekete Dávid Processzor felépítése 2 Perifériák csatlakozása a processzorhoz A perifériák adatlapjai megtalálhatók a programozasi_segedlet.zip-ben.

Részletesebben

Jelfeldolgozás a közlekedésben

Jelfeldolgozás a közlekedésben Jelfeldolgozás a közlekedésben 2015/2016 II. félév 8051 és C8051F020 mikrovezérlők Fontos tudnivalók Elérhetőség: ST. 108 E-mail: lovetei.istvan@mail.bme.hu Fontos tudnivalók: kjit.bme.hu Aláírás feltétele:

Részletesebben

Az MSP430 mikrovezérlők digitális I/O programozása

Az MSP430 mikrovezérlők digitális I/O programozása 10.2.1. Az MSP430 mikrovezérlők digitális I/O programozása Az MSP430 mikrovezérlők esetében minden kimeneti / bemeneti (I/O) vonal önállóan konfigurálható, az P1. és P2. csoportnak van megszakítás létrehozó

Részletesebben

A/D és D/A konverterek vezérlése számítógéppel

A/D és D/A konverterek vezérlése számítógéppel 11. Laboratóriumi gyakorlat A/D és D/A konverterek vezérlése számítógéppel 1. A gyakorlat célja: Az ADC0804 és a DAC08 konverterek ismertetése, bekötése, néhány felhasználási lehetőség tanulmányozása,

Részletesebben

A programozás alapjai

A programozás alapjai A programozás alapjai Változók A számítógép az adatokat változókban tárolja A változókat alfanumerikus karakterlánc jelöli. A változóhoz tartozó adat tipikusan a számítógép memóriájában tárolódik, szekvenciálisan,

Részletesebben

Szkriptnyelvek. 1. UNIX shell

Szkriptnyelvek. 1. UNIX shell Szkriptnyelvek 1. UNIX shell Szkriptek futtatása Parancsértelmez ő shell script neve paraméterek shell script neve paraméterek Ebben az esetben a szkript tartalmazza a parancsértelmezőt: #!/bin/bash Szkriptek

Részletesebben

Máté: Assembly programozás

Máté: Assembly programozás Dr. Máté Eörs docens Képfeldolgozás és Számítógépes Grafika Tanszék Árpád tér 2. II. em. 213 6196, 54-6196 (6396, 54-6396) http://www.inf.u-szeged.hu/~mate Tantárgy leírás: http://www.inf.u-szeged.hu/oktatas/kurzusleirasok/

Részletesebben

Digitális technika II. (vimia111) 5. gyakorlat: Tervezés adatstruktúra-vezérlés szétválasztással, vezérlőegység generációk

Digitális technika II. (vimia111) 5. gyakorlat: Tervezés adatstruktúra-vezérlés szétválasztással, vezérlőegység generációk Digitális technika II. (vimia111) 5. gyakorlat: Tervezés adatstruktúra-vezérlés szétválasztással, vezérlőegység generációk Elméleti anyag: Processzoros vezérlés általános tulajdonságai o z induló készletben

Részletesebben

Új kompakt X20 vezérlő integrált I/O pontokkal

Új kompakt X20 vezérlő integrált I/O pontokkal Új kompakt X20 vezérlő integrált I/O pontokkal Integrált flash 4GB belső 16 kb nem felejtő RAM B&R tovább bővíti a nagy sikerű X20 vezérlő családot, egy kompakt vezérlővel, mely integrált be és kimeneti

Részletesebben

Járműfedélzeti rendszerek I. 4. előadás Dr. Bécsi Tamás

Járműfedélzeti rendszerek I. 4. előadás Dr. Bécsi Tamás Járműfedélzeti rendszerek I. 4. előadás Dr. Bécsi Tamás Rendszer órajel Órajel osztás XTAL Divide Control (XDIV) Register 2 129 oszthat Órajel források CKSEL fuse bit Külső kristály/kerámia rezonátor Külső

Részletesebben

A tervfeladat sorszáma: 1 A tervfeladat címe: ALU egység 8 regiszterrel és 8 utasítással

A tervfeladat sorszáma: 1 A tervfeladat címe: ALU egység 8 regiszterrel és 8 utasítással .. A tervfeladat sorszáma: 1 A ALU egység 8 regiszterrel és 8 utasítással Minimálisan az alábbi képességekkel rendelkezzen az ALU 8-bites operandusok Aritmetikai funkciók: összeadás, kivonás, shift, komparálás

Részletesebben

TARTALOMJEGYZÉK. 1. BEVEZETÉS A logikai hálózatok csoportosítása Logikai rendszerek... 6

TARTALOMJEGYZÉK. 1. BEVEZETÉS A logikai hálózatok csoportosítása Logikai rendszerek... 6 TARTALOMJEGYZÉK ELŐSZÓ... 3 1. BEVEZETÉS... 4 1.1. A logikai hálózatok csoportosítása... 5 1.2. Logikai rendszerek... 6 2. SZÁMRENDSZEREK ÉS KÓDRENDSZEREK... 7 2.1. Számrendszerek... 7 2.1.1. Számok felírása

Részletesebben

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter Adatszerkezetek Tömb, sor, verem Dr. Iványi Péter 1 Adat Adat minden, amit a számítógépünkben tárolunk és a külvilágból jön Az adatnak két fontos tulajdonsága van: Értéke Típusa 2 Adat típusa Az adatot

Részletesebben

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz Archi2 Gyak (Processzorok Utasításszintű Kezelése) 2014 ősz Ajánlott irodalom Agárdi Gábor: Gyakorlati Assembly, LSI Oktatóközpont, 1996, ISBN 963 577 117 7 Agárdi G.: Gyakorlati Assembly haladóknak, LSI

Részletesebben

Az AVR ATmega128 mikrokontroller

Az AVR ATmega128 mikrokontroller Az AVR ATmega128 mikrokontroller Rövid leírás Ez a leírás a Mérés labor II. tárgy első mikrokontrolleres témájú mérési gyakorlatához készült. Csak annyit tartalmaz általánosan az IC-ről, ami szerintünk

Részletesebben

Labor gyakorlat Mikrovezérlők

Labor gyakorlat Mikrovezérlők Labor gyakorlat Mikrovezérlők ATMEL AVR ARDUINO 1. ELŐADÁS BUDAI TAMÁS Tartalom Mikrovezérlők Mikrovezérlők felépítése, működése Mikrovezérlő típusok, gyártók Mikrovezérlők perifériái Mikrovezérlők programozása

Részletesebben

Digitális technika (VIMIAA02) Laboratórium 1

Digitális technika (VIMIAA02) Laboratórium 1 BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika (VIMIAA02) Laboratórium 1 Fehér Béla Raikovich Tamás,

Részletesebben

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozás alapjai gyakorlat. 2. gyakorlat C alapok Programozás alapjai gyakorlat 2. gyakorlat C alapok 2016-2017 Bordé Sándor 2 Forráskód, fordító, futtatható állomány Először megírjuk a programunk kódját (forráskód) Egyszerű szövegszerkesztőben vagy fejlesztőkörnyezettel

Részletesebben

Digitális technika VIMIAA hét

Digitális technika VIMIAA hét BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK VIMIAA02 14. hét Fehér Béla BME MIT Rövid visszatekintés, összefoglaló

Részletesebben

Digitális technika (VIMIAA02) Laboratórium 1

Digitális technika (VIMIAA02) Laboratórium 1 BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika (VIMIAA02) Laboratórium 1 Fehér Béla Raikovich Tamás,

Részletesebben

Digitális technika VIMIAA hét

Digitális technika VIMIAA hét BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika VIMIAA02 14. hét Fehér Béla BME MIT Digitális technika

Részletesebben

Mikrorendszerek tervezése

Mikrorendszerek tervezése BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Mikrorendszerek tervezése MicroBlaze processzor Fehér Béla Raikovich Tamás

Részletesebben

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r Programozás alapjai (GKxB_INTM023) Széchenyi István Egyetem, Gy r 2019. augusztus 29. Feladat: írjuk ki az els 10 természetes szám négyzetét! #i n c l u d e i n t main ( v o i d ) { p r

Részletesebben

Assembly. Iványi Péter

Assembly. Iványi Péter Assembly Iványi Péter Miért? Ma már ritkán készül program csak assembly-ben Általában bizonyos kritikus rutinoknál használják Miért nem használjuk? Magas szintű nyelven könnyebb programozni Nehéz más gépre

Részletesebben

Már megismert fogalmak áttekintése

Már megismert fogalmak áttekintése Interfészek szenasi.sandor@nik.bmf.hu PPT 2007/2008 tavasz http://nik.bmf.hu/ppt 1 Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése Eseménykezelési módszerek 2 Már megismert fogalmak

Részletesebben

Mechatronika és mikroszámítógépek. 2018/2019 I. félév. Külső megszakítások

Mechatronika és mikroszámítógépek. 2018/2019 I. félév. Külső megszakítások Mechatronika és mikroszámítógépek 2018/2019 I. félév Külső megszakítások Megszakítás, Interrupt A megszakítás egy olyan esemény, vagy feltétel teljesülése, amely felfüggeszti a program futását, a vezérlést

Részletesebben

A programozás alapjai előadás. A C nyelv típusai. Egész típusok. C típusok. Előjeles egészek kettes komplemens kódú ábrázolása

A programozás alapjai előadás. A C nyelv típusai. Egész típusok. C típusok. Előjeles egészek kettes komplemens kódú ábrázolása A programozás alapjai 1 A C nyelv típusai 4. előadás Híradástechnikai Tanszék C típusok -void - skalár: - aritmetikai: - egész: - eger - karakter - felsorolás - lebegőpontos - mutató - függvény - union

Részletesebben

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD) Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD) Összeadó áramkör A legegyszerűbb összeadó két bitet ad össze, és az egy bites eredményt és az átvitelt adja ki a kimenetén, ez a

Részletesebben

elektronikus adattárolást memóriacím

elektronikus adattárolást memóriacím MEMÓRIA Feladata A memória elektronikus adattárolást valósít meg. A számítógép csak olyan műveletek elvégzésére és csak olyan adatok feldolgozására képes, melyek a memóriájában vannak. Az információ tárolása

Részletesebben

Yottacontrol I/O modulok beállítási segédlet

Yottacontrol I/O modulok beállítási segédlet Yottacontrol I/O modulok beállítási segédlet : +36 1 236 0427 +36 1 236 0428 Fax: +36 1 236 0430 www.dialcomp.hu dial@dialcomp.hu 1131 Budapest, Kámfor u.31. 1558 Budapest, Pf. 7 Tartalomjegyzék Bevezető...

Részletesebben

Digitális rendszerek. Mikroarchitektúra szintje

Digitális rendszerek. Mikroarchitektúra szintje Digitális rendszerek Mikroarchitektúra szintje Mikroarchitektúra Jellemzők A digitális logika feletti szint Feladata az utasításrendszer-architektúra szint megalapozása, illetve megvalósítása Példa Egy

Részletesebben

A Számítógépek hardver elemei

A Számítógépek hardver elemei Mechatronika, Optika és Gépészeti Informatika Tanszék Kovács Endre tud. Mts. A Számítógépek hardver elemei Korszerű perifériák és rendszercsatolásuk A µ processzoros rendszer regiszter modellje A µp gépi

Részletesebben

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50 Bonyolultságelmélet Monday 26 th September, 2016, 18:50 A kiszámítás modelljei 2 De milyen architektúrán polinom? A kiszámításnak számos (matematikai) modellje létezik: Általános rekurzív függvények λ-kalkulus

Részletesebben

Processzorok Utasításszintű Kezelése tavasz

Processzorok Utasításszintű Kezelése tavasz Processzorok Utasításszintű Kezelése 2014 tavasz Ajánlott irodalom Agárdi Gábor: Gyakorlati Assembly, LSI Oktatóközpont, 1996, ISBN 963 577 117 7 Agárdi G.: Gyakorlati Assembly haladóknak, LSI oktatóközpont,

Részletesebben

7. Fejezet A processzor és a memória

7. Fejezet A processzor és a memória 7. Fejezet A processzor és a memória The Architecture of Computer Hardware and Systems Software: An Information Technology Approach 3rd Edition, Irv Englander John Wiley and Sons 2003 Wilson Wong, Bentley

Részletesebben

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei Java2 / 1 Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2009. 02. 09. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve

Részletesebben

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD) Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD) Multiplexer (MPX) A multiplexer egy olyan áramkör, amely több bemeneti adat közül a megcímzett bemeneti adatot továbbítja a kimenetére.

Részletesebben

AWK programozás, minták, vezérlési szerkezetek

AWK programozás, minták, vezérlési szerkezetek 10 AWK programozás, minták, vezérlési szerkezetek AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa

Részletesebben

Assembly utasítások listája

Assembly utasítások listája Assembly utasítások listája Bevezetés: Ebben a segédanyagban a fontosabb assembly utasításokat szedtem össze. Az utasítások csoportosítva vannak. A fontos kategóriába azok az utasítások tartoznak, amiknek

Részletesebben

Járműfedélzeti rendszerek I. 2. előadás Dr. Bécsi Tamás

Járműfedélzeti rendszerek I. 2. előadás Dr. Bécsi Tamás Járműfedélzeti rendszerek I. 2. előadás Dr. Bécsi Tamás Alapfogalmak (MCU) I. Gépi szóhossz A processzor által egyszerre kezelhető adatmennyiség, azaz egy működési lépés során hány bit információ kerül

Részletesebben