Ciao a tutti gli amici del forum,
desidero sottoporvi un fastidiosissimo problema che si sta verificando scrivendo codice per ATtiny84.
Mi capita, già in un paio di progetti, durante la compilazione di avere questo errore:
c:/program files (x86)/arduino sw/arduino-1.0/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn84.o:(.init9+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in c:/program files (x86)/arduino sw/arduino-1.0/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)
il quale, ovviamente, fa fallire la compilazione.
Ho notato che il "diavolo" si manifesta tutte le volte che lo sketch oltrepassa circa il 50% dello spazio disponibile, (infatti per eliminare l'errore mi basta levare qualche riga di codice...qualunque tipo di riga e lo sketch compila correttamente).
Ho pensato che si potesse trattare di qualche problema di occupazione di memoria (soprattutto SRAM) allora ho fatto la prova con uno sketch con le seguenti caratteristiche:
- nessuna libreria esterna
- nessun array di dati da riempire dinamicamente
- solo istruzioni "classiche" (assegnamenti, cicli for, digitalWrite, analogWrite, map)
Lo sketch fino a 4306 byte compila correttamente, dopo un ennesimo copia & incolla (non importa esattamente di quale istruzione, magari per un determinato tipo occorre incollarne più di una), si manifesta l'errore.
avr-size riporta questo:
AVR Memory Usage
Device: attiny84
Program: 4306 bytes (52.6% Full)
(.text + .data + .bootloader)Data: 108 bytes (21.1% Full)
(.data + .bss + .noinit)
quindi non sembrano esserci problemi di memoria.
Da cosa mai potrebbe dipendere l'errore? Fuse non correttamente settati? chip rovinato?
Per completezza d'informazione posto le impostazioni presenti nella board per il micro (che funziona a 8Mhz)
###########################################################################
attiny84at8.name=ATtiny84 @ 8 MHz (internal oscillator; BOD disabled)
# The following do NOT work...
# attiny84at8.upload.using=avrispv2
# attiny84at8.upload.using=Pololu USB AVR Programmer
# The following DO work (pick one)...
attiny84at8.upload.using=arduino:arduinoisp
# attiny84at8.upload.protocol=avrispv2
# attiny84at8.upload.using=pololu
attiny84at8.upload.maximum_size=8192
# Default clock (slowly rising power; long delay to clock; 8 MHz internal)
# Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms; [CKSEL=0010 SUT=10]; default value
# Brown-out detection disabled; [BODLEVEL=111]
# Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0]
attiny84at8.bootloader.low_fuses=0xE2
attiny84at8.bootloader.high_fuses=0xD7
attiny84at8.bootloader.extended_fuses=0xFF
attiny84at8.bootloader.path=empty
attiny84at8.bootloader.file=empty84at8.hex
attiny84at8.bootloader.unlock_bits=0xFF
attiny84at8.bootloader.lock_bits=0xFF
attiny84at8.build.mcu=attiny84
attiny84at8.build.f_cpu=8000000L
attiny84at8.build.core=tiny
Confido insieme nella vostra esperienza e benevolenza ...