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

AVR Studio 4: Dioda miga zbyt szybko, delayms(1000) trwa 4ms, jak naprawić?

slawek-matyl 28 Gru 2007 21:22 945 5
REKLAMA
  • #1 4633812
    slawek-matyl
    Poziom 12  
    Posty: 97
    Pomógł: 1
    Ocena: 55
    Witam
    Mój problem dotyczy sie tego, iż dioda zamiast zaświecać się i gasnąc co sekundę, robi to o wiele krócej, w AVR Studio 4 pokazuje ze pętla delayms(1000) wykonuje sie w 4ms.
    Proszę o wskazówki, pozdrawiam
    
    #include <avr/io.h>
    #define FF_CPU 4000000
    #define CYCLES_PER_US ((FF_CPU+500000)/1000000)
    
    #define LED_ON PORTB |=_BV(1)
    #define LED_OFF PORTB &=~_BV(1)
    
    void delay(unsigned int us)
    {
    	unsigned int delay_loops;
    	register unsigned int i;
    	delay_loops=(us+3)/(5*CYCLES_PER_US);
    	for(i=0;i<delay_loops;i++)
    		{
    
    		}
    
    }
    
    void delayms(unsigned int ms)
    {
    	unsigned int i;
    	for(i=0;i<ms;i++)
    		{
    			delay(999);
    			asm volatile("WDR"::);
    
    		}
    }
    
    int main(void)
    {
    	for(;;)
    		{
    	DDRB=0xFF;
    	LED_ON;
    	delayms(1000);
    	LED_OFF;
    	delayms(1000);
    		}
    
    	return(0);
    }
    
  • REKLAMA
  • #2 4633948
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    A na jakim kwarcu (częstotliwości pracuje Twój procek ??? Bo to że piszesz w programie że to 4MHz to on kwarcu takiego nie podłączy.
  • REKLAMA
  • #3 4634001
    bogo88
    Poziom 11  
    Posty: 20
    Pomógł: 1
    Wystarczy zmień stałą w programie z 4000000 na 1000000. Atmega8 ma wewnętrzny rezonator 1 MHz i temu opóźnienia wykonywały się 4 razy dłużej.
  • REKLAMA
  • #4 4634563
    slawek-matyl
    Poziom 12  
    Posty: 97
    Pomógł: 1
    Ocena: 55
    Program ma wpisane 4000000Hz tylko na próbę do AVR Studio, normalnie w kompilatorze jak i w kodzie programu mam prawidłową wartość wpisaną czyli 1MHz, ciekawi mnie to, że obojętnie co wpiszę w
    #define CYCLES_PER_US ((F_CPU+500000)/1000000)

    zawsze jest ten sam czas opóźnienia czyli około 4ms[/quote]
  • REKLAMA
  • Pomocny post
    #5 4636341
    gmp
    Poziom 19  
    Posty: 434
    Pomógł: 29
    Ocena: 28
    slawek-matyl napisał:
    ciekawi mnie to, że obojętnie co
    [/quote]
    Coz... njaprawdopodobnije kompilator mysli za Ciebie i pusta petle po prostu pomija. Rozwiazanie:
    Albo napisz petle w asemblerze, albo przed dekalracja zmiennych w funkcji: void delay(unsigned int us) wstaw magiczne slowo volatile np:
    volatile unsigned int delay_loops;
    Poza tym jak cos nie dzial to zajrzyj najpierw do kodu asemblera wygenerowanego przez kompilator...
  • #6 4638857
    slawek-matyl
    Poziom 12  
    Posty: 97
    Pomógł: 1
    Ocena: 55
    Dziękuję bardzo za radę od szanownego forumowicza "gmp"
    Jak ustawię w pliku Makefile stopień optymalizacji na "0" to program działa prawidłowo, zajmuje około 4 % pamięci w atmega, jednak jak w tej pustej pętli wpisze sie np: k=5(program zajmuje około 3%), wykonuje się ona troszkę krócej, ale też działa
    Wielkie dzięki za pomoc i serdeczne pozdrowienia dla osób które postarały mi się pomóc, Pozdrawiam!
REKLAMA