Sida 4 av 6

Re: temp-station bygge

Postat: 19 april 2010, 07:43:20
av diman
Nu har jag kört fast (igen) och denna gång kommer jag inte loss på egen hand.
det handlar om beräkningar och matte har en gång i tiden varit min vän, men sen bråkade vi och är idag ovänner.

Som det syns i det tidigare inlägget så mäter jag T1 och T2.
formeln för att räkna ut temperaturen är
T1/T2 = 0.32 + 0.0047 * t (°C)
vilket med kända T1 och T2 gör att man kan räkna ut temperaturen mha följande:

t (°C) = (T1/T2 - 0.320) / 0.0047 (resultatet skall även avrundas till en decimal t.ex. 21.3433454867 blir 21.3 °C )

jag har problem med att implementera detta i assembler... :oops: (nå...)
egentligen vet jag inte ens var jag ska börja, för division i assembler med tal under 1 och floating point är (hittills) bortom min förståelse.
Det finns x antal exempel på nätet med de flesta handlar om heltalsdivisioner och det enda som handlade om flyttal var så dåligt kommenterat att jag förstod ingenting av det.

Re: temp-station bygge

Postat: 19 april 2010, 08:42:13
av vfr
Det finns nästan aldrig någon nytta med att använda flyttal i mikrokontrollers. Använd fix point aritmetik istället och räkna på "vanligt" sätt. Om du bestämmer att du kör med två decimaler så kan 12345678 betyda 123456.78. Sedan räknar du med heltal.

Använd också bråk för att representera konstanter med decimaler. Ska du multiplicera med 1.5 t.ex, så multiplicera med 3 och dela med 2. Dela med 2 är ju väldigt enkelt.

Re: temp-station bygge

Postat: 19 april 2010, 09:15:59
av sodjan
En annan väldigt vanlig metod är att helt enkelt räkna ut en
översättningstabell i förväg (Excel eller vad man nu vill använda)
och bara göra en tabell-uppslagning i koden. Ingen beräkning
alls under drift alltså. I detta fall var det ju ett linjärt förhållande
så vitt jag kan se i och för sig.

En annan sak är att labba lite med andra parametrar (inställningar
av timern o.s.v) för att se om man hittar ett läge som ger enklare
("jämnare") konstanter i formeln.

Det ser även ut som att du först tänker räkna om T1 och T2 till
sekunder !?. Det är naturligstvis helt onödigt (om det är så), det
är bara att anpassa konstanterna till vilken tidbas T1 och T2 nu
råkar ha.

Och som vfr sa, glöm floating point helt. Detta går att optimera på
betydligt smartare sätt.

Re: temp-station bygge

Postat: 20 april 2010, 17:45:22
av diman
:humm: intressanta tillvägagångssätt.

en färdig tabell med en decimal i noggrannhet (20,4 t.ex) gör att jag behöver 1000 rader för temperaturer mellan 1° och 100°.
Nå, visserligen inte så farligt med tanke på att jag har 3K programminne kvar, och programmet lär nog inte växa mycket mer, då
det är i princip färdigt.
Jag tänkte inte omvandla något till sekunder, då det är helt irrelevant i frågan. Det som har betydelse är resultatet av T1/T2 och vad T1 eller T2 egentligen är kan
man strunta i.

Re: temp-station bygge

Postat: 20 april 2010, 20:31:14
av sodjan
> en färdig tabell med en decimal i noggrannhet (20,4 t.ex) gör att jag behöver 1000 rader för temperaturer mellan 1° och 100°.

Ja, förrutsatt att du kan få fram 1000 olika tider från timern !
Tabellen behöver naturligstvis inte vara större än antalet mätbara "steg".
Om temperaturen då ibland hoppar öven en tiondel spelar ingen roll.

> Det som har betydelse är resultatet av T1/T2

Ah, OK, så var det ju ja. Men hur är det, kommer både T1 och T2
att variera över det aktuella temperaturområdet ? Jag minns inte
heller att/om det fanns någon referens till den aktuella temp-givaren.

Re: temp-station bygge

Postat: 22 april 2010, 18:46:59
av diman
hmm ... detta är aningen segt..
har nu kammat nätet för olika tutorials, hittar några som förstod mig på, men de faller redan på den första beräkningen:

T1 / T2 är det första steget i ekvationen.
De värden ändras naturligtvis, dvs inga konstanter.
och allra första bekymret är att T1 är alltid mindre än T2 så resultatet är aldrig ett heltal... divisionen producerar ett tal under 1.

