Forum: Mikrocontroller und Digitale Elektronik AVR: Delay Time stimmt nicht


von hermy (Gast)


Lesenswert?

Hallo,

kleines Problem.

Ich programmiere grade einen Atmega1284P mit dem AVR-Studio in C.

Das Programm selber läuft zwar, aber die Delay-Zeiten sind laut Stoppuhr 
genau 10x so lang, wie sie sein sollten.

Die Taktfrequenz des Atmega1284P beträgt 20MHz und der Oszillator läuft 
auch mit 20MHz (extra nachgemessen).

Verwendet wird util/delay.h

In der entsprechenden .h-Datei, die zum Programm gehört, ist die 
Taktfrequenz korrekt angegeben.

Unter Configuration Options im AVR-Studio ist auch die korrekte 
Quarzfrequenz eingetragen.

Der Funktionsaufruf _delay_ms(1000); bewirkt beispielsweise eine 
Verzögerung von  10  Sekunden .

Woran könnte es liegen?

von Stefan P. (form)


Lesenswert?

Sind es vielleicht 8 statt 10 Sekunden? Dann ist noch die DIV8-Fuse 
gesetzt.

von Werner P. (Gast)


Lesenswert?

Fuses: CKDIV/8 aktiviert?

von Falk B. (falk)


Lesenswert?

@  hermy (Gast)

>Woran könnte es liegen?

AVR Fuses falsch eingestellt, dadurch wird eine andere Taktquelle 
benutzt.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

Die Optimierung im Compiler muss eingeschaltet sein.

von Dietrich L. (dietrichl)


Lesenswert?

Erfolgte das
1
#define F_CPU xxx
vor dem
1
#include <util/delay.h>
 ?

von hermy (Gast)


Lesenswert?

Danke Euch für die schnellen Antworten!!!




Fuses stehen im Moment auf

HI 0x9D

LO 0x7E

( Ext. Crystal Osc. 8.0- MHz; Start-up time:1k + 4.1ms )





Falk Brunner schrieb:
> Die Optimierung im Compiler muss eingeschaltet sein.

Steht auf -Os

von hermy (Gast)


Lesenswert?

Dietrich L. schrieb:
> Erfolgte das#define F_CPU xxx
> vor dem#include <util/delay.h>
>  ?

#include <util/delay.h> steht in main.c

#define F_CPU 20000000 steht in main.h

von Pete K. (pete77)


Lesenswert?

Versuch mal folgendes:

_delay_ms(200)
_delay_ms(200)
_delay_ms(200)
_delay_ms(200)
_delay_ms(200)

Falls das funktioniert hast Du eine _delay_ms Implementierung, die keine 
1000 als Argument verträgt. Sollte dann aber auch im Header-File stehen.

Edit: Das #define F_CPU brauchst Du nicht in main.c, sondern stellst es 
in den AVRStudio Projektsettings ein.

von hermy (Gast)


Lesenswert?

Pete K. schrieb:
> Versuch mal folgendes:
>
> _delay_ms(200)
> _delay_ms(200)
> _delay_ms(200)
> _delay_ms(200)
> _delay_ms(200)
>
> Falls das funktioniert hast Du eine _delay_ms Implementierung, die keine
> 1000 als Argument verträgt. Sollte dann aber auch im Header-File stehen.

Funktioniert leider nicht, die Wartezeit bleibt bei 10 Sekunden.

1s Wartezeit gibts mit _delay_ms(100)


Pete K. schrieb:
> Edit: Das #define F_CPU brauchst Du nicht in main.c, sondern stellst es
> in den AVRStudio Projektsettings ein.

Das #define F_CPU steht in main.h
Kann dann also weg!?


Ansonsten verwende ich noch die lcd.h
Hat das Problem möglicherweise damit zu tun???

von Falk B. (falk)


Lesenswert?

Vielleicht ist F_CPU auch in den Projektoptionen zusätzlich definiert, 
damit wird F_CPU im Quelltext überschrieben.

von Hubert G. (hubertg)


Lesenswert?

Mit deiner Fuse-Einstellung hast du CKDIV8 immer noch aktiv.

von hermy (Gast)


Lesenswert?

Falk Brunner schrieb:
> Vielleicht ist F_CPU auch in den Projektoptionen zusätzlich definiert,
> damit wird F_CPU im Quelltext überschrieben.

Was heißt in dem Zusammenhang "Projektoptionen"?

von hermy (Gast)


Lesenswert?

Hubert G. schrieb:
> Mit deiner Fuse-Einstellung hast du CKDIV8 immer noch aktiv.

Klingeling, kümmere mich sofort darum!

Danke!!!

von hermy (Gast)


Lesenswert?

Ok, jetzt stimmt die Zeit!

Werner hatte es oben schon gepostet, war irgendwie untergegangen...


Danke an alle, die geschrieben haben!!!!!!!!!!!!!!!!!!!!!!

Super Community hier!!!!!!!

von Werner P. (Gast)


Lesenswert?

und Stefan P. hast Du auch überlesen ;-)

von hermy (Gast)


Lesenswert?

>und Stefan P. hast Du auch überlesen ;-)

Jepp, ich gebe es zu!


Noch mal  ganz  herzlichen  Dank  an die folgenden drei Poster!!!

Stefan P. schrieb:
> Sind es vielleicht 8 statt 10 Sekunden? Dann ist noch die DIV8-Fuse
> gesetzt.

Werner P. schrieb:
> Fuses: CKDIV/8 aktiviert?

Hubert G. schrieb:
> Mit deiner Fuse-Einstellung hast du CKDIV8 immer noch aktiv.


Ihnen und allen anderen wünsche ich außerdem eine schöne jecke 
Karnevalszeit!!!

X Y !!!

(X = Kölle oder jeder andere Ort)

(Y = Alaaf, Helau oder jeder andere zum Ort X passende Karnevalsruf)

;O)

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.