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

[attiny2313][C] wgrywanie programu

_michasss_ 04 Paź 2008 14:43 2344 6
  • #1 5597884
    _michasss_
    Poziom 11  
    Hej ;)
    Jestem poczatkujacym w dziedzienie uP dlatego prosze o wyrozumialosc :). Stworzylem ostatnio prosty uklad ktory ma sterowac praca 3 diod. Napisalem program w C:

    
    
    #include <avr/io.h>
    #define F_CPU 8000000
    #include <util/delay.h>
    
    
    int main()
    {
    	int dioda_zolta = 0x01;
    	int dioda_zielona = 0x02;
    	int dioda_czerwona = 0x04;
    	int czas = 10;
    
    
         while(1)
    	 {
    	 	DDRB = dioda_zolta;
    		PORTB = 0x00;
    		_delay_ms(czas);
    		PORTB = 0xff;
    		_delay_ms(czas);
    		
    		DDRB = dioda_zielona;
    		PORTB = 0x00;
    		_delay_ms(czas);
    		PORTB = 0xff;
    		_delay_ms(czas);
    		
    		DDRB = dioda_czerwona;
    		PORTB = 0x00;
    		_delay_ms(czas);
    		PORTB = 0xff;
    		_delay_ms(czas);
    	}
    }
    
    


    i to wszystko dziala bez problemu, ale poniewaz chcialem zeby kod byl "ladniejszy" to napisalem jeszcze cos takiego:

    
    
    #include <avr/io.h>
    #define F_CPU 8000000
    #include <util/delay.h>
    
    
    void mrygacz(int ktora_dioda, int jak_dlugo)
    {
           DDRB = ktora_dioda;
           PORTB = 0x00;
           _delay_ms(jak_dlugo);
          PORTB = 0xff;
          _delay_ms(jak_dlugo);
    }
    
    
    int main()
    {
    	int dioda_zolta = 0x01;
    	int dioda_zielona = 0x02;
    	int dioda_czerwona = 0x04;
    	int czas = 10;
    	
    	while(1)
    	{
            mrygacz(dioda_zolta, czas);
            mrygacz(dioda_zielona, czas);
            mrygacz(dioda_czerwona, czas);
    	}
    }
    
    


    obydwa programy kompiluja sie bez problemu, natiomiast przy tym drugim wystpuje problem z wgraniem go do uP. Avrdude wyswietla cos takiego:

    
    
    Reading | ################################################## | 100% 0.02s
    
    avrdude: Device signature = 0x1e910a
    avrdude: erasing chip
    avrdude: reading input file "C:\avr\diodki\main.hex"
    avrdude: input file C:\avr\diodki\main.hex auto detected as Intel Hex
    avrdude: ERROR: address 0x0810 out of range at line 129 of C:\avr\diodki\main.hex
    avrdude: write to file 'C:\avr\diodki\main.hex' failed
    
    avrdude done.  Thank you.
    
    


    Co nie tak zrobilem? Przypomne ze ten pierwszy program dzialal jak nalezy, a ten drugi nie chce sie wgrac nie wiem z jakiego powodu (program ma takie samo zadanie jak ten pierwszy), pozdrawiam i dziekuje za zainteresowanie :)
  • Pomocny post
    #2 5597890
    Pituś Bajtuś
    Poziom 28  
    Cytat:
    ERROR: address 0x0810 out of range

    Kod wyszedł za duży. Masz włączoną jakąś optymalizację?
  • #3 5597897
    _michasss_
    Poziom 11  
    szczerze mowiac ... nie wiem ... gdzie moge to sprawdzic?

    btw. przeciez ten drugi jest krotszy od pierwszego :)

    Dodano po 31 [minuty]:

    troche pogooglowalem i znalazlem - pomoglo ;) dziekuje :)

    # 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


    p.s pomogl :)
  • #4 5598185
    wojnar
    Poziom 17  
    Przepraszam,
    ale interesuje mnie to bardzo, bo sam zaczynam uczyć się programować w C.
    To optymalizacja ma taki duży wpływ na wielkość kodu, gdyż bez niej kod, który ma mrygać trzema LED-ami nie wlezie do ATtiny 2313?
  • #5 5599011
    mario06
    Poziom 15  
    Przy opóźnieniach _delay_ms jak i _delay_us powinieneś dawać stałą wartość, jeśli nie dasz to obliczeniem czasu opóźnienia zajmie się mikrokontroler. Możesz sprawdzić i porównać ile kod będzie zajmował tak jak masz teraz, a ile jeśli jest podana wartość stała, a nie zmienna.

    Jeśli chcesz kontrolować czas mimo takiego ograniczenia to najlepiej przez zapętlenie określoną ilość razy jakieś proste opóżnienie np.:

    
    for(i=x;i>0;i--)
     {_delay_ms(1);}
    

    i sobie ustawiasz ile czasu ma trwać opóźnienie w takiej pętli. W takim przypadku kompilator zajmie się właściwym opóźnieniem, a mikrokontroler zapętli to odpowiednią ilość razy.
  • #6 5599616
    _StinG_
    Poziom 14  
    tylko teraz spostrzeżenie z logicznego punktu widzenia... jeśli mamy _delay_ms(), to on przecież daje konkretne opóźnienie, a jak używa się pętli, to do czasu delay'a dochodzi jeszcze czas obsługi tej pętli, może mało istotny problem, ale czasem może sporo namieszać...
  • #7 5599937
    Balu
    Poziom 38  
    Generalnie to kolega (AUTOR) bardzo rozrzutny jest po co inty, jak można wziąć unsigned char,
    po co
    Cytat:

    int dioda_zolta = 0x01;
    int dioda_zielona = 0x02;
    int dioda_czerwona = 0x04;
    int czas = 10;

    te zmienne?
    Nie lepiej definicjami jako stałe? I tak ich nie zmieniamy...
    A jak ktoś stwierdził gcc woli (mniejszy kod) jak czas jest stałą:)

    Ł.
REKLAMA