Aplikace PicDev Procesor PIC16F84 Překladač PicDev Stavebnice P84

-

Procesor PIC16F84
Doprovodná dokumentace k aplikaci PicDev
Copyright (c) 2000 Ing. Miroslav Němeček, Gemtree Software, s.r.o.

www.gemtree.eu

-

Úvod Popis procesoru Registry Instrukce Příklady

Text obsahuje stručný popis procesoru PIC16F84. Jedná se o základní procesor řady PIC16xxx. Popis je, až na pár výjimek, plně platný i pro ostatní procesory této řady, jsou pouze doplněny o další technické prostředky - jak je blíže popsáno v příruční nápovědě aplikace PicDev. Podrobnější popis procesoru a bližší popis ostatních procesorů řady PIC16xxx najdete v datasheetech firmy Microchip Technology Inc., www.microchip.com.

Porovnání
Pro porovnání jsou zde uvedeny hlavní odchylky procesorů řady PIC16xxx oproti procesoru PIC16F84.

 

Popis procesoru

Úvod Popis procesoru Registry Instrukce Příklady

Snad nejvíce proslavil procesory PIC procesor PIC16C84, především díky nízké ceně, malým hardwarovým požadavkům a možnosti rychlého a snadného programování paměti. Sériové programování umožňuje přeprogramovávat procesor "za chodu" přímo v koncové aplikaci bez nutnosti manipulace s procesorem. Proto je velmi snadno použitelný ve stavebnicích a vývojových prostředích. V pozdější době jej nahradil procesor PIC16F84, který se liší větší pamětí a lepšími elektrickými parametry. Pro program používá paměť typu Flash, pro ukládání konfigurace paměť typu EEPROM.

Procesory PIC jsou procesory typu RISC, tedy procesory s omezenou instrukční sadou. To znamená, že k dispozici je pouze několik základních instrukcí procesoru (35), díky čemuž zpracování instrukcí probíhá velmi rychle (1 popř. 2 strojové takty) a každá instrukce zabírá pouze 1 slovo programu. Během jednoho strojového taktu procesor provádí jednu instrukci a současně připravuje následující instrukci. Většina instrukcí proto trvá přesně jeden strojový takt. Pouze některé instrukce, které naruší plynulý tok provádění instrukcí (skokové instrukce, nesplněné podmínky) trvají dva takty, protože procesor nevyužije připravenou instrukci a musí načítat jinou. Jeden strojový takt trvá 4 hodinové impulsy, proto doba provádění instrukcí při použití krystalu 4 MHz trvá 1 µs, popř. pro instrukce narušující plynulost toku instrukcí 2 µs.

Procesory PIC používají tzv. Harvardovu architekturu s oddělenými sběrnicemi pro program a data. To umožňuje zvýšení výkonu procesoru samostatným zpracováním programu a dat a možností používat programovou sběrnici s více bity než má datová sběrnice. Programová sběrnice má šířku 14 bitů (datová 8), což je šířka jednoho programového slova, tj. jedné instrukce.

Jak je obvyklé u RISC, procesor má k dispozici pouze 1 pracovní registr (8-bitový), označovaný W (working register, u jiných procesorů známý jako A, čili akumulátor). Všechny ostatní registry jsou 8-bitové datové proměnné F (files). Registry se označují číslem, které představuje adresu registru v datové paměti. Některé registry mají speciální význam (porty, stavový registr), jiné mohou být programem obecně používány (GPR registry).


Parametry procesoru PIC16F84

Počet instrukcí: 35
Velikost programové paměti: 1024 slov (po 14 bitech)
Velikost datové paměti RAM: 68 bajtů
Velikost paměti EEPROM: 64 bajtů
Počet portů: 13 pinů
Velikost zásobníku: 8 úrovní
Pouzdro: DIP 18
Počet časovačů: 1
Typy oscilátorů: RC, HS, XT, LP
Další vybavení:

Power-on Reset
Power-up Timer
Oscilator Start-up Timer
Watchdog Timer
Code-protection
SLEEP mode


Port A

Port A je 5-bitová vstupně/výstupní brána. V mikročipové technice často označujeme slovem port jednotlivé bity (piny) brány, značíme je např. RA0, RA1 atd.

RA0RA3
Vstup s úrovněmi TTL. Ochranné diody zapojeny proti Vss a Vdd.
Výstup poskytuje proud až 20 mA.

RA4/T0CKI
Vstup Schmittův klopný obvod. Ochranná dioda pouze proti Vss. Lze použít jako hodinový vstup pro časovač TMR0.
Výstup je typu otevřený kolektor, proud až 20 mA.

Všechny porty jsou obousměrné. Řízení směru je možné pomocí registru TRISA.


Port B

Port B je 8-bitová vstupně/výstupní brána. Jednotlivé bity (piny) brány jsou značeny RB0, RB1 atd.

RB0 RB7
Vstup s úrovněmi TTL. Ochranné diody zapojeny proti Vss a Vdd.
Výstup poskytuje proud až 20 mA.

RB0 může být nakonfigurován jako vstup pro vnější přerušení. V tom případě je to vstup typu Schmittův klopný obvod.

RB4 RB7 mohou být konfigurovány tak, aby vyvolaly přerušení při změně úrovně na vstupu.

Všechny porty jsou obousměrné. Řízení směru je možné pomocí registru TRISB.


RESET

RESET procesoru znamená nový start procesoru a může být vyvolán z těchto důvodů: zapnutí napájení, nulování vstupního signálu /MCLR, přetečení WDT.

Při resetu je vynulován čítač instrukcí (program začíná na adrese 0000h), PCLATH je nastaven na 0, všechny porty jsou nastaveny jako vstupní, všechna přerušení jsou zakázána, zápis do EEPROM je zakázán.


Timer0

Timer0 je 8-bitový čítač/časovač. Hodnotu čítače lze číst a nastavovat pomocí registru TMR0. Zápisem do registru se čítání zastaví po dobu 2 následujících instrukčních cyklů.

Mód časovače lze aktivovat nulováním bitu T0CS v registru OPTION. Časovač se inkrementuje každým instrukčním cyklem (tj. 4 hodinové takty oscilátoru).

Mód čítače se aktivuje zapnutím bitu T0CS v registru OPTION. V tomto módu se čítač inkrementuje pomocí vstupu RA4/T0CKI. Spouštěcí hranu lze vybrat bitem T0SE registru OPTION.

Bitem T0IE registru INTCON lze povolit přerušení, pokud TMR0 přeteče z hodnoty 0FFh na 0. Přerušením nelze aktivovat procesor ze stavu SLEEP, čítač je v tomto stavu neaktivní.

Před modul Timer0 lze předřadit pomocí bitu PSA registru OPTION předděličku s nastavitelným dělicím poměrem. Po připojení předděličky k modulu způsobí všechny instrukce zapisující do registru TMR0 vynulování předděličky.

Poznámka: Před přepnutím předděličky mezi moduly Timer0 a WDT se doporučuje TMR0 i WDT vynulovat (i v případě zákazu WDT), jinak může dojít k nahodilému resetování procesoru.


EEPROM

