- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: [Frage?] die Delay TIme nicht stimmt mit <util/delay.h>

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2007
    Ort
    Hannover
    Alter
    43
    Beiträge
    12

    [Frage?] die Delay TIme nicht stimmt mit <util/delay.h>

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

    Code:
    #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);
        }
    
    }
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken delay.jpg  

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2007
    Ort
    Hannover
    Alter
    43
    Beiträge
    12
    Zitat Zitat von askazo
    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

    und zwar die Warnung hab ich gehabt.

    Gruß
    PaMan

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    Moin!
    Du kannst die Compileroptimierung im Makefile einstellen.
    Dazu gibt es den Parameter "OPT".

    So sieht das in meinem Makefile aus:
    Code:
    # 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

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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.
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2007
    Ort
    Hannover
    Alter
    43
    Beiträge
    12
    Oh!!!!!

    Nachdem Optimierung wird sie richtig funktioniert.

    Danke euch alle

    PaMan

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.01.2006
    Ort
    Erlangen
    Alter
    39
    Beiträge
    210
    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.

    Code:
    #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;
    }
    Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher.
    (Albert Einstein, 1879-1955)

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    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.

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.01.2006
    Ort
    Erlangen
    Alter
    39
    Beiträge
    210
    Aha ok Habe zwar schon gegoogelt, aber nichts genaues über die delay.h gefunden. Dankeschön für den Hinweis!
    Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher.
    (Albert Einstein, 1879-1955)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress