Sida 1 av 1
macrodef. i C
Postat: 21 oktober 2012, 19:08:34
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:
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.
Re: macrodef. i C
Postat: 21 oktober 2012, 19:16:04
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.
Re: macrodef. i C
Postat: 21 oktober 2012, 19:22:16
av Niklas-k
Kolla om Vdelay_ms(tid); funkar.
Re: macrodef. i C
Postat: 21 oktober 2012, 19:33:33
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.
Re: macrodef. i C
Postat: 21 oktober 2012, 20:51:50
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);
Re: macrodef. i C
Postat: 22 oktober 2012, 07:29:37
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();
}
Re: macrodef. i C
Postat: 22 oktober 2012, 08:45:14
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.
Re: macrodef. i C
Postat: 22 oktober 2012, 09:19:45
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.
Re: macrodef. i C
Postat: 22 oktober 2012, 09:21:37
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)
};
Re: macrodef. i C
Postat: 22 oktober 2012, 09:33:49
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"

Re: macrodef. i C
Postat: 22 oktober 2012, 09:35:08
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
Re: macrodef. i C
Postat: 22 oktober 2012, 09:38:28
av SvenW
Ja, absolut lättare, men jag vill just eliminera det momentet.
Makefiler tenderar att bli nog så komplicerade ändå
