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

[tyny13][c]AVRDUDE: ERROR: address 0x0410 out of range.

carkar 06 Lip 2010 18:34 3517 6
REKLAMA
  • #1 8267006
    carkar
    Poziom 15  
    Napisałem programik pod tiny13 w c daje program a tu niemiła niespodzianka.
    
    
    > "make.exe" program
    
    Compiling C: main.c
    avr-gcc -c -mmcu=attiny13 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o 
    main.c: In function 'main':
    main.c:12: warning: implicit declaration of function 'rand'
    
    Linking: main.elf
    avr-gcc -mmcu=attiny13 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref     -lm
    
    Creating load file for Flash: main.hex
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock main.elf main.hex
    
    Creating load file for EEPROM: main.eep
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
    	--change-section-lma .eeprom=0 --no-change-warnings -O ihex main.elf main.eep || exit 0
    avrdude -p attiny13 -P usb -c usbasp    -U flash:w:main.hex 
    
    avrdude: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.03s
    
    avrdude: Device signature = 0x1e9007
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude: reading input file "main.hex"
    avrdude: input file main.hex auto detected as Intel Hex
    [color=red]avrdude: ERROR: address 0x0410 out of range at line 65 of main.hex[/color]
    avrdude: write to file 'main.hex' failed
    
    avrdude done.  Thank you.
    
    make.exe: *** [program] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:01
    
    

    Jeszcze kod programu:
    
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>               
    
    int main(void)
    {
      int nadal;
      nadal = 0x01;
      DDRB = 0x07;
      PORTB = 0x18;
      while(1) {
      int zmienna = rand()%5000;
      _delay_ms(zmienna);
      PORTB |= 0x01;
      
      while(nadal) {
      if (!(PINB & 0x08)) {
      PORTB &= ~0x01;
      PORTB |= 0x02;
      nadal = 0x00;
      break;
      }
      if (!(PINB & 0x10)) {
      PORTB &= ~0x01;
      PORTB |= 0x03;
      nadal = 0x00;
      }
      _delay_ms(3000);
       }  
      }
      }  
    
    


    Co jest nie tak??

    P.s. Co ciekawe gdy zamienię linijkę:
    int zmienna = rand()%5000;

    na:
    int zmienna = 5673;
    Wszystko gra....
    Więc jak inaczej wygenerować liczbę losową??
  • REKLAMA
  • Pomocny post
    #2 8267529
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #3 8267706
    gaskoin
    Poziom 38  
    carkar napisał:
    Więc jak inaczej wygenerować liczbę losową??


    można użyć timera zamiast rand()
  • #4 8267753
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #5 8267947
    mirekk36
    Poziom 42  
    carkar napisał:
    Napisałem programik pod tiny13 w c daje program a tu niemiła niespodzianka.

    ....
    Więc jak inaczej wygenerować liczbę losową??


    Co za niespodzianka ???? To tylko i wyłącznie twój błąd. Wiele razy było wałkowane na temat tego, że do funkcji _delay_ms(xxx) nie należy przekazywać zmiennych bo to właśnie skutkuje takim gwałtownym przyrostem kodu. I nie jest to przypadkowy przyrost. Tyle że teraz nie będziemy rozmawiać dlaczego nie jest przypadkowy.

    Na dzisiaj uświadom sobie i zakonotuj, że do funkcji _delay_ms(xxx) w miejsce xxx podstawiasz tylko i WYŁĄCZNIE stałą dosłowną a nie zmienną. Zrób to a zobaczysz w jak cudowny sposób zmniejszy ci się ilość kodu. A kiedyś zrozumiesz dlaczego przyrasta gdy ładujesz tam na siłę zmienną!

    Jeśli już chcesz koniecznie mieć możliwość regulacji czasu pętli opóźniającej w milisekundach to piszesz sobie ew taką funkcyjkę:

    void my_delay(uint16_t ms) {
       while(ms--) _delay_ms(1);
    }


    i wtedy możesz spokojnie podać do takiej funkcji zmienną, która spowoduje odczekanie żądanej przez ciebie ilości ms.

    teraz jaśniej ??? ;)
  • REKLAMA
  • Pomocny post
    #6 8268019
    Dr.Vee
    VIP Zasłużony dla elektroda
    mirekk36 ma tu oczywiście rację.

    Dodatkowo użycie rand() bez inicjalizacji przez srand() zawsze po resecie zwróci taką samą "losową" liczbę. Generator liczb pseudolosowych trzeba jakoś zainicjalizować.
  • #7 8270197
    carkar
    Poziom 15  
    Dzięki wszystkim.
    Dostajecie po 3 punkty.
REKLAMA