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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
StRob
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

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

Inlägg av StRob »

Jag skriver C-kod till en AVR (Mega48) och till denna skall det kopplas olika givare. Beroende på vilken modell av givare så skall jag använda olika värden för att beräkna flöde i detta fall (det baseras på frekvens från pulser från givaren med lite matte). så till min fråga:
Hur skriver jag i C för att i början av min kod enkelt kunna skriva in vilken givare som används och sen skall koden själv sköta omräkningarna. Jag skall alltså bara ange om jag har modellen DN8, DN 10, DN15,...Dn25.o Och min önskade flödesgräns, FLOWLIMIT = 3; // liter/minut.

(Sen i t.ex. initieringen av givaren (och timer1) så bräknar jag flowLimit [motsvarigheten till FLOWLIMIT fast räknat i Hz från Timer1-Capture.
Ex1. DN8: Flödet: Q=0,035*f-0,3 ml/puls
Ex2. DN25: Flödet: Q=0,744*f-0,2 ml/puls)

Jag vill ha nåt liknande:
int givartyp = dn8; //Givarmodell
FLOWLIMIT = 3,05; //liter/minut

Finns det nån typ som köper en text, för int enligt ovan skiter sig ju :)
Sen gärna ett tips på hur man gör när man kollar givartypen i initieringen (om den nu skall ligga där). Min tanke är väl nåt i stil med:
switch (givarTyp)
case DN8:
//Beräkning
case DN10:

Känner att det blev otydligt, men hoppas ni hajjar ;-)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Om du ända ska bygga om hela applikationen från scratch varje gång du
byter konfiguration, så behöver du ju inte alla olika givarna i samma källkod.
Lägg varje givare i en egen include fil och kör lite #if o.s.v för att inkludera
den aktuella filen när du bygger applikationen. Vilken givare som ska användas
kan väl skickas med som en parameter till kompilatorn, du behöver inte gå in
och ändra i koden varje gång.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

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

Inlägg av stekern »

som jag förstod det var det väl just detta han ville ha reda på hur man gjorde?

Kod: Markera allt

#define DN10
#ifdef DN8
double Q(double f) {
    return 0.035*f-0.3;
}
#endif
#ifdef DN10
double Q(double f) {
    return 0.744*f-0.2;
}
#endif
sen att double inte ska användas i en avr osv är ju självskrivet, men principen gäller
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

> som jag förstod det var det väl just detta han ville ha reda på hur man gjorde?

Nej, det var det inte. Läs igen.
Frågan gällde switch/case satser och då kommer
all kod för alla givartyper att alltid inkluderas.

Ditt förslag var i princip vad jag föreslog, fast med includes,
men det får ju samma slutresultat. Om man ska ha includes eller
bara villkorad kod enligt ditt exempel beror väl mest på vad som
är enklast att underhålla. Ju mer unik kod det är för varje givartyp,
ju mer rimligt är det sannolikt att bryta ut det till individuella include filer.
StRob
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

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

Inlägg av StRob »

Nej, jag behöver nödvändigtvis inte använda switch case, jag vill bara på ett smidigt sätt skriva in vilken givare jag har och byter jag givare ska jag bara behöva skriva in den nya givartypen för att den skall använda nya siffror för matematiken. (Givaren ger flödet i frekvens och då olika skalfaktor för olika modeller)
Är includefil snyggast/mer lättläst/smidigast så fine. Men jag har aldrig använt det så jag är inte 100 på syntaxen.

Nåt sånt?:

I main.c-filen:
#include "SENSOR_TYPES.H"
#define DN10 //Här skriver jag in Givartypen

I SENSOR_TYPES.H-filen:
#ifdef DN10
(unsigned long)FLOW_LIMIT *= 100;
flowLimit = 420000/FLOW_LIMIT; //flowLimit: uns long.
#endif

#ifdef DN15
FLOW_LIMIT *= 100;
flowLimit = 750000/FLOW_LIMIT;
#endif


Är jag på rätt väg?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Ja, fast du får nog kasta om de två första raderna.
DN10 o.s.v måste sannolikt vara definierat när du gör #include
annars kommer inte dina #ifdef att fungera (de "körs" ju just
när du gör #include)...

