Matematika PIC (24B) pro osmibitové mikroprocesory.

Matematika PIC (24B).

Matematické výpočty se nejsnáze programují v nějakém vyšším programovacím jazyku, například C. Bohužel, volně šířený překladač PICC, pracuje jenom s omezenou částí programové paměti. Ale hlavní důvod, proč jsem se vzdal snadného zápisu matematiky v Céčku je, že po kompilaci i jednoduchého výpočtu, je strojový kód neúměrně dlouhý. Není-li dostatek volného místa, musíme sáhnout po větším mikroprocesoru, nebo to vypočítat jinak.

Matematika PIC má samozřejmě jisté omezení.
K dispozici jsou jenom základní funkce.
Programátor musí dát pozor, aby se výpočet nedostal mimo rozsah 24 bitů.
Pracuje se pouze s celými čísly. Pokud potřebujeme desetinná místa, musíme upravit vstupní data.

Používám matematické podprogramy v řadě konstrukcí. Naposledy výpočet vlhkosti a teploty z čidla SHT11.
V Céčku se to dá zapsat na 3 řádky. V assembleru to už je horší, ale také to jde.

V příloze je zdrojový text MPIC24B.asm který obsahuje matematické podprogramy dělení, násobení, odečítání, sčítání a násobení konstantou.
Na začátku je testovací program k simulaci výpočtu v MPLABu.
MPIC24B.asm (8.49 KB)

8:00 - Jsem zkoušel vydělit číslo číslem a nějak to nefunguje. Konktétně 230400 / 999.

8:31 - Moje chyba, už to jede, i se zbytkem na 3 desetinna místa. SUPER

Pokud si ale překladač koupíš, máš k dispozici celou paměť a navíc funguje optimalizace kódu i s 32bit matematikou.

Tímto děkuji ondrovi.cer i honzovi3. Moc jste mi pomohli chlapi. Měsíc se mořím a zkouším všelijaké složité rutiny od Microchipu i z jiných míst na internetu a tady je jednoduché, srozumitelné a hlavně funkční řešení. Ještě jednou srdečný dík.

Jsem zkoušel i ty rutiny od Microchipu a nepodařilo se mi je rozjet. :blush: :blush: :blush:
Ale ondra.cer nabídl jednoduché a super řešení.
A mám takové tušení, že od něj mám i rutiny na SMT160-30.

Prosím nešlo by poradit jak mám přepočítat v asembleru pro PIC teplotu a vlhkost z čidla SHT11. Díval jsem se a v těch vzorečcích jsou desetinná čísla a rutiny výše uvedené jsou jen pro celá čísla

nešlo by to třeba tak že mám např číslo 0,0367 tak misto něj použiju 367 a pak to třeba vydělím nebo vynásobím a výsledek vydělím 10000 což je vlastně počet des. míst

Příklad s rutinama co jsou použity výš:
potřebuji např. 25421 x0,0367
tak použiju 25421*367/10000

Ano, postupujete správně.
Dá se tak rozšířit výpočet za desetinnou čárku.
Často používám číslo 8192. Snadno a rychle se to dělí nebo násobí, protože ve dvojkové soustavě to je 10 0000 0000 0000.
Hlavně je nutné pohlídat, aby se to vešlo do 3 bajtů!

A nyní k čidlu SHT11.
Výpočet lineární relativní vlhkosti (RHL) z načtené hodnoty (rh).
RHL=(rhC2)+(rhrhC3)+C1
kde C1=-4; C2=0,0405; C3=-0,0000028
To je katalogový vzorec pro 12-bitové rozlišení (rh).
Výsledek je lineární relativní vlhkost v procentech.
Pro Céčko je to jednoduchý zápis, ale pro assembler jsem to upravil takto:
HL=(rh
243/600)-(rh*rh/35714)-40
Výsledek (HL) je lineární relativní vlhkost *10 v procentech.
Násobím to deseti, abych dostal na displej jedno desetinné místo.
Předem se omlouvám fajnšmekrům, není to stoprocentně přesné (to platí pro všechny úpravy).

Pokračujeme výpočtem teploty (TC) z načtené hodnoty (t).
TC=t*0,01-40
To je opět katalogový vzorec pro 14-bitové rozlišení (t).
Úprava pro assembler:
TC=t/10-400
Výsledek (TC) je potom ve stupních Celsia *10

Relativní vlhkost se ještě upravuje podle aktuální teploty.
Katalogový vzorec:
RHK=(TC-25)(rhT2+T1)+RHL
kde T1=0,01; T2=0,00008; TC=teplota.
Upravený vzorec:
HK=((TC-250)(rh10/125+10)+(HL*1000))/1000
Výsledek je opět v procentech *10.

Všechny upravené vzorce už jdu vypočítat s MPIC24B.
Pravda - je to mnohem složitější než v Céčku a s nepatrnou chybou.
Koukněte se na chybu v tabulce RHT09.xls
RHT09.xls (38.5 KB)

děkuji moc vyzkouším, potom dám vědět a ještě jsem se chtěl zeptat jestli nepoužíváte i výpočet rosného dobu? Chtěl bych si postavit meteostanici

Rosný bod jsem zatím nepotřeboval.
Přiznám se, že ani neznám vzorec.

Hoši,
v poslední verzi MPLAB je HI-TECH kompilátor pro řadu PIC10xx, 12xx, 16xx, zdarma a zřejmě bez omezení velikosti paměti.

Vl.

sa mi nedza skor je max 2kB.