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.
Gast
#3320779
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
Gast
#3321074
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 ;-(
Gast
#3321081
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 | |
2 | |
3 | |
4 | |
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 ...)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.