www.mikrocontroller.net

Forum: Compiler & IDEs Rätselhaftes Delay


Autor: JarJar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch ein seltsames Problem:

#include <avr/io.h>
#define F_CPU 16000000
#import <avr/delay.h>

int main(void)
{
    DDRB = 0xff;
    while(1)
    {
        _delay_ms(20);
        PORTB=0x00;
        _delay_ms(20);
        PORTB=0xff;;
    }
}

Dieses kleine Programm funktioniert in etwa bis 16-17ms, alles darüber
hinaus wird ignoriert (mit dem Oszi gemessen). Wenn ich _delay_ms(500)
angebe hab ich das gleiche Signal wie bei _delay_ms(20) (Impulslänge ca
17ms). Wenn ich _delay_ms(10) angebe habe ich schöne 10ms Impulse. Ist
mir ein Rätsel

Woran liegt das?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, daß du die Dokumentation nicht gelesen hast.
Da steht nämlich:

"The maximal possible delay is 262.14 ms / F_CPU in MHz"

Die maximale Delay-Länge mit dieser Funktion liegt bei 16Mhz also bei
ca. 16,38ms, was mit deiner Beobachtung von "ca. 17ms" übereinstimmt.

Autor: JarJar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, Doku hab ich in der Tat nicht gelesen, und das obwohl ich grad ein
T-Shirt mit dem Aufdruck "RTFM" an hab ;)
Aber ich hab ehrlich gesagt auch nicht damit gerechnet das die Delay
Routine so eingeschrängt ist wesshalb ich auch erst gar nicht auf die
Idee gekommen bin das zu verdächtigen, zumal im Tutorial auch Beispiele
mit _delay_ms(100) drin sind. Der angegebene Takt beträgt 3,6864MHz, und
wenn ich mich nicht verreichnet hab komme ich auf nur 71ms. Also würde
das Beispiel auch nicht stimmen.

Sei's drum, der Fehler im Tutorial sollte wohl korrigiert werden. Aber
wie kann man dann längere Delays erzeugen?

Autor: JarJar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich beziehe mich dabei auf das Beispiel "Tasten entprellen"
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Wobei es wünschenswert wäre richtig darauf hinzuweisen und nicht nur
das Delay auf unter 70ms geändert würde. Ich würde es ja machen wenn
ich wüsste wie's richtig geht, aber das lerne ich grad erst noch

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm die hier:

http://mitglied.lycos.de/projectsilence/syscontrol...
http://mitglied.lycos.de/projectsilence/syscontrol...

Dazu musst Du noch deinen Systemtakt definieren. Also unter SYSCLOCK in
Hz angeben. Den us-ASM-Code habe ich irgendwo mal "geklaut" und den
Rest angepasst, damit alles von den Timnings her stimmt.

Autor: JarJar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fettes Merci, es funzt. Hab aber SYSCLOCK auch auf F_CPU geändert weil
die Variable anscheinend auch noch von weiteren Routinen (UART?)
verwendet wird.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.