Paměť EEPROM slouží především k ukládání konfigurace programu, jako jsou různá nastavení či volby. Do paměti EEPROM může procesor zapisovat data podobně jako do paměti RAM s tím rozdílem, že data zůstanou uchována v paměti i po vypnutí napájení procesoru.

K zápisu a čtení dat slouží registr EEDATA. Adresu dat v paměti EEPROM je nutno nastavit pomocí registru EEADR. Řízení operace zápisu či čtení se provádí registrem EECON1. Čtený bajt je k dispozici ihned, na dokončení zápisu jednoho bajtu je potřeba čekat po dobu několika milisekund. Před zápisem se provádí povolení zápisu registrem EECON2. Postup při operacích čtení a zápisu je podrobně popsán v popisu registru EEDATA.


Watchdog Timer

Watchdog Timer (WDT) je RC oscilátor běžící nezávisle na oscilátoru procesoru, tedy i během doby SLEEP. WDT se aktivuje pomocí konfiguračního bitu WDTE. Slouží ke sledování chodu procesoru. Není-li během hlídané doby vynulován (například při havárii programu), způsobí RESET procesoru. Během režimu SLEEP způsobí WDT probuzení procesoru. Doba WDT je přibližně 18 ms. Připojením předděličky (bitem PSA registru OPTION) lze dobu prodloužit až na asi 2 sekundy.

Poznámka: Před přepnutím předděličky mezi moduly Timer0 a WDT se doporučuje TMR0 i WDT vynulovat (i v případě zákazu WDT), jinak může dojít k nahodilému resetování procesoru.


SLEEP

SLEEP je režim procesoru se sníženým příkonem (řádově jednotky µA). Během tohoto režimu je zastaven chod programu a nepracuje oscilátor. Do režimu SLEEP přechází procesor softwarově, příkazem SLEEP. Je-li Watchdog Timer aktivní, způsobí příkaz SLEEP jeho nulování. Probuzení z režimu SLEEP je možné vnějším signálem RESET (/MCLR), dosažením času WDT (je-li aktivní), přerušením z portu RB0/INT, RB4RB7 nebo dokončením zápisu do EEPROM. Kromě prvního případu (RESET) bude procesor pokračovat v provádění programu od místa za instrukcí SLEEP. Probuzení proběhne i v případě zákazu přerušení GIE. Je-li GIE povoleno, provede se 1 instrukce následující za instrukcí SLEEP a přejde se na obsluhu přerušení (adresa 4).


Přerušení

Obsluha přerušení může být vyvolána některým z těchto důvodů: pin RB0/INT, piny RB4 RB7, přetečení TMR0, ukončení zápisu do EEPROM.

Přerušení je možné řídit pomocí registru INTCON. Všechna přerušení lze zakázat či povolit bitem GIE registru INTCON.

Po vyvolání přerušení je zakázáno další přerušení vynulováním bitu GIE a je proveden skok na adresu 0004h. Obsluha přerušení může čtením registru INTCON zjistit důvod vzniku přerušení. Příznaky přerušení v registru INTCON je nutno softwarově vynulovat, jinak bude přerušení vyvoláváno opakovaně. Obsluha přerušení se ukončí příkazem RETFIE, který způsobí opět povolení přerušení nastavením bitu GIE.

Během přerušení není automaticky uchováván obsah registrů. O jejich uchování se musí postarat obsluha přerušení. Jedná se především o uchování registru STATUS a registru W. K jejich uchování je potřeba rezervovat zvláštní registry v RAM. K uchování registrů je určena instrukce SWAPF, která neovlivňuje registr příznaků.


Konfigurační slovo

Procesor obsahuje konfigurační slovo, které je přístupné pouze během programování procesoru a slouží k nastavení různých režimů procesoru.

Konfigurační slovo je možné nastavovat ve zdrojovém kódu programu příkazem CONFIG nebo během programování změnou přepínačů v programovacím okně.

bity 0 a 1: volba oscilátoru
00
= LP oscilátor (krystal do 200 kHz)
01 = XT oscilátor (krystal do 4 MHz)
10 = HS oscilátor (krystal do 10 MHz)
11 = RC oscilátor (RC člen)

bit 2: WDT (Watchdog Timer)
0 = zakázán
1 = povolen

bit 3: /PWRTE (Power-up Timer)
0 = povolen
1 = zakázán

bit 46: CP (Code Protection) ochrana programu
0 = chráněn
1 = nechráněn

bit 7: DP (Data Protection) ochrana dat
0 = chráněna
1 = nechráněna

bit 813: CP (Code Protection) ochrana programu
0 = chráněn
1 = nechráněn


Piny

Procesor používá pouzdro DIP s 18 piny.

1: RA2 18: RA1
2: RA3 17: RA0
3: RA4/T0CKI 16: OSC1/CLKIN
4: /MCLR (reset) 15: OSC2/CLKOUT
5: Vss (0 V) 14: Vdd (+5 V)
6: RB0/INT 13: RB7
7: RB1 12: RB6
8: RB2 11: RB5
9: RB3 10: RB4

 

Registry

Úvod Popis procesoru Registry Instrukce Příklady

Registry mohou být adresovány přímým adresováním v rozsahu jedné banky, tj. 07Fh. Výběr banky se provádí pomocí bitů RP0 a RP1 v registru STATUS. Některé registry jsou přístupné ve všech bankách a není proto nutné měnit číslo banky. Nepřímé adresování registry FSR a INDF umožňuje adresovat registry ve 2 bankách (rozsah adres 0FFh). Registry z druhé banky mají index vyšší o 80h. Výběr páru bank pro nepřímé adresování (tj. 0 a 1 nebo 2 a 3) se provádí bitem IRP v registru STATUS.

adresa banka 0 banka 1
00h INDF
01h TMR0 OPTION
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 GPR
50h až 7Fh -

W
Working Register

W je vnitřní registr procesoru. Slouží k přenosům a zpracování dat. Je adresován přímo kódem instrukcí.


INDF
Indirect File
adresa: 0

Registr INDF není fyzický registr. Představuje jiný registr, jehož index je uložen v registru FSR (adresa 4).


TMR0
Timer 0
adresa: 1/banka 0

Registr TMR0 je čítač modulu Timer0. Pracovní mód modulu lze volit registrem OPTION. Zápisem do registru TMR0 se inkrementace registru zastaví na 2 následující strojové cykly. Je-li připojena k modulu Timer0 předdělička, vynuluje se.


OPTION
Option Register
adresa: 1/banka 1

Registr OPTION slouží k nastavení modulu Timer0 a předděličky.

bit 0 - 2: PS0 - PS2 (Prescaler Rate Select bits) dělicí poměr předděličky
0 = 1/2 TMR0 (1/1 WDT)
1 = 1/4 TMR0 (1/2 WDT)
2 = 1/8 TMR0 (1/4 WDT)
3 = 1/16 TMR0 (1/8 WDT)
4 = 1/32 TMR0 (1/16 WDT)
5 = 1/64 TMR0 (1/32 WDT)
6 = 1/128 TMR0 (1/64 WDT)
7 = 1/256 TMR0 (1/128 WDT)

