Sida 2 av 4

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 4 oktober 2010, 18:02:01
av sodjan
> @sodjan: Var utläser du det?

Genom att han vill ange vilken givare det är i koden och sedan bygga om det.

ds77, för mig låter det där lite bakvänt. Det är ju inte utrymmet i programminnet som
ska styra vilken funktion mna vill ha, det är tvärtom. Kraven på applikationen bestämmer
funktionen och det i sin tur bestämmer hur mycket minne man behöver...

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 4 oktober 2010, 18:12:00
av ds77
Visst men nu hade han ju valt processor, visserligen är det ju enkelt att öka på med 88/168/328 beroende på vad man har för krav på kostnad. Det beror ju lite på om man gör ett 10-tal enheter eller 10 miljoner också..

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 4 oktober 2010, 18:34:55
av hubben
sodjan skrev:> @sodjan: Var utläser du det?

Genom att han vill ange vilken givare det är i koden och sedan bygga om det.
Så kan man tänka, eller så kan man tänka som så att han bara inte tänkt på möjligheten att ställa sensortyp via dip/bygel och ändå tänkt kompilera in alla sensorer när han bygger. ;-)
Men ska du ändra i koden och bygga om varje gång så är det ju en bättre lösning att bara inkludera de delar av koden som behövs.

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 5 oktober 2010, 11:36:02
av jesse
>Det beror ju lite på om man gör ett 10-tal enheter eller 10 miljoner också..

... eller en enda, där det redan sitter en ATmega48.

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 09:54:15
av StRob
I just detta fall skulle jag baka kunna skriva ihop nåt som fungerar för just detta kort till just den givaren, hur simpelt som helst. Ingen annan kommer troligen se koden. MEN. Lika viktigt som att programmkoden fungerar, är att ja faktiskt lär mig hur man gör det på ett snyggt sätt, "rätt" sätt, så jag vet hur jag ska göra nästa gång då det kanske är mer komplicerat. det jag efterfrågade var:
- Jag vill kunna gå in i koden om 3 år och lätt kunna ändra faktorer som givarmodell och FLOW_LIMIT, utan att behöva sätta mig in i koden då.
- Jag vill göra det på ett bra sätt! En ny programmerare skall lätt kunna gå in och ändra och se tydligt vad som ska göras. Därför vill jag bara skriva in modell och FLOW_LIMIT t.ex 3,15 liter/min. Compilatorn eller programmet skall ta hand om det. Helst då compilatorn. (Jag vill alltså inte sätta dem till globala variabler, som jag kunde gjort och fått det att fungera utan att lära mig ett dyft)

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 10:07:02
av StRob
Sett ur programkodsperspektiv vill jag alltså Ändra FLOW LIMIT från 3,15 liter/min till något processorn förstår, alltså det counter1-värde som motsvarar 3,15 liter/min för den anslutna givaren. Och då gärna inte i i runtime.

EDIT: Jag skulle nog gärna vilja få alla #defines för givarna i en separat fil då jag inbillar mig att det blir tydligare. Gärna beräkningen för FLOW_LIMIT till Counter-värde också. Synpunkter?
EDIT2: Men när jag försöker ändra FLOW_LIMIT i separat H-fil så klagar den på att den inte att den är definerad och samma som FLOW_LIMIT i c-filen. trots att c-filen ser ut som så:

Kod: Markera allt

#define DN10																		//Type of Flow Sensor DN8-DN25 (8,10,15,20,25) 
 float FLOW_LIMIT = 3.3;													//l/min. Enter desired flow limit for relay switch

#include "SENSOR_TYPES.H"
Jag har provat massa olika datatyper, men det spelar ingen roll. Här är ju tom FLOW_LIMIT global vilket jag ville undvika. Jag vill ha den constant så kompilatorn sköter det, men const float fungerar inte heller. Vad missar jag??
borde jag itne kunna skriva:

Kod: Markera allt

//i C-filen:
const float FLOW_LIMIT = 3.3;
#include "SENSOR_TYPES.H"

