Schreib mal so:
for (unsigned int i = Takt/4000ul; i > 0; i--)
{
asm("nop");
}
Dann wird es funktionieren. Ausserdem solltest du das Takt/4000ul vorher machen, sonst wird es bei jedem Durchlauf neu berechnet. Das sind dann etliche Takte mehr.
Schreib mal so:
for (unsigned int i = Takt/4000ul; i > 0; i--)
{
asm("nop");
}
Dann wird es funktionieren. Ausserdem solltest du das Takt/4000ul vorher machen, sonst wird es bei jedem Durchlauf neu berechnet. Das sind dann etliche Takte mehr.
mach deinen Zähler volatile!
Code:void Warte1ms(void) { volatile unsigned int i; for (i = Takt/4000ul; i > 0; i--) ; }
edit:
das ist übrigens genau das, was ich meine, wenn ich sage:
nacktes C ist für Anfänger absolut nicht geeignet!
Daher gibt es für Anfänger C per Arduino IDE.
da gibt es Timer mit Millisekunden
millis()
oder Microsekunden
micros()
und
delay(msec)
und
delayMicroseconds(usec)
Ansonsten musst du dir die Timer callbacks selber programmieren.
( * schauder * )
Code:int outPin = 8; // digital pin 8 void setup() { pinMode(outPin, OUTPUT); // sets the digital pin as output } void loop() { digitalWrite(outPin, HIGH); // sets the pin on delayMicroseconds(50); // pauses for 50 microseconds digitalWrite(outPin, LOW); // sets the pin off delayMicroseconds(50); // pauses for 50 microseconds }
Geändert von HaWe (15.11.2015 um 21:06 Uhr)
Auch in C gibt es delay(ms). Ist auf jeden Fall einfacher als void. Wenn ich void warte ... nichts reinschreibe wird es einfach gelesen ohne Funktion.
delay() ist kein ANSI C oder C++ Befehl nach C99 oder C11 ANSI Standard.
Aber es kann natürlich theoretisch und praktisch möglich sein, dass es Plattform-spezifische Zusatzlibs gibt, die diesen Befehl implementiert haben.
Lesezeichen