Dělicí poměr 1/1 pro TMR0 lze zajistit připojením předděličky k WDT (PSA = 1).

bit 3: PSA (Prescaler Assignment bit) připojení předděličky
0 = předdělička k TMR0
1 = předdělička k WDT

Poznámka: Před přepnutím předděličky mezi moduly Timer0 a WDT se doporučuje TMR0 i WDT vynulovat (i v případě zákazu WDT), jinak může dojít k nahodilému resetování procesoru.

bit 4: T0SE (TMR0 Source Edge Select bit) hrana pro RA4/T0CKI
0 = vzestupná hrana
1 = sestupná hrana

bit 5: T0CS (TMR0 Clock Source Select bit) zdroj pro čítání TMR0
0 = vnitřní hodiny (instrukční cyklus, CLKOUT)
1 = vstup RA4/T0CKI

bit 6: INTEDG (Interrupt Edge Select bit) volba hrany pro RB0/INT
0 = sestupná hrana
1 = vzestupná hrana

bit 7: /RBPU (PORTB Pull-up Enable bit) udržovací kladný proud do portu B
0 = pull-up povolen
1 = pull-up zakázán


PCL
Program Counter Low
adresa: 2

Procesor používá 13-bitový čítač programu. Registr PCL zpřístupňuje nižších 8 bitů čítače pro čtení i zápis (při čtení se získá adresa následující instrukce = PC+1). Vyšších 5 bitů se při zápisu do PCL (tj. nastavení nové adresy programu) převezme z registru PCLATH. Instrukce CALL a GOTO ukládají do čítače programu 11 bitů, nejvyšší 2 bity jsou převzaty z PCLATH. Při vzdáleném skoku (instrukcí CALL nebo GOTO) mimo programový blok 2 KB je nutno do registru PCLATH nastavit vyšší bajt adresy skoku.

Modifikace registru PCL se používá především při přístupu k tabulce dat. Tabulka dat je posloupnost instrukcí RETLW, majících jako parametr konstantu (8 bitů). Tabulka začíná zpravidla instrukcí ADDWF PCL (nejjednodušší typ tabulky). Do registru W se uloží offset bajtu, který má být čten, poté se provede CALL s adresou tabulky. Instrukce ADDWF na začátku tabulky přičte k PCL offset požadované hodnoty, tím se provede skok na jednu z následujících instrukcí RETLW, která navrátí požadovanou hodnotu. Tabulka nesmí přesahovat přes hranici adres 256 bajtů. Při nastavení PCL se vyšší bajt adresy převezme z PCLATH. Nebude-li tabulka v prvních 256 bajtech programu (nebo program změnil registr PCLATH), musí se před nastavením registru PCL nastavit registr PCLATH na vyšší bajt adresy položky v tabulce.


STATUS
Status Register
adresa: 3

STATUS je stavový registr obsahující informace o výsledku aritmetické operace. Slouží též k nastavení banky registrů.

bit 0: C (Carry, Borrow)
Po operacích ADDLW a ADDWF tento bit indikuje přenos z nejvyššího bitu výsledku operace (přetečení sčítání přes 255).

Pro operace SUBLW a SUBWF má tento bit opačný význam a indikuje, že nebylo podtečení pod 0 (operace se realizují přičtením dvojkového doplňku druhého operandu, tj. záporné hodnoty operandu).

Operace RRF a RLF používají bit k přenosu z bitu 0 respektive 7.

bit 1: DC (Digit Carry)
Bit indikuje přenos z bitu 3 (z nižší číslice BCD). Při odečítání má opačný význam (podobně jako u C).

bit 2: Z (Zero bit)
Bit indikuje nulový výsledek operace.

bit 3: /PD (Power-down) Indikuje důvod startu:
0 = instrukce SLEEP
1 = reset, CLRWDT

bit 4: /TO (Time-out) Důvod time-out:
0 = přetečení WDT
1 = reset, CLRWDT, SLEEP

bit 5 - 6: RP0 - RP1 Výběr banky registrů:
00 = Banka 0
01 = Banka 1
10 = Banka 2
11 = Banka 3

bit 7: IRP Výběr banky pro nepřímé adresování:
0 = Banka 0 a 1
1 = Banka 2 a 3


FSR
File Selector Register
adresa: 4

Registr FSR slouží jako ukazatel pro nepřímé adresování. Nastavením na hodnotu 00FFh se zpřístupní registr s odpovídající adresou jako registr INDF (adresa 0). Pomocí INDF lze do adresovaného registru zapisovat nebo z něj číst. Adresy FSR zahrnují 2 banky (banka 0 a 1 respektive banka 2 a 3), registry z banky 1 (respektive 3) mají indexy zvýšeny o hodnotu 80h. Výběr páru bank se provádí bitem IRP stavového registru STATUS.


PORTA
Port A
adresa: 5/banka 0

Registr PORTA představuje bity brány A. Které bity budou použity jako vstupní a které jako výstupní, určuje registr TRISA (adresa 5, banka 1).


TRISA
Tris A
adresa: 5/banka 1

Registr TRISA určuje směr bitů portu A (registr PORTA, adresa 5, banka 0): 1 = vstup, 0 = výstup.


PORTB
Port B
adresa: 6/banka 0

Registr PORTB představuje bity brány B. Které bity budou použity jako vstupní a které jako výstupní, určuje registr TRISB (adresa 6, banka 1).


TRISB
Tris B
adresa: 6/banka 1

Registr TRISB určuje směr bitů portu B (registr PORTB, adresa 6, banka 0): 1 = vstup, 0 = výstup.


EEDATA
EEPROM Data
adresa: 8/banka 0

Registr EEDATA slouží k přístupu k datům paměti EEPROM.

Před operací čtení je nutno nastavit do registru EEADR adresu, z které bude probíhat čtení. Nastavením bitu RD registru EECON1 a následným čtením registru EEDATA se provede načtení požadovaného bajtu.

EEADR <- adresa
EECON1.RD <- 1
W <- EEDATA

Při zápisu dat se do registru EEADR uloží adresa a do registru EEDATA data k zápisu. Doporučuje se dále zakázat všechna přerušení vypnutím příznaku GIE registru INTCON. Nyní se provede povolení zápisu do EEPROM nastavením bitu WREN registru EECON1 a provede se postupný zápis hodnot 55h a 0AAh do registru EECON2 (ochrana proti náhodnému přepsání). Závěrem se nastaví bit WR registru EECON1 a je možné opět zakázat zápis a povolit přerušení. Provedení zápisu trvá několik ms, jeho dokončení je možné sledovat testováním bitu WR registru EECON1 nebo přerušením pomocí bitu EEIF.

EEADR <- adresa
EEDATA <- data
INTCON.GIE <- 0
EECON1.WREN <- 1
EECON2 <- 55h
EECON2 <- 0AAh
EECON1.WR <- 1
EECON1.WREN <- 0
INTCON.GIE <- 1


EECON1
EEPROM Control 1
adresa: 8/banka 1

Registr EECON1 řídí přístup k paměti EEPROM.

