Forum: Compiler & IDEs Rätselhaftes Delay


von JarJar (Gast)


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?

von Rolf Magnus (Gast)


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.

von JarJar (Gast)


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?

von JarJar (Gast)


Lesenswert?

Ich beziehe mich dabei auf das Beispiel "Tasten entprellen"
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#.28Tasten-.29Entprellung

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

von Ronny Schulz (Gast)


Lesenswert?

Nimm die hier:

http://mitglied.lycos.de/projectsilence/syscontrol/source/delay.c
http://mitglied.lycos.de/projectsilence/syscontrol/source/delay.h

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.

von JarJar (Gast)


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.

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.