Osmibitové mikrořadiče Microchip
PIC16F1937
SPŠElit Dobruška, 2014 Ing Josef Hloušek
Tento text může být využíván pro podporu výuky předmětu Mikroprocesorové systémy ve 3. a 4. ročníku oboru Aplikace osobních počítačů a správa sítí. Text vychází z firemních dokumentů Microchip [1] a [2], je výrazně zkrácen a je přizpůsoben úrovni výuky předmětu MPS. Text neobsahuje popis řadiče LCD pro jeho složitost. Dále neobsahuje popis sériových komunikačních kanálů (SPI, I2C, USART) a pomocných obvodů (zdroje referenčních napětí). Zájemci mají možnost využít originální dokumentace [1]. Text předpokládá znalost číslicové techniky, logických obvodů, binární a hexadecimální číselné soustavy a základní znalosti architektury mikrořadičů. Výhodou při studiu je znalost technické angličtiny.
1
Obsah: 1. Osmibitové mikrořadiče Microchip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1. Základní sortiment mikrořadičů PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Mikrořadič PIC16F1937, funkční schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Paměť pro program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1. Organizace paměti Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Čítač programu (PC, Program Counter) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Zásobník (Stack) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Paměť RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1. Paměť RAM, organizace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Registry jádra (Core Registers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. Registry SFR (Special Function Register) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4. Registry PCL a PCLATH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5. STATUS registr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. I / O porty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. Digitální vstupy / výstupy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Analogové vstupy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3. Port A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4. Port B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5. Port C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6. Port D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7. Port E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. Konfigurační bity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. Oscilátor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1. Oscilátor vnější . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2. Oscilátor na čipu s vnějšími součástkami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1. Oscilátor řízený krystalem nebo keramickým rezonátorem . . . . . . . . . . 6.2.2. Oscilátor řízený RC článkem, mód RC . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3. Oscilátory vnitřní . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4. Volba zdroje taktovacího kmitočtu, registr OSCCON . . . . . . . . . . . . . . . . . . . . . . 6.5. Taktování mikrořadiče při výpadku vnějšího oscilátoru, registr _CONFIG1 . . . . . . 7. AD převodník . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1. Princip SAR AD převodníku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2. Blokové schéma AD převodníku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3. Konfigurace AD převodníku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1. Konfigurace vstupních Portů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2. Výběr vstupního kanálu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.3. Volba referenčního napětí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.4. Nastavení vzorkovacího kmitočtu AD převodníku . . . . . . . . . . . . . . . . . . 7.3.5. Formátování výsledku AD převodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4. Povolení AD převodníku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.5. Spuštění AD převodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6. Ukončení AD převodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8. Čítače a časovače . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1. Čítač / časovač TIMER0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2. Čítač / časovač TIMER1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3. Čítač / časovač TIMER2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9. Modul CCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1. Režim vzorkování . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2. Režim porovnání . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3. Režim PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
4 4 5 7 7 8 8 9 9 10 10 16 16 16 19 20 21 23 25 26 27 29 32 32 32 32 32 33 33 35 36 36 36 37 37 38 38 38 39 39 39 40 41 41 43 45 47 47 47 48
10. Přerušovací systém PIC16F917 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1. Zdroje přerušení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2. Obsluha přerušení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3. Vnější přerušení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4. Přerušení od čítače Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5. Přerušení od změny logické úrovně na pinech Portu B . . . . . . . . . . . . . . . . . . . 10.6. Přerušení od periférií . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11. Časovač WDT (Watchdog Timer) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12. Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1. Power On Reset (POR), Reset po připojení napájecího napětí . . . . . . . . . . . . . 12.2. Brown Out Reset (BOR), Reset po poklesu napájecího napětí pod danou mez 12.3. Reset aktivací pinu /MCLR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4. Reset přeplněním časovače WDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5. Reset programem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6. Reset přetečením / podtečením zásobníku Stack . . . . . . . . . . . . . . . . . . . . . . . . 12.7. Reset po ukončení zápisu do paměti Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.8. Časovač Power-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13. Instrukční soubor mikrořadičů PIC16F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1. Struktura instrukce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2. Přehled instrukcí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3. Formát instrukcí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4. Popis instrukcí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14. Assembler MPASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1. Syntaktická pravidla assembleru MPASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.1. Příkazový řádek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.2. Label (návěští) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.3. Mnemonics (instrukce, direktivy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.4. Operandy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.5. Komentář . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.2. Konstanty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.3. Oprerátory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.4. Direktivy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. Elektrické parametry mikrořadičů PIC16(L)F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16. Vyráběné typy mikrořadičů PIC16F1937 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17. Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
50 50 50 51 51 52 53 55 56 56 56 57 57 57 58 58 58 59 59 60 62 63 73 73 73 73 73 74 74 74 74 75 78 79 79
1. Osmibitové mikrořadiče Microchip 1.1. Základní sortiment mikrořadičů PIC PIC 16F a PIC 18F jsou mikrořadiče s architekturou Harvard, vyráběné firmou Microchip od roku 1975 na základě mikrořadičů General Instruments. Původně originální, ale nepříliš ambiciózní PIC (Programmable Interface Controller), byly velmi rychle vylepšovány a cca od roku 2001 je firma Microchip vedoucí světovou firmou na trhu osmibitových mikrořadičů. Do roku 2008 firma Microchip vyrobila 6 000 000 000 mikrořadičů. Mikrořadiče PIC byly první, které v roce 1993 obsahovaly na čipu paměť EEPROM. Zvláštností mikrořadičů PIC je délka programovacího slova, které je 12, 14 nebo 16 bitů, každé slovo obsahuje vždy kompletní instrukci. Výpočetní výkon je až 10 MIPS. Jasnou výhodou je velmi široká nabídka nejrůznější variant pro velký okruh zákazníků, široký sortiment periférií včetně sběrnic USB a CAN a řadičů displejů LCD. V České republice jsou nejrozšířenější čtyři řady mikrořadičů PIC : Základní řada (Base-Line) s pamětí Flash až 2KB, instrukční soubor má 33 instrukcí, jako periferie je na čipu osmibitový čítač, osmibitový A/D převodník a komparátor. Výpočetní výkon je 5 MIPS. Střední řada (Mid-Range) s pamětí Flash až 8KB, instrukční soubor má 35 instrukcí, jako periferie jsou na čipu osmibitové a šestnáctibitové čítače, desetibitový A/D převodník, komparátor, sériové komunikační kanály UART, SPI, I2C. Všechny typy mají rozhraní ICSP pro sériové programování osazených mikrořadičů na desce tištěného spoje a rozhraní ICD pro ladění programů v paměti Flash. Výpočetní výkon je 5 MIPS. Vylepšená střední řada (Enhanced Mid-Range) s pamětí Flash až 16KB, instrukční soubor má 49 instrukcí, jako periferie jsou na čipu osmibitové a šestnáctibitové čítače, desetibitový A/D převodník, komparátor, sériové komunikační kanály UART, SPI, I2C. Všechny typy mají rozhraní ICSP pro sériové programování osazených mikrořadičů na desce tištěného spoje a rozhraní ICD pro ladění programů v paměti Flash. Výpočetní výkon je 8 MIPS. Elitní řada (High-End) s pamětí Flash až 64KB, instrukční soubor má 83 instrukcí, jako periferie jsou na čipu osmibitové a šestnáctibitové čítače, dvanáctibitový A/D převodník, komparátor, sériové komunikační kanály UART, SPI, I2C, USB. Všechny typy mají rozhraní ICSP pro sériové programování osazených mikrořadičů na desce tištěného spoje a rozhraní ICD pro ladění programů v paměti Flash. Výpočetní výkon je až 16 MIPS. Porovnání hlavních parametrů osmibitových mikrořadičů Microchip : řada Flash základní 2 KB střední 8 KB vylepšená 16 KB elitní 64 KB
RAM 144 B 368 B 1.5 KB 4 KB
instrukce 33 (12bit) 35 (14bit) 49 (14bit) 83 (16bit)
výkon čítače ADC UART 5 MIPS 1 8 bit -5 MIPS 3 10 bit 1 8 MIPS 5 10 bit 1 16 MIPS 5 12 bit 2
I/O 4 - 36 4 - 54 6 - 55 16 - 70
f 20 MHz 20 MHz 32 MHz 40 MHz
Každá řada obsahuje desítky typů a variant, všechny uvedené hodnoty jsou nejvyšší, které každá řada nabízí. Rozsah nabídky mikrořadičů ilustruje ukázka pouzder.
4
1.2. Mikrořadič PIC16F1937, funkční schéma [1]
CPU (Central Processor Unit), osmibitové jádro mikrořadiče, 49 instrukcí, jedno přerušení, maximální taktovací kmitočet 32 MHz, výpočetní výkon 8MIPS, Program Flash Memory paměť pro uložení programu, 8K slov o délce 14 bitů. Na každé z paměťových míst je možno uložit úplnou instrukci sestávající z kódu instrukce a až dvou operandů RAM sada osmibitových registrů rozdělená do 32 bank po 128 registrech. Některé registry jsou využívány procesorem a perifériemi (SFR – Special Function Registers), ostatní registry nemají přesné určení a mohou být využity programem (GPR – General Purpose Registers). EEPROM 256 bytů paměti pro konstanty a data PORTs čtyři osmibitové a jeden čtyřbitový programovatelné vstupně / výstupní porty Timers čtyři osmibitové a jeden šestnáctibitový čítače / časovače ADC 10ti bitový A/D převodník SR Latch R-S klopný obvod Comparators dva analogové komparátory LCD řadič 24 segmentů displeje LCD EUSART synchronní / asynchronní kanál UART CCPs dva moduly Capture / Compare / PWM. Po připojení k čítačům umožňují časování vnějších událostí a generování signálu PWM ECCPs tři moduly Enhanced Capture / Compare / PWM MSSP modul sériové komunikace. Může být konfigurován jako SPI nebo I2C Timing generation oscilátory
5
ALU Arithmetic Logic Unit W Reg (Working Register), střadač, je součástí sady registrů RAM Program Counter, 15bitový čítač programu, může vytvořit až 215 = 32768 adres 16-Level Stack, zásobník, 16 hardwarových 15bitových registrů. Do zásobníku je ukládán obsah čítače programu při větvení programu nebo při přerušení. Registry nejsou součástí ani paměti RAM ani Flash. Flash Program Memory paměť pro program Configuration Flash registry pro trvalé nastavení některých konfiguračních parametrů Instruction Reg registr pro uložení právě vykonávané instrukce Instruction Decode and Control dekodér instrukce STATUS Reg registr stavu ALU, je součástí RAM FSR Reg (File Select Registers) dva 16bitové registry pro přístup do paměti, jsou součástí RAM Reset, časovače a detektory pro generování stavu RESET při zapnutí napájecího napětí (Power On Reset), při poklesu napájecího napětí (Brown Out Reset), při nestandardním chodu programu (Watch Dog Timer) a při startu nebo výpadku oscilátoru.
6
2. Paměť pro program 2.1. Organizace paměti Flash Paměť pro uložení programu je organizována jako sada 14 bitových registrů. Mikrořadiče PIC16F1xxx mají 15bitový čítač programu (PC, Program Counter), který může adresovat až 32KB slov. Na čipu mikrořadiče PIC16F1937 je implementováno 8KB paměti Flash. Všechny instrukce mají délku jednoho slova a v paměti tedy může být uloženo až 8K instrukcí. Paměť je dělena do čtyř stránek po 2K. Při skocích mezi stránkami paměti musí být nastaveno pět nejvyšších bitů registru PC zápisem do registru PCLATH (Program Counter Latch High). Při postupném vykonávání instrukcí obsah registru PC přejde přes hranice stránek samovolně. Paměť menší než 2K nevyžaduje stránkování.
Registr PC je složen z registrů PCL (Program Counter Least Significant Byte) a PCH. Detaily o registru PC viz článek 2.2. Některé typy mikrořadičů mají menší paměť než 8K. Je-li v takovém mikrořadiči adresována paměť, která není na čipu implementována, je adresována paměť se „shodnou“ adresou na nižší stránce, např. místo adresy 17FFh je adresována paměť 07FFh. První instrukce uživatelského programu by měla být uložena na adrese 0005h nebo vyšší. Signál RESET vždy nastaví obsah PC na hodnotu 0000h, kde je uložen Reset Vector. Potvrzené přerušení nastavuje obsah PC na adresu 0004h, na této adrese je uložen Interrupt Vector. O požadavcích na přerušení a jejich obsloužení viz článek 10.Přerušovací systém. Stack (zásobník) je tvořen šestnácti 15bitovými hardwarovými registry. Zásobník je používán při instrukcích CALL a RETURN pro uložení a vyzvednutí návratových adres. Funkce zásobníku je popsána v článku 2.3. Zásobník.
7
2.2. Čítač programu (PC, Program Counter)
Čítač programu má délku 15 bitů a je složen z 8bitového registru PCL (Program Counter Least Significant Byte) a 7bitového hardwarového registru PCH. Registr PCL je součástí sady registrů (viz paměť RAM), má adresu 02h a je určen pro zápis i čtení. Jakýkoliv zápis do registru PCL zapíše také obsah registru PCLATH do registru PCH. Registr PCH není uživateli přístupný, jeho obsah se mění zápisem do registru PCLATH Registr PCLATH (Program Counter Latch High) je součástí sady registrů RAM, adresa je 0Ah. Obsah registru PC je nulován signálem RESET. Obsah registru PC je ukládán na vrchol zásobníku (Stack Level 1) při instrukcích call a callw, tj. při volání podprogramu. Obsah registru PC je naplněn z vrcholu zásobníku při instrukcích return , retfie a retlw, tj. při návratu z podprogramu nebo z obslužné rutiny přerušení. Registr PCL je naplněn obsahem registru WREG při instrukci callw. Nižších 11 bitů registru PC je naplněno 11bitovou adresou, kterou obsahují instrukce call pro volání podprogramu a goto pro nepodmíněný skok. Tak jsou umožněny skoky programu uvnitř jedné stránky o velikosti 2K. Pro skoky na jinou stránku je nutno nastavit i nejvyšší čtyři bity registru PC zápisem bitů < 6 : 3 > do registru PCLATH. 2.3. Zásobník (Stack) Zásobník je tvořen šestnácti 15bitovými hardwarovými registry, které nejsou součástí žádné paměti. Zásobník umožňuje až šestnáct větvení programu instrukcemi call nebo obsluhou přerušení.
Do zásobníku je ukládán obsah čítače programu PC jako návratová adresa při instrukci call a callw, obsahem zásobníku je naplněn čítač programu při instrukcích return , retfie a retlw. Do zásobníku je možno zapsat nejvýše šestnáct adres, další zápis přepíše adresu, která byla zapsána jako první. Mikrořadiče PIC16F1xxx nemají žádné instrukce typu PUSH nebo POP pro uložení do zásobníku nebo pro vyzvednutí ze zásobníku. Programátor má informaci o naplnění zásobníku v registru STKPTR (Stack Pointer), který je inkrementován instrukcemi call, callw při přerušení a dekrementován instrukcemi return, retlw a retfie. Programátor musí zajistit, aby do zásobníku bylo zapisováno nejvýše osmkrát, poté musí následovat čtení zásobníku. Nedodržení tohoto pravidla má za následek chybnou funkci programu. 8
3. Paměť RAM 3.1. Paměť RAM, organizace Paměť pro uložení dat je implementována jako statická RAM, rozdělená do 32 bank. Každá banka obsahuje 128 osmibitových registrů. V paměti jsou čtyři typy registrů: Core registry (registry jádra) Prvních 12 adres v každé bace (x00h až x0Bh a x80h až x8Bh, x=0….F) je obsazeno registry jádra. Všech 12 registrů je ve všech bankách shodných. SFR registry (Special Function Register) jsou využívány procesorem a periferiemi, nejvýše 20 jich je implementováno na adresách 0Ch až 1Fh (8Ch až 9Fh) v každé bance. GPR registry (General Purpose Register) jsou k dispozici uživateli pro manipulaci s daty. V bance může být nejvýše 80 GPR registrů, jsou implementovány na adresách 20h až 6Fh (A0h až EFh) v každé bance. Signál RESET nemění obsah registrů GPR, po zapnutí napájecího napětí je tedy stav registrů GPR náhodný. Common registry jsou na šestnácti nejvyšších adresách v každé bance. Z adresy těchto registrů je respektováno pouze 7 nejnižších bitů, takže jsou vždy adresovány registry s adresami 070h až 07Fh v Bance 0, které jsou tak přístupné ze všech Bank. Umístění registrů v prvních čtyřech bankách paměti RAM :
Mikrořadič PIC16F1937 má implementováno 512 registrů RAM. Aktivní banka je vybrána zápisem čísla banky (0 až 31) do registru BSR (Bank Select Register). Každý z registrů je přístupný buď přímo instrukcí a jejím operandem nebo nepřímo prostřednictvím dvou 16bitových registrů FSR0H:FSR0L a FSR1H:FSR1L (File Select Register).
9
3.2. Registry jádra (Core Registers) Dvanáct registrů jádra je shodných v každé z 32 bank. adresa 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh
symbol INDF0 INDF1 PCL STATUS FSR0L FSR0H FSR1L FSR1H BSR WREG PCLATH INTCON
název Indirect Addressing via FSR0H:FSR0L Indirect Addressing via FSR1H:FSR1L Program Counter Least Significant Byte Status Register File Select Register, Addres 0 Low Pointer File Select Register, Addres 0 High Pointer File Select Register, Addres 1 Low Pointer File Select Register, Addres 1 High Pointer Bank Select Register Working Register Program Counter Latch High Interrupt Control Register
stav po POR xxxx xxxx xxxx xxxx 0000 0000 - - -1 1000 0000 0000 0000 0000 0000 0000 0000 0000 - - -0 0000 0000 0000 - 000 0000 0000 0000
3.3. Registry SFR (Special Function Register) Bank 0 adresa 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh
název Port A Register Port B Register Port C Register Port D Registers Port E Register Peripheral Interrupt Request Register 1 Peripheral Interrupt Request Register 2 Peripheral Interrupt Request Register 2 reserved TMR0 Timer 0 Module Register TMR1L Timer 1 Module Low byte TMR1H Timer 1 Module High byte T1CON Timer 1 Control Register T1GCON Timer 1 Gate Control Register TMR2 Timer 2 Module register PR2 Timer 2 Period Register T2CON Timer 2 Control Register reserved CPSCON0 Capacitive Sensing Control Register 0 CPSCON1 Capacitive Sensing Control Register 1 symbol PORTA PORTB PORTC PORTD PORTE PIR1 PIR2 PIR3
0 = hodnota bitu po POR (Power On Reset) je 0 1 = hodnota bitu po POR je 1 x = hodnota bitu po POR není definována, může být 0 nebo 1 - = bit není využíván
10
stav po POR xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - - - - xxxx 0000 0000 0000 00- 0 - 000 0-0 xxxx xxxx xxxx 0000 0000 0000 1111 -000
xxxx xxxx xxxx 00- 0 0000 0x00 1111 0000
0- - - 0000 - - - - 0000
Bank 1 adresa symbol TRISA 8Ch TRISB 8Dh TRISC 8Eh TRISD 8Fh TRISE 90h PIE1 91h PIE2 92h PIE3 93h 94h OPTION_REG 95h PCON 96h WDTCON 97h OSCTUNE 98h OSCCON 99h OSCSTAT 9Ah ADRESL 9Bh ADRESH 9Ch ADCON0 9Dh ADCON1 9Eh 9Fh
název Port A Tri-State Register Port B Tri-State Register Port C Tri-State Register Port D Tri-State Registers Port E Tri-State Register Peripheral Interrupt Enable Register 1 Peripheral Interrupt Enable Register 2 Peripheral Interrupt Enable Register 3 reserved Option Register Power Control Register Watch Dog Control Register Oscillator Tuning Register Oscillator Control Register Oscillator Status Register A/D Result Register Low byte A/D Result Register High byte A/D Control Register 0 A/D Control Register 1 reserved
Bank 2 adresa symbol název 10Ch LATA PortA Data Latch 10Dh LATB PortB Data Latch 10Eh LATC PortC Data Latch LATD 10Fh PortD Data Latch LATE 110h PortE Data Latch CM1CON0 111h Comparator 1 Control Register 0 CM1CON1 112h Comparator 1 Control Register 1 CM2CON0 113h Comparator 2 Control Register 0 CM2CON1 114h Comparator 2 Control Register 1 CMOUT 115h Comparator Output Register BORCON 116h Brown-Out Reset Control Register FVRCON 117h Fixed Voltage Reference Control Register DACCON0 118h Voltage Reference Control Register 0 DACCON1 119h Voltage Reference Control Register 1 11Ah SRCON0 S-R Latch Control Register 0 11Bh SRCON1 S-R Latch Control Register 1 11Ch reserved 11Dh APFCON Alternate Pin Function Control Register 11Eh reserved 11Fh reserved 0 = hodnota bitu po POR (Power On Reset) je 0 1 = hodnota bitu po POR je 1 x = hodnota bitu po POR není definována, může být 0 nebo 1 q = hodnota bitu po Reset je závislá na podmínkách - = bit není využíván 11
stav po POR 1111 1111 1111 1111 1111 1111 1111 1111 - - - - 1111 0000 0000 0000 00-0 - 000 0- 01111 00- - - 01 - - 00 0011 10q0 xxxx xxxx - 000 0000
1111 11qq 0110 0000 1- 00 0q00 xxxx xxxx 0000 - 000
stav po POR xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - - - - -xxx 0000 -100 0000 -- 00 0000 -100 0000 -- 00 - - - - -- 00 1- - - - - -q 0q00 0000 000- 00- 0 - - -0 0000 0000 0000 0000 0000 - 000 0000
Bank 3 adresa 18Ch 18Dh 18Eh 18Fh 190h 191h 192h 193h 194h 195h 196h 197h 198h 199h 19Ah 19Bh 19Ch 19Dh 19Eh 19Fh
symbol ANSELA ANSELB ANSELD ANSELE EEADRL EEADRH EEDATL EEDATH EECON1 EECON2
RCREG TXREG SPBRGL SPBRGH RCSTA TXSTA BAUDCON
název PortA Analog Select Register PortB Analog Select Register reserved PortD Analog Select Register PortE Analog Select Register EEPROM/Flash Addres Register Low Byte EEPROM/Flash Addres Register High Byte EEPROM/Flash Read Data Register Low Byte EEPROM/Flash Read Data Register High Byte EEPROM Control Register 1 EEPROM Control Register 2 reserved reserved USART Receive Data Register USART Transmit Data Register Select Period Baud Rate Generator Low Select Period Baud Rate Generator High Receive Status and Control Register Transmit Status and Control Register Baud Rate Control Register
stav po POR - -11 1111 - -11 1111 1111 - - - 0000 - 000 xxxx - -xx 0000 0000
1111 -111 0000 0000 xxxx xxxx x000 0000
0000 0000 0000 0000 0000 0000 01- 0
0000 0000 0000 0000 000x 0010 0- 00
Bank 4 adresa 20Ch 20Dh 20Eh 20Fh 210h 211h 212h 213h 214h 215h 216h 217h 218h 219h 21Ah 21Bh 21Ch 21Dh 21Eh 21Fh
symbol WPUB
WPUE SSPBUF SSPADD SSPMSK SSPSTAT SSPCON1 SSPCON2 SSPCON3
název reserved Weak Pull-Up PortB Register reserved reserved Weak Pull-Up PortE Register Sychronous Serial Port Data Buffer Sychronous Serial Port Address Sychronous Serial Port Mask Register Sychronous Serial Port Status Sychronous Serial Port Control Register 1 Sychronous Serial Port Control Register 2 Sychronous Serial Port Control Register 3 reserved reserved reserved reserved reserved reserved reserved reserved
0 = hodnota bitu po POR (Power On Reset) je 0 1 = hodnota bitu po POR je 1 x = hodnota bitu po POR není definována, může být 0 nebo 1 - = bit není využíván 12
stav po POR 1111 1111
- - - xxxx 0000 1111 0000 0000 0000 0000
1- - xxxx 0000 1111 0000 0000 0000 0000
Bank 5 adresa 28Ch 28Dh 28Eh 28Fh 290h 291h 292h 293h 294h 295h 296h 297h 298h 299h 29Ah 29Bh 29Ch 29Dh 29Eh 29Fh
symbol
CCPR1L CCPR1H CCP1CON PWM1CON CCP1AS PSTR1CON CCPR2L CCPR2H CCP2CON PWM2CON CCP2AS PSTR2CON CCPTMRS0 CCPTMRS1
název reserved reserved reserved reserved reserved Capture/Compare/PWM Register 1 Low Capture/Compare/PWM Register 1 High Capture/Compare/PWM Control Register 1 Enhanced PWM Control Register 1 CCP 1 Auto-Shutdown Control Register PWM Steering Control Register 1 reserved Capture/Compare/PWM Register 2 Low Capture/Compare/PWM Register 2 High Capture/Compare/PWM Control Register 2 Enhanced PWM Control Register 2 CCP 2 Auto-Shutdown Control Register PWM Steering Control Register 2 PWM Timer Selection Control Register 0 PWM Timer Selection Control Register 1
stav po POR
xxxx xxxx 0000 0000 0000 - - - 0
xxxx xxxx 0000 0000 0000 0001
xxxx xxxx 0000 0000 0000 - - - 0 0000 - - - -
xxxx xxxx 0000 0000 0000 0001 0000 - - 00
Bank 6 adresa 30Ch 30Dh 30Eh 30Fh 310h 311h 312h 313h 314h 315h 316h 317h 318h 319h 31Ah 31Bh 31Ch 31Dh 31Eh 31Fh
symbol
CCPR3L CCPR3H CCP3CON PWM3CON CCP3AS PSTR3CON CCPR4L CCPR4H CCP4CON CCPR5L CCPR5H CCP5CON
název reserved reserved reserved reserved reserved Capture/Compare/PWM Register 3 Low Capture/Compare/PWM Register 3 High Capture/Compare/PWM Control Register 3 Enhanced PWM Control Register 3 CCP31 Auto-Shutdown Control Register PWM Steering Control Register31 reserved Capture/Compare/PWM Register 4 Low Capture/Compare/PWM Register 4 High Capture/Compare/PWM Control Register 4 reserved Capture/Compare/PWM Register 5 Low Capture/Compare/PWM Register 5 High Capture/Compare/PWM Control Register 5 reserved
0 = hodnota bitu po POR (Power On Reset) Reset je 0 1 = hodnota bitu po POR je 1 x = hodnota bitu po POR není definována, může být 0 nebo 1 - = bit není využíván 13
stav po POR
xxxx xxxx 0000 0000 0000 - - - 0
xxxx xxxx 0000 0000 0000 0001
xxxx xxxx xxxx xxxx - - 00 0000 xxxx xxxx xxxx xxxx - - 00 0000
Bank 7 adresa 38Ch 38Dh 38Eh 38Fh 390h 391h 392h 393h 394h 395h 396h 397h 398h 399h 39Ah 39Bh 39Ch 39Dh 39Eh 39Fh
symbol
IOCBP IOCBN IOCBF
Bank 8 adresa symbol 40Ch 40Dh 40Eh 40Fh 410h 411h 412h 413h 414h TMR4 415h PR4 416h T4CON 417h 418h 419h 41Ah 41Bh 41Ch TMR6 41Dh PR6 41Eh T6CON 41Fh
název reserved reserved reserved reserved reserved reserved reserved reserved Interrupt On-Change Positive Edge Register Interrupt On-Change Negative Edge Register Interrupt On-Change Flag Register reserved reserved reserved reserved reserved reserved reserved reserved reserved název reserved reserved reserved reserved reserved reserved reserved reserved reserved Timer 4 Module Register Timer 4 Period Register Timer 4 Control Register reserved reserved reserved reserved Timer 6 Module Register Timer 6 Period Register Timer 6 Control Register reserved
0 = hodnota bitu po POR (Power On Reset) Reset je 0 1 = hodnota bitu po POR je 1 x = hodnota bitu po POR není definována, může být 0 nebo 1 - = bit není využíván 14
stav po POR
0000 0000 0000 0000 0000 0000
stav po POR
0000 0000 1111 1111 - 000 0000
0000 0000 1111 1111 - 000 0000
Bank 15 adresa symbol 78Ch 78Dh 78Eh 78Fh 790h LCDCON 791h LCDPS 792h LCDREF 793h LCDCST 794h LCDRL 795h 796h 797h LCDSE0 798h LCDSE1 799h 79Ah LCDSE2 79Bh 79Ch 79Dh 79Eh 79Fh 7A0h LCDDATA0 7A1h LCDDATA1 7A2h LCDDATA2 LCDDATA3 7A3 LCDDATA4 7A4 LCDDATA5 7A5 LCDDATA6 7A6 LCDDATA7 7A7 LCDDATA8 7A8 LCDDATA9 7A9 LCDDATA10 7AA LCDDATA11 7AB 7AC 7AD 7AE 7AF
název reserved reserved reserved reserved reserved LCD Control Register LCD Phase Register LCD Reference Voltage Control Register LCD Contrast Control Register LCD Reference Ladder Register reserved reserved LCD Segment Enable Register 0 LCD Segment Enable Register 1 LCD Segment Enable Register 2 reserved reserved reserved reserved reserved LCD Data Register 0 LCD Data Register 1 LCD Data Register 2 LCD Data Register 3 LCD Data Register 4 LCD Data Register 5 LCD Data Register 6 LCD Data Register 7 LCD Data Register 8 LCD Data Register 9 LCD Data Register 10 LCD Data Register 11 reserved reserved reserved reserved
0 = hodnota bitu po POR (Power On Reset) Reset je 0 1 = hodnota bitu po POR je 1 x = hodnota bitu po POR není definována, může být 0 nebo 1 - = bit není využíván
15
stav po POR
0000000 000- - - 0000
0011 0000 000- 000 - 000
0000 0000 0000 0000 0000 0000
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
3.4. Registry PCL a PCLATH PCL R/W bit 7 0 ----
R/W bit 6 0 R/W bit 6 0
Program Counter Least Significant Byte R/W R/W R/W R/W R/W bit 5 bit 4 bit 3 bit 2 bit 1 0 0 0 0 0
PCLATH R/W bit 5 0
Program Counter Latch High R/W R/W R/W bit 4 bit 3 bit 2 0 0 0
adresa R/W bit 0 0
02 h
adresa R/W bit 1 0
R/W bit 0 0
0A h
Čítač programu je 15bitový. Registr PCL slouží jako nejnižších 8 bitů čítače programu. Horní byte čítače programu není přímo přístupný, pro zápis horních 7 bitů čítače programu slouží registr PCLATH. Funkce obou registrů je popsána v článku 2.2. 3.5. STATUS registr -
-
STATUS Status Register R R R/W NOT_TO NOT_PD Z 1 1 0
adresa R/W DC 0
R/W C 0
03 h
NOT_TO Time-Out Status Bit 0 = naplněn interval časovače WDT (Watch Dog Timer) 1 = po zapnutí napájení nebo po instrukcích clrwdt nebo sleep NOT_PD Power Down Status Bit 0 = po instrukci sleep 1 = po zapnutí napájení nebo po instrukci clrwdt Z Zero Flag Bit 0 = výsledek logické nebo aritmetické operace není 0 1 = výsledek logické nebo aritmetické operace je 0 DC Decimal Carry Flag Bit 0 = výsledek operace bez přenosu ze 4 bitu 1 = výsledek operace s přenosem ze 4 bitu Pro instrukce addwf , addlw , subwf , sublw. Při výpůjčce (Borrow) je bit DC reverzní. C Carry Flag Bit 0 = výsledek operace bez přenosu z nejvyššího bitu 1 = výsledek operace s přenosem z nejvyššího bitu Pro instrukce addwf , addlw , subwf , sublw. Při výpůjčce (Borrow) je bit C reverzní. STATUS registr může být použit jako cílový registr v mnoha instrukcích. Výsledek zápisu může být však neočekávaný. Např. instrukce clrf STATUS nastaví příznak Z na hodnotu 1. Stav registru po instrukci je potom 0 0 0 u u 1 u u (u= hodnota bitu se nemění). Proto se doporučuje používat pro nastavení registru STATUS jen instrukce bcf , bsf , movwf a swapf , které neovlivňují žádné příznaky.
16
4. I / O porty Mikrořadič PIC16F1937 má čtyři osmibitové (RA, RB, RC, RD) a jeden čtyřbitový (RE) vstupně / výstupní porty. Většina I/O pinů je multiplexována pro použití vnitřními periferiemi (čítače, A/D převodník, komparátory, sériové komunikační kanály, LCD řadič). Pokud jsou periferie povoleny, jim přiřazené piny nemohou být použity pro jiný účel. V pouzdru DIP 40 je uspořádání pinů podle obrázku
Sedm specifických vstupů a výstupů může být obsahem registru APFCON přepínáno mezi dvěma piny. Po stavu Reset (bit registru APFCON = 0) jsou specifikované signály vyvedeny na piny podle tabulky. Nastavením příslušného bitu na hodnotu 1 je signál vyveden na alternativní pin (poslední řádek tabulky).
------
APFCON Alternative Pin Function Control Register R/W R/W R/W R/W R/W R/W CCP3SEL T1GSEL P2BSEL SRNQSEL C2OUTSEL SSSEL 0 0 0 0 0 0 RE0 RB5 RC0 RA5 RA5 RA5 RB5 RC4 RD2 RA0 RA0 RA0
Funkce zmíněných signálů a pinů je popsána v příslušných kapitolách.
17
adresa R/W CCP2SEL 0 RC1 RB3
11D h Bank 2 po Reset bit=1
Ke každému portu jsou přiřazeny tři standardní registry (x = A, B, C, D, E): TRISx registry nastavují směr signálu (vstup / výstup) PORTx registry obsahují úroveň signálů na pinech LATx registry jsou používány při operacích „read-modify-write“ se signály na pinech Některé porty mají jeden až tři další registry: ANSELx registry pro nastavení pinů jako analogové vstupy WPUx registry pro připojení Pull-Up rezistrorů na digitální vstupy INLVLx registry pro sledování úrovně vstupních signálů 18
4.1. Digitální vstupy / výstupy Všechny piny mohou být konfigurovány jako digitální. Každému portu je přiřazen registr PORTx, směr přenosu dat nastavuje registr TRISx (x=A,B,C,D,E). Nastavením bitu v registru TRISx na hodnotu 1 je odpovídající pin PORTx nastaven jako vstup. Čtení registru PORTx vrací aktuální hodnoty každého pinu. Nastavením bitu v registru TRISx na hodnotu 0 je odpovídající pin PORTx nastaven jako výstup. Zápis do registru PORTx připojí hodnotu každého bitu na odpovídající pin.
Příklad konfigurace portu D jako digitální I/O banksel ANSELD clrf ANSELD ; port D digitální I/O banksel TRISD movlw 0Ch ; 0000 1100=>Wreg movwf TRISD ; nastaví piny 3 : 2 jako vstupy a ostatní piny jako výstupy Po signálu Reset jsou všechny piny všech portů nastaveny jako vstupy. Ke každému registru PORTx je přiřazen registr LATx (Data Latch register). Zápis do registru LATx má stejný výsledek jako zápis do registru PORTx. Čtení registru LATx vrací hodnotu uloženou v registru LATx. Zjednodušené schéma I/O Portu:
19
4.2. Analogové vstupy Po signálu Reset jsou piny portů RA, RB, RD a RE, které jsou multiplexovány na analogové periferie (AD převodník, komparátory), nastaveny jako analogové vstupy. Pro nastavení digitálních vstupů musí být nakonfigurovány registry ANSELx ANSELA PortA Analog Select Register adresa --R/W R/W R/W R/W R/W R/W 18C h --ANSA5 ANSA4 ANSA3 ANSA2 ANSA1 ANSA0 Bank 3 --1 1 1 1 1 1 --AN4 AN3/Vref+ AN2/VrefAN1 AN0 ADC --CPS7 CPS6 CapSens --C1IN+ C2IN+ C12IN1- C12IN0- Comparator ANSA5 : ANSA0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISA musí být nastaven na 1 ----4.3. Port A ---
-------
ANSELB R/W ANSB5 1 AN13 CPS5 -
PortB Analog Select Register R/W R/W R/W R/W ANSB4 ANSB3 ANSB2 ANSB1 1 1 1 1 AN11 AN9 AN8 AN10 CPS4 CPS3 CPS2 CPS1 C12IN2- C12IN3-
adresa R/W ANSB0 1 AN12 CPS0 -
18D h Bank 3 ADC CapSens Comparator
ANSB5 : ANSB0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISB musí být nastaven na 1
R/W ANSD7 1 CPS15
R/W ANSD6 1 CPS14
ANSELD R/W ANSD5 1 CPS13
PortD Analog Select Register R/W R/W R/W ANSD4 ANSD3 ANSD2 1 1 1 CPS12 CPS11 CPS10
adresa R/W ANSD1 1 CPS9
R/W ANSD0 1 CPS18
18F h Bank 3 CapSens
ANSD7 : ANSD0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISD musí být nastaven na 1
-----
-----
ANSELE -----
PortE Analog Select Register --R/W --ANSE2 --1 --AN7
adresa R/W ANSE1 1 AN6
R/W ANSEB0 1 AN5
ANSE2 : ANSE0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISE musí být nastaven na 1
20
190 h Bank 3 ADC
4.3. Port A Port A je osmibitový obousměrný port. Směr přenosu dat nastavuje registr TRISA. Nastavením bitu v registru TRISA na hodnotu 1 je odpovídající pin portu A nastaven jako vstup a hodnota pinu je uložena do odpovídajícího bitu registru PORTA. Nastavením bitu v registru TRISA na hodnotu 0 je odpovídající pin portu A nastaven jako výstup a hodnota odpovídajícího bitu registru LATA je vyvedena na pin. R/W RA7 x
R/W RA6 x
PORTA Port A Register R/W R/W R/W R/W RA5 RA4 RA3 RA2 x x x x
R/W TRISA7 1
R/W TRISA6 1
TRISA Tri-State A Register R/W R/W R/W R/W TRISA5 TRISA4 TRISA3 TRISA2 1 1 1 1
adresa R/W RA1 x
R/W RA0 x
R/W TRISA1 1
R/W TRISA0 1
R/W LATA1 x
R/W LATA0 x
0C h Bank 0 adresa 8C h Bank 1
TRISA < 7 : 0 > Port A Tri-State Control Bit 0 = pin konfigurován jako výstup 1 = pin konfigurován jako vstup
R/W LATA7 x
R/W LATA6 x
LATA Data Latch A Register R/W R/W R/W R/W LATA 5 LATA4 LATA3 LATA2 x x x x
adresa 10C h Bank 2
Po signálu Reset jsou všechny piny portu A nastaveny jako analogové vstupy, aktivní jsou analogové periferie, které jsou povoleny. Sortiment analogových signálů je v tabulce. Pro nastavení digitálních vstupů / výstupů musí být nakonfigurován registr ANSELA ANSELA PortA Analog Select Register adresa --R/W R/W R/W R/W R/W R/W 18C h --ANSA5 ANSA4 ANSA3 ANSA2 ANSA1 ANSA0 Bank 3 --1 1 1 1 1 1 --AN4 AN3/Vref+ AN2/VrefAN1 AN0 ADC --CPS7 CPS6 CapSens --C1IN+ C2IN+ C12IN1- C12IN0- Comparator ANSA5 : ANSA0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISA musí být nastaven na 1 Jestliže na některém pinu jsou výstupy více povolených periférií, aktuální řízení pinu převezme periferie s nejvyšší prioritou podle tabulky. Nejvyšší priorita vpravo, nejnižší vlevo.
21
Registry, jejichž obsah má vliv na funkci Portu A. Bity v šedých polích Port A nevyužívá.
22
4.4. Port B Port B je osmibitový obousměrný port. Směr přenosu dat nastavuje registr TRISB. Nastavením bitu v registru TRISB na hodnotu 1 je odpovídající pin portu B nastaven jako vstup a hodnota pinu je uložena do odpovídajícího bitu registru PORTB. Nastavením bitu v registru TRISB na hodnotu 0 je odpovídající pin portu B nastaven jako výstup a hodnota odpovídajícího bitu registru LATB je vyvedena na pin. PORTB Port B Register adresa R/W R/W R/W R/W R/W R/W R/W R/W 0D h RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Bank 0 x x x x x x x x TRISB Tri-State B Register adresa R/W R/W R/W R/W R/W R/W R/W R/W 8D h TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 Bank 1 1 1 1 1 1 1 1 1 TRISB < 7 : 0 > Port B Tri-State Control Bit 0 = pin konfigurován jako výstup 1 = pin konfigurován jako vstup LATB Data Latch B Register R/W R/W R/W R/W R/W R/W LATB7 LATB6 LATB 5 LATB4 LATB3 LATB2 x x x x x x
adresa R/W LATB1 x
R/W LATB0 x
10D h Bank 2
Po signálu Reset jsou všechny piny portu B nastaveny jako analogové vstupy, aktivní jsou analogové periferie, které jsou povoleny. Sortiment analogových signálů je v tabulce. Pro nastavení digitálních vstupů / výstupů musí být nakonfigurován registr ANSELB ANSELB PortB Analog Select Register adresa --R/W R/W R/W R/W R/W R/W 18D h --ANSB5 ANSB4 ANSB3 ANSB2 ANSB1 ANSB0 Bank 3 --1 1 1 1 1 1 --AN13 AN11 AN9 AN8 AN10 AN12 ADC --CPS5 CPS4 CPS3 CPS2 CPS1 CPS0 CapSens --C12IN2- C12IN3Comparator ANSB5 : ANSB0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISB musí být nastaven na 1 Na všechny piny portu B jsou připojeny Pull-Up rezistory, které definují hodnotu 1 na nepřipojeném vstupu. Pull-Up rezistory jsou konfigurovány v registru WPUB. R/W WPUB7 1
R/W WPUB6 1
WPUB Weak Pull-Up Port B Register R/W R/W R/W R/W WPUB5 WPUB4 WPUB3 WPUB2 1 1 1 1
adresa R/W WPUB1 1
R/W WPUB0 1
20D h Bank 4
WPUB7 : WPUB0 Weak Pull-Up Port B Bit 0 = Pull-Up rezistor odpojen 1 = Pull-Up rezistor připojen Pull-Up rezistory jsou odpojeny při konfiguraci pinů jako výstup. Bit NOT_WPUEN v registru OPTION_REG musí být nulován pro povolení Pull-Up rezistorů. 23
Pin RB0 může být konfigurován jako vstup INT pro vstup vnějšího signálu přerušení nastavením bitu INTE v registru INTCON. Všechny piny Portu B mohou být v registrech IOCBN a IOCBP nakonfigurovány jako zdroj vnějšího přerušení na sestupnou nebo nástupnou hranu signálu na příslušném pinu. Piny RB7 a RB6 Portu B jsou využívány pro signály rozhraní ICSP (In Circuit Serial Programing) při ladění programu.
Jestliže na některém pinu jsou výstupy více povolených periférií, aktuální řízení pinu převezme periferie s nejvyšší prioritou podle tabulky. Nejvyšší priorita vpravo, nejnižší vlevo.
Registry, jejichž obsah má vliv na funkci portu B. Bity v šedých polích port B nevyužívá.
24
4.5. Port C Port C je osmibitový obousměrný port. Směr přenosu dat nastavuje registr TRISC. Nastavením bitu v registru TRISC na hodnotu 1 je odpovídající pin portu C nastaven jako vstup a hodnota pinu je uložena do odpovídajícího bitu registru PORTC. Nastavením bitu v registru TRISC na hodnotu 0 je odpovídající pin portu C nastaven jako výstup a hodnota odpovídajícího bitu registru LATC je vyvedena na pin. PORTC Port C Register adresa R/W R/W R/W R/W R/W R/W R/W R/W 0E h RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 Bank 0 x x x x x x x x R/W TRISC7 1
R/W TRISC6 1
TRISC Tri-State C Register R/W R/W R/W R/W TRISC5 TRISC4 TRISC3 TRISC2 1 1 1 1
adresa R/W TRISC1 1
R/W TRISC0 1
R/W LATC1 x
R/W LATC0 x
8E h Bank 1
TRISC < 7 : 0 > Port C Tri-State Control Bit 0 = pin konfigurován jako výstup 1 = pin konfigurován jako vstup R/W LATC7 x
R/W LATC6 x
LATC Data Latch C Register R/W R/W R/W R/W LATC 5 LATC4 LATC3 LATC2 x x x x
adresa 10E h Bank 2
Jestliže na některém pinu jsou výstupy více povolených periférií, aktuální řízení pinu převezme periferie s nejvyšší prioritou podle tabulky. Nejvyšší priorita vpravo, nejnižší vlevo.
Registry, jejichž obsah má vliv na funkci portu C. Bity v šedých polích port C nevyužívá.
.
25
4.6. Port D Port D je osmibitový obousměrný port. Směr přenosu dat nastavuje registr TRISD. Nastavením bitu v registru TRISD na hodnotu 1 je odpovídající pin portu D nastaven jako vstup a hodnota pinu je uložena do odpovídajícího bitu registru PORTD. Nastavením bitu v registru TRISD na hodnotu 0 je odpovídající pin portu D nastaven jako výstup a hodnota odpovídajícího bitu registru LATD je vyvedena na pin. PORTD Port D Register adresa R/W R/W R/W R/W R/W R/W R/W R/W 0F h RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 Bank 0 x x x x x x x x R/W TRISD7 1
R/W TRISD6 1
TRISD Tri-State D Register R/W R/W R/W R/W TRISD5 TRISD4 TRISD3 TRISD2 1 1 1 1
adresa R/W TRISD1 1
R/W TRISD0 1
8F h Bank 1
TRISD < 7 : 0 > Port D Tri-State Control Bit 0 = pin konfigurován jako výstup 1 = pin konfigurován jako vstup R/W LATD7 x
R/W LATD6 x
LATD Data Latch D Register R/W R/W R/W R/W LATD 5 LATD4 LATD3 LATD2 x x x x
adresa R/W LATD1 x
R/W LATD0 x
10F h Bank 2
Po signálu Reset jsou všechny piny portu D nastaveny jako analogové vstupy, aktivní jsou analogové periferie, které jsou povoleny. Sortiment analogových signálů je v tabulce. Pro nastavení digitálních vstupů / výstupů musí být nakonfigurován registr ANSELD ANSELD PortD Analog Select Register adresa R/W R/W R/W R/W R/W R/W R/W R/W 18F h ANSD7 ANSD6 ANSD5 ANSD4 ANSD3 ANSD2 ANSD1 ANSD0 Bank 3 1 1 1 1 1 1 1 1 CPS15 CPS14 CPS13 CPS12 CPS11 CPS10 CPS9 CPS18 CapSens ANSD7 : ANSD0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISD musí být nastaven na 1 Jestliže na některém pinu jsou výstupy více povolených periférií, aktuální řízení pinu převezme periferie s nejvyšší prioritou podle tabulky. Nejvyšší priorita vpravo, nejnižší vlevo.
26
Registry, jejichž obsah má vliv na funkci portu D. Bity v šedých polích port D nevyužívá.
4.7. Port E Port E je čtyřbitový obousměrný port. Směr přenosu dat nastavuje registr TRISE. Nastavením bitu v registru TRISE na hodnotu 1 je odpovídající pin portu E nastaven jako vstup a hodnota pinu je uložena do odpovídajícího bitu registru PORTE. Nastavením bitu v registru TRISE na hodnotu 0 je odpovídající pin portu E nastaven jako výstup a hodnota odpovídajícího bitu registru LATE je vyvedena na pin. PORTE Port E Register adresa ----R R/W R/W R/W 10 h RE3 RE2 RE1 RE0 ----Bank 0 ----x x x x TRISE Tri-State E Register adresa -----R/W R/W R/W 90 h TRISE2 TRISE1 TRISE0 -----Bank 1 -----1 1 1 TRISE < 2 : 0 > Port E Tri-State Control Bit 0 = pin konfigurován jako výstup 1 = pin konfigurován jako vstup Pin RE 3 je vždy konfigurován jako vstup, jeho funkci určuje konfigurační bit MCLR _CONFIG1 (článek 5). LATE Data Latch E Register -----R/W R/W R/W LATE2 LATE1 LATE0 ----------x x x
v registru adresa 110 h Bank 2
Po signálu Reset jsou všechny piny portu E nastaveny jako analogové vstupy, aktivní jsou analogové periferie, které jsou povoleny. Sortiment analogových signálů je v tabulce. Pro nastavení digitálních vstupů / výstupů musí být nakonfigurován registr ANSELE -----
-----
ANSELE -----
PortE Analog Select Register --R/W --ANSE2 --1 --AN7
adresa R/W ANSE1 1 AN6
R/W ANSEB0 1 AN5
ANSE2 : ANSE0 Analog Select Bit 0 = pin konfigurován jako digitální vstup / výstup 1 = pin konfigurován jako analogový vstup, bit registru TRISE musí být nastaven na 1 27
190 h Bank 3 ADC
Jestliže na některém pinu jsou výstupy více povolených periférií, aktuální řízení pinu převezme periferie s nejvyšší prioritou podle tabulky. Nejvyšší priorita vpravo, nejnižší vlevo.
Registry, jejichž obsah má vliv na funkci portu E. Bity v šedých polích port E nevyužívá.
28
5. Konfigurační bity Mikrořadiče PIC16F1937 mají implementovány dva šestnáctibitové registry, jejichž obsah nastavuje některé parametry mikrořadiče. Registry jsou umístěny v paměti Flash na adresách 8007h a 8008h, nejsou běžně dostupné programátorovi. Jejich obsah je možné změnit jen při programování paměti Flash. Obsah konfiguračních registrů může být nastavován v programu direktivou __config nebo může být nastaven v prostředí MPLAB IDE. 15 -1
14 -1
7 /CP 1
6 MCLRE 1
_CONFIG1 Config 1 Register High Byte 13 12 11 10 9 FCMEN IESO /CLKOUTEN BOREN1 BOREN0 1 1 1 1 1 _CONFIG1 Config 1 Register Low Byte 5 4 3 2 /PWRTE WDTE1 WDTE0 FOSC2 1 1 1 1
adresa 8 /CPD 1
8007 h Flash adresa
1 FOSC1 1
0 FOSC0 1
8007 h Flash
FCMEN Fail-Safe Clock Monitor Enable bit – povolení záložního oscilátoru 1 = záložní oscilátor povolen, realizován symbolem _FCMEN_ON 0 = záložní oscilátor zakázán, realizován symbolem _FCMEN_OFF IESO Internal / External Switchover bit – přepínání vnitřní / vnější oscilátor 1 = přepínání oscilátorů povoleno, realizován symbolem _IESO_ON 0 = přepínání oscilátorů zakázáno, realizován symbolem _IESO_OFF /CLKOUTEN Clock Out Enable bit – výstup oscilátoru 1 = výstup oscilátoru zakázán, pin RA6 má funkci I/O, realizován symbolem _CLKOUTEN_OFF 0 = výstup oscilátoru povolen na pinu RA6/CLKOUT, realizován symbolem _CLKOUTEN_ON BOREN1 : BOREN0 Brown-out Reset bit – Reset při poklesu napájecího napětí 11 = Brown-out Reset povolen, symbol _BOREN_ON 10 = Brown-out Reset povolen, zakázán v režimu Sleep, symbol _BOREN_NSLEEP 01 = Brown-out Reset nastaven bitem SBOREN v registru BORCON, symbol _BOREN_SBODEN 00 = Brown-out Reset zakázán, symbol _BOREN_OFF /CPD Code Protection Data bit – ochrana paměti pro data proti zápisu 1 = paměť dat není chráněna proti přepsání, symbol _CPD_OFF 0 = paměť dat je chráněna proti přepsání, symbol _CPD_ON /CP Code Protection bit – ochrana paměti pro program proti zápisu 1 = paměť programu není chráněna proti přepsání, symbol _CP_OFF 0 = paměť programu je chráněna proti přepsání, symbol _CP_ON MCLRE MCLR pin function bit – funkce pinu RE3 / MCLR Když bit LVP=0 tak: 1 = pin RE3 je konfigurován jako vstup /MCLR (Manual Clear), symbol _MCLRE_ON 0 = pin RE3 je digitální vstup pro všeobecné použití, symbol _MCLRE_OFF Když bit LVP=1 tak je bit MCLRE ignorován
29
/PWRTE Power-Up Timer Enable bit – zpoždění programu při zapnutí napájení 1 = zpoždění zakázáno, symbol _PWRTE_OFF 0 = zpoždění povoleno, symbol _PWRTE_ON WDTE1 : WDTE0 Watchdog Timer Enable bit – povolení časovače WDT 11 = časovač WDT povolen, symbol _WDTE_ON 10 = časovač WDT povolen a zakázán ve Sleep, symbol _WDTE_NSLEEP 01 = časovač WDT nastaven bitem SWDTEN v registru WDTCON, symbol _WDTE_SWDTEN 00 = časovač WDT zakázán, symbol _WDTE_OFF V ladícím režimu na MPLAB IDE musí být WDT zakázán FOSC2 : FOSC0 Oscillator Selection bits – výběr oscilátoru 111 = ECH External Clock High, vstup na pinu RA7, symbol _FOSC_ECH 110 = ECM External Clock Medium, vstup na pinu RA7, symbol _FOSC_ECM 101 = ECL External Clock Low, vstup na pinu RA7, symbol _FOSC_ECL 100 = INTOSC oscilátor, pin RA7 jako vstup / výstup, symbol _FOSC_INTOSC 011 = vnější oscilátor, vstup na pinu RA7, pin RA6 jako vstup / výstup, symbol _FOSC_EXTRC 010 = HS krystalový oscilátor, krystal na pinech RA7 a RA6 , symbol _FOSC_HS 001 = XT oscilátor, krystal nebo keramický rezonátor na pinech RA7 a RA6, symbol _FOSC_XT 000 = LP oscilátor 32 kHz, krystal na pinech RA7 a RA6, symbol _FOSC_LP Pokud není registr _CONFIG1 naprogramován, je hodnota všech jeho bitů rovna 1. V ladicím režimu požaduje integrované prostředí MPLAB nulování bitů WDTE a tento požadavek musí být potvrzen.
30
15 -1 7 -1
14 -1
_CONFIG2 Config 1 Register High Byte 13 12 11 10 9 LVP /DEBUG -BORV STVREN 1 1 1 1 1
6 -1
_CONFIG2 Config 1 Register Low Byte 5 4 3 2 VCAPEN VCAPEN --1 1 1 1
adresa 8 PLLEN 1
8008 h Flash adresa
1 WRT1 1
0 WRT0 1
8008 h Flash
LVP Low Voltrage Programming Enable bit – programování malým napětím 1 = programování LVP povoleno, symbol _LVP_ON 0 = programování napětím Vpp na pinu RE3/Vpp, symbol _LVP_OFF /DEBUG In-Circut Debugger Mode bit – povolení ladicího režimu 1 = ladicí režim zakázán, piny RB6 a RB7 mohou být použity jako I/O piny 0 = ladicí režim povolen, piny RB6/ICSPCLK a RB7/ICSPDAT používá debugger Připojení debuggeru nebo programátoru automaticky nastavuje ladicí režim. BORV Brown-Out Reset Voltage Selection bit – napětí pro aktivaci BOR 1 = napětí pro aktivaci Bor je 1.9V, symbol _BORV_19 nebo _BORV_LO 0 = napětí pro aktivaci Bor je 2.5V, symbol _BORV_25 nebo _BORV_HI STVREN Stack Overflow/Underflow Reset Enable bit – reset při přeplnění zásobníku 1 = přeplnění nebo vyprázdnění zásobníku způsobí RESET, symbol _STVREN_ON 0 = přeplnění nebo vyprázdnění zásobníku nezpůsobí RESET, symbol _STVREN_OFF PLLEN PLL Enable bit – fázový závěs pro násobení kmitočtu oscilátoru 1 = fázový závěs povolen, symbol _PLLEN_ON 0 = fázový závěs zakázán, symbol _PLLEN_OFF VCAPEN1 : VCAPEN0 Voltage Regulator Capacitor – vnější kondenzátor regulátoru napětí 11 = žádný vnější kondenzátor, symbol _VCAPEN_OFF 10 = vnější kondenzátor na pinu RA6, symbol _VCAPEN_RA6 01 = vnější kondenzátor na pinu RA5, symbol _VCAPEN_RA5 00 = vnější kondenzátor na pinu RA0, symbol _VCAPEN_RA0 WRT1 : WRT0 Flash Memory Self-Write Protection – zákaz přepisu paměti Flash programem 11 = přepis paměti povolen, symbol _WRT_OFF 10 = 000h až 1FFh chráněno, symbol _WRT_BOOT 01 = 000h až FFFh chráněno, symbol _WRT_HALF 00 = 000h až 1FFFh chráněno, symbol _WRT_ALL Pokud není registr _CONFIG2 naprogramován, je hodnota všech jeho bitů rovna 1. V ladicím režimu integrované prostředí MPLAB a připojený debugger nebo programátor nulují bit /DEBUG.
31
6. Oscilátor Mikrořadiče PIC16F 1937 mohou jako zdroj taktovacího kmitočtu používat: 6.1. Oscilátor vnější Zdrojem taktovacího kmitočtu je vnější oscilátor. Obdélníkový signál je přiveden na pin CLKIN. Oscilátor může být konfigurován ve třech módech podle tabulky
mód ECL ECM ECH
kmitočet 0 – 0.5MHz 0.5 MHz – 4MHz 4 MHz – 32 MHz
6.2. Oscilátor na čipu s vnějšími součástkami Zdrojem taktovacího kmitočtu je oscilátor, jehož podstatná část je implementována na čipu mikrořadiče. Kmitočet oscilátoru je určen vnějšími součástkami. 6.2.1. Oscilátor řízený krystalem nebo keramickým rezonátorem Oscilátor na čipu může být konfigurován ve třech módech podle tabulky
mód
kmitočet krystal keram.rezonátor 32.768 kHz -100 kHz – 4MHz 1 MHz – 20 MHz
LP XT HS
Krystal nebo keramický rezonátor mají být specifikovány pro sériovou rezonanci, sériový odpor krystalu má být co nejmenší. Hodnota kondenzátorů je stanovena v technických podmínkách použitého krystalu. Zvětšování kapacity zlepšuje stabilitu oscilátoru a zabraňuje kmitání na vyšších harmonických základního kmitočtu. Snižování kapacity zlepšuje náběh oscilací při zapnutí napájecího napětí. 6.2.2. Oscilátor řízený RC článkem, mód RC
Vnější odpor má mít hodnotu mezi 3 k a 100 k, doporučená hodnota kondenzátoru je 20 pF. Pin OSC2 může být nakonfigurován jako výstup taktovacího kmitočtu pro synchronizaci dalších obvodů. 32
6.3. Oscilátory vnitřní. Čip mikrořadiče PIC16F1937 obsahuje dva úplné RC oscilátory a obvod fázového závěsu. Oscilátor HFINTOSC má základní kmitočet 16 MHz, který může být dále dělen až na 125 kHz. Oscilátor je kalibrován až na přesnost ± 2% a může být dále doladěn v registru OSCTUNE Oscilátor MFINTOSC má základní kmitočet 500 kHz, který může být dále dělen až na 32 kHz. Oscilátor je kalibrován až na přesnost ± 2% a může být dále doladěn v registru OSCTUNE Oscilátor LFINTOSC má základní kmitočet 31 kHz, není kalibrován a jeho kmitočet se může vlivem výrobních tolerancí, teploty a napájecího napětí pohybovat od 15 kHz do 45 kHz. Piny OSC1 a OSC2 jsou uvolněny pro využití jako I/O piny RA6 a RA7 Portu A. 6.4. Volba zdroje taktovacího kmitočtu, registr OSCCON Zdroj taktovacího kmitočtu určují bity SCS1 : SCS0 (Systém Clock Select) v registru OSCCON a bity FOSC <2 : 0 > v registru _CONFIG1 R/W SPLLEN 0
R/W IRCF3 0
OSCCON R/W IRCF2 1
Systém Clock Select Register R/W R/W U IRCF1 IRCF0 -1 1 0
adresa R/W SCS1 0
R/W SCS0 0
SPLLEN Software PLL Enable bit Když bit PLLEN=0 v registru _CONFIG1 tak: 1 = fázový závěs pro násobení 4x je povolen 0 = fázový závěs pro násobení 4x je zakázán Když bit PLLEN =1 v registru _CONFIG1 tak je fázový závěs vždy povolen IRCF3 : IRCF2 : IRCF1 : IRCF0 Internal Oscillator Frequency Select Bits 1111 =16 MHz HF 1110 = 8 MHz HF nebo 32 MHz HF s připojeným PLL (fázový závěs) 1101 = 4 MHz HF 1100 = 2 MHz HF 1011 = 1 MHz HF 1010 = 500 kHz HF 1001 = 250 kHz HF 1000 = 125 kHz HF 0111 = 500 kHz MF (po Reset) 0110 = 250 kHz MF 0101 = 125 kHz MF 0100 = 62.5 kHz MF 0011 = 31.25 kHz HF 0010 = 31.25 kHz MF 000x = 31 kHz LF SCS1 : SCS0 Systém Clock Select Bit 1x = vnitřní oscilátor 01 = 32.768 kHz oscilátor čítače TMR1 00 = oscilátor podle hodnoty konfiguračních bitů FOSC < 2 : 0 > registru _CONFIG1
33
99 h Bank 1
FOSC < 2 : 0 > Oscillator Selection bits – výběr oscilátoru, registr _CONFIG1 (paměť Flash) 111 = ECH External Clock High, vstup na pinu RA7, symbol _FOSC_ECH 110 = ECM External Clock Medium, vstup na pinu RA7, symbol _FOSC_ECM 101 = ECL External Clock Low, vstup na pinu RA7, symbol _FOSC_ECL 100 = INTOSC oscilátor, pin RA7 jako vstup / výstup, symbol _FOSC_INTOSC 011 = vnější oscilátor, vstup na pinu RA7, pin RA6 jako vstup / výstup, symbol _FOSC_EXTRC 010 = HS krystalový oscilátor, krystal na pinech RA7 a RA6 , symbol _FOSC_HS 001 = XT oscilátor, krystal nebo keramický rezonátor na pinech RA7 a RA6, symbol _FOSC_XT 000 = LP oscilátor 32 kHz, krystal na pinech RA7 a RA6, symbol _FOSC_LP
U T1OSCR 1
R/W PLRR 0
OSCSTAT Oscillator Status Register R/W R/W R R OSTS HFIOFR HFIOFL MFIOFR q 0 0 q
adresa R LFIOFR 0
R/W HFIOFS 0
9A h Bank 1
T1OSCR Timer1 Oscillator Ready Bit Když bit T1OSCEN=1 v registru T1CON tak: 0 = oscilátor čítače TMR1 32.768 kHz je zakázán 1 = oscilátor čítače TMR1 32.768 kHz je povolen Když bit T1OSCEN=0 v registru T1CON tak oscilátor čítače TMR1 32.768 kHz je zakázán PLLR 4xPLL Ready bit 0 = 4xPLL není funkční 1 = 4xPLL je funkční OSTS Oscillator Status Bit 0 = vnitřní oscilátor (HFINTOSC nebo LFINTOSC) je zdrojem takt. kmitočtu 1 = oscilátor podle hodnoty konfiguračních bitů FOSC < 2 : 0 > registru _CONFIG1 HFIOFR High FRequency Internal Oscillator Ready Bit 0 = HFINTOSC není funkční 1 = HFINTOSC je funkční HFIOFL High Frequency Internal Oscillator Locked Bit 0 = HFINTOSC má horší přesnost než 2% 1 = HFINTOSC má přesnost nejméně 2% MFIOFR Medium Frequency Internal Oscillator Ready Bit 0 = MFINTOSC není funkční 1 = HFINTOSC je funkční LFIOFR Low Frequency Internal Oscillator Ready Bit 0 = LFINTOSC není funkční 1 = LFINTOSC je funkční HFIOFS High Frequency Internal Oscillator Stable Bit 0 = HFINTOSC má horší přesnost než 0.5% 1 = HFINTOSC má přesnost nejméně 0.5%
34
6.5. Taktování mikrořadiče při výpadku vnějšího oscilátoru, registr _CONFIG1 Mikrořadiče PIC16F1937 obsahují detekční obvod, který trvale sleduje vstup taktovacích impulzů z vnějšího oscilátoru. Přepnutí vnějšího oscilátoru na vnitřní RC oscilátor povoluje bit FCMEN v registru _CONFIG1 Jestliže dojde k výpadku taktovacích impulzů na dobu cca 2ms, je jako zdroj taktovacího kmitočtu připojen vnitřní RC oscilátor. Kmitočet vnitřního RC oscilátoru je standardně 4MHz. FCMEN Fail Clock Monitor Enabled Bit, registr _CONFIG1 (paměť Flash) 0 = záložní RC oscilátor zakázán 1 = záložní RC oscilátor povolen Pokud není registr _CONFIG1 naprogramován, je hodnota všech jeho bitů rovna 1, přepnutí na vnitřní RC oscilátor je povoleno. Registry, jejichž obsah má vliv na funkci oscilátorů. Bity v šedých polích oscilátor nevyužívá.
35
7. AD převodník Mikrořadiče PIC16F1937 obsahují 10 bitový, 14 kanálový, komparační (SAR = Successive Approximation Register) analogově / číslicový převodník 7.1. Princip SAR AD převodníku Vstupní analogové napětí Uin je porovnáváno na analogovém komparátoru s analogovým napětím Uda, které je výsledkem DA převodu digitálního slova, uloženého v registru SAR. Je-li vstupní napětí menší, je obsah registru SAR zmenšen. Je-li vstupní napětí větší, je obsah registru SAR zvětšen. AD převod je ukončen, když obě napětí na vstupu komparátoru jsou shodná. Výsledek převodu je uložen v registru SAR. Uin – vstupní analogové napětí Uref – referenční napětí Uda – výstupní analogové napětí AD převodníku CLK – taktovací kmitočet S&H – vzorkovací obvod (Sample and Hold) 7.2. Blokové schéma AD převodníku
36
7.3. Konfigurace AD převodníku Před použitím musí být AD převodník zkonfigurován: - konfigurací vstupního Portu - výběrem vstupního kanálu - volbou referenčního napětí - nastavením vzorkovacího kmitočtu - nastavením přerušení - formátováním výsledku 7.3.1. Konfigurace vstupních Portů Pro vstup analogových napětí jsou určeny porty RA, RB a RE, analogové vstupy musí být konfigurovány v registrech TRISx a ANSELx. Na Portu A může být využito až 5 pinů jako vstupy AD převodníku. TRISA Tri-State A Register adresa R/W R/W R/W R/W R/W R/W R/W R/W 8C h TRISA7 TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0 Bank 1 1 1 1 1 1 1 1 1 ANSELA PortA Analog Select Register adresa --R/W R/W R/W R/W R/W R/W 18C h --ANSA5 ANSA4 ANSA3 ANSA2 ANSA1 ANSA0 Bank 3 --1 1 1 1 1 1 --- v registru AN4 AN3/Vref+ AN2/Vref-pin portu AN1 A nastaven AN0 jako ADC Nastavením bitu TRISA na -hodnotu 1 je odpovídající vstup. Na Portu B může být využito až 6 pinů jako vstupy AD převodníku. TRISB Tri-State B Register R/W R/W R/W R/W R/W R/W R/W TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 1 1 1 1 1 1 1 ANSELB PortB Analog Select Register --R/W R/W R/W R/W R/W --ANSB5 ANSB4 ANSB3 ANSB2 ANSB1 --1 1 1 1 1 --AN13 AN11 AN9 AN8 AN10 Na Portu E mohou být využity až 3 piny jako vstupy AD převodníku. TRISE Tri-State E Register -----R/W R/W TRISE2 TRISE1 ----------1 1 ANSELE PortE Analog Select Register -----R/W R/W -----ANSE2 ANSE1 -----1 1 -----AN7 AN6
adresa R/W TRISB0 1
adresa R/W ANSB0 1 AN12
18D h Bank 3 ADC
adresa R/W TRISE0 1
90 h Bank 1 adresa
R/W ANSEB0 1 AN5
Po signálu Reset jsou všechny označené piny nastaveny jako analogové vstupy.
37
8D h Bank 1
190 h Bank 3 ADC
7.3.2. Výběr vstupního kanálu Kanál, ze kterého je analogové napětí přivedeno na vstup AD převodníku, je volen bity CHS4 : CHS0 v registru ADCON0. --0
R/W CHS4 0
ADCON0 A/D Control Register 0 R/W R/W R/W R/W CHS3 CHS2 CHS1 CHS0 - 24 0 0 0 0
adresa R/W GO_DONE
0
R/W ADON 0
9D h Bank 1
CHS < 4 : 0 > Analog Channel Select – kanál A/D převodníku 0xxxx = binary numbered analog channel – binární číslo kanálu (00000=AN0, 01101=AN13) 7.3.3. Volba referenčního napětí Při AD převodu musí být připojen zdroj referenčního napětí. Tím může být buď napájecí napětí mikrořadiče (Vdd a Vss), vnitřní reference (modul FVR= Fixed Voltage Reference) nebo vnější referenční napětí, přivedené na piny AN2 a AN3. Volba se provádí nastavením bitů ADNREF a ADPREF v registru ADCON1. R/W ADFM 0
R/W ADCS2 0
ADCON1 A/D Control Register 1 R/W R/W -R/W R/W R/W ADCS1 ADCS0 -ADNREF ADPREF1 ADPREF0 0 0 0 0 0 0
adresa 9E h Bank 1
ADNREF A/D Negative Voltage Reference 0 = Vref- je připojen na Vss 1 = Vref- je připojen na vnější pin (AN2) ADPREF1 : ADPREF2 A/D Positive Voltage Reference 00 = Vref+ je připojen na Vdd 01 = reserved 10 = Vref+ je připojen na vnější pin (AN3) 11 = Vref+ je připojen na vnitřní referenci (modul FVR 2.048V nebo 4.096V) 7.3.4. Nastavení vzorkovacího kmitočtu AD převodníku Vzorkovací kmitočet převodníku může být max 1 MHz. Oscilátor mikrořadiče, musí být dělen nastavením bitů ADCS2 : ADCS0 v registru ADCON1. R/W ADFM 0
R/W ADCS2 0
ADCON1 A/D Control Register 1 R/W R/W -R/W R/W R/W ADCS1 ADCS0 -ADNREF ADPREF1 ADPREF0 0 0 0 0 0 0
ADCS2 : ADCS0 A/D Conversion Clock – vzorkovací kmitočet A/D převodu 000 = Fosc / 2 001 = Fosc / 8 010 = Fosc / 32 x11 = FRC (internal RC oscillator, max 500kHz) 100 = Fosc / 4 101 = Fosc / 16 110 = Fosc / 64
38
adresa 9E h Bank 1
7.3.5. Formátování výsledku AD převodu Výsledek AD převodu je ukládán do registrů ADRESH (vyšší bity) a ADRESL (nižší bity). Formát výsledku (zarovnání vlevo / vpravo) se nastavuje bitem ADFM v registru ADCON1 R/W ADFM 0
R/W ADCS2 0
ADCON1 A/D Control Register 1 R/W R/W -R/W R/W R/W ADCS1 ADCS0 -ADNREF ADPREF1 ADPREF0 0 0 0 0 0 0
adresa 9E h Bank 1
ADFM A/D Conversion Result Format – formát výsledku A/D převodu 0 = Left Justified – výsledek zarovnán vlevo 1 = Right Justified - výsledek zarovnán vpravo (bit LSB v bitu 0 registru ADRESL) R/W MSB x R/W x
R/W
ADRESH R/W
x
x
R/W LSB x
ADRESL U -x
A/D Result Register High byte R/W R/W R/W x
x
x
A/D Result Register Low byte U U U ---x x x
adresa R/W
R/W
x
x
9C h Bank 1 adresa
U -x
U -x
9B h Bank 1
7.4. Povolení AD převodníku Obvod AD převodníku je po signálu Reset odpojen od napájecího napětí. Tím je snížen příkon mikrořadiče. Před použitím musí být AD převodník povolen nastavením bitu ADON v registru ADCON0. ADCON0 A/D Control Register 0 adresa -R/W R/W R/W R/W R/W R/W R/W 9D h GO_DONE -CHS4 CHS3 CHS2 CHS1 CHS0 ADON Bank 1 0 0 0 0 0 0 0 0 ADON ADC Enable 1 = ADC Enabled – AD převodník povolen 0 = ADC Disabled – AD převodník zakázán 7.5. Spuštění AD převodu Vstupní analogové napětí je přiváděno na vzorkovací obvod (Sample & Hold), ve kterém je nabíjen kondenzátor s kapacitou 10pF. Před spuštěním každého AD převodu musí být tento kondenzátor nabit na plné napětí. Čas potřebný pro nabití kondenzátoru je ovlivněn zejména hodnotou vstupního rezistoru (max10k), požadovanou přesností převodu (standardně ½ LSB), velikostí napájecího napětí (standardně 5 V) a teplotou mikrořadiče (standardně 50°C). Pro uvedené hodnoty je čas pro nabití kondenzátoru cca 4.4s. Tento čas se nejsnáze vytvoří opakováním instrukcí nop, při taktovacím kmitočtu 4MHz je doba vykonání jedné instrukce rovna 1s, postačuje tedy 5 instrukcí nop. Vlastní AD převod je spuštěn nastavením bitu GO_DONE v registru ADCON0 na hodnotu 1 ADCON0 A/D Control Register 0 adresa -R/W R/W R/W R/W R/W R/W R/W 9D h GO_DONE -CHS4 CHS3 CHS2 CHS1 CHS0 ADON Bank 1 0 0 0 0 0 0 0 0 Bit GO_DONE nemá být nastavován v jedné instrukci spolu s bitem ADON. 39
7.6. Ukončení AD převodu O ukončení převodu informuje AD převodník požadavkem na přerušení (když je povoleno) nastavením bitu ADIF v registru PIR1 a nulováním bitu GO_DONE v registru ADCON0. Výsledek převodu je uložen do registrů ADRESH a ADRESL. Není-li využíváno přerušení, je nutné ukončení AD převodu zjistit testováním bitu GO_DONE bsf ADCON0, GO_DONE ; start AD převodu btfsc ADCON0, GO_DONE ; převod ukončen? goto $-1 ; ne, opakuj test Před startem nového převodu je nutné uklidit výsledek převodu kopií registrů ADRESH a ADRESL do některého GPR registru. Dalším převodem je výsledek přepsán. Registry, jejichž obsah má vliv na funkci AD převodníku. Bity v šedých polích ADC nevyužívá.
40
8. Čítače a časovače Mikrořadiče PIC16F1937 obsahují pět modulů čítačů / časovačů: - modul TIMER0, osmibitový čítač s osmibitovým předděličem - modul TIMER1, šestnáctibitový čítač s tříbitovým předděličem - moduly TIMER2, TIMER 4, TIMER 6, osmibitové čítače se čtyřbitovými předděliči 8.1. Čítač / časovač TIMER0 Modul TIMER0 obsahuje osmibitový čítač vpřed tvořený registrem TMR0. Nastavením bitu TMR0CS v registru OPTION_REG může být čítač inkrementován buď taktovacím signálem mikrořadiče při vykonání každé instrukce nebo vnějším signálem, přivedeným na pin T0CKI (RA4). Vnější signál může čítač inkrementovat buď nástupnou nebo sestupnou hranou podle hodnoty bitu TMR0SE v registru OPTION_REG. Před čítač může být bitem PSA připojen osmibitový předdělič, jehož dělicí poměr může být nastaven na hodnoty 1 : 2 až 1 : 256 třemi bity PS2 : PS0 v registru OPTION_REG. Při změně obsahu čítače (registru TMR0) z hodnoty FFH na 00H je nastaven bit TMR0IF v registru INTCON. Přeplnění registru TMR0 může být počítáno čítačem TIMER1.
OPTION_REG Option Register R/W R/W R/W R/W R/W NOT_WPUEN INTEDG TMR0CS TMR0SE PSA PS2 1 1 1 1 1 1 R/W
adresa R/W PS1 1
R/W PS0 1
95 h Bank 1
PS2: PS0 Prescaler Rate Select bits – dělící poměr předděliče 000 = 1 : 2 001 = 1 : 4 010 = 1 : 8 011 = 1 : 16 100 = 1 : 32 101 = 1 : 64 110 = 1 : 128 111 = 1 : 256 PSA 0= 1=
Prescaler Assigment bit – vřazení předděliče předdělič je připojen předdělič není připojen, dělicí poměr je 1 : 1
TMR0SE TIMER0 Source Edge select bit – volba hrany vstupního signálu 0= čítač je inkrementován nástupnou hranou signálu T0CKI na pinu PA4 1= čítač je inkrementován sestupnou hranou signálu T0CKI na pinu PA4 TMR0CS TIMER0 Clock Source select bit – volba vstupního signálu 0= čítač je inkrementován taktovacím signálem mikrořadiče při vykonání každé instrukce 1= čítač je inkrementován signálem T0CKI na pinu PA4 41
R/W bit 7 x
R/W bit 6 x
TMR0 Timer0 Register R/W R/W R/W R/W bit 5 bit 4 bit 3 bit 2 x x x x
adresa R/W bit 1 x
R/W bit 0 x
15 h Bank 0
Registr TMR0 může být čten kdykoliv, čítač po čtení pokračuje v inkrementaci. Do registru TMR0 může být zapsáno kdykoliv, inkrementace čítače je zakázána po dva instrukční cykly následující po zápisu.
R/W GIE 0
R/W PEIE 0
INTCON Interrupt Control Register R/W R/W R/W R/W TMR0IE INTE IOCIE TMR0IF 0 0 0 0
adresa R/W INTF 0
R/W IOCIF x
0B h
Při přeplnění registru TMR0 (při změně hodnoty FFH na hodnotu 00H) je vždy nastaven bit TMR0IF (TIMER0 Interrupt Flag) v registru INTCON. Je-li přerušení povoleno nastavením bitu TMR0IE (TIMER0 Interrupt Enable) program pokračuje obslužnou rutinou přerušení. Když přerušení využíváno není, musí program bit TMR0IF testovat. Bit TMR0IF musí být nulován programem, aby mohlo být rozeznáno další přeplnění čítače. Předdělič není možné číst ani do něho zapisovat. Jestliže PSA = 0, předdělič je vložen před čítač a při každém zápisu do registru TMR0 je předdělič vynulován. Registry, jejichž obsah má vliv na funkci čítače TIMER0. Bity v šedých polích čítač nevyužívá.
42
8.2. Čítač / časovač TIMER1 Modul TIMER1 obsahuje šestnáctibitový čítač vpřed tvořený registry TMR1H : TMR1L. Nastavením bitů TMR1CS1:TMR1CS0 v registru T1CON může být čítač inkrementován buď taktovacím signálem mikrořadiče, vnějším signálem, přivedeným na pin T1CKI nebo signálem z modulu CPS (Capacitive Sensing). Před čítač je připojen tříbitový předdělič, jehož dělicí poměr může být nastaven na hodnoty 1 : 1 až 1 : 8 bity T1CKPS1 : T1CKPS0 v registru T1CON. Při změně obsahu čítače z hodnoty FFFFH na 0000H je nastaven bit TMR1IF v registru PIR1. Signál před vstupem do registrů čítače TMR1 může být hradlován signály z přeplnění čítače TMR0, z výstupů obou analogových komparátorů nebo vnějším signálem na pinu T1G. Hradlovací signál je vybírán nastavením bitů T1GSS1:T1GSS0 v registru T1GCON. Funkce hradlování čítače TMR1 není v této kapitole popisována.
T1CON Timer1 Control Register R/W R/W R/W R/W R/W R/W TMR1CS1 TMR1CS0 T1CKPS1 T1CKPS0 T1OSCEN T1SYNC 0 0 0 0 0 0
adresa R/W -0
R/W TMR1ON 0
18 h Bank 0
TMR1ON Timer1 On bit – povolení čítače a hradlování 0= čítač je zastaven 1= čítač je povolen a spuštěn TMR1CS1 : TMR1CS0 Timer1 Clock Source bits – volba vstupního signálu 00 = čítač je inkrementován taktovacím signálem mikrořadiče při vykonání každé instrukce 01 = čítač je inkrementován taktovacím signálem 10 = čítač je inkrementován signálem T1CKI nebo z vnitřního oscilátoru 32.768kHz 11 = čítač je inkrementován signálem z modulu CPS (Capacitive Sensing Oscillator) T1CKPS1: T1CKPS0 00 = 1 : 1 01 = 1 : 2 10 = 1 : 4 11 = 1 : 8
Timer1 Clock Prescaler Rate Select bits – dělící poměr předděliče
T1OSCEN Timer1 Oscillator Enable bit – povolení oscilátoru 0= oscilátor odpojen 1= oscilátor povolen Povolení oscilátoru je podmíněno nastavením konfiguračních bitů FOSC2 : FOSC0 v registru _CONFIG1 na hodnotu 100B 43
R/W bit 7 x R/W bit 7 x
R/W bit 6 x
TMR1H R/W bit 5 x
Timer1 High Byte Register R/W R/W R/W bit 4 bit 3 bit 2 x x x
R/W bit 6 x
TMR1L R/W bit 5 x
Timer1 Low Byte Register R/W R/W R/W bit 4 bit 3 bit 2 x x x
adresa R/W bit 1 x
R/W bit 0 x
0F H bank 0 adresa
R/W bit 1 x
R/W bit 0 x
0E H bank 0
Registry TMR1x mohou být čteny kdykoliv, čítač po čtení pokračuje v inkrementaci. Před zápisem do registrů TMR1x se doporučuje čítač zastavit. Předdělič není možné číst ani do něho zapisovat. Při každém zápisu do registrů TMR1x je předdělič vynulován. Při přeplnění registrů TMR1x (při změně hodnoty FFFFH na hodnotu 0000H) je nastaven bit TMR1IF (Timer1 Interrupt Flag) v registru PIR1. Je-li přerušení povoleno nastavením bitu TMR1IE (Timer1 Interrupt Enable) v registru PIE1, program pokračuje obslužnou rutinou přerušení. Když přerušení využíváno není, musí program bit TMR1IF testovat. Bit TMR1IF musí být nulován programem, aby mohlo být rozeznáno další přeplnění čítače.
Registry, jejichž obsah má vliv na funkci čítače TMR1. Bity v šedých polích čítač nevyužívá.
44
8.3. Čítač / časovač TIMER2 Mikrořadič PIC16F1937 obsahuje tři identické moduly TIMER2, TIMER4, TIMER6. Popsán je modul TIMER2, další dva moduly se chovají analogicky. Modul TIMER2 obsahuje osmibitový čítač tvořený registrem TMR2 a registrem předvolby PR2. Čítač je inkrementován taktovacím signálem mikrořadiče při vykonání každé instrukce. Před čítač je připojen čtyřbitový předdělič, jehož dělicí poměr může být nastaven na hodnoty 1 : 1 až 1 : 16 dvěma bity T2CKPS1 : T2CKPS0 v registru T2CON. Obsah čítače (registru TMR2) je porovnáván s předvolbou (registr PR2), při shodě je čítač TMR2 nulován a je generován signál, který po průchodu děličem nastavuje bit TMR2IF v registru PIR1. Dělicí poměr může být nastaven na hodnoty 1 : 1 až 1 : 16 čtyřmi bity TOUTPS3 : TOUTPS0 v registru T2CON.
----
T2CON Timer2 Control Register R/W R/W R/W R/W R/W R/W R/W TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 0 0 0 0 0 0 0
TOUTPS3: TOUTPS0 0000 = 1 : 1 0001 = 1 : 2 0010 = 1 : 3 : 1101 = 1 : 14 1110 = 1 : 15 1111 = 1 : 16
adresa 1C h Bank 0
Timer2 Output Postscaler Rate Select bits – dělící poměr děliče
TMR2ON Timer2 On bit – povolení čítače 0= čítač je zastaven 1= čítač je povolen a spuštěn T2CKPS1: T2CKPS0 00 = 1 : 1 01 = 1 : 4 10 = 1 : 16 11 = 1 : 64
Timer2 Clock Prescaler Rate Select bits – dělící poměr předděliče
45
R/W bit 7 0
R/W bit 6 0
R/W bit 5 0
TMR2 Timer2 Register R/W R/W R/W bit 4 bit 3 bit 2 0 0 0
adresa R/W bit 1 0
R/W bit 0 0
1A h Bank 0
PR2 Timer2 Period Register adresa R/W R/W R/W R/W R/W R/W R/W R/W 1B h bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 Bank 0 Registry 1 TMR2 1i PR2 mohou 1 být čteny 1 kdykoliv,1čítač po čtení 1 pokračuje 1 v inkrementaci. 1 Předdělič ani dělič není možné číst ani do nich zapisovat. Při každém zápisu do registrů TMR2 a T2CON jsou oba děliče vynulovány. Registry, jejichž obsah má vliv na funkci čítače TMR2. Bity v šedých polích čítač nevyužívá.
46
9. Modul CCP Mikrořadiče PIC16F obsahují tři vylepšené moduly ECCP1, ECCP2, ECCP3 a dva standardní moduly CCP4 a CCP5. Modul CCP (Capture / Compare / PWM) může kontrolovat události při dosažení uplynulého času nebo dosažením nastavené hodnoty. V módu PWM může být generován signál různého kmitočtu a různé střídy (duty cycle). V režimech vzorkování (Capture) a porovnání (Compare) je funkce všech pěti modulů shodná. V režimu PWM (Pulse Width Modulation) se funkce mírně liší. Funkce modulů CCP přesahuje rámec tohoto textu. Popis modulů je výrazně zjednodušen. Mód modulů CCPx (x=1 až 5) určuje obsah registrů CCPxCON R/W PxM1 0
R/W PxM0 0
CCPxCON CCPx Control Register R/W R/W R/W R/W R/W R/W DCxB1 DCxB0 CCPxM3 CCPxM2 CCPxM1 CCPxM0 0 0 0 0 0 0
adresa
CCPxM3: CCPxM0 CCP Mode Select bits – mód modulu CCP 0000 = modul CCP vypnut 0001 = rezerva 0010 = režim porovnání 0011 = rezerva 01xx = režimy vzorkování obsahu čítače TMR1 (Capture mode) 10xx = režimy porovnání s obsahem čítače TMR1 (Compare mode) 11xx = PWM režim 9.1. Režim vzorkování V režimu vzorkování je obsah šestnáctibitového čítače TMR1 přepsán do dvojice registrů CCPRxH : CCPRxL každou událostí na pinu CCPx. Událost je definována bity CCPxM3:CCPxM0 v registru CCPxCON. CCPxM3: CCPxM0 CCP Mode Select bits – režim modulu CCP 0100 = vzorek na každou sestupnou hranu 0101 = vzorek na každou nástupnou hranu 0110 = vzorek na každou čtvrtou nástupnou hranu 0111 = vzorek na každou šestnáctou nástupnou hranu 9.2. Režim porovnání V režimu porovnání je obsah šestnáctibitového čítače TMR1 porovnáván s obsahem dvojice registrů CCPRxH : CCPRxL. Při shodě je vyvolána akce nastavená bity CCPxM3:CCPxM0 v registru CCPxCON CCPxM3: CCPxM0 CCP Mode Select bits – režim modulu CCP 1000 = výstup CCPx je nastaven na hodnotu 1, je nastaven bit CCPxIF 1001 = výstup CCPx je nulován na hodnotu 0, je nastaven bit CCPxIF 1010 = nastaven bit CCPxIF, požadavek na přerušení 1011 = nulován TMR1, nastaven bit CCPxIF, spuštěn A/D převodník když je povolen
47
9.3. Režim PWM Ve standardním režimu PWM jsou generovány dva šířkově modulované signály na pinech CCPx. Oba piny musí být konfigurovány jako výstup.
Kmitočet (perioda) signálu je nastavena v registru PR2, střídu signálu PWM určují registry CCPR1L a CCPR2L. Rozlišení PWM signálu je standardně osmibitové, pro 10-ti bitové rozlišení je čítač TMR2 rozšířen o dva bity předděliče a registry CCPRxL o dva bity CCPxCON<5:4>
Period = (PR2 + 1) * 4 * Tosc * TMR2 Prescaler Rate Když obsah čítače TMR2 je roven obsahu registru PR2 tak : - čítač TMR2 je nulován - úroveň pinu CCPx je nastavena =1 - obsah registru CCPRxL je přepsán do registru CCPRxH Pulse Width = CCPRxL : CCPxCON <5>4> * Tosc * TMR2 Prescaler Rate Když obsah čítače TMR2 je roven CCPRxL : CCPxCON <5>4> tak - úroveň pinu CCPx je nulována =0 Jestliže šířka impulsu (Pulse Width) je větší než perioda tak se úroveň pinu CCPx nemění.
48
Postup nastavení modulu CCP ve standardním režimu PWM - nastavení periody PWM obsahem registru PRx - konfigurace modulu CCP na režim PWM nastavením registru CCPxCON - nastavení střídy signálu PWM obsahem registru CCPRxL a bity DCxBx v registrech CCPxCON - výběr čítače TMR2/4/6 pro modul CCP nastavením bitů CxTSEL<1:0> v registru CCPTMRSx - nulování bitu TMRxIF v registru PIRx - nastavení dělicího poměru TMRx bity TxCKPS1 a TxCKPS0 v registru TxCON - konfigurace pinů CCPx jako výstupy nulováním bitů TRISx Registry, jejichž obsah má vliv na funkci modulu CCP v režimech vzorkování a porovnání. Bity v šedých polích CCP nevyužívá.
Registry, jejichž obsah má vliv na funkci modulu CCP v režimu standardního PWM. Bity v šedých polích CCP nevyužívá.
49
10. Přerušovací systém PIC16F917 10.1. Zdroje přerušení Chod programu může být přerušen logickým signálem z některého ze zdrojů přerušení: a. Vnější signál přivedený na pin RB0 b. Přeplnění čítače Timer0 c. Změna úrovně signálu na některém pinu Portu B d. Periferní obvody (AD převodník, komparátor, sériové kanály, . . . . . ) 10.2. Obsluha přerušení Každý zdroj přerušení má přidělen jeden bit (Flag) v řídících registrech INTCON, PIR1, PIR2, nebo PIR3. Požadavek na přerušení nastavuje příslušný Flag na hodnotu 1. V každém instrukčním cyklu procesor testuje hodnotu všech požadavků. Každé přerušení může být jednotlivě povoleno nebo zakázáno příslušným bitem v registrech INTCON, PIE1, PIE2 nebo PIE3 . Všechna přerušení současně (globálně) mohou být povolena nebo zakázána bitem GIE v registru INTCON. Pokud je některý z požadavků nastaven a přerušení je povoleno, pak : 1. Bit GIE v registru INTCON je nulován, všechna přerušení jsou zakázána 2. Obsah čítače programu (návratová adresa) je uložen do zásobníku. 3. Do stínových registrů v bance 31 jsou uloženy registry W, STATUS, BSR, FSR, PCLATH 4. Do čítače programu je vložena hodnota 0004h a program pokračuje obslužnou rutinou přerušení, jejíž první instrukce musí být na této adrese. Obslužná rutina musí: - Otestovat všechny požadavky na přerušení a určit zdroj přerušení - Vynulovat Flag, který přerušení způsobil a umožnit tak přijetí nového požadavku na přerušení - Skončit instrukcí retfie 5. Instrukce retfie - Vyzvedne návratovou adresu ze zásobníku a uloží ji do čítače programu - Obnoví obsah registrů W, STATUS, BSR, FSR, PCLATH - Nastaví bit GIE v registru INTCON na hodnotu 1 a povolí všechna přerušení Příklad obslužné rutiny přerušení od čítače Timer0 org ISR:
04
btfsc goto goto ServiceTimer0:
INTCON, TMR0IF ; test bitu T0IF, požadavek na přerušení od čítače Timer0 ServiceTimer0 ExitISR
:
bcf ExitISR: retfie
INTCON, TMR0IF ; nuluje požadavek na přerušení, umožňuje další požadavek
50
10.3. Vnější přerušení Signál vnějšího přerušení musí být přiveden na pin RB0, bit INTEDG v registru OPTION_REG určuje, jestli požadavek na přerušení vyvolá nástupná nebo sestupná hrana. Platný požadavek nastaví bit INTF v registru INTCON. Vnější přerušení může být zakázáno nulováním bitu INTE. R/W GIE 0 GIE 0= 1=
R/W PEIE 0
INTCON Interrupt Control Register R/W R/W R/W R/W TMR0IE INTE IOCIE TMR0IF 0 0 0 0
adresa R/W INTF 0
R IOCIF 0
R/W PS1 1
R/W PS0 1
0B h
General Interrupt Enable – povolení všech přerušení všechna přerušení zakázána všechna přerušení povolena
INTE Interrupt Enable – povolení vnějšího přerušení 0= vnější přerušení zakázáno 1= vnější přerušení povoleno INTF Interrupt Flag – příznak vnějšího přerušení 0= žádný požadavek vnějšího přerušení 1= požadavek vnějšího přerušení nastaven R/W R/W NOT_RBPU INTEDG 1 1
OPTION_REG Option Register R/W R/W R/W R/W T0CS T0SE PSA PS2 1 1 1 1
adresa 95 h Bank 1
INTEDG Interrupt Edge – hrana vnějšího přerušení 0= požadavek vnějšího přerušení na sestupnou (falling) hranu 1= požadavek vnějšího přerušení na nástupnou (rising) hranu 10.4. Přerušení od čítače Timer 0 Při přeplnění registru TMR0 (při změně hodnoty FFH na hodnotu 00H) je nastaven bit T0IF v registru INTCON. Přerušení může být zakázáno nulováním bitu T0IE. R/W GIE 0 GIE 0= 1=
R/W PEIE 0
INTCON Interrupt Control Register R/W R/W R/W R/W TMR0IE INTE IOCIE TMR0IF 0 0 0 0
adresa R/W INTF 0
General Interrupt Enable – povolení všech přerušení všechna přerušení zakázána všechna přerušení povolena
TMR0IE Timer0 Interrupt Enable – povolení přerušení od čítače Timer 0 0= přerušení Timer0 zakázáno 1= přerušení Timer0 povoleno TMR0IF Timer0 Interrupt Flag – příznak přerušení od čítače Timer 0 0= žádný požadavek přerušení od Timer 0 1= požadavek přerušení od Timer 0 nastaven
51
R IOCIF 0
0B h
10.5. Přerušení od změny logické úrovně na pinech Portu B Při změně logické úrovně na pinech Portu B je nastaven bit IOCIF v registru INTCON. Přerušení může být zakázáno nulováním bitu IOCIE. Jednotlivé piny portu B mohou být konfigurovány v registrech IOCBN a IOCBP. R/W GIE 0 GIE 0= 1=
R/W PEIE 0
INTCON Interrupt Control Register R/W R/W R/W R/W TMR0IE INTE IOCIE TMR0IF 0 0 0 0
adresa R/W INTF 0
R IOCIF 0
0B h
General Interrupt Enable – povolení všech přerušení všechna přerušení zakázána všechna přerušení povolena
IOCIE PortB Interrupt Enable – povolení přerušení od Portu B 0= přerušení PortB zakázáno 1= přerušení PortB povoleno IOCIF PortB Interrupt Flag – příznak přerušení od Portu B 0= žádný požadavek přerušení od Portu B 1= požadavek přerušení od Portu B nastaven Bit IOCIF je Read Only a je nulován, když všechny bity registru IOCBF byly vynulovány programem.
R/W IOCBN7 0
IOCBN Interrupt On-Change Port B Register R/W R/W R/W R/W R/W R/W IOCBN6 IOCBN5 IOCBN4 IOCBN3 IOCBN2 IOCBN1 0 0 0 0 0 0
R/W IOCBN0 0
R/W IOCBP7 0
IOCBP Interrupt On-Change Port B Register R/W R/W R/W R/W R/W R/W IOCBP6 IOCBP5 IOCBP4 IOCBP3 IOCBP2 IOCBP1 0 0 0 0 0 0
R/W IOCBP0 0
adresa 395 h Bank 7 adresa 394 h Bank 7
IOCBN7: IOCBN0 Interrupt On-Change Port B Negative edge – přerušení na sestupnou hranu IOCBP7: IOCBP0 Interrupt On-Change Port B Positive edge – přerušení na nástupnou hranu 0= přerušení zakázáno 1= přerušení na sestupnou (nástupnou) hranu povoleno
R/W IOCBF7 0
IOCBF Interrupt On-Change Port B Register R/W R/W R/W R/W R/W R/W IOCBF6 IOCBF5 IOCBF4 IOCBF3 IOCBF2 IOCBF1 0 0 0 0 0 0
adresa R/W IOCBF0 0
IOCBF7 : IOCBF0 Interrupt On-Change PortB – příznak přerušení od pinů Portu B 0= žádný požadavek na přerušení od změny úrovně na pinu Portu B 1= požadavek na přerušení od změny úrovně na pinu Portu B
52
396 h Bank 7
10.6. Přerušení od periférií Všechny periferie na čipu mikrořadičů PIC16F mohou žádat o přerušení nastavením příslušných bitů v registrech PIR1, PIR2 a PIR3. Každé přerušení je možno individuálně povolit nebo zakázat nastavením nebo nulováním bitů v registrech PIE1, PIE2 a PIE3. Všechna přerušení od periferií je možno povolit nebo zakázat nastavením nebo nulováním bitu PEIE v registru INTCON. R/W GIE 0 GIE 0= 1=
R/W PEIE 0
INTCON Interrupt Control Register R/W R/W R/W R/W TMR0IE INTE IOCIE TMR0IF 0 0 0 0
adresa R/W INTF 0
R IOCIF 0
0B H bank 0
General Interrupt Enable – povolení všech přerušení všechna přerušení zakázána (včetně přerušení od periferií) všechna přerušení povolena
PEIE Peripheral Interrupt Enable – povolení přerušení od periferií 0= přerušení od periferií zakázána 1= přerušení od periferií povolena
R/W TMR1GIE 0
PIE1 Peripheral Interrupt Enable 1 Register R/W R/W R/W R/W R/W R/W ADIE RCIE TXIE SSPIE CCP1IE TMR2IE 0 0 0 0 0 0
adresa R/W TMR1IE 0
91 h Bank 1
TMR1GIE TMR1 Gete Interrupt Enable ADIE A/D Converter Interrupt Enable RCIE USART Receive Interrupt Enable TXIE USART Transmit Interrupt Enable SSPIE SSP (Synchronous Seriál Port) Interrupt Enable CCP1IE CCP1 Interrupt Enable TMR2IE TMR2 to PR2 Match Interrupt Enable TMR1IE TMR1 Overflow Interrupt Enable 0= přerušení od periferie zakázáno 1= přerušení od periferie povoleno R/W OSFIE 0
R/W C2IE 0
PIE2 Peripheral Interrupt Enable 2 Register R/W R/W R/W R/W C1IE EEIE BCLIE LCDIE 0 0 -0
OSFIE Oscillator Fail Interrupt Enable C2IE Comparator C2 Interrupt Enable C1IE Comparator C1 Interrupt Enable EEIE EEPROM Write Completion Interrupt Enable BCLIE MSSP Bus Collision Interrupt Enable LCDIE LCD Module Interrupt Enable CCP2IE CCP2 Interrupt Enable 0= přerušení od periferie zakázáno 1= přerušení od periferie povoleno
53
adresa ----
R/W CCP2IE 0
92 h Bank 1
PIE3 Peripheral Interrupt Enable 3 Register R/W R/W R/W R/W -R/W CCP5IE CCP4IE CCP3IE TMR6IE -TMR4IE 0 0 0 0 -0
----
adresa ----
93 h Bank 1
CCP5IE CCP5 Interrupt Enable CCP4IE CCP4 Interrupt Enable CCP3IE CCP3 Interrupt Enable TMR6IE TMR6 to PR6 Match Interrupt Enable TMR4IE TMR4 to PR4 Match Interrupt Enable 0= přerušení od periferie zakázáno 1= přerušení od periferie povoleno PIR1 R/W TMR1GIF 0
R/W ADIF 0 PIR2
R/W OSFIF 0
R/W C2IF 0
Peripheral Interrupt Request 1 Register R R R/W R/W R/W RCIF TXIF SSPIF CCP1IF TMR2IF 0 0 0 0 0
Peripheral Interrupt Request 2 Register R/W R/W R/W R/W C1IF EEIF BCLIF LCDIF 0 0 0 0
adresa R/W TMR1IF 0
adresa ----
Peripheral Interrupt Request 3 Register R/W R/W R/W -R/W CCP4IF CCP3IF TMR6IF -TMR4IF 0 0 0 -0
R/W CCP2IF 0
0= 1=
R/W CCP5IF 0
----
žádný požadavek přerušení od periferie požadavek přerušení od periferie nastaven
Registry, jejichž obsah má vliv na funkci přerušení. Bity v šedých polích CCP nevyužívá.
54
12 h Bank 0 adresa
PIR3 ----
11 h Bank 0
13 h Bank 0
11. Časovač WDT (Watchdog Timer) Časovač WDT generuje signál Reset, jestliže program nevykoná instrukci clrwdt během nastavené periody časovače. Časovač WDT je typicky používán k vyvedení mikrořadiče z neočekávaného stavu. Časovač WDT může pracovat ve čtyřech módech, které se nastavují bity WDTE<1:0> v konfiguračním registru _CONFIG1 7 /CP 1
6 MCLRE 1
_CONFIG1 Config 1 Register Low Byte 5 4 3 2 WDTE0 /PWRTE WDTE1 FOSC2 1 1 1 1
adresa 1 FOSC1 1
0 FOSC0 1
8007 h Flash
WDTE1 : WDTE0 Watchdog Timer Enable bit – povolení časovače WDT 11 = časovač WDT povolen, symbol _WDTE_ON 10 = časovač WDT povolen a zakázán ve Sleep módu, symbol _WDTE_NSLEEP 01 = časovač WDT nastaven bitem SWDTEN v registru WDTCON, symbol _WDTE_SWDTEN 00 = časovač WDT zakázán, symbol _WDTE_OFF V ladícím režimu na MPLAB IDE musí být WDT zakázán Časovač WDT je 23 bitový dělič s vlastním vnitřním oscilátorem 31 kHz, z kterého je odvozena perioda časovače od 1ms do 256 s. Časovač je nulován kteroukoliv z událostí: - jakýkoliv Reset - instrukce clrwdt - vstupem do módu Sleep - výstupem z módu Sleep - výpadkem oscilátoru - zákazem WDT ----
----
WDTCON Watchdog Timer Control Register R/W R/W R/W R/W R/W R/W WDTPS4 WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN 0 1 0 1 1 0
WDTPS4 : WDTPS0 Watchdog Timer Period Select Bits 00000 = 1:32 (interval cca 1ms) 00001 = 1:64 (interval cca 2ms) :
01010 = 01011 =
1:32768 (interval cca 1s) 1:65536 (interval cca 2s, hodnota po stavu Reset)
:
10001 = 10010 =
1: 222 (interval cca 128s) 1: 223 (interval cca 256s)
10011 =
reserved (interval cca 1ms)
:
11111 = reserved (interval cca 1ms) Všechny hodnoty intervalu jsou v originál dokumentu. SWDTEN Software Enable/Disable WDT Bit If WDTE1:WDTE0 = 01 pak 0= WDT zakázán 1= WDT povolen
55
adresa 97 h Bank 1
12. Reset Stav Reset mikrořadiče může být vyvolán několika způsoby. Signál Reset nuluje obsah čítače programu a nastavuje obsah některých registrů na definovaný obsah. Signál Reset může být vyvolán: - připojením napájecího napětí VDD na mikrořadič, stav POR (Power On Reset) - poklesem napětí VDD pod danou mez a opětným vzestupem, stav BOR (Brown Out Reset) - aktivací pinu MCLR (Manual Clear) - přeplněním časovače WDT (Watch Dog Timer) - instrukcí reset - přetečením zásobníku - ukončením programování paměti Flash 12.1. Power On Reset (POR), Reset po připojení napájecího napětí Po připojení napájecího napětí VDD je generován signál Reset po dosažení úrovně VPOR=1,6V.. Pro spolehlivý náběh některých obvodů mikrořadiče může být zařazena prodleva 64ms po dosažení úrovně VPOR. Prodlevu generuje časovač PWRT, pokud je povolen nulováním bitu PWRTE v registru _CONFIG1 7 /CP 1
6 MCLRE 1
_CONFIG1 Config 1 Register Low Byte 5 4 3 2 /PWRTE WDTE1 WDTE0 FOSC2 1 1 1 1
adresa 1 FOSC1 1
0 FOSC0 1
8007 h Flash
/PWRTE Power-Up Timer Enable bit – zpoždění programu při zapnutí napájení 1 = zpoždění zakázáno, symbol _PWRTE_OFF 0 = zpoždění povoleno, symbol _PWRTE_ON 12.2. Brown Out Reset (BOR), Reset po poklesu napájecího napětí pod danou mez Při poklesu napájecího napětí pod úroveň VBOR je generován signál Reset Hodnota VBOR může být nastavena bitem BORV v registru _CONFIG2 15 -1
14 -1
_CONFIG2 Config 1 Register High Byte 13 12 11 10 9 LVP /DEBUG -BORV STVREN 1 1 1 1 1
adresa 8 PLLEN 1
8008 h Flash
BORV Brown-Out Reset Voltage Selection bit – napětí pro aktivaci BOR 1 = napětí pro aktivaci BOR je 1.9V, symbol _BORV_19 nebo _BORV_LO 0 = napětí pro aktivaci BOR je 2.5V, symbol _BORV_25 nebo _BORV_HI Modul BOR může být nastaven do čtyř režimů bity BOREN v registru _CONFIG1 15 -1
14 -1
_CONFIG1 Config 1 Register High Byte 13 12 11 10 9 FCMEN IESO /CLKOUTEN BOREN1 BOREN0 1 1 1 1 1
adresa 8 /CPD 1
8007 h Flash
BOREN1 : BOREN0 Brown-out Reset bit – Reset při poklesu napájecího napětí 11 = Brown-out Reset povolen, symbol _BOREN_ON 10 = Brown-out Reset povolen, zakázán v režimu Sleep, symbol _BOREN_NSLEEP 01 = Brown-out Reset nastaven bitem SBOREN v registru BORCON, symbol _BOREN_SBODEN 00 = Brown-out Reset zakázán, symbol _BOREN_OFF 56
R/W SBOREN 1
----
BORCON ----
Brown-Out Reset Control Register ----------
adresa ----
R BORRDY q
116 h Bank 2
SBOREN Software Brown-Out Reset Enable bit – Programové řízení BOR Když BOREN<1:0> = 01 1 = BOR je povolen 0 = BOR je zakázán BORRDY Brown-Out Reset Circuit Ready Status bit – příznak aktivity BOR 1 = BOR je aktivní 0 = BOR je neaktivní Při poklesu napájecího napětí VDD pod úroveň VBOR je vyvolán stav Reset, obsah registrů RAM se nemění. Při poklesu napájecího napětí VDD pod úroveň 1,5 V je obsah registrů ztracen a obnoví se na definované hodnoty dalším stavem Reset. 12.3. Reset aktivací pinu /MCLR Nastavením úrovně L na pinu /MCLR je vyvolán stav Reset. Pin /MCLR je připojen na napětí VDD přes vnitřní Pull-Up rezistor. Funkce pinu /MCLR je konfigurována bity MCLRE a LVP v registrech _CONFG1 a _CONFIG2
7 /CP 1
15 -1
6 MCLRE 1
14 -1
_CONFIG1 Config 1 Register Low Byte 5 4 3 2 /PWRTE WDTE1 WDTE0 FOSC2 1 1 1 1
adresa 1 FOSC1 1
_CONFIG2 Config 1 Register High Byte 13 12 11 10 9 LVP /DEBUG -BORV STVREN 1 1 1 1 1
0 FOSC0 1
8007 h Flash adresa
8 PLLEN 1
8008 h Flash
MCLRE MCLR pin function bit – funkce pinu RE3 / MCLR Když bit LVP=0 tak: 1 = pin RE3 je konfigurován jako vstup /MCLR (Manual Clear), symbol _MCLRE_ON 0 = pin RE3 je digitální vstup pro všeobecné použití, symbol _MCLRE_OFF Když bit LVP=1 tak je bit MCLRE ignorován Když je Reset na pinu zakázán, má pin finkci standardního vstupu. Pin je opatřen filtrem, který detekuje a ignoruje krátké impulzy. 12.4. Reset přeplněním časovače WDT Časovač WDT generuje signál Reset, jestliže program nevykoná instrukci clrwdt během nastavené periody časovače. Bity NOT_TO a NOT_PD v registru STATUS jsou nulovány.
12.5. Reset programem Instrukce reset vyvolá stav Reset. Bit RI v registru PCON je nulován. 57
12.6. Reset přetečením / podtečením zásobníku Stack Při uložení více než 16 adres do zásobníku nebo vyzvednutí více než 16 adres ze zásobníku. Reset je povolen bitem STVREN v registru _CONFIG2 _CONFIG2 Config 1 Register High Byte adresa 15 14 13 12 11 10 9 8 8008 h --LVP /DEBUG -BORV STVREN PLLEN Flash 1 1 1 1 1 1 1 1 STVREN Stack Overflow/Underflow Reset Enable bit – reset při přeplnění zásobníku 1 = přeplnění nebo vyprázdnění zásobníku způsobí RESET, symbol _STVREN_ON 0 = přeplnění nebo vyprázdnění zásobníku nezpůsobí RESET, symbol _STVREN_OFF Bity STKOVF nebo STKUNF v registru PCON indikují podmínky, za kterých byl Reset vyvolán. 12.7. Reset po ukončení zápisu do paměti Flash Výstup z režimu programování paměti Flash způsobí Reset jako při zapnutí napájení (POR). 12.8. Časovač Power-Up Po vyvolání stavu POR nebo BOR může být spuštěn časovač Power-Up, který podrží mikrořadič ve stavu Reset, aby napájecí napětí VDD mohlo dosáhnout dostatečné a stabilní hodnoty. Doba časovače je závislá na konfiguraci oscilátoru a časovače Power-Up a je typicky 40ms až 140ms. Časovač je povolen bitem /PWRTE v registru _CONFIG1 7 /CP 1
6 MCLRE 1
_CONFIG1 Config 1 Register Low Byte 5 4 3 2 /PWRTE WDTE1 WDTE0 FOSC2 1 1 1 1
adresa 1 FOSC1 1
0 FOSC0 1
/PWRTE Power-Up Timer Enable bit – zpoždění programu při zapnutí napájení 1 = zpoždění zakázáno, symbol _PWRTE_OFF 0 = zpoždění povoleno, symbol _PWRTE_ON Stav speciálních registrů po vyvolání Reset.
58
8007 h Flash
13. Instrukční soubor mikrořadičů PIC16F 13.1. Struktura instrukce Instrukční soubor má 49 instrukcí, každá má délku 14 bitů. Každá instrukce obsahuje kód instrukce a až dva operandy. kód zdrojový cílový instrukce operand operand nop příklad instrukce bez operandu
; prázdná instrukce
clrw ; vynuluje W registr instrukce bez zdrojového operandu, cílový operand (W registr) je součástí kódu instrukce movlw 05 ; uloží konstantu 05h do W registru cílový operand (W registr) je součástí kódu instrukce movwf TRISD ; zkopíruje W registr do registru TRISD zdrojový operand (W registr) je součástí kódu instrukce movf PORTD, 0 ; zkopíruje PORTD do W registru cílový operand (W registr) je určen hodnotou 0 decf Counter, 1 ; uloží hodnotu Counter - 1 do Counter cílový operand (Counter registr) je určen hodnotou 1 Operace přesunů mezi registry a uložení konstanty do registru musí být provedeny přes registr W (Working register), musí být vykonány pomocí dvou instrukcí. Všechny instrukce, které mají jako operand registr (file) pracují v módu Read – Modify – Write, tedy obsah registru je čten, obsah je změněn a výsledek je zapsán do cílového operandu. Většina instrukcí je vykonána v jednom instrukčním cyklu, který je složen ze čtyř taktů hodinového kmitočtu. Při taktovacím kmitočtu 4MHz je instrukce vykonána za 1s. Instrukce s podmíněným skokem a instrukce, které mění obsah čítače programu, jsou vykonány ve dvou instrukčních cyklech. Instrukce jsou rozděleny do tří skupin - bytově orientované operace, operandem je celý byte (registr) incf Counter, 1 ; inkrementuje Counter, výsledek uloží do Counter - bitově orientované, operandem je určený bit určeného byte (registru) bsf STATUS, RP0 ; nastaví bit RP0 registru STATUS - operace s přímým operandem (konstantou) a řídící operace movlw 5A ; uloží konstantu 5Ah do registru W goto Start ; nepodmíněný skok na návěští Start nop ; prázdná instrukce
59
13.2. Přehled instrukcí mnemonika funkce cykly Bytově orientované instrukce addwf f, d Add W and f 1 addwfc f, d Add with Carry W and f 1 andwf f, d AND W with f 1 asrf f, d Arithmetic Right Shift 1 lslf f, d Logical Left Shift 1 lsrf f, d Logical Right Shift 1 clrf f Clear f 1 clrw Clear W 1 comf f, d Complement f 1 decf f, d Decrement f 1 decfsz f, d Decrement f, Skip if 0 1 (2) incf f, d Increment f 1 incfsz f, d Increment f, Skip if 0 1 (2) iorwf f, d Inclusive OR W with f 1 movf f, d Move f 1 movwf f Move W to f 1 rlf f, d Rotate Left f through Carry 1 rrf f, d Rotate Right f through Carry 1 subwf f, d Subtract W from f 1 subwfb f, d Subtract with Borrow W from f 1 swapf f, d Swap nibbles in f 1 xorwf f, d Exclusive OR W with f 1 Bitově orientované instrukce bcf f, b Bit Clear f 1 bsf f, b Bit Set f 1 btfsc f, b Bit Test f, Skip if Clear 1 (2) btfss f, b Bit Test f, Skip if Set 1 (2) Instrukce s přímým operandem (konnstantou) addlw k Add literal and W 1 andlw k AND literal with W 1 iorlw k Inclusive OR literal with W 1 movlb k Move literal to BSR 1 movlp k Move literal to PCLATH 1 movlw k Move literal to W 1 sublw k Subtract W from literal 1 xorlw k Exclusive OR literal with W 1 f d=0 d=1 b k
14 bitů instrukce
status
00 0111 d f f f 11 1101 d f f f 00 0101 d f f f 11 0111 d f f f 11 0101 d f f f 11 0110 d f f f 00 0001 1 f f f 00 0001 0000 00 1001 d f f f 00 0011 d f f f 00 1011 d f f f 00 1010 d f f f 00 1111 d f f f 00 0100 d f f f 00 1000 d f f f 00 0000 1 f f f 00 1101 d f f f 00 1100 d f f f 00 0010 d f f f 11 1011 d f f f 00 1110 d f f f 00 0110 d f f f
ffff ffff ffff ffff ffff ffff ffff 00xx ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
C, DC, Z C, DC, Z Z C, Z C, Z C, Z Z Z Z Z
01 00bb b f f f 01 01bb b f f f 01 10bb b f f f 01 11bb b f f f
ffff ffff ffff ffff
11 1110 kkkk kkkk 11 1001 kkkk kkkk 11 1000 kkkk kkkk 00 0000 001kkkkk 11 0001 1kkk kkkk 11 0000 kkkk kkkk 11 110x kkkk kkkk 11 1010 kkkk kkkk
Z Z Z C C C, DC, Z C, DC, Z Z
C, DC, Z Z Z
C, DC, Z Z
7-bitová adresa registru, může adresovat 128 registrů tj. jedna banka paměti RAM cílový operand je W cílový operand je f 3-bitová adresa bitu, může adresovat 8 bitů (tj. bity 0 až 7) 8-bitová hodnota přímého operandu (konstanta) tj. hodnota 0 až 255
60
mnemonika funkce Řídící instrukce bra k Relative Branch brw Relative Branch with W call k Call subroutine callw Call subroutine with W goto k Go to address retfie Return from interrupt retlw k Return with literal in W return Return from Subroutine Inherentní instrukce clrwdt Clear Watchdog Timer nop No Operation option Load OPTION_REG with W reset Software Reset sleep Go into Sleep mode tris f Load TRIS register with W Instrukce pro optimalizaci C překladače addfsr n, k Add literal k to FSRn moviw n, m Move FSRn to W k[n] Move INDFn to W movwi n, m Move W to FSRn k[n] Move W to INDFn f k k n m
cykly 14 bitů instrukce
status
2 2 2 2 2 2 2 2
11 001k kkkk kkkk 00 0000 0000 1011 10 0kkk kkkk kkkk 00 0000 0000 1010 10 1kkk kkkk kkkk 00 0000 0000 1001 11 0100 kkkk kkkk 00 0000 0000 1000
1 1 1 1 1 1
00 0000 0110 0100 00 0000 0000 0000 00 0000 0110 0010 00 0000 0000 0001 00 0000 0110 0011 00 0000 0110 0 f f f
1 1 1 1 1
11 0001 0nkk kkkk 00 0000 0001 0nmm Z Z 11 1111 0nkk kkkk 00 0000 0001 1nmm 11 1111 1nkk kkkk
/TO, /PD
/TO, /PD
7-bitová adresa registru, může adresovat 128 registrů tj. jedna banka paměti RAM přímý operand (konstanta), 6, 8 nebo 9 bitů 11-bitová adresa (call a goto), může adresovat 2K instrukcí tj. 1 stránka paměti Flash n=0 pro FSR0 a INDF0 nebo n=1 pro FSR1 a INDF1 inkrement / dekrement při nepřímém adresování
/TO Time-Out Status Bit NOT_TO 0 = naplněn interval časovače WDT (Watch Dog Timer) 1 = po zapnutí napájení nebo po instrukcích clrwdt nebo sleep /PD Pover Down Status Bit NOT_PD 0 = po instrukci sleep 1 = po zapnutí napájení nebo po instrukci clrwdt Z Zero Flag Bit 0 = výsledek logické nebo aritmetické operace není 0 1 = výsledek logické nebo aritmetické operace je 0 DC Decimal Carry Flag Bit 0 = výsledek operace bez přenosu ze 4 bitu 1 = výsledek operace s přenosem ze 4 bitu Pro instrukce addwf , addlw , subwf , sublw. Při výpůjčce (Borrow) je bit DC reverzní. C Carry Flag Bit 0 = výsledek operace bez přenosu z nejvyššího bitu 1 = výsledek operace s přenosem z nejvyššího bitu Pro instrukce addwf , addlw , subwf , sublw. Při výpůjčce (Borrow) je bit C reverzní.
61
13.3. Formát instrukcí Bytově orientované instrukce 13
8 kód instrukce
7 d
6 f
f
f
f
f
0 f
f
0 f
k
0 k
f
d = 0 cílový operand je W d = 1 cílový operand je f f 7-bitová adresa, může adresovat 128 registrů tj. jedna banka paměti RAM Bitově orientované instrukce 13
10 kód instrukce
9 b
b
7 b
6 f
f
f
f
f
3-bitová adresa bitu 7-bitová adresa, může adresovat 128 registrů tj. jedna banka paměti RAM
b f
Instrukce s přímým operandem 13
8 kód instrukce
7 k
k
k
k
k
k
8-bitová hodnota přímého operandu (konstanta) tj. hodnota 0 až 255
k
Instrukce CALL a GOTO 13 11 10 kód instrukce k k k k k k k k k k k 11-bitová adresa, může adresovat 2K instrukcí tj. 1 stránka paměti Flash
0 k
Instrukce pro nepřímé adresování 13
7 kód instrukce
n k
6 n
k
k
k
k
0 k
2 n
1 m
0 m
0 pro FSR0 nebo 1 pro FSR1 6-bitová hodnota přímého operandu (konstanta) tj. hodnota 0 až 63 13
3 kód instrukce
n m
5 k
0 pro FSR0 nebo 1 pro FSR1 2-bitová hodnota inkrementu / dekrementu
62
13.4. Popis instrukcí
addfsr Syntaxe: Operace: Status: Popis:
addlw Syntaxe: Operace: Status: Popis: Příklad:
addwf Syntaxe: Operace: Status: Popis: Příklad:
addwfc Syntaxe: Operace: Status: Popis:
andlw Syntaxe: Operace: Status: Popis: Příklad:
Add Literal to FSRn addfsr FSRn,k -32 k +31 n=0 nebo 1 FSRn + k FSRn -šestibitová konstanta k se znaménkem je přičtena k registru FSRnH:FSRnL
Add Literal and W addlw k 0 k 255 W + k W C, DC, Z obsah registru W je přičten k osmibitové konstantě k a výsledek je uložen do W addlw 15 před instrukcí W = 10h po instrukci W = 25h
Add W and f addwf f, d 0 f 127 d = 0 nebo 1 W + f destination C, DC, Z obsahy registrů W a f jsou sečteny, výsledek je uložen do W když d = 0 obsahy registrů W a f jsou sečteny, výsledek je uložen do f když d = 1 addwf FSR, 0 před instrukcí W = 17h, FSR = C2h po instrukci W = D9h, FSR = C2h addwf INDF, 1 před instrukcí W = 17h, obsah FSR = 20h po instrukci W = 17h, obsah FSR = 37h Add W and Carry bit to f addwfc f, d 0 f 127 d = 0 nebo 1 W + f + C destination C, DC, Z obsahy registrů W a f jsou sečteny s C, výsledek je uložen do W když d = 0 obsahy registrů W a f jsou sečteny s C, výsledek je uložen do f když d = 1
AND Literal with W andlw k 0 k 255 W AND k W Z logická operace AND obsahu registru W s konstantou k, výsledek je uložen do W andlw 5F před instrukcí W = A3h = 1010 0011b k = 5Fh = 0101 1111b po instrukci W = 03h = 0000 0011b
63
andwf Syntaxe: Operace: Status: Popis: Příklad:
asrf Syntaxe: Operace:
Status: Popis:
bcf Syntaxe: Operace: Status: Popis: Příklad:
bra Syntaxe: Operace: Status: Popis:
brw Syntaxe: Operace: Status: Popis:
bsf Syntaxe: Operace: Status: Popis: Příklad:
AND W with f andwf f, d 0 f 127 d = 0 nebo 1 W AND f destination Z logická operace AND obsahu registrů W a f, výsledek do W když d = 0 logická operace AND obsahu registrů W a f, výsledek do f když d = 1 andwf FSR, 1 před instrukcí W = 17h = 0001 0111b FSR = C2h =1100 0010b po instrukci W = 17h FSR = 02h = 0000 0010b Arithmetic Right Shift asrf f, d 0 f 127 d = 0 nebo 1 f<7> dest<7> f<7:1> dest<6:0> f<0> C C, Z obsah registru f je posunut o jeden bit doprava, LSB do C, MSB se nemění výsledek do W když d = 0 , výsledek do f když d = 1
Bit Clear f bcf f, b 0 f 127 0b7 0 f
-bit b v registru f je vynulován bcf STATUS, 6 před instrukcí STATUS = E7h = 1110 0111b po instrukci STATUS = A7h = 1010 0111b Relative Branch bra k -256 f +255 PC +1 + k PC -obsah PC je inkrementován a přičtena 9-bit konstanta se znaménkem Relative Branch with W brw PC +1 + W PC -obsah PC je inkrementován a přičten obsah registru W
Bit Set f bsf f, b 0 f 127 0b7 1 f -bit b v registru f je nastaven na hodnotu 1 bsf STATUS, 5 před instrukcí STATUS = 0Ah = 0000 1010b po instrukci STATUS = 2Ah = 0010 1010b 64
btfsc Syntaxe: Operace: Status: Popis:
btfss Syntaxe: Operace: Status: Popis:
call Syntaxe: Operace:
Status: Popis: Příklad:
callw Syntaxe: Operace:
Status: Popis:
clrf Syntaxe: Operace: Status: Popis: Příklad:
Bit Test, Skip if Clear btfsc f, b 0 f 127 0b7 skip iff = 0 -když bit b v registru f je 0 pak následující instrukce je vykonána jako nop
Bit Test, Skip if Set btfss f, b 0 f 127 0b7 skip iff = 1 -když bit b v registru f je 1 pak následující instrukce je vykonána jako nop
Call Subroutine call k 0 k 2047 PC + 1 Top of Stack (TOS) k PC<10:0> PCLATH <6:3> PC<14:11> -13-bitová návratová adresa PC+1 je uložena do zásobníku 11-bitová adresa k je uložena do PC<10:0> nejvyšší čtyři bity PC jsou nataženy z PCLATH<6:3> Here: call There před instrukcí PC = Here po instrukci PC = There , TOS = Here + 1 Call Subroutine with W callw PC + 1 Top of Stack (TOS) W PC<7:0> PCLATH <6:0> PC<14:8> -13-bitová návratová adresa PC+1 je uložena do zásobníku 8-bitová adresa W je uložena do PC<7:0> nejvyšší bity PC jsou nataženy z PCLATH<6:0>
Clear f clrf f 0 f 127 00h f 1 Z Z obsah registru f je vynulován, příznak Z je nastaven na hodnotu 1 clrf TRISD před instrukcí TRISD = 5Ah po instrukci TRISD = 00h, Z = 1
65
clrw Syntaxe: Operace: Status: Popis: Příklad:
clrwdt Syntaxe: Operace:
Status: Popis: Příklad:
comf Syntaxe: Operace: Status: Popis: Příklad:
decf Syntaxe: Operace: Status: Popis: Příklad:
decfsz Syntaxe: Operace: Status: Popis: Příklad:
Clear W clrw 00h W 1 Z Z obsah registru W je vynulován, příznak Z je nastaven na hodnotu 1 clrw před instrukcí W = 5Ah po instrukci W = 00h, Z = 1 Clear Watchdog Timer clrwdt 00h WDT 0 WDT předdělička 1 NOT_TO 1 NOT_PD NOT_TO, NOT_PD časovač WDT i předdělička vynulovány, příznaky NOT_TO a NOT_PD nastaveny clrwdt před instrukcí WDT = xx po instrukci WDT = 00, prescaler count= 0 Complement f comf f, d 0 f 127 d = 0 nebo 1 NON f destination Z obsah registru f je invertován po bitech, výsledek do W když d = 0 obsah registru f je invertován po bitech, výsledek do f když d = 1 comf Reg1, 0 před instrukcí Reg1 = 13h = 0001 0011b po instrukci W = ECh = 1110 1100b Reg1 = 13h = 0001 0011b Decrement f decf f, d 0 f 127 d = 0 nebo 1 f - 1 destination Z obsah registru f je dekrementován (zmenšen o 1), výsledek do W když d = 0 obsah registru f je dekrementován (zmenšen o 1), výsledek do f když d = 1 decf Count, 1 před instrukcí Count = 02h po instrukci Count = 01h Decrement f, Skip if 0 decfsz f, d 0 f 127 d = 0 nebo 1 f - 1 destination, skip if f-1= 0 -obsah registru f je dekrementován (zmenšen o 1), výsledek do W když d = 0 obsah registru f je dekrementován (zmenšen o 1), výsledek do f když d = 1 když výsledek je 0 pak následující instrukce je vykonána jako nop Loop: decfsz Count, 1 před instrukcí PC = Loop, Count = 01h goto Loop po instrukci PC = Continue, Count = 00h Continue: 66
goto Syntaxe: Operace: Status: Popis: Příklad:
incf Syntaxe: Operace: Status: Popis: Příklad:
incfsz Syntaxe: Operace: Status: Popis: Příklad:
iorlw Syntaxe: Operace: Status: Popis: Příklad:
iorwf Syntaxe: Operace: Status: Popis:
Go to address, nepodmíněný skok goto k 0 k 2047 k PC<10:0> PCLATH<6:3> PC<14:11> -nepodmíněný skok na adresu k 11-bitová adresa k je uložena do PC<10:0> nejvyšší čtyři bity PC jsou nataženy z PCLATH<6:3> Here: goto 200 před instrukcí PC = Here po instrukci PC = 200h
Increment f incf f, d 0 f 127 d = 0 nebo 1 f + 1 destination Z obsah registru f je inkrementován (zvětšen o 1), výsledek do W když d = 0 obsah registru f je inkrementován (zvětšen o 1), výsledek do f když d = 1 incf Count, 1 před instrukcí Count = FFh po instrukci Count = 00h, Z = 1
Increment f, Skip if 0 incfsz f, d 0 f 127 d = 0 nebo 1 f + 1 destination, skip if f+1= 0 -obsah registru f je inkrementován (zvětšen o 1), výsledek do W když d = 0 obsah registru f je inkrementován (zvětšen o 1), výsledek do f když d = 1 když výsledek je 0 pak následující instrukce je vykonána jako nop Loop: incfsz Count, 1 před instrukcí PC = Loop, Count = FFh goto Loop po instrukci PC = Continue, Count = 00h Continue:
Inclusive OR Literal with W iorlw k 0 k 255 W OR k W Z logická operace OR obsahu registru W s konstantou k, výsledek je uložen do W iorlw 35 před instrukcí W = 9Ah = 1001 1010b k = 35h = 0011 0101b po instrukci W = BFh = 1011 1111b Inclusive OR W with f iorwf f, d 0 f 127 d = 0 nebo 1 W OR f destination Z logická operace OR obsahu registrů W a f, výsledek do W když d = 0 logická operace OR obsahu registrů W a f, výsledek do f když d = 1 67
lslf Syntaxe: Operace:
Status: Popis:
lsrf Syntaxe: Operace:
Status: Popis:
movf Syntaxe: Operace: Status: Popis:
movlb Syntaxe: Operace: Status: Popis:
movlp Syntaxe: Operace: Status: Popis:
movlw Syntaxe: Operace: Status: Popis: Příklad:
Logical Left Shift lslf f, d 0 f 127 d = 0 nebo 1 f<7> C f<6:0> dest<7:1> 0 dest<0> C, Z obsah registru f je posunut o jeden bit doleva, MSB do C, LSB je nulován výsledek do W když d = 0 , výsledek do f když d = 1 Logical Right Shift lsrf f, d 0 f 127 d = 0 nebo 1 0 dest<7> f<7:1> dest<6:0> f<0> C C, Z obsah registru f je posunut o jeden bit doprava, MSB je nulován, LSB do C výsledek do W když d = 0 , výsledek do f když d = 1 Move f movf f, d 0 f 127 d = 0 nebo 1 f destination Z obsah registru f je přesunut do W když d = 0 obsah registru f je přesunut do f když d = 1 (použitelné pro test obsahu f) Move Literal to BSR movlb k 0 k 15 k BSR -pětibitová konstanta k je uložena do BSR Move Literal to PCLATH movlp k 0 k 127 k PCLATH -sedmibitová konstanta k je uložena do PCLATH Move Literal to W movlw k 0 k 255 k W -osmibitová konstanta k je uložena do W movlw 5A před instrukcí po instrukci
68
W = xxxx k = 5Ah W = 5Ah
movwf Syntaxe: Operace: Status: Popis: Příklad:
nop Syntaxe: Operace: Status: Popis: Příklad:
option Syntaxe: Operace: Status: Popis:
reset Syntaxe: Operace: Status: Popis:
retfie Syntaxe: Operace: Status: Popis: Příklad:
Move W to f movwf f 0 f 127 W f -obsah registru W je přesunut do f movwf Reg1 před instrukcí W = 47h Reg1 = FFh po instrukci W = 47h Reg1 = 47h No Operation nop No operation -žádná operace, čítač programu inkrementuje nop před instrukcí PC = xx po instrukci PC = PC + 1
Load OPTION_REG with W option W OPTION_REG -obsah registru W je přesunut do OPTION_REG Software Reset reset 0 RI bit v registru PCON -Reset mikrořadiče, nastavení příznaku RI (Reset Instruction)
Return from Interrupt retfie TOS PC (Top of Stack to Program Counter) 1 GIE (General Interrupt Enable) -13-bitová adresa ze zásobníku je uložena do PC GIE, sedmý bit registru INTCON je nastaven na hodnotu 1, přerušení povoleno retfie před instrukcí PC = xxxx po instrukci PC = TOS, GIE = 1
69
retlw Syntaxe: Operace: Status: Popis: Příklad:
return Syntaxe: Operace: Status: Popis: Příklad:
rlf Syntaxe: Operace: Status: Popis: Příklad:
rrf Syntaxe: Operace: Status: Popis: Příklad:
Return with Literal in W retlw k 0 k 255 k W TOS PC (Top of Stack to Program Counter) -osmibitová konstanta k je uložena do W 13-bitová adresa ze zásobníku je uložena do PC Here: call Table ; W obsahuje počáteční adresu tabulky po instrukci W = 8 Table: addwf PCL,0 PC = TOS = Here + 1 retlw 1 ; začátek tabulky xx retlw 8 ; konec tabulky
Return from Subroutine return TOS PC (Top of Stack to Program Counter) -13-bitová adresa ze zásobníku je uložena do PC return před instrukcí PC = xxxx po instrukci PC = TOS
Rotate Left f through Carry rlf f, d 0 f 127 d = 0 nebo 1 viz příklad C obsah registru f rotuje o 1 bit vlevo včetně příznaku C, výsledek do W když d = 0 obsah registru f rotuje o 1 bit vlevo včetně příznaku C, výsledek do f když d = 1 rlf Reg1, 0 před instrukcí Reg1 = E6h = 1110 0110b C=0 po instrukci Reg1 = E6h = 1110 0110b W = BBh = 1100 1100b C=1
Rotate Right f through Carry rrf f, d 0 f 127 d = 0 nebo 1 viz popis C obsah registru f rotuje o 1 bit vpravo včetně příznaku C, výsledek do W když d = 0 obsah registru f rotuje o 1 bit vpravo včetně příznaku C, výsledek do f když d = 1 rrf Reg1, 1 před instrukcí Reg1 = E6h = 1110 0110b C=0 po instrukci Reg1 = 73h = 0111 0011b C=0
70
sleep Syntaxe: Operace:
Status: Popis: Příklad:
sublw Syntaxe: Operace: Status: Popis: Příklad:
subwf Syntaxe: Operace: Status: Popis: Příklad:
subwfb Syntaxe: Operace: Status: Popis:
Sleep sleep 00h WDT 0 WDT předdělička 1 NOT_TO 0 NOT_PD NOT_TO, NOT_PD mikrořadič je uveden do stavu Sleep, oscilátor je zastaven časovač WDT i předdělička vynulovány, NOT_PD nulován, NOT_TO nastaven sleep
Subtract W from Literal sublw k 0 k 255 k - W W C, DC, Z obsah registru W je odečten od osmibitové konstanty k a výsledek je uložen do W sublw 02 před instrukcí W = 01h po instrukci W = 01h, C = 1, Z = 0 sublw 02 před instrukcí W = 02h po instrukci W = 00h, C = 1, Z = 1 sublw 02 před instrukcí W = 03h po instrukci W = FFh, C = 0, Z = 0 sublw Myreg před instrukcí W = 10h adresa registru Myreg = 37h po instrukci W = 27h, C = 1 Subtract W from f subwf f, d 0 f 127 d = 0 nebo 1 f - W destination C, DC, Z obsah registru W je odečten od registru f , výsledek je uložen do W když d = 0 obsah registru W je odečten od registru f , výsledek je uložen do f když d = 1 subwf Reg1, 1 před instrukcí W = 02h Reg1 = 03h po instrukci W = 02h Reg1 = 01h Subtract W from f with Borrow subwf f, d 0 f 127 d = 0 nebo 1 f – W - B destination C, DC, Z obsah registru W je odečten od registru f , výsledek je uložen do W když d = 0 obsah registru W je odečten od registru f , výsledek je uložen do f když d = 1
71
swapf Syntaxe: Operace: Status: Popis: Příklad:
tris Syntaxe: Operace: Status: Popis:
xorlw Syntaxe: Operace: Status: Popis: Příklad:
xorwf Syntaxe: Operace: Status: Popis: Příklad:
Swap Nibbles in f swapf f, d 0 f 127 d = 0 nebo 1 f<3:0> destination <7:4> f<7:4> destination <3:0> -spodní a horní půlbyty registru f jsou zaměněny, výsledek do W když d = 0 spodní a horní půlbyty registru f jsou zaměněny, výsledek do f když d = 1 swapf Reg1, 1 před instrukcí Reg1 = A5h po instrukci Reg1 = 5Ah Load TRIS register with W tris f 5f7 W TRISf -když f=5, obsah registru W je přepsán do registru TRISA když f=6, obsah registru W je přepsán do registru TRISB když f=7, obsah registru W je přepsán do registru TRISC
Exclusive OR Literal with W xorlw k 0 k 255 W XOR k W Z logická operace XOR obsahu registru W s konstantou k, výsledek je uložen do W xorlw 0AF před instrukcí W = B5h = 1011 0101b k = AFh = 1010 1111b po instrukci W = 1Ah = 0001 1010b
Exclusive OR W with f xorwf f, d 0 f 127 d = 0 nebo 1 W XOR f destination Z logická operace XOR obsahu registrů W a f, výsledek do W když d = 0 logická operace XOR obsahu registrů W a f, výsledek do f když d = 1 xorwf Reg1, 1 před instrukcí W = B5h = 1011 0101b Reg1 = AFh = 1010 1111b po instrukci Reg1 = 1Ah = 0001 1010b
72
14. Assembler MPASM [2] Assembler je strojově orientovaný programovací jazyk, ve kterém jsou psány zdrojové soubory xxx.asm aplikačních programů pro mikrořadiče PIC16F. 14.1. Syntaktická pravidla assembleru MPASM 14.1.1. Příkazový řádek Základním elementem zdrojového textu je příkazový řádek, který je rozdělen do čtyř polí, jejichž pořadí a pozice na řádku musí být dodrženy - label (návěští) - mnemonics (instrukce, direktiva, makro) - operands (operandy) - commentary (komentář) Příklad : label mnemonics operands commentary #include p16f1937.inc Dest
equ
0B
; definice proměnné Dest
org goto
00 Start
; reset vector
org
20
; začátek programu
movlw movwf bcf goto end
0A Dest Dest, 3 Start
; uloží konstantu 0Ah to W ; kopíruje W (0Ah) do proměnné Dest ; instrukce se dvěma operandy, nuluje třetí bit proměnné Dest ; smyčka
Start :
14.1.2. Label (návěští) Návěští (label) je pojmenování jednoho nebo více řádků a slouží pro větvení programu. Pravidla pro návěští jsou : - začíná na prvním sloupci řádku - může obsahovat až 32 znaků - jako poslední znak má být mezera, Tab, „:“ (dvojtečka) nebo konec řádku (Enter) - nesmí být použita vyhrazená slova tj. instrukce a direktivy - jsou Case sensitive, tj. rozlišují se malá a velká písmena, Delay a DELAY jsou různá návěští 14.1.3. Mnemonics (instrukce, direktivy) Instrukce jsou vyhražená slova (add, call, movwf) která jsou překládána do strojového kódu. Direktivy jsou příkazy pro způsob překladu a nejsou překládány. Pravidla: - začínají na druhém nebo dalším sloupci řádku - na prvním sloupci smí být jen direktiva jejíž první znak je # (mříže), např. #include - pokud je label na stejném řádku s instrukcí, musí být oddělen znakem „:“ (dvojtečka) - nejsou Case sensitive, MOVWF a movwf jsou shodné instrukce
73
14.1.4. Operandy Operandy obsahují data, s kterými jsou prováděny operace a adresy uložení instrukcí. Každý řádek může obsahovat až dva operandy. Pravidla: - operandy následují za instrukcí - mezi instrukcí (direktivou) a operandem musí být jedna nebo více mezer - dva operandy musí být odděleny znakem „ , “ (čárka) - jsou Case sensitive, JEDNA a jedna jsou dva různé symboly operandů 14.1.5. Komentář Komentář (poznámky) jsou texty, které vysvětlují funkci programu. Doporučuje se opatřit každý zdrojový text dostatečným počtem komentářů. Komentář není překládán. Pravidla: - komentář následuje za operandy, může začínat na kterékoliv pozici řádku včetně první - komentář začíná znakem „ ; “ (středník) a končí znakem konec řádku (Enter) 14.2. Konstanty Assembler podporuje následující aritmetické konstanty - hexadecimální H‘9F‘ nebo h‘9F‘ nebo 9F - dekadické D‘100‘ nebo d‘100‘ - binární B‘0100‘ nebo b‘0100‘ Ve standardních projektech v MPLAB IDE jsou ve výchozím nastavení konstanty interpretovány jako hexadecimální, je tedy možné psát 9F místo H‘9F‘ Výchozí nastavení konstant je možné změnit direktivou radix. Aritmetická konstanta musí začínat číslicí. Před hexadecimální konstanty začínající znaky A až F musí být zapsána číslice 0, např 0A0 nebo 0FF. 14.3. Oprerátory Aritmetické operátory mohou být použity spolu s direktivami a jejich proměnnými : operátor popis příklad $ obsah čítače programu goto $+3 low nižší byte adresy movlw low Table high vyšší byte adresy movlw high Table * násobení a=b*c / dělení a=b/c = rovná se index = 0 Assembler MPASM podporuje cca 40 operátorů, uvedeny jsou jen ty nejčastěji použité ve vzorových programech a při cvičení.
74
14.4. Direktivy Direktivy jsou příkazy assembleru, které jsou součástí zdrojového textu, ale nejsou překládány do spustitelného souboru. Direktivy určují postup překladu, nastavují vstupy, výstupy a umístění dat. Většina direktiv má více jmen a formátů kvůli podpoře starších verzí assembleru. Dále jsou uvedeny jen direktivy a jejich formát použitý ve vzorových programech a cvičeních. Direktivy nejsou Case Sensitive, END, End a end jsou totožné direktivy.
banksel
symbol Nastaví assembler na banku RAM, která obsahuje symbol. Tento symbol musí být dříve definován. #include
p16f1937.inc ; obsahuje standardní definice symbolů pro PIC16F1937
banksel
TRISB
; nastavuje Banku 1 ve které je umístěn registr TRISB
clrf banksel
TRISB PORTB
; nuluje TRISB, nastavuje PORTB jako výstupy ; nastavuje banku 0 ve které je umístěn registr PORTB
movlw movwf goto $ end
55 PORTB
; ukládá hodnotu 55h na Port D ; každý program musí být ukončen direktivou end
cblock
address Definuje seznam symbolů a určuje jejich adresy v paměti RAM. address nastavuje adresu prvního symbolu seznamu, musí být umístěna do pole registrů GPR (pro všeobecné použití). První adresa GPR v bance 0 mikrořadiče PIC16F1937 je 20h. Pokud není definováno jinak, je symbolu přiřazen jeden registr (jeden byte). Seznam symbolů končí direktivou endc. cblock Delay1 Delay2
20 ; definuje registr Delay1 na adrese 020h ; definuje registr Delay2 na adrese 021h
endc
__config
výraz Nastavuje konfigurační bity procesoru, který musí být předtím definován direktivou list nebo v projektu MPLAB IDE volbou Configure / Select Device Direktiva má být umístěna na začátku zdrojového textu. Výraz má obsahovat symboly bitů použité v hlavičkovém souboru .inc pro daný typ mikrořadiče. Více bitů může být spojeno znakem & (logický AND). Direktiva začíná znaky __ (dvojí podtržení), pro řadu PIC18F má být používán formát config. #include p16F1937.inc __config _CONFIG1, _BOR_OFF & _MCLRE_OFF & _PWRTE_ON
75
end Konec zdrojového textu. Při překladu jednoho zdrojového textu musí být obsažena právě jedna direktiva end. Pokud zdrojový text obsahuje soubor .inc, nesmí tento soubor obsahovat end. #include : : end
p16f1937.inc ; instrukce programu ; konec zdrojového textu
endc Konec seznamu symbolů začínající direktivou cblock. Direktivy cblock a endc musí být vždy v páru. cblock
20
Delay1 Delay2
; Definuje dva registry endc
symbol equ výraz Hodnota výraz je přiřazena k symbol Používá se zejména k přiřazení symbolu k adrese registru SFR STATUS TRISD PORTD PORTC PCLATH
equ equ equ equ equ
03 88 08 07 0A
; místo adresy 03h může program používat symbol STATUS ; místo adresy 88h může program používat symbol TRISD ; místo adresy 08h může program používat symbol PORTD
#include file.inc #include “c:\ Program Files \ myfile.inc” Specifikovaný soubor file.inc je čten jako součást zdrojového textu na místě direktivy jako by celý soubor byl skutečně na místě direktivy napsán. Pokud je použit vlastní soubor .inc nebo pokud název souboru obsahuje mezery, musí být uzavřen v uvozovkách. #include
p16F1937.inc ; standardní include soubor
76
org
adresa Definuje první adresu paměti Flash na kterou je uložen přeložený strojový kód. Obvykle používané adresy pro mikrořadiče PIC16F jsou: 00h reset vektor 04h vektor rutiny pro ošetření přerušení 05h nebo vyšší začátek uživatelského programu #include
p16f1937.inc ; vložení standardní definice symbolů
org goto
00 Main
; následující přeložená instrukce bude uložena na adresu 0h ; skok na adresu s návěštím Main
org goto
04 int_routine
; následující přeložená instrukce bude uložena na adresu 04h ; skok na adresu s návěštím int_routine
org
10
; následující přeložená instrukce bude uložena na adresu 10h
Main
; hlavní program ; smyčka na návěští Main
Main ; goto
org 100 int_routine ; retfie end
; následující přeložená instrukce bude uložena na adresu 100h ; obslužná rutina přerušení ; návrat z přerušení
radix
hex / dec / oct Nastavuje radix (základ číselné soustavy) pro interpretaci dat. V projektech v MPLAB IDE je výchozí nastavení hex a není ho nutné nastavovat. movlw movlw movlw
D‘50‘ ; 50 je deklarováno jako dekadické číslo O‘50‘ ; 50 je deklarováno jako oktalové (osmičkové) číslo 50 ; 50 není deklarováno a je ve výchozím nastavení jako hexadecimální
radix movlw movlw movlw
dec H‘50‘ ; 50 je deklarováno jako hexadecimální číslo O‘50‘ ; 50 je deklarováno jako oktalové (osmičkové) číslo 50 ; 50 není deklarováno a je direktivou radix nastaveno jako dekadické
77
15. Elektrické parametry mikrořadičů PIC16(L)F Originální text [1] definuje stovky elektrických parametrů. Zde je uvedeno jen několik nejdůležitějších, dostačujících pro návrh jednoduchých konstrukcí. Napájecí napětí
VDD
PIC16F1937 PIC16LF1937
Spotřeba
IDD
PIC16LF1937
PIC16F1937
Spotřeba ve Sleep
IPD
PIC16LF1937 PIC16F1937
1,8 – 5,5 V 2,3 – 5,5 V 1,8 – 3,6 V 2,3 – 3,6 V
Fosc 16 MHz Fosc 32 MHz Fosc 16 MHz Fosc 32 MHz
9A 750A 5,0 mA 40 A 930 A 5,0 mA
VDD=3,0V, Fosc=32kHz VDD=3,0V, Fosc=4 MHz VDD=3,6V, Fosc=32 MHz VDD=5,0V, Fosc=32 kHz VDD=5,0V, Fosc=4 MHz VDD=5,0V, Fosc=32 MHz
0,08 A 27 A
VDD=3,0V, periferie neaktivní VDD=5,0V, periferie neaktivní
Flash Počet zápisů/čtení EP Doba zápisu 1 slova TIW Trvanlivost TRET
10 0000 2 ms 40 let
Vstupní úroveň L
VIL
<0,8 V
VDD 4,5V
Vstupní úroveň H
VIH
>2,0 V
VDD 4,5V
Výstupní úroveň L
VOL
<0,6 V
Výstupní úroveň H
VOH
VDD-0,7 V
Výstupní proud
max 20 mA / pin max 100 mA / Port
Ztrátový výkon
max 0,8 W
Teplota okolí
TA
-40°C TA -+85°C -40°C TA -+125°C
78
PIC16(L)F1937 –I (Industrial) PIC16(L)F1937 –E (Extended)
16. Vyráběné typy mikrořadičů PIC16F1937 typový znak PIC16F1937-I/ML PIC16F1937-I/MV PIC16F1937-I/P PIC16F1937-I/PT PIC16F1937-E/ML PIC16F1937-E/MV PIC16F1937-E/P PIC16F1937-E/PT
pouzdro QFN 44 UQFN 40 DIP 40 TQFP 44 QFN 44 UQFN 40 DIP 40 TQFP 44
pracovní teploty -40°C až +85°C -40°C až +85°C -40°C až +85°C -40°C až +85°C -40°C až +125°C -40°C až +125°C -40°C až +125°C -40°C až +125°C
PIC16LF1937-I/ML PIC16LF1937-I/MV PIC16LF1937-I/P PIC16LF1937-I/PT PIC16LF1937-E/ML PIC16LF1937-E/MV PIC16LF1937-E/P PIC16LF1937-E/PT
QFN 44 UQFN 40 DIP 40 TQFP 44 QFN 44 UQFN 40 DIP 40 TQFP 44
-40°C až +85°C -40°C až +85°C -40°C až +85°C -40°C až +85°C -40°C až +125°C -40°C až +125°C -40°C až +125°C -40°C až +125°C
QFN 44 8x8x0,9 mm
UQFN 40 5x5x0,5 mm
DIP 40 52x15x6 mm
cena / 1ks (USD) 2.24 2.10 2.31 2.12 2.45 2.31 2.52 2.33
vzorky X X X
2.24 2.10 2.31 2.12 2.45 2.31 2.52 2.33
TQFP 44 10x10x1 mm
Ceny jsou platné v červenci 2014 Vzorky označené X jsou dostupné u Microchip v omezeném množství zdarma (bez záruky !)
17. Literatura [1] PIC16(L)F1934/6/7 Data Sheet, Microchip Technology Inc., 2008-2011 [2] MPASM Assembler, Microchip Technology Inc., 2005
79