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)
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.
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=(rh243/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)