PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Frage?] die Delay TIme nicht stimmt mit <util/delay.h>



PaMan
01.08.2007, 09:47
Hallo Zusammen ....

Ich hab diese Funktion <util/delay.h> mit ATmega16 versucht zu benutzen.
Aber die Zeit nicht so stimmt.

zB. Ich hab auf 80us gesetzt, aber sie kommt auf 990us aus.
und habe ich die delay time geändert, trotzdem bleibt sie auf 950-990us

Ich habe schon mit FUSE Bit korrigiert, das schon richtig ist.
Die Quarz ist auch richtig 4Mhz.

Woran kann die Problem noch legen, oder mich etwas flash gemacht

Danke für eure Hilfe ...

Gruß
PaMan



#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdint.h>

#ifndef F_CPU
#define F_CPU 4000000UL /* Quarz 4 Mhz */
#endif
#include <util/delay.h>
/************************************************** ****************************/

int main (void)
{

DDRA = 0xFF; // Set PortA as Output

DDRB = 0b11111010; // PB3( OC0 as Output) PB0(T0 as Input) PB2(SW as Input)
PORTB = 0b00000101; // Pull Up Input Pin

PORTA |= (1<<PORTA0); // Pre Show



while(PINB & (1<<PINB2)); // wait switch Clear (Loop until bits clear)
PORTA &= ~(1<<PORTA0); // switch Confirm clear pre show

while(1)
{
_delay_us(80);

PORTA |= (1<<PORTA1);

_delay_us(80);

PORTA &= ~(1<<PORTA1);
}

}

askazo
01.08.2007, 10:29
Ich tippe stark darauf, dass Du die Compiler-Optimierung ausgeschaltet hast. In dem Fall funktionieren die Funktionen der delay.h nicht korrekt.
Dein Compiler sollte Dir auch eine entsprechende Warnung ausspucken:
(c:/winavr/bin/../avr/include/util/delay.h:89:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed")

Gruß,
askazo

PaMan
01.08.2007, 12:09
Ich tippe stark darauf, dass Du die Compiler-Optimierung ausgeschaltet hast. In dem Fall funktionieren die Funktionen der delay.h nicht korrekt.
Dein Compiler sollte Dir auch eine entsprechende Warnung ausspucken:
(c:/winavr/bin/../avr/include/util/delay.h:89:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed")

Gruß,
askazo

Arrrr ... Was ist die Compiler-Optimierung, Wo leigt sie denn :-s

und zwar die Warnung hab ich gehabt.

Gruß
PaMan

PcVirus
01.08.2007, 13:23
Moin!
Du kannst die Compileroptimierung im Makefile einstellen.
Dazu gibt es den Parameter "OPT".

So sieht das in meinem Makefile aus:


# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s


Gruß Jörn

SprinterSB
01.08.2007, 13:31
Optimiert wird über die GCC-Option -Os (für Codegröße) oder -O2 (Laufzeit), wobei ich persönlich -Os empfehle.

Wie du den Compiler mit der Option versorgst, kommt drauf an... direkt über die Kommandozeile oder abhängig vom Aufbeu deines Makefiles, evtl in den Variablen OPT oder CFLAGS.

askazo
01.08.2007, 13:35
Falls Du WinAVR im AVR-Studio nutzt, findest Du die Optimierung unter Project -> Configuration Options -> General -> unterstes Drop-Down Feld.
-Os ist generell eine gute Wahl.

Gruß,
askazo

PaMan
01.08.2007, 19:53
Oh!!!!!

Nachdem Optimierung wird sie richtig funktioniert.

Danke euch alle

PaMan

Strahleman
03.08.2007, 14:30
Ich bin grade dabei von Bascom auf C umzusteigen. Und habe hier nun auch ein Problem mit der delay.h

Die LEDs blinken zu "schnell". Egal was ich als delay einstelle blinken die LEDs ab einer bestimmten Einstellung immer gleich. Auch wenn ich als delay 1000ms eingebe, blinken sie so schnell, als wenn ich 300ms einstelle.
Als Compiler-Optimierung habe ich - wie ihr hier vorschlagt - -Os benutzt.


#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 3686400UL // Quarz3.6864 Mhz //
#endif

#include <util/delay.h>

int main(void)
{

DDRB = 0x05; // PB0 und PB2 als Ausgang definiert //
while(1==1){
_delay_ms(500); // Zwei blinkende LEDs an PB0 und PB2 //
PORTB = 0x00;
_delay_ms(500);
PORTB = 0x05;

};
return 0;
}

PcVirus
03.08.2007, 14:40
Du kannst nur eine maximale Zeit von 262.14 ms / F_CPU in MHz warten, wie es auch in der delay.h steht
"The maximal possible delay is 262.14 ms / F_CPU in MHz."
Das wären bei dir ca 71ms maximales Warten.

Strahleman
03.08.2007, 15:57
Aha ok ;) Habe zwar schon gegoogelt, aber nichts genaues über die delay.h gefunden. Dankeschön für den Hinweis!