Forum: Compiler & IDEs Wartezeiten PROBLEM


von Marc A. (mark2013)


Lesenswert?

hi , ich programmiere für einen DS1820 ein OneWire Protokoll.
Der Master Reset- und Slave Presence Impuls funktioniert auch schon.
Wenn ich aber F_CPU = 8MHz einstelle ,dann wartet das Program bei 
_delay_us(100) viel länger als angegeben.
Wieso arbeitet die Funktion nicht wie angegeben?

(Wenn ich F_CPU nicht einstelle ,dann ist F_CPU = 1GHz)

AtMega16 (externer Takt = 8MHz)

von Peter II (Gast)


Lesenswert?

Fabian Anderw schrieb:
> dann wartet das Program bei
> _delay_us(100) viel länger als angegeben

optimierung muss eingeschaltet sein, es dürfen nur konstanden verwendet 
werden.

> Wenn ich F_CPU nicht einstelle ,dann ist F_CPU = 1GHz
nein, dann ist es nur wo anders eingestellt (->suche). Wenn das define 
fehlt gibt es einen fehler.

von Marc A. (mark2013)


Lesenswert?

>nein, dann ist es nur wo anders eingestellt (->suche). Wenn das define
>fehlt gibt es einen fehler.

Stimmt genau in der delay.h ist F_CPU = 1GHZ.


>optimierung muss eingeschaltet sein, es dürfen nur konstanden verwendet
>werden.

Sorry aber ich weiss nicht genau was du mit optimierung meinst.Wo kann 
ich das einstellen?

von Peter II (Gast)


Lesenswert?

Fabian Anderw schrieb:
> Stimmt genau in der delay.h ist F_CPU = 1GHZ.

glaube nicht.

> Sorry aber ich weiss nicht genau was du mit optimierung meinst.Wo kann
> ich das einstellen?
woher soll ich wissen mit was du arbeitest? Du musst die optimierung für 
die Compiler einschalten. (-Os );

von Peter II (Gast)


Lesenswert?

dann liegt es bestimmt an der Hardware, sie läuft nicht mit dem Takt den 
du erwartest.


lass mal mit dem dalay eine LED im Sekundentakt blinken. Und schau wie 
schnell sie wirklich blinkt.

von Marc A. (mark2013)


Lesenswert?

Ok jetzt noch mal Schritt für Schritt.

Ich habe einen AtMega16 mit internen Takt von 1MHz.
(externer Takt = 8000000Hz)

Diese Frequent wird auch in der <util/delay.h> mit #define F_CPU 
1000000UL
voreingestellt.

(Test)Programm:

1. LED an
2. _delay_ms(5)
3. LED aus
4. _delay_ms(5)

Nun mit Oszi messen : Alle Wartezeiten im Programm sind identisch mit 
den realen Wartezeiten. KEINE PROBLEME

Nun stelle ich die F_CPU auf 8000000UL.

(Test) Programm:

...
siehe oben
...

Mit Oszi messen :
1. LED an
2. reale 40ms wird gewartet
3. LED aus
4. reale 40ms wird gewartet

Wieso wartet die Funktion _delay_ms(5) nun in Wirklichkeit genau 40ms???

von Godsaveourworld (Gast)


Lesenswert?

40/5 = ?

Faellt dir was auf?

von Marc A. (mark2013)


Lesenswert?

Jop 8 mal schneller -> 8mal länger warten :D ERst denken dann schreiben!
Trotzdem danke

von Godsaveourworld (Gast)


Lesenswert?

N7x erst denken dann schreiben...faktor 8 ist tipp genug...datenblatt 
lesen ftw....und erst dann wiederkommen

von CKoch (Gast)


Lesenswert?

Manchmal lösen sich Probleme ganz von selbst
Und wenn nicht dann ab ins Forum ....

von Oliver (Gast)


Lesenswert?

marc Andrew schrieb:
> Nun stelle ich die F_CPU auf 8000000UL.

Und mit welchem Takt läuft dein Prozessor dann?

Oliver

von Peter D. (peda)


Lesenswert?

marc Andrew schrieb:
> Nun stelle ich die F_CPU auf 8000000UL.

F_CPU gibt dem Compiler nur bekannt, womit Du den AVR betreibst.

Und es liegt allein an Dir, dafür zu sorgen, daß der AVR auch wirklich 
mit dieser Frequenz läuft.

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.