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][C] Dwie wersje pętli FOR. Jedna nie działa - dlaczego?

Electix 27 Gru 2010 13:58 1799 3
REKLAMA
  • #1 8918555
    Electix
    Poziom 21  
    Witam serdecznie. Wczoraj pisząc program napotkałem na takie dziwne zjawisko. Napisałem pewną funkcję tak:
    
    void lightc(volatile uint8_t * color, _Bool dimmer)
    {
    	switch (dimmer)
    	{
    		case 0:
    				for(*color; *color>0x00; *color--) _delay_ms(czas);
    				*color=0x00;
    				break;
    		case 1:
    				for(*color; *color<0xFF; *color++) _delay_ms(czas);
    				*color=0xFF;
    				break;
    	}
    }
    

    Program z tą funkcją kompiluje się bez błędów i ostrzeżeń, ale gdy uruchamiam go na µkontrolerze to nie ma efektu. Po prostu nie działa.

    Gdy zmodernizowałem powyższą funkcję do takiej formy:
    
    void lightc(volatile uint8_t * color, _Bool dimmer)
    {
    	uint8_t i;
    	switch (dimmer)
    	{
    		case 0:
    				for(i=*color; i>0x00; *color=i--) _delay_ms(czas);
    				*color=0x00;
    				break;
    		case 1:
    				for(i=*color; i<0xFF; *color=i++) _delay_ms(czas);
    				*color=0xFF;
    				break;
    	}
    }
    

    Wszystko działa tak jak sobie to założyłem.

    Czy ktoś z forumowiczów biegłych w C może mi wyjaśnić co może być przyczyną tego dziwnego działania?

    Podaną funkcję w programie wywołuję np. tak:
    
    #include <avr/io.h>
    #include<util/delay.h>
    
    //*****DEFINICJE STAŁYCH*****
    #define RLED OCR0A   // PINB.2
    #define Dim 0
    #define Brighten 1
    #define czas 24 
    
    //*****DEKLARACJE FUNKCJI*****
    void config(void);
    void lightc(volatile uint8_t * color, _Bool dimmer);
    
    //*****PROGRAM GŁÓWNY********
    int main(void)
    {
            config();
    	while(1)
    	{
    	      lightc(&RLED, Brighten);
    	      _delay_ms(czas);
    	      lightc(&RLED, Dim);
    	      _delay_ms(czas);
    	}
    }
    
    

    Efektem działania programu jest płynne rozjaśnianie i ściemnianie (w pętli) podłączonej do wyjścia PWM diody LED.
  • REKLAMA
  • Pomocny post
    #2 8918618
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Electix napisał:
    *color--

    Takie wyrażenie zwraca starą wartość wskazywaną przez color i zmniejsza WSKAŹNIK, a nie wartość wskazywaną. Powinno być (*color)--

    Pozatym:
    for(*color; *color>0x00; *color--)
    To pierwsze "*color" jest zupełnie zbędne i nie robi zupełnie nic.

    4\/3!!
  • REKLAMA
  • #4 8919060
    Electix
    Poziom 21  
    No i pomogło :)
    Rzeczywiście nie pomyślałem, że priorytet operatorów może tak wpłynąć na działanie tej pętli. Ale to efekt braku biegłości i doświadczenia. Z czasem pewnie będzie łatwiej takie błędy wychwycić. Dziękuję Kolegom za podpowiedź. :)
REKLAMA