[PIC programování] – 1. díl

Vítám vás u prvního dílu série o programování mikrokontrolérů PIC.

V minulém díle jsem uvedl, že si napíšeme nějaký malý program v Assemleru. Bohužel vás zklamu, protože dnešní téma je poměrně rozsáhlé a článek by byl moc dlouhý. Podíváme na číselné soustavy, vysvětlíme si pojmy bit a byte a spojíme si je s číselnými soustavami. S nimi také úzce souvisí pojem registr. Ukážeme si co to je a jak funguje.

Číselné soustavy

Dá se říct, že většina obyčejných smrtelníků počítá v desítkové (dekadické) soustavě, tedy že používají číslice od 0 do 9. My si k nim ještě přidáme dvě: dvojkovou (binární) a šestnáctkovou (hexadecimální).

Takže, jak to funguje?

Když počítáte v dekadické soustavě, vypadá to asi následovně:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 a tak dále…

Je vidět, že v každém čísle najdete číslice v rozsahu 0-9, tedy 10 čísel – proto desítková soustava.

Pokud bychom počítali v binární soustavě, používáme pouze dvě číslice: 0 a 1. Řada čísel od nuly do 20 by tedy vypadala takto:

0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111, 10000, 10001, 10010, 10011, 10100.

V hexadecimální soustavě používáme celkem 16 čísel – od 0 do F. Proč do F? Pokud si vypíšeme řadu použitých číslic, bude to

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.

Čísla 10 – 15 jsou dvojciferná, my potřebujeme jednociferná. Proto je nahradíme písmeny A až F. Číselná řada od 0 do 30 pak bude vypadat takto:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E.

K čemu nám jsou jednotlivé soustavy pochopíte během tohoto dílu 🙂 .

Jak převádět mezi soustavami a trocha teorie z matiky

Pokud se zamyslíme nad tím, jak fungují čísla v desítkové soustavě, možná dojdeme k názoru, že jsou to součty násobků jednotlivých řádů. Moc kecám 😀 ? Pojďme se podívat na příklad:

Pokud si vezmeme například číslo 1523710 (desítka v dolním indexu znamená, že je číslo zapsáno v desítkové soustavě), můžeme ho zapsat následovně:

1 * 10000 + 5 * 1000 + 2 * 100 + 3 * 10 + 7 * 1.

Pokud se podíváme pozorně, násobíme vlastně mocniny čísla 10. Ještě jednou rozepíšu naše číslo, ale pomocí mocnin 10:

1 * 104 + 5 * 103 + 2 * 102 + 3 * 101 + 7 * 100.

Po sečtení vám opět vyjde číslo 15237.

Totéž my ale můžeme udělat i s 101102:

1 * 24 + 0 * 23 + 1 * 22 + 1 * 21 + 0 * 20.

Po součtu nám vyjde číslo 22, které je v desítkové soustavě. Tedy 101102 = 2210. Takto se převádí čísla z dvojkové soustavy do desítkové. Pokud bychom chtěli převést číslo v desítkové soustavě do binární, použijeme opačný postup.

Mějme například číslo 72. Pokud se zamyslíme, tak největší mocnina dvou, která se do tohoto čísla vejde, je šestá mocnina (tedy 26 = 64). Po odečtení od 72 nám zbude 8. Číslo 8 vyjádříme jako třetí mocninu dvou. Máme tedy součet 26 + 23 = 72. Pokud to rozepíšeme do celé řady násobků mocnin čísla dvě, bude to vypadat takto:

1 * 26 + 0 * 25 + 0 * 24 + 1 * 23 + 0 * 22 + 0 * 21 + 0 * 20.

Pokud číslo přepíšeme, vypadá takto: 10010002. V tomto případě se nám počítalo celkem snadno, pokud bychom ale měli číslo značně vyšší, například 6457856421, už by se nám tak lehce nepočítalo. Proto existuje jednodušší způsob a my si ho ukážeme:

Pokud si vzpomenete asi na 3. třídu základní školy, jistě si vzpomenete na pojem “zbytek po dělení.” Pro jistotu vám dám příklad. Pokud by vám někdo zadal příklad 26 : 4, vyjde vám (alespoň doufám 😀 ), že je to 6,5. Ve třetí třídě (tedy alespoň já, pokud si vzpomínám dobře) bychom řekli, že je to 6 a zbytek 2. Tedy 6 * 4 + 2 = 26. Programátoři pro tento zbytek používají speciální operátor zvaný modulo. Značí se %. Tedy pokud napíšu 26 % 4, rovná se to 2. A pokud do toho připleteme dvojkovou soustavu, zjistíme, že pro modulo dvěma nám vždy vyjde zbytek 1 nebo 0. A to je jev, kterého využijeme při převodu čísla dekadického na číslo binární.