Som sagt, det finns nog flera olika sätt att lösa det på. Det
beror lite på hur det ser ut i helhet.
StRob
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

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

Inlägg av StRob »

Som sagt, det finns nog flera olika sätt att lösa det på. Det
beror lite på hur det ser ut i helhet.
Kan ju vara bra att köra detta racet så jag får lära mig det. Men jag tar gärna fler tips om någon tycker att man ska lösa det på något annat sätt.

Tackar för hjälpen iaf!
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

Jag håller med om att dels är float en styggelse i µC och dels i att man använder #define först och sedan include-filen.

Men någon "om det är definierat mer än 1 sensor ska det komma ett felmeddelande" skulle jag lägga in i include-filen.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

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

Inlägg av jesse »

Jag skulle inte använt #ifdef utan använt numeriska värden istället:

Kod: Markera allt

// här fördefinieras alla givarnas värden
#define DN10 420000L
#define DN15 750000L

#define GIVARE DN10 // här väljer jag vilken givare jag vill använda

//...senare i koden...

FLOW_LIMIT *= 100;
flowLimit = GIVARE/FLOW_LIMIT;
Det behövs ingen separat fil för detta.
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

jesse: Om det bara är en faktor som ska ställas på det sätt är det helt rätt att göra så men är det en "större" uträkning som är lite olika för varje sensor (inte bara faktorskillnad) kan det vara besvärligt sätt.
Användarvisningsbild
hubben
Inlägg: 1754
Blev medlem: 7 september 2010, 11:46:58
Ort: Örviken

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

Inlägg av hubben »

Beror ju lite på om du vill göra't runtime eller compile-time. Vill du kunna byta sensortyp men en bygel på kortet tex kan du inte använda define och include, resten av koden kompileras inte in isåfall..

Vill du köra runtime kan du ju göra en typ

#define FLOW_LIMIT_MULTIPLICATOR 0;
#define FLOW_LIMIT 1;

enum SENSOR_TYPE {
DN10,
DN20,
DN30
} s_type;

int TYPE_VALUES[][] = {{100,750000},{100,30000},{75,32000}};

s_type = DN20;

...

sen kan du använda TYPE_VALUES[s_type][FLOW_LIMIT_MULTIPLICATOR] och TYPE_VALUES[s_type][FLOW_LIMIT] för att komma åt värdena i koden... Släng skiten i en includefil så blir det snyggare, gör arrayen till en const så blir det ok med stora bokstäver på den.. ;-)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

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

Inlägg av jesse »

Beror ju på om bara numeriska värden ska ändras eller om man ska göra på olika sätt

Kod: Markera allt

// här fördefinieras alla givarnas värden
#define DN10 // här väljer jag vilken givare jag vill använda

#ifdef DN10
    #define MAX 420000L
    #define ADD 32000L
#endif

#ifdef DN10
    #define MAX 750000L
    #define ADD 16000L
#endif


//...senare i koden...

FLOW_LIMIT *= 100;
flowLimit = MAX/FLOW_LIMIT+ADD;
hubben: runtime kan bli lite kärvt då det är en mega48 - inte mycket programminne... så jag skulle föreslå att man spikar valet av givare i kompileringen, om det är möjligt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

> Beror ju lite på om du vill göra't runtime eller compile-time.

Ja, självklart ! Det är ju en jäkla skillnad ! :-)
Man nu var ju förutsättningen i frågan i förstainlägget
att det skulle styra just kompileringen.
Användarvisningsbild
hubben
Inlägg: 1754
Blev medlem: 7 september 2010, 11:46:58
Ort: Örviken

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

Inlägg av hubben »

@jesse: Sant, tänker lite kort idag. ;-)

@sodjan: Var utläser du det? Det står nåt nämnt om att man ska skriva i början på koden, det kan man ju utläsa som compile time, men det står ju inte specifikt att det måste vara så. ;-) Det står att koden själv ska sköta omräkningarna, inte specifikt kompilatorn..
ds77
Inlägg: 2461
Blev medlem: 24 juli 2008, 09:38:07
Ort: småland

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

Inlägg av ds77 »

Hur mycket plats tar programmet? Är den inte fullknökad kan det ju vara trevligt och bara plugga in valfri givare och ha något smart sätt att välja vilken man använder.
Skriv svar