Forum: Mikrocontroller und Digitale Elektronik Variable in delay speichern - Fehler


von Tobias W. (towa)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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.

von me (Gast)


Lesenswert?

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.

von Tobias W. (towa)


Lesenswert?

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

von ;-o (Gast)


Lesenswert?

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 ;-(

von Michael (Gast)


Lesenswert?

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
    }

von Wolfgang H. (frickelkram)


Lesenswert?

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
Noch kein Account? Hier anmelden.