Pojďme dělit číslo 769 (a jeho výsledné podíly) dvěma, dokud nedojdeme nuly: (uvedené číslo v závorkách je zbytek po dělení)

769 : 2 = 384 (1)
384 : 2 = 192 (0)
192 : 2 =   96 (0)
  96 : 2 =   48 (0)
  48 : 2 =   24 (0)
  24 : 2 =   12 (0)
  12 : 2 =     6 (0)
    6 : 2 =     3 (0)
    3 : 2 =     1 (1)
    1 : 2 =     0 (1)

Pokud teď seřadíme zbytky po zpátku, dostaneme číslo 11000000012. Pokud si toto číslo rozeberete (stejně jako já předtím), dojdete opět k číslu 76910. Pokud máte kalkulačku, která umí převody mezi číselnými soustavami, máte to bez práce 🙂 . Ostatně to umí většinou i každá kalkulačka v počítači.

Pokud jsem vás těmito postupy odradil, tak se nebojte, tohle stejně používat nebudete 😀 . Většina z nás si to asi dá do kalkulačky a nechá si to převést počítačem 🙂 . Myslím si ale, že tuto terii by měl znát každý programátor, proto jsem vám ji poskytl.

Pojďme si to celé ještě ukázat na šestnáctkové soustavě:

Pokud bychom si vzali například číslo 7B, můžeme ho rozepsat jako

7 * 161 + 11 * 160,

což nám v součtu dá číslo 12310. Vídíte, že jsem použil stejný postup, jako v případě binární soustavy. Při převodu z desítkové soustavy použijeme zbytky po dělení. Pokud se zamyslíme, tak po dělení šestnácti dostáváme zbytky v rozsahu 0 až 15. Mějme tedy číslo 625:

625 : 16 = 39 (1)
  39 : 16 =   2 (7)
    2 : 16 =   0 (2)

Pokud opět seřadíme zbytky po zpátku, vyjde nám číslo 27116. Pro jistotu ještě ukážu číslo s písmeny. Mějme tedy číslo 447:

447 : 16 = 27 (15)
  27 : 16 =   1 (11)
    1 : 16 =   0  (1)

Po seřazení zbytků po zpátku dostáváme čísla 1, 11 a 15, která přepíšeme jako 1, B, F. Tedy dostáváme číslo 1BF16. Opět si to můžete ověřit 11111111roznásobením, nebo na kalkulačce 😉 .

To je k číselným soustavám ode mě vše.

Bit a bajt

Pojďme si nyní objasnit dva pojmy, které si začátečníci dosti pletou. Bit je složeninou dvou anglických slov: binary digit. Je to nejmenší jednotka velikosti dat, jaká v informatice existuje. Nese buď hodnotu 1 nebo 0. Pokud dáme osm bitů dohromady, vyjde nám bajt (anglicky byte). Pokud všechny bity v bajtu budou 1, pak dostaneme binární číslo 111111112. Po převedení do desítkové soustavy zjistíme, že je tato hodnota rovna 255. To znamená, že bajt může mít celkem 256 číselných kombinací (nezapomeňte počítat nulu). Každá procesor pracuje s bajty jako s nejmenší jednotkou. Tedy, čísla ukládá ve velikostech násobcích bajtů. Pokud máte v počítači 64-bitový procesor, pak to znamená, že může pracovat s čísly, která mají až 64 bitů (tedy 8 bajtů). My v tomto seriálu použijeme mikrokontrolér, který je pouze 8-bitový. To nám ale nebude bránit si naprogramovat více bajtová čísla – ale o tom až později 🙂 . V logických obvodech a výrokové logice se také používá pojem logická hodnota. Logická hodnota buď nese číslo 1 nebo 0. 1 většinou značí stav zapnuto/pravda, 0 většinou značí stav vypnuto/nepravda. Logickou hodnotu nám právě značí bit.

Registr

Registr je jakási paměťová buňka, která má určitý počet bajtů. Pokud máme 8-bitový procesor, pracujeme s 1-bajtovými registry. Pokud máme 64-bitový procesor, pracujeme s 8-bajtovými registry. Více o registrech si povíme v příštích dílech.

 

To by bylo pro tento díl vše. V příštím díle si ukážeme strukturu našeho mikrokontroléru PIC16F1705, naučíme se pracovat s datasheetem, ponoříme se hlouběji do registrů a snad se dostaneme i k nějakému tomu malému prográmku v assembleru.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.