Rätselhaftes Delay

Gast #237454
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?
Gast #237455
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.
Gast #237456
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?

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