Matematická knihovna pro 8051 - FP_MATH & FP_FUNC.



FP_MATH.INC

      Tato matematická knihovna pro jednočipové mikropočítače 8051 umožňuje provádět výpočty v pohyblivé řádové čárce (s reálnými čísly). Její použití je velmi jednoduché a formát čísel přehledný. Rozšíření knihovny počítá i goniometrické a exponenciální funkce.
     Podobných knihoven existuje více, ale buď je jejich ovládnutí složité, nebo potřebují externí RAM, nebo mají argumenty uložené v BCD tvaru - to je nevýhodné, pokud chceme pracovat s naměřenými hodnotami v HEX tvaru.

Schopnosti knihovny
      Základní knihovna FP_MATH.INC obsahuje rutiny pro sčítání (FP_ADD), odčítání (FP_SUBB), násobení (FP_MUL), dělení (FP_DIV) reálných čísel. Vstupem do těchto podprogramů jsou adresy dvou argumentů umístěných ve vnitřní paměti RAM. Tyto adresy se předají v registrech R0 a R1. Výsledkem je přepsán obsah čísla na adrese R0. Přesnost matematických výpočtů je 7-8 míst, rozsah čísel je -1e127 až 1e127, přetečení není kontrolováno.

Výpočet tedy lze symbolicky zapsat:
R0 = R0 fce R1

      Výsledek je normován do správného tvaru, podprogramy (až na dále uvedené výjimky) nemění obsahy registrů. Knihovna potřebuje 16 bajtů vnitřní RAM jako pracovní místo.


Formát čísel
     Čísla jsou ukládána v pětibajtové formě. 1. bajt obsahuje znaménko (0 je plus, FFh je minus); následující 3 bajty obsahují vyjádření čísla jako celočíselné hodnoty v hexadecimální formě a konečně poslední bajt obsahuje exponent v pseudo- doplňku (80h je 100, 84h je 104, 7eh je 10-2 atd).

1.bajt - znaménko 0 - plus, FFh - minus
2.bajt   \
3.bajt   | - číslo
4.bajt   /
5.bajt - exponent

Každé reálné číslo lze vyjádřit ve tvaru A*10B, kde A je mantisa (zadaná v hexa v druhém, třetím a čtvrtém bajtu) a B je exponent (v pátém bajtu v pseudodoplňku).
Příklady:
1,254987 = 1254987 * 10-6, takže zapsáno: 00 = znaménko +
 13
 26 = číslo 1254987 v hexadec.
 4B
 7A = exponent -6 (80h-6)


-3,5 = -35 * 10-1, zapsáno v pamětiFF = znaménko -
 00
 00 = číslo 35 v hexadec.
 23
 7F = exponent -1 (80h-1)
atd.


Přehled funkcí (+ názvy registrů, ve kterých jsou adresy argumentů)

Funkce1.argument2.argumentVýsledek
FP_ADDR0 - 1.sčítanecR1 - 2.sčítanecR0 - součet
@R0=@R0 + @R1
FP_SUBBR0 - menšenecR1 - menšitelR0 - rozdíl
@R0=@R0 - @R1
FP_MULR0 - 1.násobenecR1 - 2.násobenecR0 - násobení
@R0=@R0 * @R1
FP_DIVR0 - dělenecR1 - dělitelR0 - podíl
@R0=@R0 / @R1
FP_PRINT   vypíše číslo přes sériovou linku
FP_COPYR0 - zdrojová adr.R1 - cílová adr.zkopíruje číslo z R0 na R1
@R1 = @R0
FP_COMPR0 - 1.čísloR1 - 2.čísloporovná čísla, výsledek:
ACC=1 @R0 > @R1
ACC=0 @R0 = @R1
ACC=FFh @R0 < @R1
FP_SIGNR0 - 1.číslo znaménko čísla
ACC=1 @R0 > 0
ACC=0 @R0 = 0
ACC=FFh @R0 < 0
FP_EXCHR0 - 1.čísloR1 - 2.číslozamění čísla
FP_INVERTR0 - adresa čísla zinvertuje číslo
@R0 = - @R0


FP_0R0 - adresa čísla vloží číslo 0
FP_1R0 - adresa čísla vloží číslo 1
FP_2R0 - adresa čísla vloží číslo 2
FP_10R0 - adresa čísla vloží číslo 10
FP_PIR0 - adresa čísla vloží Ludolfovo číslo PI (3,141592)



Rozšíření knihovny FP_FUNC.INC


Toto rozšíření umožňuje výpočet základních goniometrických a exponenciálních funk cí. Na svoji práci ovšem spotřebuje dalších 15 bajtů paměti (celkem tedy 31 bajtů) a je tedy vytvořeno jako doplněk knihovny FP_MATH. Všechny obsažené funkce mají jediný argument, jehož adresa se předá v registru R0. Výsledek je uložen na stejnou adresu, a proto chceme-li argument zachovat, musíme ho předem někam zkopírovat (např. funkcí FP_COPY).Přesnost tohoto rozšíření je nižší, zpravidla na čtyři desetinná místa.

Obsažené funkce:


FP_SINR0 - adresa čísla@R0 = SIN (@R0)
FP_COSR0 - adresa čísla@R0 = COS (@R0)
FP_LNR0 - adresa čísla@R0 = LN (@R0)
FP_EXPR0 - adresa čísla@R0 = EXP (@R0)
FP_TANR0 - adresa čísla@R0 = TAN (@R0)




ZNÁMÉ CHYBY VE FP_MATH
Knihovna fp_math nemá známé chyby. Pokud Vás mate, že z některých funkcí, které by neměly měnit druhý argument se tento vrátí změněn, dříve než začnete spílat autorovi, zkontrolujte, zda obsah není jen jiným vyjádřením téhož čísla. Téměř všechny funkce provádí normalizaci tak, jak je pro výpočet nejlepší, a někdy například změní zadané číslo 5 = 5 * 100 na 5000000 * 10-6. Je však zřejmé, že na hodnotě čísla se nemění nic.
ZNÁMÉ CHYBY VE FP_FUNC
Tato knihovna počítá funkce rozkladem do řad. Protože počet členů rozvoje je omezen, dávají funkce správný výsledek jen při malém argumentu. Nečekejte, prosím, že se Vám podaří spočítat, kolik je E125. Jde o to, že 8051 má malou paměť RAM, a aby nebyla knihovna neúnosně velká, byl použit tento druh výpočtu. Na běžné výpočty přesnost funkcí postačuje.


Tento software vytvořil NEGATRON research - Martin Hankovec

Vytisknout stránku Velikost 13 kByte

Zpátky
© DH servis 2002 -