Aplikace PicDev | Procesor PIC16F84 | Překladač PicDev | Stavebnice P84 |
- Překladač PicDev - |
Úvod | Příkazy překladače | Výrazy |
V následujícím textu je popsán překladač aplikace PicDev, jeho použití a syntaxe. Překladač překládá zdrojový text k procesorům řady PIC16xxx do binárního tvaru, který je možné odeslat do paměti procesoru. Funkce překladače závisí na typu procesoru, který je zvolen v aplikaci PicDev.
Vytvářený program je uložen ve zdrojovém tvaru v souboru s příponou ASM. Program lze pomocí PicDev otevřít, editovat a přeložit do binárního tvaru. Program v binárním tvaru je možné odeslat přímo do procesoru nebo uložit do souboru formátu HEX (pro možnost programování procesoru jiným programovacím nástrojem).
Program je zpracováván po jednotlivých řádcích. Řádek zdrojového textu má běžně tento tvar:
návěští | instrukce | operandy | ; komentář |
Návěští
Návěští je symbolické označení místa v programu jménem.
Návěští musí začínat na první pozici řádku, za
návěštím může následovat znak dvojtečky (":"),
mezera nebo tabulátor. Návěští musí začínat písmenem
nebo znakem podtržítka ("_") a
může obsahovat písmena, číslice, otazník a znak
podtržítka. U návěští se rozlišují velká a malá
písmena ("Start" a "START" se považují za
dvě různá návěští).
Instrukce
Na místě instrukce může být buď instrukce procesoru,
pseudoinstrukce nebo příkaz překladače. Instrukce musí
začínat na druhé nebo vyšší pozici řádku. Je-li před
instrukcí návěští, musí být odděleno znakem dvojtečky
(":"), mezerou nebo tabulátorem.
Operandy
Operandy jsou parametry instrukce. Od instrukce jsou odděleny
mezerou nebo tabulátorem. Je-li uvedeno více operandů, jsou
jednotlivé operandy navzájem odděleny čárku (",").
Komentář
Komentář je jakákoliv poznámka následující za znakem
středníku (";"). Komentář může
začínat kdekoliv na řádku (též na jeho začátku).
Komentář slouží pouze ke zpřehlednění zdrojového textu.
Překladač text za středníkem ignoruje (kromě případu, kdy
je středník součástí operandu instrukce jako text v
uvozovkách).
Příkazy překladače |
---|
Příkazy překladače jsou příkazy sloužící k řízení překladu. Při zadávání příkazů překladače se nerozlišují velká a malá písmena ("ORG" a "org" je pro překladač stejný příkaz).
CBLOCK, ENDC | blok číselných konstant |
CONFIG | nastavení konfigurace procesoru |
DE | definice dat v paměti EEPROM |
DEFINE | definice substitučního textu, definice symbolu |
DT | definice tabulky konstant v programové paměti |
DW | uložení slova do programové paměti |
EQU | definice hodnoty číselné konstanty |
ERROR | výpis chybového hlášení |
IDLOCS | nastavení identifikačního slova procesoru |
IFDEF, IFNDEF, ELSE, ENDIF | podmíněný překlad programu |
INCLUDE | vnoření externího souboru |
LIST, NOLIST | řízení výpisu překladu |
ORG | nastavení ukazatele adres |
RADIX | nastavení implicitní číselné soustavy |
RES | rezervace místa v paměti |
SET | nastavení hodnoty číselné proměnné |
UNDEFINE | zrušení definice substitučního textu, zrušení symbolu |
Pro zajištění přenositelnosti z jiných překladačů a pro budoucí použití rezervuje překladač skupinu příkazů, jejichž jména nemohou být použita jako návěští nebo jména symbolů:
BADRAM, BANKISEL, BANKSEL, CODE, CONSTANT, END, ENDM, ENDW, ERRORLEVEL, EXITM, EXPAND, EXTERN, GLOBAL, IDATA, IF, LOCAL, MACRO, MAXRAM, MESSG, NOEXPAND, PAGESEL, PROCESSOR, SPACE, SUBTITLE, TITLE, UDATA, VARIABLE, WHILE.
Předdefinované
symboly
Překladač definuje
několik předdefinovaných symbolů (prázdných substitučních
textů), které umožňují řídit podmíněný překlad
příkazy IFDEF a IFNDEF v
závislosti na zvoleném procesoru.
procesor | symboly |
---|---|
PIC16F83 | __16F83, __16f83, _16F83, _16f83, PIC16F83, pic16f83 |
PIC16C84 | __16C84, __16c84, _16C84, _16c84, PIC16C84, pic16c84 |
PIC16F84 | __16F84, __16f84, _16F84, _16f84, PIC16F84, pic16f84 |
PIC16F627 | __16F627, __16f627, _16F627, _16f627, PIC16F627, pic16f627 |
PIC16F628 | __16F628, __16f628, _16F628, _16f628, PIC16F628, pic16f628 |
PIC16F873 | __16F873, __16f873, _16F873, _16f873, PIC16F873, pic16f873 |
PIC16F874 | __16F874, __16f874, _16F874, _16f874, PIC16F874, pic16f874 |
PIC16F876 | __16F876, __16f876, _16F876, _16f876, PIC16F876, pic16f876 |
PIC16F877 | __16F877, __16f877, _16F877, _16f877, PIC16F877, pic16f877 |
Druhou skupinou symbolů jsou symboly definující architekturu procesoru.
procesory | symboly |
---|---|
PIC16F83, PIC16C84, PIC16F84 | __1684, _1684, PIC1684, pic1684 |
PIC16F627, PIC16F628 | __1662, _1662, PIC1662, pic1662 |
PIC16F873, PIC16F874, PIC16F876, PIC16F877 | __1687, _1687, PIC1687, pic1687 |
CBLOCK,
ENDC
Constant
Block
CBLOCK | [<výraz>] | ||
návěští | [:<přírustek>] | ||
ENDC |
Příkaz CBLOCK definuje blok číselných konstant. Každému návěští uvnitř bloku je přiřazena číselná hodnota. Za návěštím může za znakem dvojtečky (":") následovat přírustek (0 a více), o kolik se posune ukazatel konstant. Není-li přírustek uveden, zvýší se ukazatel konstant o 1 (další návěští bude mít hodnotu o 1 vyšší). Na jednom řádku může být uvedeno více definic konstant, jednotlivé definice jsou odděleny čárkami. Za příkazem CBLOCK může být uveden číselný výraz představující počáteční hodnotu přiřazovanou konstantám. Není-li výraz uveden, použije se poslední hodnota předešlého příkazu CBLOCK. Pro první příkaz CBLOCK se použije hodnota prvního všeobecného registru (GPR). Blok konstant je ukončen příkazem ENDC. Nejčastějším použitím příkazu CBLOCK je při definici adres proměnných v datové paměti procesoru.
Příklad:
CBLOCK | 20h | ; počáteční adresa | |
Citac1 | ; čítač 1 (adresa 20h) | ||
Citac2 | ; čítač 2 (adresa 21h) | ||
Flags | ; příznaky (adresa 22h) | ||
ENDC | ; konec bloku konstant |
CONFIG
Configuration
CONFIG | {<výraz>| LP | XT | HS | RC | WDT} |
Příkaz CONFIG nastavuje konfigurační slovo procesoru. Za příkazem následuje číselný výraz představující přímo číselnou hodnotu konfiguračního slova procesoru nebo následuje jeden ze symbolů:
Výhodou symbolů je, že nezávisí na použitém procesoru. Význam jednotlivých bitů konfiguračního slova lze nalézt u popisu procesoru. Pro zajištění přenositelnosti zdrojového textu programu s číselným vyjádřením konfiguračního slova lze použít podmíněný překlad IFDEF se jménem procesoru (PIC16F84 atd).
Příklad:
CONFIG | WDT | ; zapnout časovač Watchdog |
DE
Data
EEPROM
DE | <výraz> [, <výraz>, ...] |
Příkaz DE uloží data do paměti EEPROM. Za příkazem může následovat jeden nebo více číselných výrazů, každý výraz je uložen jako jeden datový bajt. Ukládací adresa je určena nastavením ukazatele adres (příkazem ORG) na adresu 2100h a více.
Příklad:
ORG | 2100h | ; počáteční adresa EEPROM | |
DE | 'A', 'H', 'O', 'J', 0 | ; uložení dat do EEPROM |
DEFINE
Define
DEFINE | jméno | text |
Nebo:
#DEFINE | jméno | text |
Příkaz DEFINE definuje substituční text, kterým bude nahrazován symbol daného jména. Během překladu je každý překládaný řádek předzpracován nahrazením symbolů substitučními texty. Za substituční text je považován text následující za oddělovacími mezerami a tabulátory až po konec řádku nebo po komentář. Pomocí substitučního textu lze snadno provádět modifikace zdrojových textů změnou definic na začátku programu. Symboly je možné předefinovávat opakovaným použitím příkazu DEFINE (včetně zadání prázdných textů) nebo definice zrušit příkazem UNDEFINE. Dalším využitím je podmíněný překlad programu pomocí příkazů IFDEF a IFNDEF.
Poznámka: Před příkazem DEFINE není povoleno uvést návěští.
Příklad:
#define | bank1 | bcf 3,5 | ; vytvoření pseudoinstrukce |
bank1 | ; příkaz pro nastavení banky 1 | ||
bcf | 3,5 | ; tak by vypadal rozvoj příkazu |
DT
Data
Table
DT | <výraz> [, <výraz>, ...] |
Příkaz DT slouží k definici tabulek konstant. Za příkazem následuje jeden nebo více číselných parametrů. Každý parametr je přeložen jako jedna instrukce RETLW s uvedeným parametrem (u procesorů řady PIC16xxx se čtení hodnot z tabulek provádí voláním instrukcí RETLW, které navrací požadované hodnoty).
Příklad:
Table1 | addwf | 2,1 | ; přičtení offsetu ve W k registru PCL |
dt | 'A', 'H', 'O', 'J', 0 | ; přeloženo jako 5 instrukcí RETLW |
Tabulka je volána instrukcí CALL Table1, před voláním je do registru W uložen offset požadované hodnoty z tabulky (W = 0 až 4), po návratu obsahuje W načtenou hodnotu. Tabulka v příkladu vyžaduje, aby byla umístěna v počátečních 256 bajtech programové paměti. Při jiném umístění je nutné použít složitější obsluhu volání s využitím registru PCLATH.
DW
Data
Word
DW | <výraz> [, <výraz>, ...] |
Příkaz DW uloží do programové paměti jedno nebo více slov se zadanou hodnotou (rozsah hodnot 0 až 3FFFh). Tímto způsobem je možné do programu vkládat nestandardní instrukce (např. instrukce ADDLW 0xFF je překládána kódem 3EFFh, ale může mít kód i 3FFFh).
Příklad:
addlw | 0FFh | ; instrukce přeložena jako 3EFFh | |
dw | 3FFFh | ; jiný tvar instrukce ADDLW 0FFh |
EQU
Equal
návěští | EQU | <výraz> |
Pomocí příkazu EQU je možné definovat číselné konstanty pro překladač. Uvedením jména konstanty ve výrazu dosadí překladač na místo konstanty odpovídající číselnou hodnotu. Konstanty slouží především k usnadnění zápisu programu. Namísto konkrétních číselných hodnot je možné používat symboly s mnemotechnickým jménem. Změnou definice konstanty lze snadno změnit hodnotu konstanty v celém programu. Konstantu lze definovat kdekoliv v programu (i před jejím prvním použitím). Konstantu lze definovat pouze jednou; její hodnotu nelze na dalším místě programu změnit. Je-li potřeba hodnotu měnit, je možné použít příkaz SET.
Příklad:
LED | equ | 3 | ; dioda LED připojena k bitu 3 |
bsf | PortA,LED | ; zapnutí diody LED |
ERROR
Error
ERROR | text |
Příkazem ERROR může progam při překladu vypisovat chybová hlášení, zpravidla při nesplnění některé podmínky pro překlad. Překladač považuje příkaz ERROR za chybu. Během překladu informuje o chybě uživatele a vypíše řádek se zdrojovým textem, kde si uživatel může přečíst text chybového hlášení.
Příklad:
#ifndef | __16c84 | |
error | >>> Nepodporovaný procesor! <<< | |
#endif |
IDLOCS
Identification
Locations
IDLOCS | <výraz> |
Procesory řady PIC16xxx umožňují příkazem IDLOCS uložit do paměti procesoru 16-bitové slovo, které může být využito k identifikaci procesoru (sériové číslo). Identifikační slovo není přístupné z programu v procesoru. Je přístupné pouze při čtení obsahu procesoru a to i v případě zapnuté ochrany proti čtení obsahu procesoru.
Příklad:
idlocs | 0x1234 | ; sériové číslo procesoru |
IFDEF,
IFNDEF, ELSE, ENDIF
If
Defined, If Not Defined, Else, End of If
IFDEF | jméno | ||
... | |||
ELSE | |||
... | |||
ENDIF |
Nebo:
#IFNDEF | jméno | |
... | ||
#ELSE | ||
... | ||
#ENDIF |
Příkazy IFDEF a IFNDEF umožňují podmíněný překlad programu. Příkaz IFDEF testuje, zda existuje symbol daného jména. Symbol je definován příkazem DEFINE, hodnotou symbolu může být prázdný řetězec. Pokud symbol existuje, přeloží se část programu následující za příkazem IFDEF. Pokud symbol neexistuje (nebo byl zrušen příkazem UNDEFINE), přeloží se část programu následující za příkazem ELSE. Podmíněný blok je ukončen příkazem ENDIF. Příkaz ELSE je nepovinný. Příkaz IFNDEF má opačný význam než IFDEF. První část programu se přeloží v případě, že symbol neexistuje, druhá část v případě existence symbolu.
Pomocí podmíněného překladu je možné přizpůsobit zdrojový text různým variantám. Častým případem je překlad podmíněný typem zvoleného procesoru. Překladač definuje symboly označující typ zvoleného procesoru (např. PIC16F84 nebo __16F84).
Poznámka: Před příkazy IFDEF a IFNDEF není povoleno uvést návěští.
Příklad:
#ifdef | PIC16C84 | ||
config | 11001b | ; konfigurace pro PIC16C84 | |
#endif | |||
#ifdef | PIC16F84 | ||
config | 3FF1h | ; konfigurace pro PIC16F84 | |
#endif |
INCLUDE
Include
INCLUDE | "soubor" |
Nebo:
#INCLUDE | "soubor" |
Příkazem INCLUDE je možné vložit do programu zdrojový text z jiného souboru. Jako parametr příkazu následuje jméno souboru, které může být uzavřeno do dvojitých uvozovek nebo do lomených závorek <soubor>. Jako aktuální složka pro přístup k souborům je použita složka, ve které je umístěn editovaný program.
Příklad:
#include | "pic16f627.inc" | ; definice procesoru PIC16F627 |
LIST,
NOLIST
List,
No List
NOLIST | |
LIST |
Po překladu programu je možné v okně překladu zobrazit výpis překladu programu, který obsahuje kódy přeložených instrukcí. Výpis překladu lze pro jednotlivé části programu zastavit příkazem NOLIST nebo opět povolit příkazem LIST. To je vhodné například při vnoření souboru příkazem INCLUDE, kdy nás nezajímá výpis jeho překladu.
Příklad:
nolist | ; výpis překladu vypnut | ||
#include | "config.inc" | ; konfigurace programu | |
list | ; výpis překladu zapnut |
ORG
Origin
[návěští] | ORG | <výraz> |
Překladač používá při překladu vnitřní ukazatel adres udávající místo, kam bude přeložená instrukce v paměti uložena. Ukazatel má počáteční hodnotu 0 a po každé přeložené instrukci se zvýší. Jeho hodnotu lze nastavovat příkazem ORG a tak určovat, kam bude která část programu uložena. Není nutné dodržet posloupnost adres (nižší adresy a potom vyšší), doporučuje se to však z důvodu přehlednosti programu. Je-li před příkazem ORG zapsáno návěští, je mu přidělena hodnota odpovídající nové hodnotě ukazatele adres. Hodnotu ukazatele adres lze používat ve výrazech uvedením znaku $ (dolar). Ukazatel adres se uplatňuje i při zápisu dat do paměti EEPROM příkazem DE. Pro zápis do EEPROM je nutno nastavit ukazatel adres na 2100h a více.
Příklad:
Tab1 | org | ($ + 0ffh) & ~0ffh | ; tabulka začíná vždy na násobku 256 bajtů |
RADIX
Radix
RADIX | {<výraz>| DEC | HEX | OCT | BIN} |
Při zápisu číselných hodnot v programu lze specifikovat číselnou soustavu, ve které je číslo zapsáno. Specifikaci číselné soustavy je možné vynechat, v tom případě se číslo interpretuje v implicitní číselné soustavě. Implicitní číselnou soustavou je běžně dekadická soustava. Příkazem RADIX je možné implicitní číselnou soustavu změnit, nová číselná soustava se uplatní pro následující překládané řádky programu. Jako parametr příkazu RADIX lze uvést přepínač DEC, HEX, OCT nebo BIN, nastaví se číselná soustava dekadická, hexadecimální, oktalová nebo binární. Jinou možností je zadání číselného parametru s hodnotou 10, 16, 8 nebo 2. Při zadání číselného parametru příkazu je však potřeba pamatovat na to, že pro parametr platí do té chvíle platná implicitní číselná soustava.
Upozornění: Je-li zvolena implicitně hexadecimální soustava, není vhodné používat dekadický a binární sufixový způsob zápisu, sufixové znaky D a B jsou v tom případě považovány za znaky hexadecimální číselné soustavy. Např. 10D je považován za 0x10D a 10B za 0x10B. Pro tyto případy je vhodnější použít prefixový zápis .10 (nebo D'10') a B'10'.
Příklad:
RADIX | DEC | ; dekadická číselná soustava | |
addlw | 10 | ; číslo má hodnotu 10 | |
RADIX | HEX | ; hexadecimální číselná soustava | |
addlw | 10 | ; číslo má hodnotu 16 | |
RADIX | OCT | ; oktalová číselná soustava | |
addlw | 10 | ; číslo má hodnotu 8 | |
RADIX | BIN | ; binární číselná soustava | |
addlw | 10 | ; číslo má hodnotu 2 | |
addlw | .10 | ; číslo má vždy hodnotu 10 | |
addlw | 0x10 | ; číslo má vždy hodnotu 16 | |
addlw | O'10' | ; číslo má vždy hodnotu 8 | |
addlw | B'10' | ; číslo má vždy hodnotu 2 |
RES
Reserve
[návěští] | RES | <výraz> |
Příkaz RES rezervuje v paměti volné místo o zadané velikosti. Příkaz způsobí zvýšení ukazatele adres o hodnotu zadanou výrazem. Má stejný účinek jako "ORG $+<výraz>". Je-li před příkazem RES uvedeno návěští, bude mít toto návěští hodnotu začátku rezervované oblasti. Příkaz RES se uplatňuje na programovou paměť i na paměť EEPROM, stejně jako příkaz ORG. Do rezervované oblasti lze v jiné části programu ukládat instrukce nastavením příkazu ORG na hodnotu návěští začátku oblasti.
Příklad:
org | 0 | ; počátek paměti procesoru (adresa po resetu) | |
goto | Start | ; adresa 0: skok na start procesoru | |
res | 3 | ; přeskočení nepoužité části paměti | |
goto | Inter | ; adresa 4: skok na obsluhu přerušení procesoru | |
res | 250 | ; rezervace místa pro tabulky |
SET
Set
návěští | SET | <výraz> |
Pomocí příkazu SET je možné definovat číselné proměnné pro překladač. Uvedením jména proměnné ve výrazu dosadí překladač na místo proměnné odpovídající číselnou hodnotu. Proměnné slouží především k usnadnění zápisu programu. Namísto konkrétních číselných hodnot je možné používat symboly s mnemotechnickým jménem. Změnou definice proměnné lze snadno změnit hodnotu proměnné v celém úseku programu. Proměnnou lze definovat kdekoliv v programu (i před jejím prvním použitím). Proměnnou je možné předefinovávat na více místech programu, nová definice přepíše starou hodnotu. Před první definicí proměnné platí hodnota nastavená poslední definicí v programu. Pro číselné hodnoty, které se v programu nebudou měnit, je vhodnější použít příkaz EQU (větší kontrola nechtěné vícenásobné definice).
Příklad:
Port | set | PORTA | ; použije se port A |
#include | "Input.asm" | ; překlad pro port A | |
Port | set | PORTB | ; nyní se použije port B |
#include | "Input.asm" | ; překlad pro port B |
UNDEFINE
Undefine
UNDEFINE | jméno |
Nebo:
#UNDEFINE | jméno |
Příkaz UNDEFINE zruší definici substitučního textu, který byl nadefinován příkazem DEFINE. Příkaz má význam především ve spojitosti s podmíněným překladem IFDEF a IFNDEF, kdy je překlad větven v závislosti na existenci symbolu substitučního textu.
Poznámka: Před příkazem UNDEFINE není povoleno uvést návěští.
Příklad:
#define | quick | ; bude překlad pro režim "quick" | |
#include | "SetRate.asm" | ; překlad pro režim "quick" | |
#undefine | quick | ; zrušení příznaku režimu "quick" | |
#define | slow | ; bude překlad pro režim "slow" | |
#include | "SetRate.asm" | ; překlad pro režim "slow" |
Výrazy |
---|
Úvod | Příkazy překladače | Výrazy |
Výrazy jsou vyčíslovány jako celočíselné. Výrazy vyčíslující číslo registru nebo konstantu pro parametr instrukce mohou přesahovat cílový rozsah bitů, nadbytečné bity jsou ignorovány. Např. je možné zapsat instrukci MOVWF TRISA, adresa TRISA (85h) je zkrácena na 7 bitů (na 05h).
Operátory
Operátory slouží k sestavování číselných výrazů.
operátor | popis | příklad |
---|---|---|
$ | aktuální ukazatel adres | goto $ + 1 |
( ) | levá a pravá závorka | 1 * (2 + a) |
- | unární znaménko - (negace) | -4 |
+ | unární znaménko + | +4 |
~ | bitová inverze | ~flags |
HIGH | vyšší bajt | movlw HIGH Table |
LOW | nižší bajt | movlw LOW Table |
* | násobení | a * 4 |
/ | celočíselné dělení | a / 4 |
% | modulo (zbytek po celočíselném dělení) | a % 4 |
+ | sčítání | a + 4 |
- | odečítání | a - 4 |
<< | bitový posun vlevo (opakované násobení 2) | a << 4 |
>> | bitový posun vpravo (opakované dělení 2) | a >> 4 |
& | bitový součin (AND) | a & 4 |
| | bitový součet (OR) | a | 4 |
^ | bitový výhradní součet (XOR) | a ^ 4 |
Ukazatel adres
Symbol $ (dolar) představuje ukazatel adres
překládaného programu. Je to adresa, do které bude uložena
přeložená instrukce. Hodnotu ukazatele adres lze nastavovat
příkazem ORG. Jeho hodnota se automaticky
zvýší po překladu každé instrukce. Při použití ve
výrazu udává ukazatel adres $ hodnotu aktuální adresy
instrukce. Např. instrukce "goto $" představuje
nekonečnou smyčku, skok sám na sebe.
Unární
operátory
Unární operátory jsou jednooperandové operátory. Mění
hodnotu následujícího operandu. Patří mezi ně:
Duální
operátory
Duální operátory jsou operátory pro dva operandy. Operátor
provede operaci mezi operandy uvedenými na obou stranách,
výsledkem je hodnota, která může sloužit jako operand pro
další operace.
Priorita
operací
Při vyčíslování výrazů se postupuje podle následující
priority:
Prioritu operací lze měnit uzavíráním částí výrazů do závorek ( a ).
Zadání číselných konstant
Při zadávání číselných konstant je možné zadat číselnou soustavu podle následující tabulky. Zápis je možný buď v prefixovém tvaru nebo v sufixovém tvaru. Při prefixovém zápisu je číslo uvozeno znakem číselné soustavy D (dekadická), H (dexadecimální), O (oktalová), B (binární). Za úvodním znakem následují číslice ohraničené znaky jednoduchých uvozovek. Při sufixovém zápisu následuje znak číselné soustavy za číslicemi čísla. Číslo při sufixovém zápisu musí začínat číslicí 0 až 9.
číselná soustava | syntaxe | příklad |
---|---|---|
dekadická | D'???' | D'127' |
.??? | .127 | |
???d | 127d | |
hexadecimální | H'??' | H'9F' |
0x?? | 0x9F | |
??h | 9Fh | |
oktalová | 0'???' | 0'777' |
O'???' | O'777' | |
???o | 777o | |
binární | B'????' | B'0110' |
????b | 0110b | |
ASCII | A'?' | A'C' |
'?' | 'C' |
Dekadická
číselná soustava
Při prefixovém zápisu se uvede nejdříve písmeno D
(nebo d), za ním následují číslice
ohraničené jednoduchými uvozovkami (např. D'123').
Zvláštním typem zápisu je znak tečky uvedený před
číslicemi (bez uvozovek, např. .123). Při
sufixovém zápisu následuje za číslicemi písmeno D
(nebo d; např. 123d).
Sufixový zápis nelze použít v případě, že je zvolena
hexadecimální číselná soustava jako implicitní. V tomto
případě je sufixový znak D považován za
platnou číslici hexadecimální soustavy.
Hexadecimální
číselná soustava
Při prefixovém zápisu se uvede nejdříve písmeno H
(nebo h), za ním následují číslice
ohraničené jednoduchými uvozovkami (např. H'2AB').
Zvláštním typem zápisu je zápis čísla za prefixem 0X
(nebo 0x, např. 0x2AB). Při
sufixovém zápisu následuje za číslicemi písmeno H
(nebo h; např. 123h). Číslo
musí při sufixovém zápisu začínat číslicí 0
až 9 (např. 0ABh).
Oktalová
číselná soustava
Při prefixovém zápisu se uvede nejdříve písmeno O
(nebo o), za ním následují číslice
ohraničené jednoduchými uvozovkami (např. O'167').
Jako prefixový znak je možné použít i znak číslice 0
(např. 0'167'). Při sufixovém zápisu
následuje za číslicemi písmeno O (nebo o;
např. 167o). Sufixový zápis se nedoporučuje
používat, neboť může snadno dojít k záměně písmene O
s číslicí 0.
Binární
číselná soustava
Při prefixovém zápisu se uvede nejdříve písmeno B
(nebo b), za ním následují číslice
ohraničené jednoduchými uvozovkami (např. B'110').
Při sufixovém zápisu následuje za číslicemi písmeno B
(nebo b; např. 110b).
Sufixový zápis nelze použít v případě, že je zvolena
hexadecimální číselná soustava jako implicitní. V tomto
případě je sufixový znak B považován za
platnou číslici hexadecimální soustavy.
ASCII zápis
Číslo v ASCII tvaru umožňuje zadat jeden ASCII znak.
Znak je uzavřen do jednoduchých uvozovek, před uvozovkami
může (ale nemusí) předcházet prefixový znak A
nebo a (např. 'm' nebo A'm').
Implicitní
číselná soustava
Při zápisu čísla není nutné uvádět číselnou soustavu. V
tom případě se použije implicitní číselná
soustava. Implicitní číselnou soustavou je dekadická
číselná soustava nebo soustava zvolená příkazem RADIX.
Čísla v implicitní číselné soustavě se zadávají přímo
zápisem číslic. Hexadecimální čísla musí začínat
číslicí 0 až 9. Při
implicitní hexadecimální číselné soustavě nelze použít
sufixový zápis dekadické a binární soustavy (např. 10b),
protože sufixové znaky D a B jsou považovány za platné
číslice hexadecimální soustavy.
Tabulky
Zde je uvedeno několik tabulek, které mohou usnadnit používání různých číselných soustav. První je binární tabulka usnadňující převod jednotlivých bitů:
číslo bitu | dekadicky | hexadecimálně | binárně |
---|---|---|---|
0 | 1 | 0001h | 0000000000000001b |
1 | 2 | 0002h | 0000000000000010b |
2 | 4 | 0004h | 0000000000000100b |
3 | 8 | 0008h | 0000000000001000b |
4 | 16 | 0010h | 0000000000010000b |
5 | 32 | 0020h | 0000000000100000b |
6 | 64 | 0040h | 0000000001000000b |
7 | 128 | 0080h | 0000000010000000b |
8 | 256 | 0100h | 0000000100000000b |
9 | 512 | 0200h | 0000001000000000b |
10 | 1024 | 0400h | 0000010000000000b |
11 | 2048 | 0800h | 0000100000000000b |
12 | 4096 | 1000h | 0001000000000000b |
13 | 8192 | 2000h | 0010000000000000b |
14 | 16384 | 4000h | 0100000000000000b |
15 | 32768 | 8000h | 1000000000000000b |
Další je hexadecimální tabulka usnadňující převod hexadecimálních číslic:
vyšší bajt (HIGH) | nižší bajt (LOW) | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
1. číslice | 2. číslice | 3. číslice | 4. číslice | ||||||||
hex. | dek. | binárně | hex. | dek. | binárně | hex. | dek. | binárně | hex. | dek. | binárně |
0000 | 0 | 0000000000000000 | 000 | 0 | 000000000000 | 00 | 0 | 00000000 | 0 | 0 | 0000 |
1000 | 4096 | 0001000000000000 | 100 | 256 | 000100000000 | 10 | 16 | 00010000 | 1 | 1 | 0001 |
2000 | 8192 | 0010000000000000 | 200 | 512 | 001000000000 | 20 | 32 | 00100000 | 2 | 2 | 0010 |
3000 | 12288 | 0011000000000000 | 300 | 768 | 001100000000 | 30 | 48 | 00110000 | 3 | 3 | 0011 |
4000 | 16384 | 0100000000000000 | 400 | 1024 | 010000000000 | 40 | 64 | 01000000 | 4 | 4 | 0100 |
5000 | 20480 | 0101000000000000 | 500 | 1280 | 010100000000 | 50 | 80 | 01010000 | 5 | 5 | 0101 |
6000 | 24576 | 0110000000000000 | 600 | 1536 | 011000000000 | 60 | 96 | 01100000 | 6 | 6 | 0110 |
7000 | 28672 | 0111000000000000 | 700 | 1792 | 011100000000 | 70 | 112 | 01110000 | 7 | 7 | 0111 |
8000 | 32768 | 1000000000000000 | 800 | 2048 | 100000000000 | 80 | 128 | 10000000 | 8 | 8 | 1000 |
9000 | 36864 | 1001000000000000 | 900 | 2304 | 100100000000 | 90 | 144 | 10010000 | 9 | 9 | 1001 |
A000 | 40960 | 1010000000000000 | A00 | 2560 | 101000000000 | A0 | 160 | 10100000 | A | 10 | 1010 |
B000 | 45056 | 1011000000000000 | B00 | 2816 | 101100000000 | B0 | 176 | 10110000 | B | 11 | 1011 |
C000 | 49152 | 1100000000000000 | C00 | 3072 | 110000000000 | C0 | 192 | 11000000 | C | 12 | 1100 |
D000 | 53248 | 1101000000000000 | D00 | 3328 | 110100000000 | D0 | 208 | 11010000 | D | 13 | 1101 |
E000 | 57344 | 1110000000000000 | E00 | 3584 | 111000000000 | E0 | 224 | 11100000 | E | 14 | 1110 |
F000 | 61440 | 1111000000000000 | F00 | 3840 | 111100000000 | F0 | 240 | 11110000 | F | 15 | 1111 |
Následující ASCII tabulka slouží k převodu ASCII znaků:
20 - 2F | 30 - 3F | 40 - 4F | 50 - 5F | 60 - 6F | 70 - 7F | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hex | dek | ASCII | hex | dek | ASCII | hex | dek | ASCII | hex | dek | ASCII | hex | dek | ASCII | hex | dek | ASCII |
20 | 32 | mezera | 30 | 48 | 0 | 40 | 64 | @ | 50 | 80 | P | 60 | 96 | ` | 70 | 112 | p |
21 | 33 | ! | 31 | 49 | 1 | 41 | 65 | A | 51 | 81 | Q | 61 | 97 | a | 71 | 113 | q |
22 | 34 | " | 32 | 50 | 2 | 42 | 66 | B | 52 | 82 | R | 62 | 98 | b | 72 | 114 | r |
23 | 35 | # | 33 | 51 | 3 | 43 | 67 | C | 53 | 83 | S | 63 | 99 | c | 73 | 115 | s |
24 | 36 | $ | 34 | 52 | 4 | 44 | 68 | D | 54 | 84 | T | 64 | 100 | d | 74 | 116 | t |
25 | 37 | % | 35 | 53 | 5 | 45 | 69 | E | 55 | 85 | U | 65 | 101 | e | 75 | 117 | u |
26 | 38 | & | 36 | 54 | 6 | 46 | 70 | F | 56 | 86 | V | 66 | 102 | f | 76 | 118 | v |
27 | 39 | ' | 37 | 55 | 7 | 47 | 71 | G | 57 | 87 | W | 67 | 103 | g | 77 | 119 | w |
28 | 40 | ( | 38 | 56 | 8 | 48 | 72 | H | 58 | 88 | X | 68 | 104 | h | 78 | 120 | x |
29 | 41 | ) | 39 | 57 | 9 | 49 | 73 | I | 59 | 89 | Y | 69 | 105 | i | 79 | 121 | y |
2A | 42 | * | 3A | 58 | : | 4A | 74 | J | 5A | 90 | Z | 6A | 106 | j | 7A | 122 | z |
2B | 43 | + | 3B | 59 | ; | 4B | 75 | K | 5B | 91 | [ | 6B | 107 | k | 7B | 123 | { |
2C | 44 | , | 3C | 60 | < | 4C | 76 | L | 5C | 92 | \ | 6C | 108 | l | 7C | 124 | | |
2D | 45 | - | 3D | 61 | = | 4D | 77 | M | 5D | 93 | ] | 6D | 109 | m | 7D | 125 | } |
2E | 46 | . | 3E | 62 | > | 4E | 78 | N | 5E | 94 | ^ | 6E | 110 | n | 7E | 126 | ~ |
2F | 47 | / | 3F | 63 | ? | 4F | 79 | O | 5F | 95 | _ | 6F | 111 | o | 7F | 127 | del |
Předdefinované konstanty
Překladač definuje několik předdefinovaných konstant usnadňujících použití registrů a konstant procesoru. Hodnoty některých konstant závisí na zvoleném typu procesoru. Předdefinované konstanty mají charakter proměnných, jejich hodnotu lze předefinovat příkazy SET nebo EQU.
Adresy registrů
název | popis | hodnota |
---|---|---|
EEADR (EEAdr, Eeadr, eeadr) | adresa registru EEADR | podle typu procesoru |
EEADRH (EEAdrH, Eeadrh, eeadrh) | adresa registru EEADRH | podle typu procesoru |
EECON1 (EECon1, Eecon1, eecon1) | adresa registru EECON1 | podle typu procesoru |
EECON2 (EECon2, Eecon2, eecon2) | adresa registru EECON2 | podle typu procesoru |
EEDATA (EEData, Eedata, eedata) | adresa registru EEDATA | podle typu procesoru |
EEDATH (EEDatH, Eedath, eedath) | adresa registru EEDATH | podle typu procesoru |
FSR (Fsr, fsr) | adresa registru FSR | 4 |
INDF (IndF, Indf, indf) | adresa registru INDF | 0 |
INTCON (IntCon, Intcon, intcon) | adresa registru INTCON | 0Bh |
OPTION_REG (Option_Reg, Option_reg, option_reg) | adresa registru OPTION | 81h |
PCL (Pcl, pcl) | adresa registru PCL | 2 |
PCLATH (PCLatH, Pclath, pclath) | adresa registru PCLATH | 0Ah |
PORTA (PortA, Porta, porta) | adresa registru PORTA | 5 |
PORTB (PortB, Portb, portb) | adresa registru PORTB | 6 |
PORTC (PortC, Portc, portc) | adresa registru PORTC | 7 |
PORTD (PortD, Portd, portd) | adresa registru PORTD | 8 |
PORTE (PortE, Porte, porte) | adresa registru PORTE | 9 |
STATUS (Status, status) | adresa registru STATUS | 3 |
TMR0 (Tmr0, tmr0) | adresa registru TMR0 | 1 |
TRISA (TrisA, Trisa, trisa) | adresa registru TRISA | 85h |
TRISB (TrisB, Trisb, trisb) | adresa registru TRISB | 86h |
TRISC (TrisC, Trisc, trisc) | adresa registru TRISC | 87h |
TRISD (TrisD, Trisd, trisd) | adresa registru TRISD | 88h |
TRISE (TrisE, Trise, trise) | adresa registru TRISE | 89h |
Čísla bitů v registrech
název | popis | hodnota |
---|---|---|
C (c) | číslo bitu C registru STATUS | 0 |
DC (Dc, dc) | číslo bitu DC registru STATUS | 1 |
EEIE (Eeie, eeie) | číslo bitu EEIE registru INTCON | 6 |
EEIF (Eeif, eeif) | číslo bitu EEIF registru EECON1 | 4 |
GIE (Gie, gie) | číslo bitu GIE registru INTCON | 7 |
INTEDG (IntEdg, Intedg, intedg) | číslo bitu INTEDG registru OPTION | 6 |
INTE (IntE, Inte, inte) | číslo bitu INTE registru INTCON | 4 |
INTF (IntF, Intf, intf) | číslo bitu INTF registru INTCON | 1 |
IRP (Irp, irp) | číslo bitu IRP registru STATUS | 7 |
NOT_PD (Not_PD, Not_pd, not_pd) | číslo bitu /PD registru STATUS | 3 |
NOT_RBPU (Not_RBPU, Not_rbpu, not_rbpu) | číslo bitu /RBPU registru OPTION | 7 |
NOT_TO (Not_TO, Not_to, not_to) | číslo bitu /TO registru STATUS | 4 |
PS0 (Ps0, ps0) | číslo bitu PS0 registru OPTION | 0 |
PS1 (Ps1, ps1) | číslo bitu PS1 registru OPTION | 1 |
PS2 (Ps2, ps2) | číslo bitu PS2 registru OPTION | 2 |
PSA (Psa, psa) | číslo bitu PSA registru OPTION | 3 |
RBIE (Rbie, rbie) | číslo bitu RBIE registru INTCON | 3 |
RBIF (Rbif, rbif) | číslo bitu RBIF registru INTCON | 0 |
RD (Rd, rd) | číslo bitu RD registru EECON1 | 0 |
RP0 (Rp0, rp0) | číslo bitu RP0 registru STATUS | 5 |
RP1 (Rp1, rp1) | číslo bitu RP1 registru STATUS | 6 |
T0CS (T0cs, t0cs) | číslo bitu T0CS registru OPTION | 5 |
T0SE (T0se, t0se) | číslo bitu T0SE registru OPTION | 4 |
T0IE (T0ie, t0ie) | číslo bitu T0IE registru INTCON | 5 |
T0IF (T0if, t0if) | číslo bitu T0IF registru INTCON | 2 |
WR (Wr, wr) | číslo bitu WR registru EECON1 | 1 |
WREN (WrEn, Wren, wren) | číslo bitu WREN registru EECON1 | 2 |
WRERR (WrErr, Wrerr, wrerr) | číslo bitu WRERR registru EECON1 | 3 |
Z (z) | číslo bitu Z registru STATUS | 2 |
Různé konstanty
název | popis | hodnota |
---|---|---|
BIT0 (Bit0, bit0) | hodnota bitu 0 | 1 |
BIT1 (Bit1, bit1) | hodnota bitu 1 | 2 |
BIT2 (Bit2, bit2) | hodnota bitu 2 | 4 |
BIT3 (Bit3, bit3) | hodnota bitu 3 | 8 |
BIT4 (Bit4, bit4) | hodnota bitu 4 | 16 |
BIT5 (Bit5, bit5) | hodnota bitu 5 | 32 |
BIT6 (Bit6, bit6) | hodnota bitu 6 | 64 |
BIT7 (Bit7, bit7) | hodnota bitu 7 | 128 |
F (f) | druhý parametr instrukce - výsledek do F | 1 |
W (w) | druhý parametr instrukce - výsledek do W | 0 |