Elektroonikafoorum.com

Täisversioon: PIC ja ujupunktarvutused
Teile näidatakse hetkel lihtsustatud versiooni tekstist. Vaadake täisversiooni õiges formaadis.
Kas keegi on juhtunud kasutama PICi ujupunktarvutit (assembleris)? Probleem on keerukamates funktsioonides nagu exp, log, astendamine. Nad on kõik esindatud failis ef32.a17 . Õige vastuse annab vaid ruutjuurika f-n, muud arvutavad ... mida iganes. Kaasa pandud näidis annab samuti vale tulemuse.
Kui juurikas arvutab "otse" siis muud f-nid kasutavad mingeid lähenduspolünoome ja teevad sellega veel mõningaid mulle mitte eriti arusaadavaid trikke. Arvan, et viga on kuidagi seotud nimelt nende polünoomide kasutamisega (makrod POL132, POL32 jne).
E astet on vaja veeauru osarõhu arvutamiseks temp., niiskuse ja rõhu järgi. Valemeid on teisigi aga kõik nad paraku sisaldavad astendamist.

Oskab keegi aidata ?
(21-05-2014, 08:14 AM)felch Kirjutas: [ -> ]Kas keegi on juhtunud kasutama PICi ujupunktarvutit (assembleris)?
Ei ole kasutanud assembleris aga...
Olen kasutanud C-s. Paistis töötavat.
Transleeritud programmist võib saada ka asm versiooni.

C astendus on selline:
pow.c

#include <math.h>
#include <errno.h>

double
pow(double x, double y)
{
unsigned char sign = 0;
unsigned long yi;

if(x == 0.0) {
if (y <= 0.0) {
errno = EDOM;
}
return 0.0;
}
if(y == 0.0)
return 1.0;
if(x < 0.0) {
yi = (unsigned long)y;
if(yi != y) {
errno = EDOM;
return 0.0;
}
sign = yi & 1;
x = -x;
}
x = exp(log(x) * y);
if(sign)
return -x;
return x;
}

Oled Sa ikka veel C vihkaja?
Kas katseta(me-d)?

********
Proov 1:
Programm
d10=10.0;
d3=3.0;
dpow=pow(d10, d3);
d31=2.9999;
dpow1=pow(d10, d31);

Tulemused
d10 = 10.0000000
d3 = 3.00000000
d31 = 2.99987793
dpow = 1000.03125
dpow1 = 999.859375
(21-05-2014, 07:01 PM)A.R. Kirjutas: [ -> ]C astendus on selline:
pow.c...

Väga hea kuid mul on kogu proge juba valmis ja mõistagi asmis. Vaja vaid osarõhud arvutada. Selleks küll C-d pruukida ei kavatse.
Ilmselt tuleb kas lib-is kasutatavasse aprokimeerimisse süüvida või lähendada valem polünoomile tabelarvutusega. Viimase ma tegelikult tegin ära ka ja võiks toimida. Jääb siiski sportlik hasart too kakane lib tööle ajada. Võiks ju toimida, isegi peaks... Miks siis minul mitte? Lib'i on mul ilmselt edaspidi ka vaja.
[attachment=62]
See lõik mis arvutab astet on C asm-is selline.
Vast on kasuks
(21-05-2014, 10:35 PM)A.R. Kirjutas: [ -> ]See lõik mis arvutab astet on C asm-is selline.

See lõik (fcall _pow) ise on paraku puudu. Näha on vaid sisendandmete arvutisse tõstmine...
(22-05-2014, 07:49 AM)felch Kirjutas: [ -> ]See lõik (fcall _pow) ise on paraku puudu. Näha on vaid sisendandmete arvutisse tõstmine...

Öösel mõeldes tundus ka et midagi on viltu.
Jalutasin selle POWi debugeri all läbi ja
see avas 8 alamosa ja keerutas seal nagu jõudis.

MPLAB all paistab see disassembly Listing teistsugune.
Tegin otse copy.

Seal on nüüd ASMina need osad sees segamini C käskudega.
Vast on abiks
[attachment=63]
Nimelaiendit asm ja lst paneb foorum pahaks, txt-ga lepib.
Nägin unes veel ühte võimalust.
Ütled et on valmis suur asm ja ei taha ümber teha.
Aga kui teha C-s arvutus ja kutsuda sinna sisse see valmis asm

Kontrollisin, töötab:
Näide
___________________
C-s tehtud omistamised
F56 30CD MOVLW 0xcd
F57 00AF MOVWF 0x2f
F58 30CC MOVLW 0xcc
F59 00B0 MOVWF 0x30
F5A 303F MOVLW 0x3f
F5B 00B1 MOVWF 0x31

Sama lõik disasmist kopeeritud _asm - _endasm vahele
19: _asm
20: MOVLW 0xcd
F5C 30CD MOVLW 0xcd
21: MOVWF 0x2f
F5D 00AF MOVWF 0x2f
22: MOVLW 0xcc
F5E 30CC MOVLW 0xcc
23: MOVWF 0x30
F5F 00B0 MOVWF 0x30
24: MOVLW 0x3f
F60 303F MOVLW 0x3f
25: MOVWF 0x31
F61 00B1 MOVWF 0x31
26: _endasm

See asmi osa lubab kasutada debug all ka breakpointe ja
vaadata mis tegelikult toimub.
___________
Olgu, nii ei ole ilus ja aus teha.
Aga kes seda keelab?
Tänud !
Ma ei taha enam kellelgi õudusunenägusid esile kutsuda... Smile
Lahendasin asja hetkel nii, et arvutasin veeauru sisaldused excelis tabelina välja ja leidsin lähenduspolünoomi. Sisaldab vaid korrutamist/jagamist. Töötab ! Tabel kehtib vahemikus -25C...+25C aga viga piiride ületamisel ei ole >10% mis antud lahenduses on lubatav. Seade annab nimelt soovitusi kas kiriku uksi oleks mõistlik avada tuulutamiseks (et ruumi niiskust alandada) või mitte. Mõned lisamugavused on veel.
A.R-i astmefunktsiooni katsetan ka kohe üle kui seadme lõplikult tööle saan. Hetkel ...nagu annab lootust.

Kui küllastunud veeauru rõhu tabel kedagi peaks huvitama, andke teada - laen üles.