bit 0: RD (Read)
Zápisem hodnoty 1 do bitu se zahájí čtení bajtu EEPROM, jehož adresa byla uložena do EEADR. Čtení trvá 1 strojový cyklus, bajt je možné následující instrukcí načíst z registru EEDATA. Bit nelze nulovat, je nulován procesorem.

bit 1: WR (Write)
Zápisem hodnoty 1 do bitu se zahájí zápis bajtu do EEPROM. Data bajtu musí být zapsána do registru EEDATA, adresa do registru EEADR. Před zahájením zápisu je nutno provést inicializaci, jak je popsáno u registru EEDATA. Provádění zápisu trvá několik milisekund. Po dokončení zápisu je bit WR vynulován, dokončení zápisu lze zjistit sledováním bitu WR. Bit nelze nulovat, je nulován procesorem.

bit 2: WREN (Write Enable)
Po resetu procesoru je zápis do EEPROM zakázán. Před operací zápisu je nutno nejdříve nastavením bitu WREN zápis povolit.
0 = zápis do EEPROM je zakázán
1 = zápis do EEPROM je povolen

bit 3: WRERR (Write Error Flag)
0
= operace zápisu byla kompletní
1 = operace zápisu do EEPROM byla přerušena pomocí /MCLR nebo WDT

bit 4: EEIF (EEPROM Write Operation Interrupt Flag bit)
Nastavením bitu EEIF je indikováno dokončení operace zápisu do EEPROM. Vynulování bitu je nutno provést softwarově.


EEADR
EEPROM Address
adresa: 9/banka 0

Registr EEADR slouží k zadání adresy paměti EEPROM, odkud se provede načtení bajtu dat nebo kam bude proveden zápis. Postup při provádění čtení a zápisu dat je popsán u registru EEDATA.


EECON2
EEPROM Control 2
adresa: 9/banka 1

Registr EECON2 není fyzický registr. Je to speciální řídicí registr umožňující zápis dat do paměti EEPROM. Slouží jako ochrana proti nežádoucímu přepsání dat v paměti. Před zápisem bajtu do paměti musí být provedena přesná posloupnost úkonů, jak je popsáno u registru EEDATA. (Zápis hodnot 55h a 0AAh do registru EECON2 těsně před nastavením bitu WR).


PCLATH
Program Counter Latch High
adresa: 0Ah

Procesor používá 13-bitový čítač programu. Při zápisu do registru PCL se převezme z registru PCLATH vyšších 5 bitů adresy. Instrukce CALL a GOTO ukládají do čítače programu 11 bitů, nejvyšší 2 bity se převezmou z PCLATH (bity 3 a 4). Při vzdáleném skoku (instrukcí CALL nebo GOTO) mimo programový blok 2 KB je nutno do registru PCLATH nastavit vyšší bajt adresy skoku. Nastavení registru PCLATH je nutné provést též v případě přístupu k tabulce dat, neleží-li v prvních 256 bajtech programu nebo pokud byl PCLATH změněn.


INTCON
Interrupt Control
adresa: 0Bh

Registr INTCON slouží k řízení přerušení. Bity příznaků přerušení jsou nastaveny nezávisle na povolení přerušení GIE. Nulování bitů příznaků přerušení je nutno provádět softwarově.

bit 0: RBIF (RB Port Change Interrupt Flag)
1 = Některý z bitů RB4RB7 změnil stav

bit 1: INTF (RB0/INT Interrupt Flag)
1 = nastalo přerušení z portu RB0/INT

bit 2: T0IF (TMR0 Overflow Interrupt Flag)
1 = nastalo přetečení časovače TMR0

bit 3: RBIE (RB Port Change Interrupt Enable)
1 = povoleno přerušení při změně RB4RB7

bit 4: INTE (RB0/INT Interrupt Enable)
1 = povoleno přerušení z portu RB0/INT

bit 5: T0IE (TMR0 Overflow Interrupt Enable)
1 = povoleno přerušení při přetečení TMR0

bit 6: EEIE (EEPROM Write Complete Interrupt Enable)
1 = povoleno přerušení při dokončení zápisu do EEPROM

bit 7: GIE (Global Interrupt Enable)
0 = zákaz všech přerušení
1 = povolena všechna nemaskovaná přerušení


GPR
General Purpose Register
adresa: 0Ch až 4Fh

Registry v rozsahu 0Ch4Fh (tj. 68 registrů) jsou přístupné k použití jako běžné datové registry (nezávisle na zvolené bance).

 

Instrukce

Úvod Popis procesoru Registry Instrukce Příklady

W - pracovní registr
f - datový registr (0 až 127)
k - konstanta 8 bitů (0 až 255)
a - adresa 11 bitů
d - volba cíle operace (0=výsledek do W, 1=výsledek do f)
b - číslo bitu (0 až 7)

Každá instrukce zabírá 1 slovo (tj. 14 bitů). Doba vykonání je 1 strojový cyklus (4 takty hodin, pro krystal 4 MHz je to 1 µs), pouze při přerušení souvislého provádění instrukcí (CALL, GOTO, RET) se délka zvýší na 2 cykly.

ADDLW k součet W a konstanty
ADDWF f,d součet W a registru f
ANDLW k AND registru W a konstanty
ANDWF f,d AND registru W a registru f
BCF f,b vynulování bitu registru f
BSF f,b nastavení bitu registru f
BTFSC f,b test bitu registru f a podmíněné provedení instrukce
BTFSS f,b test bitu registru f a podmíněné provedení instrukce
CALL a volání podprogramu
CLRF f vynulování registru f
CLRW vynulování registru W
CLRWDT vynulování časovače Watchdog
COMF f,d bitový doplněk registru f
DECF f,d dekrementace registru f
DECFSZ f,d dekrementace registru f a podmíněné provedení instrukce
GOTO a nepodmíněný skok
INCF f,d inkrementace registru f
INCFSZ f,d inkrementace registru f a podmíněné provedení instrukce
IORLW k OR registru W a konstanty
IORWF f,d OR registru W a registru f
MOVF f,d načtení nebo test obsahu registru f
MOVLW k uložení konstanty do registru W
MOVWF f uložení obsahu W do registru f
NOP prázdná operace
RETFIE návrat z přerušení
RETLW k návrat z podprogramu s uložením konstanty do W
RETURN návrat z podprogramu
RLF f,d bitová rotace registru f vlevo
RRF f,d bitová rotace registru f vpravo
SLEEP aktivace režimu SLEEP
SUBLW k odečtení W od konstanty
SUBWF f,d odečtení W od registru f
SWAPF f,d záměna tetrád registru f
XORLW k XOR registru W a konstanty
XORWF f,d XOR registru W a registru f
OPTION nastavení registru OPTION
TRIS f nastavení registru TRIS

ADDLW k
Add Literal and W
(W) + k -> (W)
ovlivňuje: C, DC a Z
1 cyklus / 4 T / 1 µs

Sečte obsah registru W s konstantou k. Výsledek uloží do W. Příznak C je nastaven v případě, že výsledek operace přeteče přes hodnotu 255. Příznak DC indikuje, že při operaci nastal přenos z bitu 3 do bitu 4 (tj. že součet nižších 4 bitů operandů přesáhl hodnotu 15). Příznak Z indikuje, že výsledkem operace je 0.