//i SENSOR_TYPES.H:
(const int)FLOW_LIMIT *= 100;
Här känner jag mig osäker och önskar gärna mer info hur det funkar..
Det är de absolut första raderna i min c-fil.

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 10:25:32
av jesse
Först får du väl komma på en matematisk formel som anger sambandet mellan flow (liter/minut) och heltalsvärdet i timer1. Sedan kan du ange denna formel i ett macro som använder fördefinierade invariabler som macron.

// ange här flödet i liter per minut i decimalform
#define FLOW 3.15
...
// formel för beräkning av konstant i timer
#define TIMER1_VALUE = (FLOW*300-45)
...
// initierar timern
OCRA1 = TIMER1_VALUE;

och om nu detta värde innehåller decimaler så omvandlar du det til int genom type-cast, eventuellt med avrundning till närmaste heltal:


OCRA1 = (uint16_t)(TIMER1_VALUE+0.5);

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 11:38:48
av StRob
Tack Jesse!
Nu fick ja ordning på det, exakt som jag ville ha! Nu ska ja bara verifiera att det gör det jag tänkt mig..
Så här blev det iaf:

Kod: Markera allt

//C-filen:
//USER DATA:
#define DN10																		//Type of Flow Sensor DN8-DN25 (8,10,15,20,25) 
#define FLOW_LIMIT 3.3													//l/min. Enter desired flow limit for relay switch

#include "SENSOR_TYPES.H"

Kod: Markera allt

//H-filen:
#ifdef DN8						//Sensor type
#define GIVARE 560		//Constant for calculation of equivalent flow-timer-value
#endif

#ifdef DN10
#define GIVARE 1400
#endif

#ifdef DN15
#define GIVARE 3090
#endif

#ifdef DN20
#define GIVARE 6220
#endif

#ifdef DN25
#define GIVARE 12400
#endif


#define TIMER1_FLOW_LIMIT = ((7500*GIVARE)/FLOW_LIMIT)+0.5	//Calculate FLOWLIMIT to the equivalence TIMER1-value
Men vad blir det för värde på TIMER1_FLOW_LIMIT? jag vill ju ha det till ett 16 bit heltal. kan man typecasta en define på nåt sätt?

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 11:59:54
av monstrum
"kan man typecasta en define på nåt sätt?"
Du har nog missförstått define en aning. #define är inget magiskt, det enda som händer är att kompilatorn i princip kör "search and replace". #define APA 55 kommer således byta ut APA överallt där den hittar det och stoppa in 55, precis som om du själv hade skrivit det i koden.
Alltså behöver du inte typecasta TIMER1_FLOW_LIMIT, eftersom det inte ens är en variabel.
Om du t.ex. laddar en variabel "int timervalue = TIMER1_FLOW_LIMIT" så kommer detta kanske att resultera i "int timervalue = 3.38" efter att pre-processorn fixat dina defines, detta i sin tur kommer automagiskt trunkeras till heltalet 3. Din +0.5 löser ju problemet med avrundningen så det har du ju redan löst.

Edit: Ett tips för att slippa riktigt jobbiga buggar. Kapsla in alla dina define-påståenden helt med paranteser! Hemläxa: Vad händer om du skriver TIMER1_FLOW_LIMIT*2?

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 12:59:04
av StRob
Jodå, jag är på det klara med att den bara översätter, hade väl bara tänkt lite för mycket, lite för länge.. Jag ville ha funktion för att avrunda efter översättningen på nåt sätt men förstår att det inte är möjligt.

Angående parenteserna: Är det så här du ville att det skulle se ut:
#define TIMER1_FLOW_LIMIT = (((7500*GIVARE)/FLOW_LIMIT)+0.5)

Misstänker att hemläxan isf är att skillnaden med och utan extra parenteser vore:
Utan: TIMER1_FLOW_LIMIT*2: ==> ((7500*GIVARE)/FLOW_LIMIT)+(0.5*2)
Med: TIMER1_FLOW_LIMIT*2 ==> (((7500*GIVARE)/FLOW_LIMIT)+0.5)*2
Vilket är en betydlig skillnad!
Rätt?

Uppskattar verkligen infon!

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 14:52:59
av jesse
Jag hade gjort så här:

