hallo, ich möchte die delay Zeit in einer Variable speichern. der delay funktion möchte ich dann diese zahl übergeben und das programm soll ein delay von der zahl in ms machen. ich nutze den xc8 compiler. das ist mein code: #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <pic16f887.h> int speicher = 1000; #define _XTAL_FREQ 4000000 void main (void) { TRISC = 0b00000000; PORTC = 0b00000000; while(1) { //header_test(speicher); __delay_ms(speicher); } } Also das Programm soll ein delay von speicher --> also 1000ms machen. ich bekomme jedoch eine Fehlermeldung die ich nicht lösen kann: :: warning: Omniscient Code Generation not available in Free mode (908) exit status = 1 header_test.c:40: error: inline delay argument must be constant make[2]: *** [dist/default/production/HEADER_Test.X.production.hex] Error 1 header_test.c:40: error: can't generate code for this expression make[2]: Leaving directory `C:/Users/twagner/Desktop/Ultraboard/Programme/PIC/TEST16F887/Neuer Ordner/HEADER_Test.X' make[1]: *** [.build-conf] Error 2 make[1]: Leaving directory `C:/Users/twagner/Desktop/Ultraboard/Programme/PIC/TEST16F887/Neuer Ordner/HEADER_Test.X' make: *** [.build-impl] Error 2 BUILD FAILED (exit value 2, total time: 1s) Kann mir jemand erklären was falsch ist, ich bin noch recht neu in der programmierwelt. viele grüße, tobias
Tobias Wagner schrieb: > header_test.c:40: error: inline delay argument must be constant Nur lesen... der Compiler sagt dir schon, was er nicht mag.
delay_ms() sind gewöhnlich Makros die entsprechend dem Zahlenwert nop-Schleifen generieren. Du hast es hier nicht mit einem Funktionsaufruf zu tun, dem du zur Laufzeit deine gewünschte Wartezeit übergeben kannst. Das sagt dir der Kompiler in der Fehlermeldung zu Zeile 40 ganz klar ;) Für effizientes Warten nutzt man eigentlich Timer. Wenn es komplexer wird, kann man sich einen einfachen Scheduler bauen... dann ist der Weg zu einem kleinen RTOS eigentlich auch nicht mehr weit.
Hallo, ok, danke für die Rückmeldungen ich mach mich bezüglich der timer schlau um mit einem timer das delay zu ersetzen. Grüße, Tobias
Georg G. schrieb: > Tobias Wagner schrieb: >> header_test.c:40: error: inline delay argument must be constant > > Nur lesen... der Compiler sagt dir schon, was er nicht mag. ... und schmeißt dann fleißig Nebelkerzen, damit man es möglichst schwer hat, die eigentliche Fehlerursache zu ergründen ;-(
Tobias Wagner schrieb: > ok, danke für die Rückmeldungen ich mach mich bezüglich der timer schlau > um mit einem timer das delay zu ersetzen. Das ist auf jeden Fall der bessere und lehrreichere Weg. Wenn der Prozessor sonst nix besseres zu tun hat, als die Zeit zu vertrödeln, kann man auch eine verpönte Verzögerungsschleife folgender Art verwenden:
1 | while(1) |
2 | { //header_test(speicher); |
3 | for (int i=0;i<speicher;i++) |
4 | __delay_ms(1); |
5 | } |
Hi Tobias, Tobias Wagner schrieb: > Hallo, > > ok, danke für die Rückmeldungen ich mach mich bezüglich der timer schlau > um mit einem timer das delay zu ersetzen. Du kannst die delay-Makros ruhig nutzen, dafür sind sie ja da. Du solltest aber auf den Variablentyp und den Wertebereich achten. Wenn das Makro z.B. uint8 nutzt kannst Du keinen Wert von 1000 übergeben. Schau Dir die Makrodefinitionen in der Headre-Datei an, damit Du die Möglichkeiten und Einschränkungen verstehst. Es kann sein das Du eine zusätzliche Schleife um das delay-Makro bauen musst, wenn Du lange warten möchtest. Es gibt auf mehr als ein Delay-Makro ... manche nutzen eine kurze Zeitbasis, manche eine längere ... siehe Michaels Beispiel ... :-) (immer diese Parallelposts ...)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.