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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.