Forum: Mikrocontroller und Digitale Elektronik __delay_us(x)


von Yasin (Gast)


Lesenswert?

Hallo,

ich habe nur eine ganz kleine Frage:
Bei meinem PIC12 möchte ich der __delay_us() Funktion eine unsigned int 
(16 bit)variable übergeben, aber es funktioniert nicht. Kann mir Jemand 
sagen, wie ich den Wert der Variablen übergeben kann?
Ich programmiere in MPLAB mit dem HIGH-TECH Compiler.

Viele Grüße

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Yasin schrieb:
> möchte ich der __delay_us() Funktion eine unsigned int
> (16 bit)variable übergeben, aber es funktioniert nicht.

/bloedelmodus_an

du mußt igned integer übergeben, damit man auch _delay_us(-100) eingeben 
kann. Damit wird der nächste Befehl schon xx mikrosekunden vor 
Abarbeitung des aktuellen Befehls ausgeführt. Vorsichtig anwenden, kann 
Effekte im aktuellen Zeit-Kontinuum verursachen!

/bloedelmodus_aus


nee, zeigt doch mal deinen Code, dann ist das alles einfacher zu 
bewerten was falsch sein könnte

von Michael .. (bigneal)


Lesenswert?

und was sagt die Hilfe des Compilers, was für eine Variable die Funktion 
erwartet?

von Yasin (Gast)


Lesenswert?

Der Compiler sagt: inline delay argument must be conastant. Geht das 
dann überhaupt?

Der Code ist nur:
1
#define _XTAL_FREQ 4000000
2
unsigned int x;
3
x = 100;
4
__delay_us(x);

von chris (Gast)


Lesenswert?

Fehlt da nicht ein header?

von Yasin (Gast)


Lesenswert?

Stimmt, und die mail...
Habe die htc.h eingefügt.

von Yasin (Gast)


Lesenswert?

EDIT:
Yasin schrieb:
> Stimmt, und die mail...
main() meine ich natürlich ;)

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Ja ein #include "delay.h" würde ich auch vermissen.

Ansonsten würde ich mich bei solch einem 'Programm' als Compiler auch 
weigern! Ich würde schon aus Protest keine Fehlermeldung bringen sondern 
einen Link auf ein Tutorial....

von Yasin (Gast)


Lesenswert?

Rene Schube schrieb:
> Ja ein #include "delay.h" würde ich auch vermissen.
Sicher? Im Manuel vom HIGH-TECH steht da nix von. Außerdem funktioniert 
es einwandfrei, solange ich Zahlen übergebe. Nur mit der Variablen 
funktioniert es nicht.

von Rolf Magnus (Gast)


Lesenswert?

Yasin schrieb:
> Der Compiler sagt: inline delay argument must be conastant.

Na dann ist doch alles klar. Du mußt eine Konstante übergeben, was du 
hier:

> unsigned int x;
> x = 100;
> __delay_us(x);

nicht tust, denn x ist keine Konstante, sondern eine Variable.

Wegstaben Verbuchsler schrieb:
> du mußt igned integer übergeben, damit man auch _delay_us(-100) eingeben
> kann. Damit wird der nächste Befehl schon xx mikrosekunden vor
> Abarbeitung des aktuellen Befehls ausgeführt. Vorsichtig anwenden, kann
> Effekte im aktuellen Zeit-Kontinuum verursachen!

Das erinnert mich an den COMEFROM-Befehl in Intercal. Der funktioniert 
quasi wie goto, nur umgekehrt.

von Yasin (Gast)


Lesenswert?

Ist es denn irgendwie möglich meine Variable in eine Konstante 
umzuwandeln?

von (prx) A. K. (prx)


Lesenswert?

Versuchs mal mit einer Erklärung dessen, was du eigentlich erreichen 
willst. Vielleicht wirds dann was.

von Rolf Magnus (Gast)


Lesenswert?

Wie sollte das gehen? Dazu müßte sich das Programm ja dynamisch selbst 
neu compilieren. ;-)
Konstanten sind zur Compilezeit bekannt, Variablen erhalten aber erst 
zur Laufzeit ihren Wert.

von guest (Gast)


Lesenswert?

nimm doch einfach ein Makro:

#define TIME 100

...

__delay_us(TIME);
..

von Peter II (Gast)


Lesenswert?

oder eine schleife

int wait = 100;

while( wait-- ) {
   __delay_us(1);
}

von Thomas E. (thomase)


Lesenswert?

Yasin schrieb:
> Ist es denn irgendwie möglich meine Variable in eine Konstante
> umzuwandeln?
Für die Frage ziehst du dir jetzt ein Ohr lang. SELBSTVERSTÄNDLICH 
NICHT!

void Delay(unsigned char nDelay)
{
  for (unsigned char nInd = 0; nInd < nDelay; nInd++) _delay_ms(1);
}

Dauert zwar ein Taktchen länger, wegen der Schleife und dem 
Funktionsaufruf, aber wenn es 100 Pro sein muss, nimmt man einen Timer.

mfg.

von Thomas E. (thomase)


Lesenswert?

Peter II schrieb:
> oder eine schleife
Hätte ich nicht soviel dazugesülzt, wäre ich der schneller gewesen.

mfg.

von Peter II (Gast)


Lesenswert?

Thomas Eckmann schrieb:
>> oder eine schleife
> Hätte ich nicht soviel dazugesülzt, wäre ich der schneller gewesen.

dein code ist nur zu lang.

von Thomas E. (thomase)


Lesenswert?

Peter II schrieb:
> dein code ist nur zu lang.
Das war noch das schnellste. Copy & Paste.

mfg.

von Yasin (Gast)


Lesenswert?

Ok, eine Schleife ist keine schlechte Idee. Es ging mir eigentlich nur 
darum, Variablen so auszugeben, dass ich sie am Oszi auslesen kann. Mit 
dem Debugger wird das nichts, weil die Variablen vom Timer abhängen. 
Danke für die Hilfe!

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.