Forum: Mikrocontroller und Digitale Elektronik Atmel Studio 6 - C, warte Schleife "while"


von EinProger (Gast)


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

von Curby23523 N. (Gast)


Lesenswert?

Was ein Hardwaretimer macht weißt du?

von EinProger (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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?

von EinProger (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

Johann L. schrieb:
> while-Schlaufe

oh, oh. Als nächstes kommt die IF-Schlaufe :-)

von Rolf M. (rmagnus)


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);

von Carl D. (jcw2)


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
}

: Bearbeitet durch User
von EinProger (Gast)


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

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.
Lade...