Någon som kan hjälpa mig med detta, förklara så att jag fattar, och/eller peka i rätt riktning...







en tanke slog mig här: Detta hade inte varit något problem om jag körde med C istället för Assembler, men jag vill inte.
Däremot, såsom det finns möjlighet att infoga asm-kod i C program, kan man göra det omvända, dvs infoga C-kod i assembler program ?
klarar någon kompilator det ? eller är jag nu ute och cyklar...

Re: temp-station bygge

Postat: 22 april 2010, 21:32:18
av Swech
t (°C) = (T1/T2 - 0.320) / 0.0047 (resultatet skall även avrundas till en decimal t.ex. 21.3433454867 blir 21.3 °C )

(T1/T2) / 0.0047 - (0.320/0.0047)

= 212.276*T1/T2 - 68.08

Så är det upp till vilken upplösning som behövs.
du bör klara dig om du tar
21227 * t1 / t2 - 6808 svar med 2 decimaler

21227*t1 = max 32 bitar
32 bitar / 16 bitar bör vara lätt att hitta exempel på.

Swech

Re: temp-station bygge

Postat: 23 april 2010, 07:13:36
av diman
tack så mycket :)
provar detta så fort jag få chansen.

Re: temp-station bygge

Postat: 24 april 2010, 08:47:22
av diman
sitter och räknar lite...
men får jag fråga: var fick du 212.276 ifrån ?

Re: temp-station bygge

Postat: 24 april 2010, 10:44:15
av Swech
1/0.0047

Re: temp-station bygge

Postat: 5 maj 2010, 18:38:54
av diman
efter ett antal om och men, så har jag hittat en mathlib i asm för just pic och försökt implementera det i programmet.
divisionen skulle utföras av detta bibliotek. Jag trodde saken var biff och blev glad, tills det slog mig att
jag måste även jobba med negativa värden ...
om temp ute är minus något så kommer hela ekvationen involvera negativa tal. Och det bibliotek som jag har hittat klarar inte av det.

Detta är inte så där jätteroligt och aningen frustrerande och jag funderar allvarligt på att överge assembler (iallafal i detta projekt) och gå över till C.

Därför undrar jag
1: om Hi-tech C kommer att ge mig samma möjligheter som vanlig C/C++ att i koden bara skriva

Kod: Markera allt

int i;
i = (T1/T2 - 0.320) / 0,0047;
och vips har jag resultatet (även om det är negativt)...

eller har PIC C samma fallgropar gällande ekvationer som Assembler ?

och 2:
finns det en lösning för mitt problem i assembler ?

Re: temp-station bygge

Postat: 5 maj 2010, 21:36:30
av danielr112
Så gör jag i MikroC ivf...

Re: temp-station bygge

Postat: 5 maj 2010, 21:51:13
av Swech
212.276*T1/T2 - 68.08

Kan T1 och/eller T2 vara negativ?
Om inte så är det ju i slutet då du drar bort 68.08 från ditt resultat, inte negativt i divisionen.....
Oavsett så är det bra att öva lite positivt negativt innan man fuskar med C :D

Swech

Re: temp-station bygge

Postat: 6 maj 2010, 07:05:23
av diman
> Swech
det har du ju rätt i... :vissla:
Jag provar igen! Deadline för projektet närmar sig dock...


>daniel
Tack! känns bra att veta att jag har en snabb utväg

Re: temp-station bygge

Postat: 10 maj 2010, 07:03:57
av diman
Nu har jag kommit vidare en aning
la assembler åt sidan för tillfället, och skrev om programmet i Hi-tech C

Samplingsfunktionen reducerades till fyra while loopar :-)

Kod: Markera allt

float sample_sensor1()
{
    unsigned short long T1;
    unsigned short long T2;
    float dutycycle;

    while (RA4);        //If high , wait till low
    while(!RA4);        //If low, waith for rising edge
    while(RA4)          //  just turned high, start sampling
    {
           T1++;
           T2++;
    }
    while(!RA4)        //  just turned low, continue with T2
           T2++;

    dutycycle = (T1 / T2);
    return  dutycycle;
}
och ekvationen räknas ut direkt i koden :

Kod: Markera allt

float dc1;
float Temp;

dc1 = sample_sensor1();
Temp = (dc1 - 0.32) / 0.0047;   
Kollade på memory gauge före den raden skrevs och efter - Mamma Mia !!!! ca 390 words för denna ekvation :shock:

Känns att närmar mig målet :-) Skönt !