ADDWF f,d
Add W and f
(W) + (f) -> (W) nebo (f)
ovlivňuje: C, DC a Z
1 cyklus / 4 T / 1 µs

Sečte obsah registru W s registrem f. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Příznak C je nastaven v případě, že výsledek operace přeteče přes hodnotu 255. Příznak DC indikuje, že při operaci nastal přenos z bitu 3 do bitu 4 (tj. že součet nižších 4 bitů operandů přesáhl hodnotu 15). Příznak Z indikuje, že výsledkem operace je 0.


ANDLW k
AND Literal with W
(W) .AND. k -> (W)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Provede operaci AND mezi obsahem registru W a konstantou k. Výsledek uloží do W. Příznak Z indikuje, že výsledkem operace je 0. Operace AND se provádí mezi jednotlivými bity operandů podle následující tabulky.

1. operand 2. operand výsledek
0 0 0
0 1 0
1 0 0
1 1 1

ANDWF f,d
AND W with f
(W) .AND. (f) -> (W) nebo (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Provede operaci AND mezi obsahem registru W a registrem f. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Příznak Z indikuje, že výsledkem operace je 0. Operace AND se provádí mezi jednotlivými bity operandů podle následující tabulky.

1. operand 2. operand výsledek
0 0 0
0 1 0
1 0 0
1 1 1

BCF f,b
Bit Clear f
0 -> (f<b>)
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Vynuluje bit b registru f. Instrukce pracuje tak, že načte obsah registru, provede požadovanou operaci a zapíše obsah registru zpět. Proto pozor na práci s porty v případech, kdy se může u ostatních bitů lišit čtená hodnota od požadované výstupní hodnoty (např. výstup s otevřeným kolektorem portu A4).


BSF f,b
Bit Set f
1 -> (f<b>)
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Nastaví bit b registru f. Instrukce pracuje tak, že načte obsah registru, provede požadovanou operaci a zapíše obsah registru zpět. Proto pozor na práci s porty v případech, kdy se může u ostatních bitů lišit čtená hodnota od požadované výstupní hodnoty (např. výstup s otevřeným kolektorem portu A4).


BTFSC f,b
Bit Test f, Skip if Clear
přeskoč, je-li (f<b>) = 0
ovlivňuje: nic
1-2 cykly / 4-8 T / 1-2 µs

Je-li bit b registru f nulový, následující instrukce se přeskočí - provede se náhradní instrukce NOP (2 strojové cykly = 1 cyklus na instrukci BTFSC + 1 cyklus na následující náhradní instrukci NOP). Je-li bit b registru f nastaven, následující instrukce se provede (1 strojový cyklus).


BTFSS f,b
Bit Test f, Skip if Set
přeskoč, je-li (f<b>) = 1
ovlivňuje: nic
1-2 cykly / 4-8 T / 1-2 µs

Je-li bit b registru f nastaven, následující instrukce se přeskočí - provede se náhradní instrukce NOP (2 strojové cykly = 1 cyklus na instrukci BTFSS + 1 cyklus na následující náhradní instrukci NOP). Je-li bit b registru f nulový, následující instrukce se provede (1 strojový cyklus).


CALL a
Call Subroutine
(PC) + 1 -> zásobník, a -> PC
ovlivňuje: nic
2 cykly / 8 T / 2 µs

Volání podprogramu. Do zásobníku uschová následující (návratovou) adresu a provede skok na adresu a. Bity 11 a 12 cílové adresy převezme z registru PCLATH (z bitů 3 a 4).


CLRF f
Clear f
0 -> (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Vynuluje registr f. Nastaví příznakový bit Z.


CLRW
Clear W
0 -> (W)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Vynuluje registr W. Nastaví příznakový bit Z.


CLRWDT
Clear Watchdog Timer
0 -> WDT, 0 -> předdělička WDT
ovlivňuje: /TO a /PD
1 cyklus / 4 T / 1 µs

Vynuluje registr WDT (Watchdog Timer) a předděličku, je-li k WDT připojená. Nastaví stavové bity /TO a /PD.


COMF f,d
Complement f
.NOT. (f) -> (W) nebo (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Provede operaci NOT (bitový komplement) registru f. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Příznak Z indikuje, že výsledkem operace je 0. Operace NOT se provádí s jednotlivými bity operandu podle následující tabulky.

operand výsledek
0 1
1 0

DECF f,d
Decrement f
(f) - 1 -> (W) nebo (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Obsah registru f zmenší o 1. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Příznak Z indikuje, že výsledkem operace je 0.


DECFSZ f,d
Decrement f, Skip if Zero
(f) - 1 -> (W) nebo (f); přeskoč, je-li výsledek = 0
ovlivňuje: nic
1-2 cykly / 4-8 T / 1-2 µs

Obsah registru f zmenší o 1. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Je-li výsledek 0, další instrukci přeskočí - provede se náhradní instrukce NOP (2 strojové cykly = 1 cyklus na instrukci DECFSZ + 1 cyklus na následující náhradní instrukci NOP). Je-li výsledek operace nenulový, následující instrukce se provede (1 strojový cyklus).


GOTO a
Go to Address
a -> PC
ovlivňuje: nic
2 cykly / 8 T / 2 µs

Provede nepodmíněný skok na adresu a. Bity 11 a 12 cílové adresy převezme z registru PCLATH (z bitů 3 a 4).


INCF f,d
Increment f
(f) + 1 -> (W) nebo (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Obsah registru f zvětší o 1. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Příznak Z indikuje, že výsledkem operace je 0.


INCFSZ f,d
Increment f, Skip if Zero
(f) + 1 -> (W) nebo (f); přeskoč, je-li výsledek = 0
ovlivňuje: nic
1-2 cykly / 4-8 T / 1-2 µs

Obsah registru f zvětší o 1. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Je-li výsledek 0, další instrukci přeskočí - provede se náhradní instrukce NOP (2 strojové cykly = 1 cyklus na instrukci INCFSZ + 1 cyklus na následující náhradní instrukci NOP). Je-li výsledek operace nenulový, následující instrukce se provede (1 strojový cyklus).


IORLW k
Inclusive OR Literal with W
(W) .OR. k -> (W)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Provede operaci OR mezi obsahem registru W a konstantou k. Výsledek uloží do W. Příznak Z indikuje, že výsledkem operace je 0. Operace OR se provádí mezi jednotlivými bity operandů podle následující tabulky.

1. operand 2. operand výsledek
0 0 0
0 1 1
1 0 1
1 1 1

IORWF f,d
Inclusive OR W with f
(W) .OR. (f) -> (W) nebo (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Provede operaci OR mezi obsahem registru W a registrem f. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Příznak Z indikuje, že výsledkem operace je 0. Operace OR se provádí mezi jednotlivými bity operandů podle následující tabulky.

1. operand 2. operand výsledek
0 0 0
0 1 1
1 0 1
1 1 1

MOVF f,d
Move f
(f) -> (W) nebo (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Instrukce načte obsah registru f. Pro d = 0 uloží hodnotu do W, pro d = 1 navrátí obsah registru f zpět. Příznak Z indikuje, že obsah registru f je 0. Pro d = 1 slouží instrukce k testování obsahu registru f, zda je 0.


MOVLW k
Move Literal to W
k -> (W)
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Do registru W uloží konstantu k.


MOVWF f
Move W to f
(W) -> (f)
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Obsah registru W uloží do registru f.


NOP
No Operation
-
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Prázdná instrukce.


RETFIE
Return from Interrupt
zásobník -> PC, 1 -> GIE
ovlivňuje: nic
2 cykly / 8 T / 2 µs

Návrat z obsluhy přerušení. Navrátí ukazatel programu PC ze zásobníku. Povolí globální přerušení nastavením bitu GIE v registru INTCON.


RETLW k
Return with Literal in W
k -> (W), zásobník -> PC
ovlivňuje: nic
2 cykly / 8 T / 2 µs

Návrat z podprogramu s navrácením hodnoty. Do registru W uloží konstantu k a navrátí ukazatel programu PC ze zásobníku. Velmi časté použití této instrukce je v datových tabulkách (Harvardova architektura procesoru neumožňuje čtení tabulky konstant adresováním dat v programové paměti).

Nejjednodušší datová tabulka začíná instrukcí ADDWF PCL,F za kterou následuje posloupnost instrukcí RETLW k, kde k je nějaká konstanta. Při čtení hodnoty z tabulky se do registru W uloží požadovaný offset z tabulky (0 představuje první položku) a začátek tabulky (instrukce ADDWF PCL,F) se volá instrukcí CALL. Po návratu obsahuje registr W hodnotu z tabulky. Namísto instrukce RETLW lze používat pseudoinstrukci překladače DT. Pro čtení tabulek přesahujících prvních 256 bajtů programové paměti je nutno použít adresování s využitím registru PCLATH.


RETURN
Return from Subroutine
zásobník -> PC
ovlivňuje: nic
2 cykly / 8 T / 2 µs

Návrat z podprogramu. Navrátí ukazatel programu PC ze zásobníku.


RLF f,d
Rotate Left f through Carry
C <- (f<7>) <- (f<6>) <- ... <- (f<0>) <- C
ovlivňuje: C
1 cyklus / 4 T / 1 µs

Obsah registru f rotuje o 1 bit vlevo (obsah nižšího bitu přemístí do vyššího bitu) přes C. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f.


RRF f,d
Rotate Right f through Carry
C -> (f<7>) -> (f<6>) -> ... -> (f<0>) -> C
ovlivňuje: C
1 cyklus / 4 T / 1 µs

Obsah registru f rotuje o 1 bit vpravo (obsah vyššího bitu přemístí do nižšího bitu) přes C. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f.


SLEEP
SLEEP
0 -> /PD, 1 -> /TO, 0 ->WDT, 0 -> předdělička WDT
ovlivňuje: /TO a /PD
1 cyklus / 4 T / 1 µs

Aktivuje stav SLEEP, tedy režim "spánku" procesoru se sníženou spotřebou a se zastaveným oscilátorem. Vynuluje registr WDT (Watchdog Timer) a předděličku, je-li k WDT připojená. Vynuluje stavový bit /PD (power-down) a nastaví stavový bit /TO (time-out).


SUBLW k
Subtract Literal and W
k - (W) -> (W)
ovlivňuje: C, DC a Z
1 cyklus / 4 T / 1 µs

Odečte obsah registru W od konstanty k. Výsledek uloží do W. Operace odečítání se realizuje přičtením negativní hodnoty registru W, proto má příznak C opačný význam. Příznak C je nastaven v případě, že výsledek operace nepodteče pod hodnotu 0. Příznak Z indikuje, že výsledkem operace je 0

výsledek > 0 Z = 0, C = 1
výsledek = 0 Z = 1, C = 1
výsledek < 0 Z = 0, C = 0

SUBWF f,d
Subtract W from f
(f) - (W) -> (W) nebo (f)
ovlivňuje: C, DC a Z
1 cyklus / 4 T / 1 µs

Odečte obsah registru W od registru f. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Operace odečítání se realizuje přičtením negativní hodnoty registru W, proto má příznak C opačný význam. Příznak C je nastaven v případě, že výsledek operace nepodteče pod hodnotu 0. Příznak Z indikuje, že výsledkem operace je 0.

výsledek > 0 Z = 0, C = 1
výsledek = 0 Z = 1, C = 1
výsledek < 0 Z = 0, C = 0

SWAPF f,d
Swap Nibbles in f
(f<0..3>) <-> (f<4..7>)
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Vymění horní a dolní tetrádu (4 bity) registru f. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f.


XORLW k
Exclusive OR Literal with W
(W) .XOR. k -> (W)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Provede operaci XOR mezi obsahem registru W a konstantou k. Výsledek uloží do W. Příznak Z indikuje, že výsledkem operace je 0. Operace XOR se provádí mezi jednotlivými bity operandů podle následující tabulky.

1. operand 2. operand výsledek
0 0 0
0 1 1
1 0 1
1 1 0

Poznámka: Pro usnadnění představy o operaci XOR můžeme považovat jeden z operandů za invertora druhého operandu. Bity s hodnotou 1 invertují příslušné bity druhého operandu, bity s hodnotou 0 je neovlivní.


XORWF f,d
Exclusive OR W with f
(W) .XOR. (f) -> (W) nebo (f)
ovlivňuje: Z
1 cyklus / 4 T / 1 µs

Provede operaci XOR mezi obsahem registru W a registrem f. Pro d = 0 uloží výsledek do W, pro d = 1 uloží výsledek do f. Příznak Z indikuje, že výsledkem operace je 0. Operace XOR se provádí mezi jednotlivými bity operandů podle následující tabulky.

1. operand 2. operand výsledek
0 0 0
0 1 1
1 0 1
1 1 0

Poznámka: Pro usnadnění představy o operaci XOR můžeme považovat jeden z operandů za invertora druhého operandu. Bity s hodnotou 1 invertují příslušné bity druhého operandu, bity s hodnotou 0 je neovlivní.


OPTION
Load Option Register
(W) -> OPTION
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Obsah registru W zapíše do registru OPTION (adresa 1 v bance 1). Tato instrukce je pouze z důvodu zpětné kompatibility se staršími verzemi procesorů a doporučuje se ji nepoužívat.


TRIS f
Load TRIS Register
(W) -> TRIS registr f
ovlivňuje: nic
1 cyklus / 4 T / 1 µs

Obsah registru W zapíše do TRIS registru portu A až C (f = 57). Tato instrukce je pouze z důvodu zpětné kompatibility se staršími verzemi procesorů a doporučuje se ji nepoužívat.

 

Příklady

Úvod Popis procesoru Registry Instrukce Příklady

Zde je uvedeno několik řešených příkladů spolu se stručným komentářem. Další příklady naleznete ve výukových lekcích k jednotce P84-UNI.


Výstup na port

Tento příklad nastaví bity portu A jako výstup a hodnotu portu RA0 nastaví na 1. Je-li připojena indikační LED dioda mezi pin RA0 a zem 0V (přes omezovací odpor např. 330 ohmů), dioda se rozsvítí.

  bsf 3,5 ; volba banky 1 (bit RP0 registru STATUS)
  movlw 00000b ; volba směru bitů: 0=výstup, 1=vstup
  movwf 5 ; nastavení směru bitů portu A (registr TRISA)
       
  bcf 3,5 ; volba banky 0 (bit RP0 registru STATUS)
  movlw 00001b ; volba hodnot bitů RA0 až RA4
  movwf 5 ; nastavení hodnot bitů portu A (registr PORTA)
       
  goto $ ; zastavení procesoru nekonečnou smyčkou

Časování instrukcí

Další příklad ukazuje využití doby provádění instrukcí při vytváření časových prodlev. Každá instrukce u procesorů řady PIC16xxx trvá buď 1 strojový takt nebo 2 strojové takty (v případě, že je přerušen souvislý tok provádění instrukcí - skoky). V příkladu jsou čítány 2 uzavřené smyčky - vnější a vnitřní cyklus. Registry čítačů přitom využívají přetečení přes hodnotu 0 (počet průchodů je tedy 256). Doba všech průchodů vnitřního cyklu je (1 + 2)*255 + 2 = 767 taktů, doba všech průchodů vnějšího cyklu (včetně obsluhy blikání) je (767 + 1 + 2)*255 + 2 + 1 + 2 = 196355 taktů. Pro krystal 4 MHz je doba 1 taktu rovna 1 mikrosekundě (1 takt trvá 4 kmity oscilátoru), celková doba 1 průchodu smyčkami je tedy asi 0.2 sekundy, což je 5 změn za sekundu neboli 2.5 bliknutí za sekundu. LED diody připojené k výstupům portu A blikají díky instrukci INCF se snižující se frekvencí (pozor na RA4, nemůže napájet LED proti 0V).

  bsf 3,5 ; volba banky 1 (bit RP0 registru STATUS)
  clrf 5 ; všechny bity portu A jako výstup (registr TRISA)
  bcf 3,5 ; volba banky 0 (bit RP0 registru STATUS)
       
Loop decfsz 20h,1 ; dekrementace vnitřního čítače
  goto Loop ; opakování vnitřního cyklu
       
  decfsz 21h,1 ; dekrementace vnějšího čítače
  goto Loop ; opakování vnějšího cyklu
       
  incf 5,1 ; inkrementace portu A (zajištění blikání)
  goto Loop ; opakování blikání

Časovač Watchdog

Časovač Watchdog (WDT) je běžně využíván k hlídání chodu programu a k resetování procesoru v případě chyby. Můžeme ho využít v jiné funkci - probuzení procesoru ze stavu spánku SLEEP. V tomto programu využijeme WDT tak, že LED diody připojené k výstupům portu A budou blikat s intervalem přibližně 1 sekunda (tj. každá prodleva 0.5 sekundy).

  CONFIG WDT ; zapnutí časovače Watchdog
       
  bsf 3,5 ; volba banky 1 (bit RP0 registru STATUS)
  clrf 5 ; všechny bity portu A jako výstup (registr TRISA)
  movlw 5 + bit3 ; dělička WDT 1/32, je připojena k WDT
  movwf 1 ; nastavení registru OPTION
  bcf 3,5 ; volba banky 0 (bit RP0 registru STATUS)
       
Loop SLEEP   ; uvedení procesoru do stavu spánku
  comf 5,1 ; zajištění blikání LED diod na portu A
  goto Loop ; opakování blikání

Přerušení

Následující příklad ukazuje způsob práce s přerušením, především pokud se jedná o přesné nastavení časovače a způsob úschovy registrů. Předpokládáme použití krystalu 4 MHz, 1 strojový takt trvá 1 mikrosekundu. Program nastaví časovač Timer0 tak, aby byl inkrementován každých 128 mikrosekund (nastavením děličky na 1/128). Při každém přerušení nastaví obsluha přerušení čítač časovače na hodnotu 217, tím bude přerušení vyvoláváno každých 4992 mikrosekund (přetečením na 0, doplněk do 256 je 39, perioda je tedy 39*128 = 4992). Nastavením čítače se vynuluje předdělička a vznikne tak dodatečné zpoždění: 2 (aktivace přerušení) + 2 (instrukce "goto Inter") + 3 (úschova registrů) + 2 (nastavení čítače) + 2 (dodatečné pozastavení čítače) = 11 strojových taktů, tj. 11 mikrosekund. Skutečná perioda vyvolávání přerušení bude tedy 4992 + 11 = 5003 mikrosekund. V tomto příkladu se s odchylkou od 5000 mikrosekund spokojíme. V obsluze přerušení použijeme doplňkový čítač, který prodlouží periodu na 0.5 sekundy. Připojené LED diody budou tak blikat s 1-sekundovou periodou (připojený reproduktor bude "tikat" jako hodiny).

  CBLOCK 20h ; blok definice proměnných
TempW     ; úschova registru W při přerušení
TempS     ; úschova registru STATUS
Counter     ; čítač přerušení pro jedno bliknutí
  ENDC    
       
  goto Start ; adresa 0: skok na start programu
  org 4  
  goto Inter ; adresa 4: skok na obsluhu přerušení
       
Start bsf STATUS,RP0 ; volba banky 1
  clrf TRISA ; všechny bity portu A jako výstup
  movlw 6 + bit7 ; dělička TMR0 1/128, zdrojem hodiny
  movwf OPTION_REG ; nastavení registru OPTION
  bcf STATUS,RP0 ; volba banky 0
  movlw bit5 + bit7 ; povoleno přerušení od TMR0
  movwf INTCON ; nastavení registru INTCON
  goto $ ; zastavení procesoru, čekání na přerušení
       
Inter movwf TempW ; úschova registru W
  swapf STATUS,W ; načtení registru STATUS do W
  movwf TempS ; úschova registru STATUS
       
  movlw 217 ; nová hodnota čítače
  movwf TMR0 ; nastavení čítače TMR0
  bcf INTCON,T0IF ; nulování příznaku přerušení
  decfsz Counter,F ; čítání pomocného čítače
  goto IntRet ; není ještě dosažen potřebný čas
  movlw 100 ; nová hodnota pro čítač
  movwf Counter ; nastavení pomocného čítače
  comf PORTA,F ; zajištění blikání LED
       
IntRet swapf TempS,W ; původní registr STATUS do W
  movwf STATUS ; navrácení registru STATUS
  swapf TempW,F ; příprava původního registru W
  swapf TempW,W ; návrat původního registru W
  retfie   ; návrat z obsluhy přerušení

Tabulky

Procesory PIC16xxx používají Harvardovu architekturu. Programová sběrnice je oddělena od datové sběrnice, proto není možné procesorem přistupovat do programové paměti. Je-li potřeba vytvořit tabulku číselných konstant, lze k tomuto účelu využít posloupnost instrukcí RETLW, které navrací v registru W číselnou konstantu. Namísto instrukce RETLW lze použít příkaz DT. Následující ukázkový výřez programu je nejjednodušším případem tabulky. Tabulka musí být celá umístěna v prvních 256 bajtech programové paměti. Tabulka začíná instrukcí ADDWF PCL,F, která zajistí skok na instrukci s offsetem podle registru W. Hodnota z tabulky se získá nastavením registru W na offset požadované hodnoty (0 a více) a zavoláním začátku tabulky instrukcí CALL. Po návratu obsahuje registr W požadovanou hodnotu.

Table addwf PCL,F ; přičtení W k ukazateli programu PCL
  dt 23 ; hodnota pro W=0
  dt 45 ; hodnota pro W=1
  dt 12 ; hodnota pro W=2
  dt 120 ; hodnota pro W=3
       
  ...    
  movf Pointer,W ; offset požadovaného prvku (0, 1, 2, ...) do W
  incf Pointer,F ; zvýšení ukazatele tabulky
  call Table ; načtení prvku z tabulky do registru W
  ...    

Další tabulka již nemá omezení předešlého typu tabulky. Může být umístěna kdekoliv v paměti a může mít libovolnou velikost. Tabulek může být více. Při inicializaci se uloží do registrů PointL a PointH (ukazatele tabulky LOW a HIGH) nižší a vyšší bajt adresy požadované tabulky. Prvek z tabulky se čte voláním procedury GetTab. Procedura zajistí automatické zvýšení ukazatele tabulky. Je-li v programu využíván i předešlý typ tabulky, je vhodné po návratu z procedury vynulovat registr PCLATH (popř. jeho obsah nastavit na vyšší bajt aktuální adresy, leží-li program mimo rozsah počátečních 2 KB paměti).

Table dt 23  
  dt 45  
  dt 12  
  dt 120  
      ;*** procedura pro načtení hodnoty z tabulky
GetTab movf PointH,W ; načtení ukazatele HIGH do W
  movwf PCLATH ; nastavení adresy skoku HIGH
  movf PointL,W ; načtení ukazatele LOW do W
  incf PointL,F ; zvýšení ukazatele LOW
  btfsc STATUS,Z ; je přetečení ukazatele LOW přes 0?
  incf PointH,F ; při přetečení zvýšení ukazatele HIGH
  movwf PCL ; zápis W do PCL = skok do tabulky
      ;*** inicializace ukazatele tabulky
Init movlw HIGH Table ; adresa tabulky HIGH do W
  movwf PointH ; nastavení ukazatele HIGH
  movlw LOW Table ; adresa tabulky LOW do W
  movwf PointL ; nastavení ukazatele LOW
  ...   ;*** čtení hodnoty z tabulky
  call GetTab ; načtení položky z tabulky
  clrf PCLATH ; nulování adresy skoků HIGH
  ...    

EEPROM

Procesor obsahuje kromě programové a datové paměti paměť EEPROM, která umožňuje uchování dat i po vypnutí napájení procesoru. Proto je velmi vhodná obzvláště k ukládání uživatelských nastavení a voleb. K paměti EEPROM nelze přistupovat přímo jako k běžné paměti. Pro přístup k EEPROM jsou určeny dva základní registry - registr adresy paměti a registr dat. K nim přibývají dva řídicí registry. Použití paměti EEPROM se u různých typů procesorů liší. Především jsou odlišné adresy registrů pro EEPROM, mohou dokonce ležet i v jiných bankách. U procesorů PIC16F62x jsou všechny 4 registry umístěné v bance 1. U procesorů řady PIC16F87x jsou v bankách 2 a 3 a přibývají ještě dva registry - vyšší bajt adresy a vyšší bajt dat. Proto je nutné obsluhu EEPROM přizpůsobit použitému procesoru.

Při operaci čtení je potřeba nejdříve do registru EEADR uložit požadovanou adresu. Zapnutím bitu RD registru EECON1 se zahájí čtení bajtu z paměti EEPROM. Načtený bajt je k dispozici v registru EEDATA v dalším strojovém cyklu, odkud může být přečten. Následující ukázka procedury pro čtení bajtu z EEPROM je určena pro procesor PIC16F84, u jiných typů procesorů se mohou lišit instrukce pro volby banky.

CfgGet bcf STATUS, RP0 ; volba banky 0
  movf CfgAdr,W ; příprava adresy ke čtení do W
  movwf EEADR ; nastavení adresy EEPROM
  bsf STATUS,RP0 ; volba banky 1
  bsf EECON1,RD ; zapnutí požadavku ke čtení bajtu
  bcf STATUS,RP0 ; volba banky 0
  movf EEDATA,W ; načtení bajtu do registru W
  return    

Zápis bajtu do EEPROM je poněkud složitější. Zápis do EEPROM je chráněn proti náhodnému přepisu a proto je nutné nejdříve deaktivovat několik stupňů ochran. Nejdříve ze všeho se do registrů EEADR a EEDATA uloží adresa a data k zápisu. Následující "odemykací" sekvence musí být provedena přesně, proto je dalším úkonem zákaz všech přerušení. Nastavením bitu WREN registru EECON1 se povolí zápis do EEPROM. Do registru EECON2 se uloží postupně hodnoty 55h a 0AAh a následně se nastaví bit WR registru EECON1. Závěrem je možné opět povolit přerušení. Zápis do EEPROM je zahájen. Zápis trvá několik milisekund. Jeho dokončení je možné sledovat buď testováním bitu WR registru EECON1 nebo vyvoláním přerušení (čekání lze realizovat instrukcí SLEEP). Po zápisové sekvenci je možné zakázat zápis do EEPROM nastavením bitu WREN, probíhající zápis se tím neovlivní.

CfgSet bcf STATUS, RP0 ; volba banky 0
  movf CfgAdr,W ; příprava adresy k zápisu do W
  movwf EEADR ; nastavení adresy EEPROM
  movf CfgData,W ; příprava dat k zápisu do W
  movwf EEDATA ; nastavení dat k zápisu do EEPROM
  bsf STATUS,RP0 ; volba banky 1
  bcf INTCON,GIE ; zákaz všech přerušení
  bsf EECON1,WREN ; povolení zápisu do EEPROM
  movlw 55h ; 1. odemykací kód
  movwf EECON2 ; zápis 1. kódu
  movlw 0AAh ; 2. odemykací kód
  movwf EECON2 ; zápis 2. kódu
  bsf EECON1,WR ; zapnutí požadavku k zápisu bajtu
  bcf EECON1,WREN ; zákaz dalšího zápisu do EEPROM
  bsf INTCON,GIE ; povolení přerušení
CfgSet2 btfsc EECON1,WR ; je zápis již dokončen?
  goto CfgSet2 ; čekání na dokončení zápisu
  return    

Po provedení zápisu by mělo být provedeno kontrolní čtení s porovnáním pro ověření správnosti zápisu. Doporučuje se před provedením zápisu načíst původní obsah a zkontrolovat, zda je zápis nutné provést. Jednak se tím zkrátí doba potřebná k zápisu a jednak se tím sníží únava paměti EEPROM (přestože výrobce zaručuje více než milion zápisů do jedné paměťové buňky). V některých případech může být důležitá i nižší spotřeba energie z baterií.