Variable in delay speichern - Fehler

OP #3320754
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
Gast #3320779
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.
Gast #3321074
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 ;-(
Gast #3321081
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
    }
#3321082
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 ...)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren