Saat Anda mengatur ulang Uno yang menjalankan loader Optiboot, bootloader pertama akan mem-flash pin 13 sebanyak tiga kali.
Baris atas (abu-abu) dikirim ke Arduino, garis tengah (oranye) dikirim dari Arduino.
Ketika itu terjadi, program yang avrdude
berjalan di komputer Anda mengirimkan kueri ke perangkat:
STK_GET_SYNC / CRC_EOP (0x30/0x20)
Arduino tidak melihat "get sync" yang pertama karena sibuk mem-flash pin 13. Setelah selesai, pemberitahuan "get sync" (itu akan disangga oleh perangkat keras serial) dan menjawab:
STK_INSYNC / STK_OK (0x14/0x10)
Sepertinya avrdude menjadi sedikit tidak sabar, dan kehabisan waktu, karena ia mencoba lagi dengan permintaan "get sync". Kali ini Optiboot segera merespons.
Sisa dari pengunggahan dijelaskan pada gambar berikutnya. Contoh yang dihasilkan mengunggah program saham "Blink".
(Klik pada gambar di atas untuk versi yang lebih besar)
Langkah-langkahnya adalah:
- Pertanyaan: Dapatkan Sinkronisasi? Jawab: Di Sinkronisasi.
- Pertanyaan: Dapatkan parameter? (versi utama) Jawab: versi 4.
- Pertanyaan: Dapatkan parameter? (versi minor) Jawab: versi 4.
Tetapkan parameter perangkat. Parameter perangkat berikut dikirim ke chip:
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 mengabaikan semua itu dan membalas dengan In Sync / OK. :)
Tetapkan parameter perangkat yang diperluas:
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 mengabaikan semua itu juga dan membalas dengan In Sync / OK.
Masuk ke mode program. Jawab: Di Sinkron / OK.
Baca tanda tangan. Optiboot membalas dengan 0x1E 0x95 0x0F
tanpa benar-benar membaca tanda tangan .
Tulis sekering (empat kali). Optiboot tidak menulis sekring tetapi hanya membalas Dalam Sinkronisasi / OK.
Muat alamat (awalnya 0x0000). Alamatnya dalam kata-kata (mis. Sebuah kata adalah dua byte). Ini menetapkan alamat di mana halaman data selanjutnya akan ditulis.
Halaman program (hingga 128 byte dikirim). Optiboot segera membalas "In Sync". Lalu ada jeda sekitar 4 ms sementara sebenarnya memprogram halaman. Kemudian itu menjawab "OK".
Muat alamat (sekarang 0x0040). Ini adalah alamat 64 dalam desimal, yaitu. 128 byte dari awal memori program.
Halaman lain ditulis. Urutan ini berlanjut sampai semua halaman ditulis.
Muat alamat (kembali ke 0x0000). Ini untuk memverifikasi penulisan.
Baca halaman (hingga 128 byte dibaca). Ini untuk memverifikasi. Perhatikan bahwa meskipun verifikasi gagal, data buruk telah ditulis ke chip.
Tinggalkan mode pemrograman.
Apa artinya "tidak sinkron"?
Seperti yang Anda lihat dari atas, setiap langkah melalui urutan pemrograman yang diharapkan akan dijawab oleh Arduino dengan "In Sync" (0x14), mungkin diikuti oleh beberapa data, diikuti oleh "OK" (0x10).
Jika "tidak sinkron" itu berarti avrdude tidak mendapatkan respons "sinkron". Kemungkinan alasannya adalah:
- Tingkat baud salah digunakan
- Port serial salah dipilih dalam IDE
- Jenis papan yang salah dipilih dalam IDE
- Tidak ada bootloader yang diinstal
- Bootloader salah diinstal
- Board tidak dikonfigurasikan untuk menggunakan bootloader (di sekering)
- Beberapa perangkat dicolokkan ke pin D0 dan D1 pada Arduino, mengganggu komunikasi serial
- Chip antarmuka USB (ATmega16U2) tidak berfungsi dengan benar
- Jam salah untuk papan tulis
- Pengaturan sekering yang salah pada Atmega328P (mis. "Bagi jam dengan 8")
- Board / chip rusak
- Kabel USB rusak (beberapa kabel USB hanya memberikan daya, dan bukan untuk data, mis. Kabel murah untuk penggemar USB)
Apa itu "dalam sinkronisasi"?
Seperti disebutkan di atas, respons "Dalam sinkronisasi" berarti Arduino (bootloader) disinkronkan dengan program pengunggahan.
Protokol apa yang digunakan?
Protokol adalah protokol STK500 yang didokumentasikan oleh Atmel. Lihat referensi di bawah ini.
Referensi
Catatan : STK500 Versi 2 tidak digunakan dalam Optiboot, tetapi disertakan untuk informasi jika Anda menggunakan papan seperti Mega2560.
Konstanta STK500
/* 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'