macrodef. i C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
SeniorLemuren
Inlägg: 8428
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

macrodef. i C

Inlägg av SeniorLemuren »

Följande funkar:

Kod: Markera allt

#define stegtid             delay_ms(5);
#define step                STP=1; stegtid; STP=0;
.
.
void adjust_aire(){
       step;
}
Med variabeln tid = 5 i stället för siffran 5 godkänns inte kompileringen:

Kod: Markera allt

int tid = 5 ;
.
#define stegtid             delay_ms(tid);
#define step                STP=1; stegtid; STP=0;
.
.
void adjust_aire(){
       step;
}
Har även testat:

Kod: Markera allt

#define step                STP=1; delay_ms(tid); STP=0;
Tänker jag helt fel eller skriver jag det fel? Jag vill ha stegmotorn att gå olika fort beroende på variabel tid. Det är givet att jag kan skippa "#define" och lägga in stegningen direkt i den rutin som kör motorn men detta hade ju varit trevligare om det funkat.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: macrodef. i C

Inlägg av sodjan »

Jag har för mig att delay funktioner kompileras till fast asemblerkod och
den kan därför inte ta en variabel som parameter. D.v.s att koden
"huggs i sten" vid kompileringen med hjälp av bl.a den hastighet (MHz)
som man har angivit att man tänker använda vid körningen.
Niklas-k
Inlägg: 354
Blev medlem: 10 mars 2004, 15:59:21
Ort: Katrineholm

Re: macrodef. i C

Inlägg av Niklas-k »

Kolla om Vdelay_ms(tid); funkar.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: macrodef. i C

Inlägg av Icecap »

Det fungerar inte för att delay_ms() inte kan jobba med variabler, enbart med fasta värden.

Kod: Markera allt

#define tid 5
#define stegtid             delay_ms(tid);
#define step                STP=1; stegtid; STP=0;
ska däremot fungera.
Användarvisningsbild
SeniorLemuren
Inlägg: 8428
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: macrodef. i C

Inlägg av SeniorLemuren »

Vdelay funkade, problemet är löst och en ny lärdom har infunnit sig. :)

delay_xx tar const som input och Vdelay_xx tar variabel som input. Vdelay tar även const. som input. Men har man dåligt med minne så sparar man 6 byte genom att använda delay_xx till const. (Åtminstone i microC for PIC.

Kod: Markera allt

int tid = 5;
.
.
#define stegtid             Vdelay_ms(tid);
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: macrodef. i C

Inlägg av stekern »

Har ingenting att göra med den egentliga frågeställningen, men ett generellt tips:
om du skapar makron som är "funktionslika", se till att de ser ut som en funktion
när du använder dem, det gör koden mycket mer lättläst.

Dvs

Kod: Markera allt

int tid = 5;
.
.
#define stegtid()          Vdelay_ms(tid);
#define step()             STP=1; stegtid(); STP=0;
.
.
void adjust_air(void) {
       step();
}
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46979
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: macrodef. i C

Inlägg av TomasL »

Ett annat tips, att använda makron är synnerligen dålig programmeringsstil, och en källa till många fel.
Använd #define till konstantdeklarationer, inget annat.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: macrodef. i C

Inlägg av stekern »

Instämmer med TomasL, även om världen givetvis inte är så svart och vit att det inte finns tillfällen där makros är vettigt att använda till annat än konstantdeklarationer.
För exemplet i den här tråden verkar det dock inte finnas några fördelar med att använda makros.
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: macrodef. i C

Inlägg av SvenW »

Vill ni se min senaste makrodef? Just en kostantdeklaration. Varsågod :-)
Om någon har en bättre idé på hur man löser problemet mottages det med tacksamhet.
Jag vill alltså initiera en sinustabell.

Ps. Makrot expanderar till ca 123000 tecken. Märkligt nog inget problem för kompilatorn!!!

Kod: Markera allt


#define  AMP  ( 32 * 1024 - 3 )
#define SF  ((int) ((double) 64 * 1024 / (2.0 * M_PI)))
#define SINSERIES_B(x) ((double) x - x*x*x/6  \
			+ x*x*x*x*x/2/3/4/5		       \
			- x*x*x*x*x*x*x/2/3/4/5/6/7	       \
			+ x*x*x*x*x*x*x*x*x/2/3/4/5/6/7/8/9    \
		      	- x*x*x*x*x*x*x*x*x*x*x/2/3/4/5/6/7/8/9/10/11    \
			+ x*x*x*x*x*x*x*x*x*x*x*x*x/2/3/4/5/6/7/8/9/10/11/12/13 \
			- x*x*x*x*x*x*x*x*x*x*x*x*x*x*x/2/3/4/5/6/7/8/9/10/11/12/13/14/15 )


#define AB(i) (((double) ((i) << 8) + (double) (1 << 7)) / SF )
#define SA(i) (( int16_t ) (  -0.7 + AMP *  SINSERIES_B( AB(i) )))
#define SB(k)  SA(k + 0), SA(k + 1), SA(k + 2), SA(k + 3)
#define SC(k)  SB(k + 0), SB(k + 4), SB(k + 8), SB(k + 12)


const int16_t sintab_B[256] = {
  SC (0),
  SC (16),
  SC (32),
  SC (48)
};
 


Senast redigerad av SvenW 22 oktober 2012, 10:33:21, redigerad totalt 1 gång.
Användarvisningsbild
bit96
Inlägg: 2529
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: macrodef. i C

Inlägg av bit96 »

:)
Om du nu ändå skriver dina #define mer eller mindre "rekursivt" kan du lika gärna göra själva MacLaurinserien rekursiv direkt.
Det sparar många många multiplikationer och divisioner.
Och blir ännu mer "lättläst" :roll: :)
Senast redigerad av bit96 22 oktober 2012, 09:35:11, redigerad totalt 1 gång.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: macrodef. i C

Inlägg av stekern »

SvenW: nog inte det svaret du önskade dig, men jag hade nog hellre löst det genom att generera sinustabellen med ett skript som körs i buildprocessen
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: macrodef. i C

Inlägg av SvenW »

Ja, absolut lättare, men jag vill just eliminera det momentet.
Makefiler tenderar att bli nog så komplicerade ändå :-(
Skriv svar