Atmel Studio 6 - C, warte Schleife "while"

Gast #5241171
Lesenswert?

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
Gast #5241178
Lesenswert?

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
#5241192
Lesenswert?

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);
#5241207
Lesenswert?

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
}
Gast #5241222
Lesenswert?

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!!!

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