PIC3
Škola programování PIC 3
Registry a jejich popis.
Rozdělení registrů je patrné na následujícím obrázku:
adresa |
banka 0 |
banka 1 |
00h |
INDF |
|
01h |
TMR0 |
OPTION_REG |
02h |
PCL |
|
03h |
STATUS |
|
04h |
FSR |
|
05h |
PORTA |
TRISA |
06h |
PORTB |
TRISB |
07h |
- |
|
08h |
EEDATA |
EECON1 |
09h |
EEADR |
EECON2 |
0Ah |
PCLATH |
|
0Bh |
INTCON |
|
0Ch až 4Fh |
uživatelské reg. |
Jak bylo uvedeno v úvodu, registrem se nazývají 8 bitové části ať už paměti nebo samostatné celky, které jak je patrno z tabulky mají svou adresu. Takže pokud například chceme něco zapsat na výstupy portu B procesoru, provedeme to uložením informace na adresu 06h, nebo slovem do registru PORTB. Všechny tyto registry je tedy možné adresovat buď přímo číslem, nebo je možné je "volat" jejich názvem, který mají přiřazený (PORTB).
Registry jsou dvojího druhu. První tzv. systémové jsou všechny do adresy 0Bh (nebo 8Bh). Ty uchovávají různá nastavení a informace o běhu procesoru a budou podrobně popsány v zápětí.
Druhý typ registrů jsou tzv. uživatelské (adresy 0Ch až 4Fh). Ty jsou plně k dispozici programátorovi, který je využívá na průběžné odkládání různých mezivýsledků a informací. Jejich adresování je samozřejmě také možné přímo pomocí adres, ale pro usnadnění a zpřehlednění programu se vždy na začátku každého programu všem registrům (samozřejmě jen těm které se používají) přiřazují nějaké názvy a později se pracuje jen s nimi. Tyto názvy většinou vystihují použití toho kterého registru a přeci jen je jednodušší pamatovat si, že jsem si nějakou hodnotu uložil do registru s názvem například CISLO, než jeho konkrétní adresu. To samé platí i o systémových registrech, ale ty své názvy již mají a tak je není potřeba znovu určovat.
Nyní se podíváme na nejpoužívanější systémové registry:
TMR0
Jedná se o obyčejný 8 bitový čítač. V registru OPTION_REG je kromě jiných funkcí možné nastavit i zdroj signálu pro tento čítač. Je možné vybírat mezi vývodem RA4 a impulsy z vnitřních instrukčních cyklů (oscilátor / 4). K tomuto čítači je v případě potřeby možné ještě přiřadit předděličku s nastavitelným dělícím poměrem viz. následující registr.
OPTION_REG
Slouží především k různým nastavením:
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
RBPU |
INTEDG |
T0CS |
T0SE |
PSA |
PS2 |
PS1 |
PS0 |
RBPU - zdvyhací rezistory na portu B. Velké odpory zapojené mezi všechny vývody portu B a + napájení.
0 - připojeny
1 - odpojeny
INTEG - řídící bit hrany přerušení
0 - přerušení nastane při sestupné (1-0) hraně na vývodu RB0
1 - při vzestupné (0-1)
T0CS - zdroj signálu pro čítač TMR0
0 - vnitřní instrukční cyklus
1 - hrana na vývodu RA4
T0SE - volba hrany pro čítání TMR0
0 - přičte při vzestupné hraně
1 - při sestupné
PSA - přiřazení předděliče
0 - předdělič u TMR0
1 - předdělič u WDT
PS2, PS1, PS0 - dělící poměr předděliče dle následující tabulky:
PS |
TMR0 |
WDT |
000 |
1:2 |
1:1 |
001 |
1:4 |
1:2 |
010 |
1:8 |
1:4 |
011 |
1:16 |
1:8 |
100 |
1:32 |
1:16 |
101 |
1:64 |
1:32 |
110 |
1:128 |
1:64 |
111 |
1:256 |
1:128 |
PCL
V tomto registru je dostupných posledních osm bitý čítače programu. Je možné jen nejen číst, ale i zapisovat a tím procesor přesunout na jiné místo programu.
Toho se využívá například při tvorbě tabulek. Vezme se nějaké číslo a to se přičte k hodnotě v tomto registru. Tím se dosáhne přesunu programového čítače o počet kroků rovný přičtenému číslu.
STATUS
Tento registr obsahuje především informace o běhu procesoru (procesor je tedy nastavuje sám) a také je zde bit k přepínání mezi bankou 0 a 1 s registry (proto je také k dispozici v obou).
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
IRP |
RP1 |
RP0 |
TO |
PD |
Z |
DC |
C |
IRP, RP1 - tyto dva bity se zde nepoužívají a při čtení se jeví jako 0
RP0 - výběr banky registrů
0 - banka 0
1 - banka 1
TO - dává informaci o prošlém časovém limitu, nastaví se po přetečení WATCH DOG časovače
0 - byl
1 - nebyl
PD - indikuje použití SLEEP (úsporného režimu)
0 - byl
1 - nebyl
Z - výsledek operace byl roven nule. Při probírání dostupných příkazů bude u všech označeno co ovlivňuje.
0 - nebyl
1 - byl
DC - jako C s tím rozdílem, že indikuje přenos přes 16
0 - nebyl
1 - byl
C - byl přenos do vyššího řádu, tedy přes číslo 256 (registr přetekl)
0 - nebyl
1 - byl
PORTA, PORTB
Jak už název napovídá, jedná se o registry přímo napojené na výstupní porty (které jsou výstupní a které vstupní se nastavuje následujícími registry). Takže, pokud chceme zapsat nějakou hodnotu na výstupy, zapíšeme ji do jednoho z těchto registrů a ona tam zůstane do doby, než ji dalším zápisem změníme.
Popis vývodů u procesoru plně odpovídá bitům v těchto registrech. Tak například vývod RA0 je "nultý" bit v registru PORTA, viz následující obrázek:
PORTA |
|||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
- |
- |
- |
RA4 |
RA3 |
RA2 |
RA1 |
RA0 |
PORTB |
|||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
RB7 |
RB6 |
RB5 |
RB4 |
RB3 |
RB2 |
RB1 |
RB0 |
TRISA, TRISB
Jak bylo naznačeno v předchozím odstavci, tyto registry slouží k nastavení vlastnosti toho kterého vývodu. Tedy, nastavuje se zde, který vývod chceme mít jako vstup a který naopak výstup a to i kdykoliv při běhu programu.
Rozložení bitů plně odpovídá předchozímu obrázku a teď to nejdůležitější. Bit, který má hodnotu 0 je výstupní a naopak, bit s log. 1 je nastaven jako vstupní. Uložíme-li například do registru TRISB tuto binární hodnotu: 00001111, nastavíme tím vývody RB0-RB3 jako vstupní a RB4-RB7 jako výstupní. A ještě taková pomůcka, můžete si to pamatovat podle začátečních písmen anglických názvů (1-In, 0-Out).
Pokud některý z vývodů nastavíme jako výstupní, má z počátku hodnotu Log. 1 a ta se dá změnit zápisem do registrů PORTA a PORTB. Pokud ale některý z vývodů nastavíme jako vstupní, má vysokou impedanci. To znamená, že má velký odpor a jakoby se odpojil. Této vlastnosti se hojně využívá.
EEDATA, EEADR, EECON1, EECON2
Všechny tyto registry slouží ke práci s pamětí EEPROM, která bude podrobně popsána později.
Teď jen tolik, že první registr slouží pro data a druhý pro adresu do které se bude číst, nebo zapisovat. Zbývající dva registry představují něco jako zámek. Protože se tato paměť často používá na důležité údaje (hesla a podobně), tak aby se, například při poruše procesoru, zabránilo nechtěnému přepsání této paměti, musí se před každým zápisem provést přesně stanované kroky, které do těchto registrů uloží dva klíče. Ale o tom všem až později.
PCLATH
Zde je zbylých 5 bitů programového čítače, pokračování z registru PCL.
INTCON
Poslední systémový registr je opět nastavovací. Slouží k nastavení přerušení (viz. první díl) případně indikuje typ vzniklého přerušení.
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
GIE |
EEIE |
TOIE |
INTE |
RBIE |
TOIF |
INTF |
RBIF |
GIE - povolení jakéhokoli přerušení
0 - zakázat
1 - povolit
EEIE - přerušení po dokončení zápisu do EEPROM
0 - zakázat
1 - povolit
TOIE - přerušení po přetečení časovače TMR0
0 - zakázat
1 - povolitINTE - přerušení od vývodu INT - RB0
0 - zakázat
1 - povolit
RBIE - přerušení od změny na portu B
0 - zakázat
1 - povolit
TOIF - příznak přetečení TMR0 (ručně nulovat)
0 - nebyl
1 - byl
INTF - příznak vnějšího přerušení (ručně nulovat)
0 - nebyl
1 - byl
RBIF - příznak přerušení od portu B (ručně nulovat)
0 - nebyl
1 - byl