Kod: Markera allt

//USER DATA:
#include "SENSOR_TYPES.H"
#define GIVARE DN10    //Type of Flow Sensor DN8-DN25 (8,10,15,20,25) 
#define FLOW_LIMIT 3.3	//l/min. Enter desired flow limit for relay switch

Kod: Markera allt

//H-filen:
//#define Sensortype - Constant for calculation of equivalent flow-timer-value
#define DN10  1400
#define DN15  3090
#define DN20  6220
#define DN25 12400

#define TIMER1_FLOW_LIMIT = ((7500*GIVARE)/FLOW_LIMIT)+0.5	//Calculate FLOWLIMIT to the equivalence TIMER1-value
>timervalue = 3.38

trodde det inte gick att skriva så, men då är det ju inga problem med decimalerna heller. Inget typecast behövs alltså.

EDIT: rättelse: bytte ut #define GIVARE DN10 1400 mot #define DN10 1400

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 15:02:27
av Icecap
När kompilern räknar ut konstanter är standard att * & / har prioritet över + & - så du har helt rätt!

Men jag skulle tänka om detta med "float", det är en värdetyp man mycket sällan behöver i µC-världen! Bättre är det att fastställa en minsta storlek man vill mäta efter, istället för 3,3L/sek kan man istället räkna heltal och då skala upp till att definiera värdet till 3300mL/sek.

Float ger INTE högre precision men däremot mycket mer kod och långsammare uträkningar.

Exempel: Jag byggde för många år sedan en trippmätare med extra visslor och pukor och en massa funktioner men trippmätardelen skulle trimmas och det gjorde man vid att köra en känd sträcka och låta datorn räkna antal pulser och sedan samköra detta till en sträcka per puls.

Jag beslöt mig för att ha en upplösning på 1/10mm varför alla längder faktisk räknades i detta värde! Kalibreringsvärdet kanske var 1120,3mm varför det sparades som 11203. Detta gav heltalsräkning och det fungerade skitbra, snabbt och effektivt och jag räknade igenom worst case och kom fram till att precisionen faktisk var en aning bättre än den ville ha varit med float.

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 15:32:17
av StRob
@Icecap: µC ska inte köra några floatberäkningar. Tanken är att beräkningarna skall ske av compilatorn.

@Jesse: Jaha, kan mna skriva fler på en och samma rad? Så GIVARE byts ut mot DN10 så står det egentligen: #define DN10 DN10 1400? Om GIVARE är definerad som DN10 vill säga. Behöver man verkligen GIVARE med i: "#define GIVARE DN10 1400" då? Jag behöver nog få detta förklarat närmare. Trodde jag hade koll på det :/

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 15:37:35
av monstrum
Tycker inte det är något fel alls att använda icke-heltal i konstanter som ändå räknas om till heltal i kompileringen, såsom görs ovan.

StRob: Det är fel på användningen av #define. Du skall definiera DN10 till 1400, DN15 till 3090 osv, sedan har du en enda definition av GIVARE, som du väljer till DN10, DN15, etc.
"#define GIVARE DN10 1400" blir rappakalja

Off topic:
Angående flyttal eller inte i övrig exekverad kod så är det inte alltid lönsamt att undvika. I mitt UAV-projekt jämförde jag att köra 32-bitars floats mot att köra fixpunkt (tror jag körde 22.10 eller nåt sånt) och det var inte många procent långsammare till slut. Detta var på en ARM, testat både i thumb- och arm-läge.

Det är också sant att floats inte ger högre precision, men dock mycket större omfång. Testa att implementera ett 6:e ordningens filter med 32-bitars fixpunkt så märks det rätt tydligt.

Däremot så tjänar man ju givetvis massor ifall man kan gå ner från 32-bit float till 16-bit heltal. Skiljer säkert 10ggr i bara hastighet.

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Postat: 6 oktober 2010, 15:43:36
av Gimbal
Icecap skrev: Men jag skulle tänka om detta med "float", det är en värdetyp man mycket sällan behöver i µC-världen!
Håller jag inte med om, jag använder det stup i ett. Det beror (som vanligt alltså) precis på vad man gör.