logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR Atmega32 nie równe interwały czasowe z _delay_ms

shtr 15 Mar 2012 18:44 1987 11
  • #1 10681522
    shtr
    Poziom 9  
    Witam, kupiłem niedawno zestaw ZLAVR3 z uC AtMega32 i mam pytanie. Chciałem zrobić na początek coś łatwego, więc napisałem program, który ma jakąś liczbę i wyświetla ją na wyświetlaczu segmentowym a nastepnie co sekunde obniza wartosc o 1, zdziwiło mnie że dając w pętli for 250 iteracji, gzdie byly 4 delaye bo 1ms, wartosc spadala nie co sekunde ale ok 1.5s. Postanowiłem sprawdzic co jest nie tak, wiec napisałem po prostu program ze zapala sie dioda _delay_ms(1000), gasnie _delay_ms(1000) no i nadal zmiana jest po czasie dłuższym niż sekunda. Czy mógłby ktos wyjasnic czemu się tak dzieje?
  • #3 10681573
    shtr
    Poziom 9  
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <avr/delay.h>
    
    void led(int zap)
    {
    	if(zap)PORTA = 1<<2;
    	else PORTA = 0 << 2;
    }
    
    int main(void)
    {
    	DDRA = 1<<2;
        while(1)
        {
            led(1);
    		_delay_ms(1000);
    		led(0);
    		_delay_ms(1000);
        }
    }

    Na razie we fusebity się nie bawiłem
  • #5 10681601
    shtr
    Poziom 9  
    Nie zmieniałem nic w ustawieniach AVR Studio 5 więc jest defaultowo wszystko włącznie z optymalizacją
  • #7 10681627
    shtr
    Poziom 9  
    
    ------ Build started: Project: AVRGCC4, Configuration: Debug AVR ------
    Build started.
    Project "AVRGCC4.avrgccproj" (default targets):
    Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
    Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\AVR Studio 5.0\Vs\AvrGCC.targets" from project "D:\AVR\Projects\AVRGCC4\AVRGCC4\AVRGCC4.avrgccproj" (target "Build" depends on it):
    	Task "RunAvrGCC"
    		C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR ToolChain\bin\make.exe all 
    		AVR Memory Usage
    		----------------
    		Device: atmega32
    		Program:    3556 bytes (10.9% Full)
    		(.text + .data + .bootloader)
    		Data:          8 bytes (0.4% Full)
    		(.data + .bss + .noinit)
    	Done executing task "RunAvrGCC".
    Done building target "CoreBuild" in project "AVRGCC4.avrgccproj".
    Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
    Target "Build" in file "C:\Program Files (x86)\Atmel\AVR Studio 5.0\Vs\Avr.common.targets" from project "D:\AVR\Projects\AVRGCC4\AVRGCC4\AVRGCC4.avrgccproj" (entry point):
    Done building target "Build" in project "AVRGCC4.avrgccproj".
    Done building project "AVRGCC4.avrgccproj".
    
    Build succeeded.
    ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
    

    Hm to może mógłbyś polecić coś innego niż studio 5?
    Optimization level: None(-O0)

    Edit:Mam wrażenie, że przy -O1 jest mniejszy rozjazd a przy -O3 już go chyba nie ma
  • Pomocny post
    #8 10681649
    gaskoin
    Poziom 38  
    Włącz optymalizację w opcjach projektu.
    Jeżeli nie podoba Ci się AS to możesz spróbować z Eclipsem :)

    W nagłówku do delayów masz napisane, że bez optymalizacji delay działa źle
  • #9 10681664
    shtr
    Poziom 9  
    Racja optymalizacja pomogła, wielkie dzięki!
  • #10 10681764
    tmf
    VIP Zasłużony dla elektroda
    A na przyszłość czytaj ostrzeżenia, bo miałeś takie:
    Warning 1 #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" c:\program files (x86)\atmel\atmel studio 6.0\extensions\atmel\avrgcc\3.3.2.31\avrtoolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/util/delay.h

    tylko je zignorowałeś. Gdybyś je przeczytał to nie byłoby problemu.
  • #11 10681919
    gaskoin
    Poziom 38  
    Dobrze jest sobie włączyć traktowanie warningów jako errorów żeby ich nie olewać przypadkiem.
  • #12 10681982
    shtr
    Poziom 9  
    Ok dzięki za radę, będę pamiętać ;)
REKLAMA