Gribēju kā labāk, bet sanāca šķērsām, kad vēlējos savam Seeedstudio Stalkerim v2.0 (ATmega328P, 3V3, 8 MHz) ieliet jaunu "bootloader" – programmu, kas ielādē programmu, kaut kas līdzīgs PC datora BIOS. Jaunu vēlējos tāpēc, ka oriģinālais nepilnīgi atbalsta watchdog funkcijas, kas ļautu restartēt čipu, ja izskatās, ka programma ir uzkārusies. Tāpēc gribēju tikt pie OptiBoot versijas.

Būtlouderi ielādēju, bet Stalkeris pārstāja ar mani sazināties. Un vairs ne uz priekšu, ne atpakaļ. Pie dzīvības to atgrieza CopyLeft, pēc ilgas ņemšanās ielādējot to pašu oriģinālo būtlouderi. Viņš tam izmantoja ISP (in-system programming) pieslēgumu un AVRStudio.

Atguvu savu Stalkeri, sapratu, kas un kā. Kopijs iedeva līdzi arī AVR ISP programmētāju, ja nu es gribētu mēģināt vēlreiz. Izlasīju vairākus rakstus un nolēmu tiešām pamēģināt vēlreiz, jo tagad bija cerība, ka tikšu atpakaļ pie oriģinālā būtloudera, ja nu arī šoreiz neveiksies ar jauno.

Tad nu visas nepieciešamās darbības:

  • pievieno ISP hederi no AVR ISP
  • pielabo bootloaders/optiboot/Makefile file, kas atrodas turpat, kur Arduino programma, lai tajā ieliktu jaunu konfigurāciju ar mazāku baudreitu (tur jau viens 8 MHz variants ir, bet tas ir ar 115200, kas, kā jau pārliecinājos, nestrādā pareizi):
    • atmega328_pro8_2: TARGET = atmega328_pro_8MHz_2
    • atmega328_pro8_2: MCU_TARGET = atmega328p
    • atmega328_pro8_2: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=57600'
    • atmega328_pro8_2: AVR_FREQ = 8000000L
    • atmega328_pro8_2: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
    • atmega328_pro8_2: $(PROGRAM)_atmega328_pro_8MHz_2.hex
    • atmega328_pro8_2: $(PROGRAM)_atmega328_pro_8MHz_2.lst
    • atmega328_pro8_2_isp: atmega328_pro8_2
    • atmega328_pro8_2_isp: TARGET = atmega328_pro_8MHz_2
    • atmega328_pro8_2_isp: MCU_TARGET = atmega328p
    • # 512 byte boot, SPIEN
    • atmega328_pro8_2_isp: HFUSE = DE
    • # Low power xtal (16MHz) 16KCK/14CK+65ms
    • atmega328_pro8_2_isp: LFUSE = FF
    • # 2.7V brownout
    • atmega328_pro8_2_isp: EFUSE = 05
    • atmega328_pro8_2_isp: isp
  • izpilda dažas darbības komandrindā:
    • mac:~ xf$ cd "./Desktop/dev/electronics/Arduino 1.0.app/Contents/Resources/Java/hardware/arduino/bootloaders/optiboot/"
    • mac:optiboot xf$ make OS=macosx ENV=arduino atmega328_pro8_2
  • rezultātā tiks uzkompilēts jauns būtlouderis "atmega328_pro8_2.hex", kas tagad jāielādē čipā
  • failu pārvietoju uz turieni, kur atrodas avrdude (to nepieciešams uzinstalēt avrdude, bet var arī izmantot to, kas nāk līdzi Arduino IDE), un turpmāk darbojos no turienes
  • ielādē būtlouderi čipā:
    • mac:avr xf$ ./bin/avrdude -v -c stk500 -p m328p -P /dev/tty.usbserial-A6003Lq8 -U flash:w:optiboot_atmega328_pro_8MHz_2.hex
  • uzliek pareizās fuses, kas nosaka to, kā čips darbosies (kalkulators šeit):
    • mac:avr xf$ ./bin/avrdude -v -c stk500 -p m328p -P /dev/tty.usbserial-A6003Lq8 -U lfuse:w:0xff:m -U hfuse:w:0xde:m -U efuse:w:0x05:m
  • uzliek lock bitu, kas aizsargās būtlouderi no nejaušas pārrakstīšanas:
    • mac:avr xf$ ./bin/avrdude -v -v -c stk500 -p m328p -P /dev/tty.usbserial-A6003Lq8 -U lock:w:0x0f:m
  • izveido jaunu ierakstu ar konfigurācijas parametriem Arduino IDE boards.txt failā:
    • pro328o.name=[Optiboot] Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
    • pro328o.upload.protocol=stk500
    • pro328o.upload.maximum_size=32256
    • pro328o.upload.speed=57600
    • pro328o.bootloader.low_fuses=0xff
    • pro328o.bootloader.high_fuses=0xde
    • pro328o.bootloader.extended_fuses=0x05
    • pro328o.bootloader.path=optiboot
    • pro328o.bootloader.file=optiboot_atmega328_pro_8MHz_2.hex
    • pro328o.bootloader.unlock_bits=0x3F
    • pro328o.bootloader.lock_bits=0x0F
    • pro328o.build.mcu=atmega328p
    • pro328o.build.f_cpu=8000000L
    • pro328o.build.core=arduino

Tas arī viss, vajadzētu darboties. Pieņemu, ka tāds čakars tikai tajā gadījumā, ka čips ir ar 8 MHz frekvenci. Ja būtu standarta 16 MHz, tad vienkāršāk, jo problēma bija tajā, ka nebija iespējams komunicēt ar čipu ar 115200 ātrumu.

Protams, pēc tam atklāju, kā būtlouderi var ielādēt no tās pašas Arduino IDE, izmantojot ISP. Toties komandrindā vismaz var uzzināt vairāk informācijas.

  • /hardware/arduino/progammers.txt:
    • avrisp_2.name=AVR ISP (2)
    • avrisp_2.communication=serial
    • avrisp_2.protocol=stk500v2
  • /Library/Arduino/preferences.txt:
    • upload.using=avrisp_2
    • programmer=arduino.avrisp_2

Pēc tam lock bits jāuzliek komandrindā manuāli (skatīt augstāk), tas kaut kā nenotiek automātiski.

Aktuālo informāciju par čipu un tā parametriem var uzzināt ar šo komandu:

  • ./bin/avrdude -v -c stk500 -p m328p -P /dev/tty.usbserial-A6003Lq8