Aplikace PicDev | Procesor PIC16F84 | Překladač PicDev | Stavebnice P84 |
- Procesor PIC16F84 - |
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.
PIC16F83 menší paměť programu (512 slov), menší paměť RAM (36 bajtů)
PIC16C84 zastaralá verze procesoru (pomalejší, vyšší spotřeba proudu, menší rozsah napětí, jiný typ paměti programu - EEPROM), menší paměť RAM (36 bajtů), menší rozdíly v konfiguračním slově (obrácená polarita bitu PWRTE)
PIC16F84A rychlejší verze procesoru, drobná vylepšení elektrických vlastností
PIC16F627 pouzdro pinově kompatibilní (může beze změny nahradit PIC16F84), možnost využití více bitů portů, větší paměť RAM rozdělená do více bank (224 bajtů), větší paměť EEPROM (128 bajtů), více časovačů (3), 2 analogové komparátory, programovatelné referenční napětí, modul CCP pro měření a generování časových impulsů, sériový port USART/SCI, nízkonapěťové programování, jiné adresy registrů pro práci s EEPROM, jiný formát konfiguračního slova
PIC16F628 jako PIC16F627, větší paměť programu (2048 slov)
PIC16F873 větší pouzdro, větší paměť programu (4096 slov), větší paměť RAM (192 bajtů), větší paměť EEPROM (128 bajtů), více portů (22 pinů), více časovačů (3), modul CCP pro měření a generování časových impulsů, sériový port USART/SCI, sériový port MSSP (SPI a I2C), 5 10-bitových A/D převodníků, přístup procesoru k programové paměti Flash, nízkonapěťové programování, jiné adresy registrů pro práci s EEPROM, jiný formát konfiguračního slova
PIC16F874 jako PIC16F873, více portů (33 pinů), 8 10-bitových A/D převodníků, paralelní komunikace PSP
PIC16F876 jako PIC16F873, větší paměť programu (8192 bajtů), větší paměť RAM (368 bajtů), větší paměť EEPROM (256 bajtů)
PIC16F877 jako PIC16F873, více portů (33 pinů), 8 10-bitových A/D převodníků, paralelní komunikace PSP, větší paměť programu (8192 bajtů), větší paměť RAM (368 bajtů), větší paměť EEPROM (256 bajtů)
Popis procesoru |
---|
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 |
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.
RA0
až RA3
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
až 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 až 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, RB4 až RB7 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 až 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
4 až 6: 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
8 až 13: 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. 0 až 7Fh. 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 0 až FFh). 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 0 až 0FFh 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ů RB4 až RB7
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ě RB4
až RB7
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 0Ch až 4Fh (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 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 Obsah registru W zapíše do TRIS registru portu A až C (f = 5 až 7). 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í.