Obsah
1. Minimalistické osmibitové mikrořadiče s jádry RS08
2. Adresní prostor mikrořadičů s jádry RS08
3. Registry implementované v centrální procesorové jednotce
4. Registry mapované do operační paměti
5. Podporované adresovací režimy
9. Aritmetické posuny, bitové posuny a rotace
10. Podmíněné i nepodmíněné skoky
11. Instrukce Booleovského procesoru
1. Minimalistické osmibitové mikrořadiče s jádry RS08
V předchozím článku seriálu o architekturách počítačů a procesorů jsme se seznámili se základními vlastnostmi i s instrukční sadou osmibitových mikrořadičových jader S08. Připomeňme si, že tato jádra byla odvozena od starších osmibitových mikrořadičů Motorola 68HC08 a jejich společným prapředkem je slavný osmibitový mikroprocesor Motorola 6800. Mikrořadiče s jádry S08 nalezneme i v dnešních zařízeních, pochopitelně ovšem v těch oblastech, kde není vyžadován čip s vysokým výpočetním výkonem a/nebo velkou kapacitou paměti RAM. Typické čipy postavené na těchto jádrech mají hodinovou frekvenci mezi 20 MHz až 40 MHz, relativně vysoký počet GPIO (až 20 v závislosti na tom, zda se nepoužije alternativní funkce pinů), sériové sběrnice SPI a SCI, modul pro PWM (pulsně šířkovou modulaci) a jeden až dva časovače.
Kvůli požadavkům na dosažení co nejmenší spotřeby a taktéž nízké ceny celého čipu byla úpravou architektury jader S08 vytvořena další řada jader označovaná RS08. Některé úpravy byly z pohledu programátorů drastické – například počet příznakových bitů se snížil ze šesti na pouhé dva, zmenšila se šířka adresové sběrnice na čtrnáct bitů, kapacita RAM dosahuje pouze 64, 128 či 256 bajtů atd. Výsledkem jsou jádra, která se používají v čipech, jenž se někdy s nadhledem (navíc poněkud nepřesně) označují termínem „programovatelné součástky“. Podobný segment trhu obsadily i některé konkurenční čipy, z nichž zmiňme například řadu PIC10 či nepatrně výkonnější čipy PIC12 (tyto dvě řady osmibitových mikrořadičů jsme si již v tomto seriálu popsali dříve: [1] a [2])).
V následujících kapitolách si nejprve popíšeme největší rozdíly mezi jádry S08 a RS08 a následně se zmíníme o typických konfiguracích mikrořadičů i o jejich periferních modulech.
2. Adresní prostor mikrořadičů s jádry RS08
Adresní prostor byl zmenšen z plných 64 kB na pouhých 16 kB. To se odrazilo na menším čítači instrukcí, který má šířku pouze 14 bitů. Adresní prostor byl dále rozdělen takovým způsobem, že v prvních čtrnácti bajtech se nachází takzvaná paměť s rychlým přístupem (fast access RAM), za ní se nachází registry X a D[X] (ty jsou tedy mapovány do paměťového prostoru) a dalších šestnáct bajtů je určeno pro vybrané řídicí registry. Po těchto třech oblastech nalezneme v adresním prostoru zbylou část RAM, „okno“ do něhož je možné mapovat jinou paměť (viz další odstavec), zbylé řídicí registry a na samotném konci adresního prostoru se nachází oblast s Flash ROM.
Zajímavá je funkce paměťového okna, které nalezneme na adresách 0×00c0 až 0×00ff. Do této oblasti o velikosti 64 bajtů je možné namapovat libovolnou stránku paměti, přičemž každá stránka má velikost oněch zmíněných 64 bajtů (celkový počet stránek je 256, takže skutečně získáme celý paměťový rozsah: 64×256=16384). Toto řešení bylo vynuceno zmenšením indexového registru na osm bitů (původně se jednalo o registrový pár H:X), což znamená, že lze adresovat jen prvních 256 bajtů z adresového prostoru. Výběr paměťové stránky se provádí zápisem do registru PAGESEL.
3. Registry implementované v centrální procesorové jednotce
U jader S08 měl programátor pracující v assembleru k dispozici několik registrů, především osmibitový akumulátor A, šestnáctibitový indexový registr H:X složený (jak jeho označení napovídá) ze dvou osmibitových registrů H a X, šestnáctibitový ukazatel na vrchol zásobníku SP a taktéž šestnáctibitový programový čítač PC. Kromě toho se v registru pojmenovaném CCR sdružovala šestice příznakových bitů nastavovaná aritmetickými, logickými a bitovými operacemi, stejně jako bitovými rotacemi a aritmetickými posuny. Tyto bity a jejich kombinace byly využity zejména pro provádění podmíněných skoků.
U jednodušších jader RS08 došlo k podstatným úpravám i v této oblasti. Osmibitový akumulátor A sice zůstal zachován, ovšem šířka programového čítače PC byla zůžena na čtrnáct bitů, což mimochodem znamená, že adresovatelný rozsah byl zmenšen na 16384 adres (některé jsou obsazeny RAM, další pamětí ROM, do tohoto rozsahu jsou mapovány i řídicí registry). Kromě programového čítače PC byl přidán další čtrnáctibitový registr SPC neboli Shadow Program Counter. Do tohoto registru se ukládá návratová adresa při volání subrutin. Po přečtení tohoto popisu již pravděpodobně tušíte, že jádra RS08 neobsahují žádný zásobník a tudíž ani ukazatel na vrchol zásobníku SP. To, že se pro uložení návratové adresy nepoužívá zásobník, ale jen jediný registr, de facto znamená, že buď může existovat jen jediná úroveň zanoření subrutin, nebo je nutné činnost zásobníku nějakým způsobem emulovat, například explicitním ukládáním a obnovováním návratových adres do operační paměti.
Počet příznakových bitů uložených do registru CCR byl taktéž snížen, a to dosti drasticky, protože zachovány zůstaly pouhé dva příznaky – Zero flag a Carry flag. To mj. znamená, že na jádrech RS08 neexistuje přímá podpora pro výpočty s celými čísly se znaménkem (základní operace lze provádět, ale nikoli již některé podmínky) ani s BCD kódem (to by mohlo vadit při ovládání některých displejů či hodin reálného času – RTC).
4. Registry mapované do operační paměti
V předchozí kapitole jsme se vůbec nezmínili o indexovém registru či indexových registrech, i když již víme, že existence takových registrů je pro čipy odvozené od mikroprocesoru Motorola 6800 zcela zásadní. Ve skutečnosti programátoři používající čipy RS08 sice mají k dispozici indexový registr X, ten ovšem není realizován přímo na CPU, ale je mapován do „rychlé“ operační paměti, konkrétně na adresu 0×000f. Navíc je do operační paměti na adresu 0×000e mapován i pseudoregistr označovaný D[X]. Při čtení či zápisu do tohoto pseudoregistru se ve skutečnosti provede čtení/zápis do buňky aktuálně adresované registrem X. Toto řešení může připomínat například čipy 8051 (pracovní registry R0-R7 + „index registr“ nazvaný DPTR) nebo ještě více čipy PIC s pseudoregistrem INDF a registrem FSR.
Pro porovnání možností různých čipů odvozených od Motoroly 6800 si zopakujme tabulku uvedenou v předchozím článku:
Čip | Typ | Akumulátor(y) | D=A+B (16b) | Index registr(y) | Čítač instrukcí | Zásobníkové registry | Spec. registry |
---|---|---|---|---|---|---|---|
MC6800 | CPU | A (8b), B (8b) | ne | X (16b) | PC (16b) | SP (16b) | CCR (6b) |
68HC05 | MCU | A (8b) | ne | X (8b) | PC (13b) | SP (13b) | CCR (5b) |
68HC08 | MCU | A (8b) | ne | H:X (16b) | PC (16b) | SP (16b) | CCR (6b) |
68HC11 | MCU | A (8b), B (8b) | ano | X (16b), Y (16b) | PC (16b) | SP (16b) | CCR (8b) |
S08 | MCU | A (8b) | ne | H:X (16b) | PC (16b) | SP (16b) | CCR (6b) |
RS08 | MCU | A (8b) | ne | X (8b) | PC (14b) + SPS (14bit) | × | CCR (2b) |
5. Podporované adresovací režimy
Adresovací režimy byly oproti jádrům S08 taktéž změněny, a to následujícím způsobem:
# | Název | Zkratka | Stručný popis |
---|---|---|---|
1 | Inherent | INH | operand je umístěn v registru (nezměněno) |
2 | Relative | REL | za instrukcí je osmibitový offset připočtený k PC (nezměněno) |
3 | Immediate | IMM | za instrukcí je umístěna 8bit konstanta (16bit není podporován) |
4 | Tiny | TNY | přímé adresování prvních 16 bajtů (novinka) |
5 | Short | SRT | přímé adresování prvních 32 bajtů (novinka) |
6 | Direct | DIR | za instrukcí je umístěna osmibitová adresa do nulté stránky (nezměněno) |
7 | Extended | EXT | za instrukcí je umístěna 14bitová absolutní adresa (zmenšeno na 14 bitů) |
8 | Indexed | IX | operand je adresován přes D[X] (omezení proti S08) |
9 | Indexed with Post Increment | IX+ | (neexistuje) |
10 | Indexed, 8-Bit Offset | IX1 | (neexistuje) |
11 | Indexed, 16-Bit Offset | IX2 | (neexistuje) |
12 | Indexed, 8-Bit Offset with Post Increment | IX1+ | (neexistuje) |
13 | SP-Relative, 8-Bit Offset | SP1 | (neexistuje) |
14 | SP-Relative, 16-Bit Offset | SP2 | (neexistuje) |
Adresovací režim Tiny je zajímavý tím, že čtyřbitová adresa je přímo součástí instrukčního kódu. Totéž platí pro režim Short, který je však dostupný jen pro několik instrukcí (což dává smysl, protože jediná instrukce zabere velkou část dostupných operačních kódů).
6. Instrukční sada jader RS08
Instrukční sada jader RS08 se v několika ohledech odlišuje od původních jader S08, což je však očekávatelné, zejména s ohledem na změny v konfiguraci registrů dostupných programátorům i kvůli menšímu počtu příznakových bitů. Následující kapitoly jsou pojmenovány stejně, jako tomu bylo v předchozím článku, takže si můžete rozdíly mezi instrukčními sadami snadno porovnat:
Skupina | Počet instrukcí |
---|---|
Aritmetické instrukce | 9 |
Logické instrukce | 4 |
Posuny a rotace | 5 |
Podmíněné a nepodmíněné skoky | 12 |
Instrukce Booleovského procesoru | 4 |
Přesuny dat a další operace | 15 |
Celkem: | 49 |
Malý počet instrukcí ovšem neznamená, že by mapa operačních kódů 0×00 až 0×ff byla prázdná. Především kvůli adresovacím režimům Tiny a Short jsou naopak prakticky všechny kódy obsazeny (celkem 245 kódů z 256).
7. Aritmetické instrukce
Sada aritmetických (a testovacích) instrukcí se zmenšila. Chybí například instrukce pro násobení a dělení (což je u jader RS08 pochopitelné) i všechny 16bitové instrukce typu AIS, CPHX apod.:
# | Instrukce | Stručný popis |
---|---|---|
1 | ADD | součet A = A + mem |
2 | ADC | součet A = A + mem + carry |
3 | SUB | rozdíl A = A – mem |
4 | SBC | rozdíl A = A – mem – carry |
5 | INC | inkrementace A, X, nebo mem |
6 | DEC | dekrementace A, X, nebo mem |
7 | CLR | vynulování A, X, nebo mem |
8 | CMP | jako SUB, ale bez změny obsahu registru A |
9 | TST | porovnání A, X nebo mem s nulou |
Poznámka: operace prováděné pouze s registrem A či X se ve skutečnosti zapisují ve formě <instrukce>A a <instrukce>X, tedy například INCA, INCX, CLRA, TSTX atd.
8. Logické instrukce
Ze skupiny logických instrukcí zmizela instrukce BIT, instrukce COM byla redukována pouze na použití s akumulátorem a ostatní tři instrukce podporují jen dva adresní režimy (Immediate a Direct); další dva režimy jsou dostupné díky tomu, že registry X a D[X] jsou mapovány do adresního prostoru:
# | Instrukce | Stručný popis |
---|---|---|
1 | AND | logický součin bit po bitu: A = A & mem |
2 | ORA | logické součet bit po bitu: A = A | mem |
3 | EOR | logická nonekvivalence: A = A ⊕ memm |
4 | COMA | negace A |
9. Aritmetické posuny, bitové posuny a rotace
Všechny instrukce pro aritmetické i bitové posuny a rotace dokážou operand, kterým je zde pouze akumulátor (!), posunout o jediný bit. U aritmetických a logických posunů se přebytečný bit přesouvá do příznaku carry, u obou instrukcí pro rotaci je carry naopak devátým bitem v „posuvném registru“:
# | Instrukce | Stručný popis |
---|---|---|
1 | LSLA | logický posun doleva (lze posouvat jen A) |
2 | LSRA | logický posun doprava (-//-) |
3 | ASLA | pouze alias k instrukci LSL |
4 | ROLA | rotace doleva přes příznak carry |
5 | RORA | rotace doprava přes příznak carry |
Povšimněte si absence instrukce ASR/ASRA, tedy aritmetického posunu doprava. Ten vlastně nemá valného významu, protože zpracování celých čísel se znaménkem stejně není podporováno.
10. Podmíněné i nepodmíněné skoky
Původní rozsáhlá skupina s podmíněnými a nepodmíněnými skoky se u jader RS08 výrazně zmenšila. Je tomu tak z toho důvodu, že byly odstraněny příznaky Overflow a Negative, takže velké množství podmínek vlastně není možné nijak vyhodnotit:
# | Instrukce | Stručný popis |
---|---|---|
1 | JMP | nepodmíněný skok |
2 | BRA | nepodmíněný skok |
3 | BRN | v podstatě instrukce NOP |
4 | BEQ | skok za podmínky Z = 1 |
5 | BNE | skok za podmínky Z = 0 |
6 | BCC | skok za podmínky C = 0 |
7 | BCS | skok za podmínky C = 1 |
8 | CBEQ | skok pokud A = mem |
9 | DBNZ | dekrementace A nebo M se skokem, pokud je výsledek nenulový |
10 | JSR | skok do podprogramu |
11 | BSR | relativní skok do podprogramu |
12 | RTS | návrat z podprogramu |
Assemblery navíc rozpoznávají i instrukční aliasy BHS a BLO.
11. Instrukce Booleovského procesoru
Zajímavé je, že všechny čtyři instrukce Booleovského procesoru zůstaly na jádrech RS08 zachovány. Instrukce BCLR a BSET podporují adresovací režim Tiny, což mj. znamená, že jak adresa bajtu, tak i index bitu 0..7 jsou součástí jediného instrukčního kódu:
# | Instrukce | Stručný popis |
---|---|---|
1 | BCLR | vynulování bitu v paměti |
2 | BSET | nastavení bitu v paměti |
3 | BRCLR | skok, pokud je bit v paměti nulový |
4 | BRSET | skok, pokud je bit v paměti nastavený na 1 |
12. Ostatní operace
Z ostatních operací stojí za zmínku především trojice nových instrukcí MOV, SHA a SLA. Instrukce MOV umožňuje přesunutí bajtu mezi dvěma místy v operační paměti (ovšem pouze v rámci prvních 256 bajtů). Díky této instrukci i díky tomu, že registry X a D[X] jsou mapovány do této paměťové oblasti, je umožněna existence pseudoinstrukcí LDX, STX a několika adresních režimů. Instrukce SHA a SLA představují jedinou možnost manipulace s návratovou adresou, takže tyto instrukce mohou být užitečné při softwarové implementaci zásobníku:
# | Instrukce | Stručný popis |
---|---|---|
1 | LDA | načtení bajtu do akumulátoru A |
2 | LDX | načtení bajtu do index registru X (pseudoinstrukce) |
3 | STA | uložení akumulátoru do mem |
4 | STX | uložení index registru X do mem (pseudoinstrukce) |
5 | TAX | přesun X=A (pseudoinstrukce) |
6 | TXA | přesun A=X (pseudoinstrukce) |
7 | MOV | přesun bajtu mezi dvěma adresami v paměti |
8 | SHA | prohození horních šesti bitů registru SPC s akumulátorem |
9 | SLA | prohození dolních osmi bitů registru SPC s akumulátorem |
10 | NOP | NOP (na rozdíl od BRN má jen jeden bajt) |
11 | SEC | nastavení C=1 |
12 | CLC | vynulování C=0 |
13 | BGND | pozastavení běhu programu |
14 | WAIT | čekání na přerušení |
15 | STOP | ukončení běhu programu a čekání na přerušení |
13. Časovač a generátor PWM
Většina mikrořadičů obsahujících jádro RS08 je osazena jedním nebo dvěma časovači nazvanými TPM, které mohou být použity pro ovládání externích zařízení (motorů, osvětlení apod.) s využitím PWM (pulsně šířkovou modulací). Pro každý TPM může být zvolen samostatný zdroj hodinových signálů – buď interních (rozvedených přímo na čipu) nebo externích (přivedených na pin TPMCLK). Hodinový signál může být před přivedením do čítače dělen konstantou 1, 2, 4 .. 128. Každý TPM má dva kanály, které sice pracují nezávisle na sobě, ale vždy používají stejný zdroj hodinových signálů. V případě dvou TPM tedy existují čtyři kanály, kde každý kanál může být nastaven na jinou funkci:
- Porovnání hodnoty čítače s nastavenou konstantou (compare). Časovač a tedy i porovnávaná konstanta (uložená do řídicího registru), mají šířku 16 bitů.
- Zachycení aktuální hodnoty čítače na základě externího signálu (capture). I v tomto případě se zachytí 16bitová hodnota čítače a lze specifikovat, na jakou hranu externího signálu se má reagovat:
- Reagovat lze na sestupnou hranu, vzestupnou hranu nebo na obě hrany externího signálu.
- Při porovnání (compare) může čítač automaticky nastavit, vynulovat či znegovat zvolený pin.
- Existuje i speciální režim pro pulsně šířkovou modulaci, kdy je možné specifikovat střídu 0–100%. Tento režim se podobá režimu porovnávání (compare), kdy se při dosažení nastavené hodnoty změní hodnota výstupního pinu. Další automatická změna pinu nastane při přetečení časovače. Samozřejmě lze zvolit polaritu signálu; při přetečení časovače se může signál přepnout do hodnoty 1 a při dosažení nastavené hodnoty naopak spadnout do nuly.
- Pro všechny události (compare, capture) je možné specifikovat přerušovací rutinu.
Některé čipy obsahují kromě TPM i takzvaný modulo timer (MTIM), který je taktéž programovatelný a pro nějž lze zvolit různé hodinové signály – hodiny použité v CPU, externí hodinový signál, hodinový signál odvozený od připojeného krystalu – i různé konstanty, jimiž se hodinový signál dělí (1, 2, 4, …256). MTIM je pouze osmibitový, takže obsahuje jen osmibitový komparátor. Podporovány jsou dva základní režimy činnosti – kontinuální čítání a režim porovnání (compare); v obou režimech lze samozřejmě zvolit, za jakých podmínek (a jestli vůbec) se bude generovat přerušení.
14. A/D převodník
Některé čipy s jádry RS08 jsou vybaveny i A/D převodníkem s (teoretickým) rozlišením dvanáct bitů, ovšem lze ho nakonfigurovat i pro rozlišení deseti či osmi bitů. Rychlost převodu a režim činnosti (kontinuální vs. jedno měření) je taktéž konfigurovatelný. Zajímavé je, že existuje celkem 32 vstupů do A/D převodníku, ovšem na externí piny je většinou vyvedeno jen osm vstupů a u menších čipů je k dispozici ještě méně pinů. Další vstupy jsou určeny pro přivedení referenčního napětí, teplotního senzoru atd. Ovšem interní teplotní senzor není příliš přesný – bez kalibrace je přesnost jen ±12°C, s kalibrací pak ±4,5°C (pro detekci mezních teplot to však může dostačovat).
15. Napěťový komparátor
Napěťový komparátor pracuje podobně, jako je tomu u mnoha jiných mikrořadičů. Dochází zde k porovnání dvou napětí, přičemž obě napětí mohou být přivedena na vstupní piny (ACMP+ a ACMP-), nebo se namísto ACMP+ použije interně přivedené referenční napětí. Na základě porovnání těchto dvou napětí se na výstupu komparátoru (ACMPO) objevuje logická jednička či nula (jednička pokud je napětí mezi ACMP+ a ACMP- kladné, nula v opačném případě, samozřejmě s přihlédnutím k určité hysterezi, která zde dosahuje cca 15mV). Navíc je možné zvolit, za jakých podmínek dojde ke vzniku přerušení – vzestupná hrana, sestupná hrana či libovolná hrana na výstupu z napěťového komparátoru.
16. Odkazy na Internetu
- 8-bit S08
http://www.nxp.com/products/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-s08:HCS08 - S08QB: 8-bit QB MCUs
http://www.nxp.com/products/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-s08/8-bit-s08–3.6v-mcus/8-bit-qb-mcus:S08QB - 8-bit RS08
http://www.nxp.com/products/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-rs08:RS08FAMILY - Wikipedia: Motorola 68HC05
http://en.wikipedia.org/wiki/Motorola_68HC05 - Wikipedia: Freescale 68HC08
http://en.wikipedia.org/wiki/68HC08 - Wikipedia: Freescale 68HC11
http://en.wikipedia.org/wiki/68HC11 - Wikipedia: Freescale 68HC12
http://en.wikipedia.org/wiki/Freescale_68HC12 - HC05 Processor Families
http://www.freescale.com/webapp/sps/site/overview.jsp?nodeId=01624684498633 - HC08 Processor Families
http://www.freescale.com/webapp/sps/site/overview.jsp?nodeId=01624684497663 - Digital Core Design 68HC08 – HDL IP Core
http://www.dcd.pl/acore.php?idcore=82 - Freescale 68HC11
http://www.freescale.com/webapp/sps/site/taxonomy.jsp?nodeId=01624684498635 - Lifecycle of a CPU:
http://www.cpushack.net/life-cycle-of-cpu.html - Great Microprocessors of the Past and Present (V 13.4.0)
http://jbayko.sasktelwebsite.net/cpu.html - SPI interface tutorial
http://www.best-microcontroller-projects.com/spi-interface.html - Serial Peripheral Interface Bus
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus - What is SPI?
http://www.fpga4fun.com/SPI1.html - SPI – A simple implementation
http://www.fpga4fun.com/SPI2.html - Bit-banging
http://en.wikipedia.org/wiki/Bit-banging - Joint Test Action Group
http://en.wikipedia.org/wiki/JTAG - I2C
http://en.wikipedia.org/wiki/I2C - I2 Background
http://www.microport.tw/blognew.php?blog_no=7#theory - H8/3802, 38002S, 38004, 38104 (manuály k čipům)
https://www.renesas.com/en-us/document/hw-manual?hwLayerShowFlg=true&prdLayerId=184&layerName=H8%252F3802%252C%2B38002S%252C%2B38004%252C%2B38104&coronrService=document-prd-search&hwDocUrl=%2Fen-us%2Fdoc%2Fproducts%2Fmpumcu%2F001%2Frej09b0024_h83802.pdf&hashKey=c5e1fa0a18c01e6c789bc7b5c0184ed9 - Addressing mode (Wikipedia)
https://en.wikipedia.org/wiki/Addressing_mode - Renesas SH Instruction Set Summary
http://shared-ptr.com/sh_insns.html - SH-4 RISC Processor by HITACHI
http://www.cs.umd.edu/~meesh/cmsc411/website/projects/risc/risc.htm - SH-4 RISC Processor
http://www.cs.umd.edu/~meesh/cmsc411/website/projects/risc/sh-4.htm - SuperH RISC engine Family Features
https://www.renesas.com/en-us/products/microcontrollers-microprocessors/superh/superh-features.html - Orthogonal instruction set
https://en.wikipedia.org/wiki/Orthogonal_instruction_set - An introduction to the TI MSP430 low-power microcontrollers
http://mspgcc.sourceforge.net/manual/c68.html - MSP430 LaunchPad Tutorials
http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_Tutorials - LaunchPad MSP430 Assembly Language Tutorial
http://robotics.hobbizine.com/asmlau.html - TI 16-bit and 32-bit microcontrollers
http://www.ti.com/lsds/ti/microcontrollers16-bit32-bit/overview.page