Funktion "_delay_ms()" nicht ausreichend

Gast #304032
Lesenswert?
• ▲
▼
Hi...

Auf meinem ATmega16, mit einem externen 8MHz Oszillator, lasse ich ein
kleines Programm laufen und möchte zwischen jedem Schritt eine gewisse
Zeit warten... Sagen wir mal 0,5s!

Die Funktion _delay_ms() ist leider dafür nicht geeignet, da für mich
die maximale Wartezeit etwa 35 ms beträgt... Habt ihr einen Vorschlag
was ich noch machen könnte?

Danke schonmal
Gast #304035
Lesenswert?
• ▲
▼
Hi,

längere Delays sind in einem Programm sowieso nicht die beste lösung.
Vielleicht kannst deine Programmteile ja per Timer interrupt aufrufen?
oder du verweilst in einer whileloop in der du permanent einen
timerflag abrufst, ob dieser gesetzt wurde. zumindest ist diese zeit
dann auch genauer als eine lange nop-wait schleife.

gruß marc
Gast #304038
Lesenswert?
• ▲
▼
Ne eigene delay-Funktion mit einem freien Timer schreiben.

Beispiel für ATMega 16 mit 8 MHz:

//Erzeugen einer Wartezeit in Millisekunden (max. 16383)
void wait_ms(unsigned int msecs)
{
        //Zaehler mit 4 multiplizieren (4 x 250us = 1ms)
        msecs <<= 2;
        OCR0 = 250;     //Compare-Register laden
        TIFR |= 1 << OCF0; //Compare-Flag loeschen
        TCCR0 = 0x0a;   //Timer 0 starten, Taktteilung durch 8
        while(msecs) // Warten bis Zeit abgelaufen
        {
                //Warte bis Compare-Ereignis
                while(!(TIFR & (1 << OCF0)));
                msecs--;        //dekrementiere Zaehler
                TIFR |= 1 << OCF0; //Compare-Flag loeschen
        }
        TCCR0 = 0x00;   //Timer 0 deaktivieren
}

Mit Interrupt isses natürlich eleganter. Aber wenn der uC eh sonst nix
zu tun hat...
Gast #304040
Lesenswert?
• ▲
▼
wenn du definitiv sowieso nichts anderes als warten willst, warum nicht
delay()? Kein Problem, dafür muss man nicht mit Timer arbeiten, aber
man kann natürlich.
Kenne deine delay-funktion nicht - ich kenne sie mit int-Parameter. Und
das bedeutet, bis zu 65535 ms max. Verzögerung.
Gast #304045
Lesenswert?
• ▲
▼
>> Gibts irgndwo einen
>> Bericht, der mich mal so richtig von dem Compiler überzeugt? ..

wozu einen Bericht lesen, lad dir die Demo-Version und du wirst
begeistert sein. Hat mir (als bekennenden "Pascaler") im Gegensatz
zum gcc den Einstieg in c für die Atmels mehr als erleichtert.


Grüße leo9
Gast #304047
Lesenswert?
• ▲
▼
Jo und wo ist das Problem ?

Wozu gibt es denn Schleifen unter C:
1
void long_delay_ms( unsigned long ms )
2
{
3
  while( ms-- )
4
    _delay_ms( 1 );
5
}

Damit kommst Du bis auf 49 Tage, das sollte ja reichen.


Die Entwickler des GCC (und ich auch) denken eben, daß sehr lange
Delays schlechter Programmierstil sind, d.h. die Performance zur Sau
machen und die Programmerweiterung sehr erschweren.

Immerhin ist ein Delay von 1ms schon riesige 20.000 verlorene Zyklen
bei 20MHz, wo die CPU vieles anderes machen könnte.

Wenn man also etwas mehr programmieren will, als nur einen Timer, kommt
man mit Monsterdelays nicht weit.


Peter

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.