Optiboot yükleyiciyi çalıştıran bir Uno'yu sıfırladığınızda, önyükleyici önce pim 13'ü üç kez yanıp söner.
Üst satır (gri) gönderilir için Arduino, orta hat (turuncu) gönderilir den Arduino.
Bu sırada, avrdude
bilgisayarınızda çalışan program cihaza bir sorgu gönderir:
STK_GET_SYNC / CRC_EOP (0x30/0x20)
Arduino, yanıp sönen pim 13 ile meşgul olduğu için ilk "senkronizasyonu al" ı fark etmez. Bir kez yapıldığında "senkronizasyonu al" (seri donanım tarafından arabelleğe alınır) fark eder ve yanıtlar:
STK_INSYNC / STK_OK (0x14/0x10)
Görünüşe göre avrdude biraz sabırsız ve zaman aşımına uğradı, çünkü tekrar "senkronizasyon al" sorgusuyla çalışıyor. Bu sefer Optiboot hemen cevap veriyor.
Yüklemenin geri kalanı bir sonraki resimde açıklanmıştır. Stok "Blink" programı yüklenerek oluşturulan örnek.
(Daha büyük bir versiyon için yukarıdaki resme tıklayın)
Adımlar:
- Sorgu: Senkronizasyon al? Cevap: Senk.
- Sorgu: Parametre al? (ana sürüm) Yanıt: sürüm 4.
- Sorgu: Parametre al? (küçük sürüm) Yanıt: sürüm 4.
Cihaz parametrelerini ayarlayın. Aşağıdaki cihaz parametreleri çipe gönderilir:
0x42 // STK_SET_DEVICE
0x86 // device code
0x00 // revision
0x00 // progtype: “0” – Both Parallel/High-voltage and Serial mode
0x01 // parmode: “1” – Full parallel interface
0x01 // polling: “1” – Polling may be used
0x01 // selftimed: “1” – Self timed
0x01 // lockbytes: Number of Lock bytes.
0x03 // fusebytes: Number of Fuse bytes
0xFF // flashpollval1
0xFF // flashpollval2
0xFF // eeprompollval1
0xFF // eeprompollval2
0x00 // pagesizehigh
0x80 // pagesizelow
0x04 // eepromsizehigh
0x00 // eepromsizelow
0x00 // flashsize4
0x00 // flashsize3
0x80 // flashsize2
0x00 // flashsize1
0x20 // Sync_CRC_EOP
Optiboot tüm bunları yok sayar ve In Sync / OK ile yanıtlar. :)
Genişletilmiş cihaz parametrelerini ayarlayın:
0x45 // STK_SET_DEVICE_EXT
0x05 // commandsize: how many bytes follow
0x04 // eeprompagesize: EEPROM page size in bytes.
0xD7 // signalpagel:
0xC2 // signalbs2:
0x00 // ResetDisable: Defines whether a part has RSTDSBL Fuse
0x20 // Sync_CRC_EOP
Optiboot da bunları yok sayar ve In Sync / OK ile yanıtlar.
Program moduna girin. Cevap: Senk / Tamam.
İmzayı okuyun. Optiboot 0x1E 0x95 0x0F
, imzayı gerçekten okumadan yanıt verir .
Sigortaları yazın (dört kez). Optiboot sigortayı yazmaz, sadece Sync / OK olarak yanıtlar.
Yükleme adresi (başlangıçta 0x0000). Adres kelimelerdir (yani bir kelime iki bayttır). Bu, bir sonraki veri sayfasının yazılacağı adresi ayarlar.
Program sayfası (128 bayta kadar gönderilir). Optiboot hemen "In Sync" yanıtını verir. Ardından, sayfayı gerçekten programlarken yaklaşık 4 ms'lik bir duraklama olur. Sonra "Tamam" yanıtını verir.
Yükleme adresi (şimdi 0x0040). Bu, ondalık olarak adres 64'tür, yani. Program belleğinin başlangıcından itibaren 128 bayt.
Başka bir sayfa yazılmıştır. Bu sıra tüm sayfalar yazılana kadar devam eder.
Adresi yükle (0x0000'e geri dön). Bu yazmayı doğrulamak içindir.
Sayfayı oku (128 bayta kadar okunur). Bu doğrulama içindir. Doğrulama başarısız olsa bile, bozuk verilerin zaten çipe yazıldığını unutmayın.
Programlama modundan çıkın.
"Senkronize değil" ne anlama geliyor?
Yukarıdan da görebileceğiniz gibi, Arduino'nun programlama sekansındaki her adımda, muhtemelen bazı veriler ve ardından "Tamam" (0x10), ardından "Senkronize" (0x14) ile yanıt vermesi bekleniyor.
Eğer "senkronize değil" ise, avrdude "senkronize" yanıtı almadı demektir. Olası nedenler şunlar olabilir:
- Yanlış baud hızı kullanılmış
- IDE'de yanlış seri bağlantı noktası seçildi
- IDE'de yanlış kart türü seçildi
- Yüklü önyükleyici yok
- Yanlış önyükleyici takılmış
- Kart önyükleyiciyi kullanacak şekilde yapılandırılmamış (sigortalarda)
- Bazı cihazlar Arduino'daki D0 ve D1 pinlerine takılı ve seri haberleşmelere müdahale ediyor
- USB arabirim yongası (ATmega16U2) düzgün çalışmıyor
- Tahta için yanlış saat
- Atmega328P'de yanlış sigorta ayarları (örn. "Saati 8'e böl")
- Kart / yonga hasarlı
- Hatalı USB kablosu (bazı USB kabloları yalnızca güç sağlar ve veri için değildir, örneğin USB fanları için ucuz kablolar)
"Senkronize" nedir?
Yukarıda belirtildiği gibi, "Senkronize" yanıtı, Arduino'nun (bootloader) yükleme programıyla senkronize edildiği anlamına gelir.
Hangi protokol kullanılıyor?
Protokol, Atmel tarafından belgelendiği gibi STK500 protokolüdür. Aşağıdaki referanslara bakın.
Referanslar
Not : STK500 Sürüm 2, Optiboot'ta kullanılmaz, ancak Mega2560 gibi kartlar kullanmanız durumunda bilgi için dahil edilir.
STK500 sabitleri
/* STK500 constants list, from AVRDUDE */
#define STK_OK 0x10
#define STK_FAILED 0x11 // Not used
#define STK_UNKNOWN 0x12 // Not used
#define STK_NODEVICE 0x13 // Not used
#define STK_INSYNC 0x14 // ' '
#define STK_NOSYNC 0x15 // Not used
#define ADC_CHANNEL_ERROR 0x16 // Not used
#define ADC_MEASURE_OK 0x17 // Not used
#define PWM_CHANNEL_ERROR 0x18 // Not used
#define PWM_ADJUST_OK 0x19 // Not used
#define CRC_EOP 0x20 // 'SPACE'
#define STK_GET_SYNC 0x30 // '0'
#define STK_GET_SIGN_ON 0x31 // '1'
#define STK_SET_PARAMETER 0x40 // '@'
#define STK_GET_PARAMETER 0x41 // 'A'
#define STK_SET_DEVICE 0x42 // 'B'
#define STK_SET_DEVICE_EXT 0x45 // 'E'
#define STK_ENTER_PROGMODE 0x50 // 'P'
#define STK_LEAVE_PROGMODE 0x51 // 'Q'
#define STK_CHIP_ERASE 0x52 // 'R'
#define STK_CHECK_AUTOINC 0x53 // 'S'
#define STK_LOAD_ADDRESS 0x55 // 'U'
#define STK_UNIVERSAL 0x56 // 'V'
#define STK_PROG_FLASH 0x60 // '`'
#define STK_PROG_DATA 0x61 // 'a'
#define STK_PROG_FUSE 0x62 // 'b'
#define STK_PROG_LOCK 0x63 // 'c'
#define STK_PROG_PAGE 0x64 // 'd'
#define STK_PROG_FUSE_EXT 0x65 // 'e'
#define STK_READ_FLASH 0x70 // 'p'
#define STK_READ_DATA 0x71 // 'q'
#define STK_READ_FUSE 0x72 // 'r'
#define STK_READ_LOCK 0x73 // 's'
#define STK_READ_PAGE 0x74 // 't'
#define STK_READ_SIGN 0x75 // 'u'
#define STK_READ_OSCCAL 0x76 // 'v'
#define STK_READ_FUSE_EXT 0x77 // 'w'
#define STK_READ_OSCCAL_EXT 0x78 // 'x'