Fritz Bie schrieb:
> Hallo, ich möchte mir nach und nach ein Programm stricken mit dem ich
> einen Laminator auf ca. 200 Grad einregeln kann.
> Ich bin grad am versuchen ein Poti auszulesen und über den ermittelten
> Wert eine Diode in der Blink-geschwindigkeit zu regeln.
> Das Problem ist hier das ich als Rückgabewert des ADC kein Zahlenformat
> finde das ich in _delay_ms(xxx) eintragen kann ohne eine Fehlermeldung
> zu kriegen.
das Problem ist nicht das Zahlenformat. Das Problem ist, dass du bei
_delay_ms einen konstanten Wert angeben musst.
Du kannst also schreiben
oder auch
da sowohl 50 als auch 200 konstante Werte seind.
Du kannst aber nicht schreiben
1 | int zeit;
|
2 |
|
3 | ...
|
4 | _delay_ms( zeit );
|
weil zeit eine Variable ist und keine Konstante.
Hintergrund: _delay_ms erfordert vom Compiler einiges an Aufwand. Er
ermittelt aus der Zahl ein Schleifenkonstrukt, dass so oft durchlaufen
wird, dass die angegebene Zeit ziemlich genau erreicht wird.
Das geht aber nur dann gut, wenn der Compiler die angestrebte Zeit als
Zahlenwert auch tatsächlich kennt! Denn nur dann kann der Compiler all
die Zwischenberechnungen rausoptimieren, so dass im Endeffekt nur das
Schleifenkonstrukt mit genau diesem Zeitverhalten entsteht.
Daher die Einschränkung.
Aber:
Wenn man 50 Zeiteinheiten warten will, dann kann man auch 50 mal 1
Zeiteinheit warten. Das ist im Endergebnis fast das selbe. Will man x
Zeiteinheiten warten, dann kann man auch x mal 1 Zeiteinheit warten.
Anstatt einem nicht korrekten
kann man zb ein
1 | for( i = 0; i < zeit; i++ )
|
2 | _delay_ms( 1 );
|
machen und ist damit auch (fast) dort, dass man eine vorher nicht näher
bestimmte Zeit abwarten kann. Die Zeiten werden nicht ganz genau
stimmen, weil ja das for-Konstrukt auch seine Zeit braucht, aber
meistens ist das nicht so schlimm. Wir reden da über ein paar
Zehntel-Prozent, die die Zeit deswegen abweichen wird.