Hallo, erhoffe mir hier eine kleine Hilfe. Will in meinem Code eine Warteschleife mit while programmieren. Warum mit while und nicht _delay_ms?, weil die Warteschleife von einem übergebenen Wert abhängt und delay_ms nur konstante Werte annimmt. So hab ich's mir gedacht mit einer kleinen Testroutine für mein ATMega328p. int main(void) { DDRD |= (1<<DDD1); PORTD &= ~(1<<PORTD1); while(1) { //TODO:: Please write your application code int wait1 = 23; while(wait1 >=0) { int wait2 = 1000; while(wait2 >= 0) { wait2--; } wait1--; } //_delay_ms(100); PORTD ^= (1<<PORTD1); } return 0; } Die eine angeschlossene LED soll in dem Intervall, welche die while-schleife vorlegt, blinken. Debuggen kann ich nur über den Simulator des Atmel Studio 6.2, leider funktioniert er nicht ganz so richtig in diesem Fall. Ebenso funktioniert der Code nicht aufm ATMega328p, sobald ich diesen flashe. Was mache ich falsch? greetz
Bitte um Aufklärung. F_CPU 16000000 Mittels diesem Wert errechnet die _delay_ms ihre Warteschleife. Jedoch blicke ich bei der Funktion nicht ganz durch und wie ich eine eigene derbezüglich programmiere
EinProger schrieb: > Was mache ich falsch? Der einzige Seiteneffekt der while-Schlaufe ist, PORTD1 zu toggeln. Die Schleife wird also nichts anderes tun, als PORTD1 zu toggeln, denn dies ist der einzige "beobachtbare" Effekt, den das Programm laut C-Standard hat. > dem Intervall In welchen Einheiten, und wie hast du die angegeben?
mittels der whileschleife versuche ich ein Blink-Rythmus von ca. 500ms zu programmieren. Dies will ich dann mittels den Werten den ich wait1 und wait2 übergebe abstimmen.
EinProger schrieb: > Was mache ich falsch? Du hast vergessen zu erwähnen, was du unter "funktioniert nicht ganz so richtig" verstehst. EinProger schrieb: > mittels der whileschleife versuche ich ein Blink-Rythmus von ca. 500ms > zu programmieren. Was dir die anderen sagen wollten: Die beiden inneren while-Schleifen tun nichts, also wird der Optimizer des Compilers feststellen, dass man nichts auch viel schneller als mit dieser Schleife machen kann und sie einfach komplett wegoptimieren. Genau deshalb benutzt man ja die Delay-Funktion. Die kümmert sich einerseits um genaue Delay-Zeiten und andererseits darum, dass auch wirklich gewartet wird. Du brauchst sie auch nicht komplett zu verwerfen, um ein variables Delay umzusetzen. Du kannst sie einfach in einer Schleife aufrufen:
1 | for (int loop = 0; loop < 500; ++loop) |
2 | _delay_ms(1); |
Rolf M. schrieb: > Du brauchst sie > auch nicht komplett zu verwerfen, um ein variables Delay umzusetzen. Du > kannst sie einfach in einer Schleife aufrufen: >
1 | > for (int loop = 0; loop < 500; ++loop) |
2 | > _delay_ms(1); |
3 | >
|
Oder eben wegen >> ... weil die Warteschleife von einem übergebenen Wert abhängt >> und delay_ms nur konstante Werte annimmt. so:
1 | void delay_n_millis(int millis) { |
2 | for (int loop = 0; loop < millis; ++loop) |
3 | _delay_ms(1); |
4 | }
|
:
Bearbeitet durch User
Rolf M. schrieb: > EinProger schrieb: >> Was mache ich falsch? > > Du hast vergessen zu erwähnen, was du unter "funktioniert nicht ganz so > richtig" verstehst. > > EinProger schrieb: >> mittels der whileschleife versuche ich ein Blink-Rythmus von ca. 500ms >> zu programmieren. > > Was dir die anderen sagen wollten: Die beiden inneren while-Schleifen > tun nichts, also wird der Optimizer des Compilers feststellen, dass man > nichts auch viel schneller als mit dieser Schleife machen kann und sie > einfach komplett wegoptimieren. Genau deshalb benutzt man ja die > Delay-Funktion. Die kümmert sich einerseits um genaue Delay-Zeiten und > andererseits darum, dass auch wirklich gewartet wird. Du brauchst sie > auch nicht komplett zu verwerfen, um ein variables Delay umzusetzen. Du > kannst sie einfach in einer Schleife aufrufen:for (int loop = 0; loop < > 500; ++loop) > _delay_ms(1); Darauf hätte man selbst kommen sollen. Besten Dank!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.