Hlavní navigace

Minimalistické osmibitové mikrořadiče s jádry RS08

29. 11. 2016
Doba čtení: 15 minut

Sdílet

Z osmibitových jader S08 byla odvozena další řada jader nazvaná RS08. Tato jádra jsou určena pro výpočetně a paměťově nenáročné aplikace, v nichž je limitujícím faktorem minimální spotřeba.

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

6. Instrukční sada jader RS08

7. Aritmetické instrukce

8. Logické instrukce

9. Aritmetické posuny, bitové posuny a rotace

10. Podmíněné i nepodmíněné skoky

11. Instrukce Booleovského procesoru

12. Ostatní operace

13. Časovač a generátor PWM

14. A/D převodník

15. Analogový komparátor

16. Odkazy na Internetu

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:

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:

  1. 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ů.
  2. 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:
  3. Reagovat lze na sestupnou hranu, vzestupnou hranu nebo na obě hrany externího signálu.
  4. Při porovnání (compare) může čítač automaticky nastavit, vynulovat či znegovat zvolený pin.
  5. 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.
  6. 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í.

UX DAy - tip 2

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

  1. 8-bit S08
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-s08:HCS08
  2. S08QB: 8-bit QB MCUs
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-s08/8-bit-s08–3.6v-mcus/8-bit-qb-mcus:S08QB
  3. 8-bit RS08
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-rs08:RS08FAMILY
  4. Wikipedia: Motorola 68HC05
    http://en.wikipedia.org/wi­ki/Motorola_68HC05
  5. Wikipedia: Freescale 68HC08
    http://en.wikipedia.org/wiki/68HC08
  6. Wikipedia: Freescale 68HC11
    http://en.wikipedia.org/wiki/68HC11
  7. Wikipedia: Freescale 68HC12
    http://en.wikipedia.org/wi­ki/Freescale_68HC12
  8. HC05 Processor Families
    http://www.freescale.com/we­bapp/sps/site/overview.jsp?no­deId=01624684498633
  9. HC08 Processor Families
    http://www.freescale.com/we­bapp/sps/site/overview.jsp?no­deId=01624684497663
  10. Digital Core Design 68HC08 – HDL IP Core
    http://www.dcd.pl/acore.php?idcore=82
  11. Freescale 68HC11
    http://www.freescale.com/we­bapp/sps/site/taxonomy.jsp?no­deId=01624684498635
  12. Lifecycle of a CPU:
    http://www.cpushack.net/life-cycle-of-cpu.html
  13. Great Microprocessors of the Past and Present (V 13.4.0)
    http://jbayko.sasktelwebsi­te.net/cpu.html
  14. SPI interface tutorial
    http://www.best-microcontroller-projects.com/spi-interface.html
  15. Serial Peripheral Interface Bus
    http://en.wikipedia.org/wi­ki/Serial_Peripheral_Inter­face_Bus
  16. What is SPI?
    http://www.fpga4fun.com/SPI1.html
  17. SPI – A simple implementation
    http://www.fpga4fun.com/SPI2.html
  18. Bit-banging
    http://en.wikipedia.org/wiki/Bit-banging
  19. Joint Test Action Group
    http://en.wikipedia.org/wiki/JTAG
  20. I2C
    http://en.wikipedia.org/wiki/I2C
  21. I2 Background
    http://www.microport.tw/blog­new.php?blog_no=7#theory
  22. H8/3802, 38002S, 38004, 38104 (manuály k čipům)
    https://www.renesas.com/en-us/document/hw-manual?hwLayerShowFlg=tru­e&prdLayerId=184&layerName=H8%252F3802%252C%2B38­002S%252C%2B38004%252C%2B38104&co­ronrService=document-prd-search&hwDocUrl=%2Fen-us%2Fdoc%2Fproducts%2Fmpum­cu%2F001%2Frej09b0024_h83802­.pdf&hashKey=c5e1fa0a18c01e6c789bc7­b5c0184ed9
  23. Addressing mode (Wikipedia)
    https://en.wikipedia.org/wi­ki/Addressing_mode
  24. Renesas SH Instruction Set Summary
    http://shared-ptr.com/sh_insns.html
  25. SH-4 RISC Processor by HITACHI
    http://www.cs.umd.edu/~me­esh/cmsc411/website/projec­ts/risc/risc.htm
  26. SH-4 RISC Processor
    http://www.cs.umd.edu/~me­esh/cmsc411/website/projec­ts/risc/sh-4.htm
  27. SuperH RISC engine Family Features
    https://www.renesas.com/en-us/products/microcontrollers-microprocessors/superh/superh-features.html
  28. Orthogonal instruction set
    https://en.wikipedia.org/wi­ki/Orthogonal_instruction_set
  29. An introduction to the TI MSP430 low-power microcontrollers
    http://mspgcc.sourceforge­.net/manual/c68.html
  30. MSP430 LaunchPad Tutorials
    http://processors.wiki.ti­.com/index.php/MSP430_Lau­nchPad_Tutorials
  31. LaunchPad MSP430 Assembly Language Tutorial
    http://robotics.hobbizine­.com/asmlau.html
  32. TI 16-bit and 32-bit microcontrollers
    http://www.ti.com/lsds/ti/mi­crocontrollers16-bit32-bit/overview.page

Byl pro vás článek přínosný?