Wenn Sie einen Uno zurücksetzen, auf dem der Optiboot Loader ausgeführt wird, blinkt der Bootloader zuerst dreimal auf Pin 13.
![Pin 13 blinkt](https://i.stack.imgur.com/py9om.png)
Die obere Linie (grau) wird an den Arduino gesendet , die mittlere Linie (orange) wird vom Arduino gesendet .
Währenddessen avrdude
sendet das auf Ihrem Computer ausgeführte Programm eine Abfrage an das Gerät:
STK_GET_SYNC / CRC_EOP (0x30/0x20)
Das Arduino bemerkt das erste "Synchronisieren" nicht, weil es beschäftigt ist, Pin 13 zu blinken. Sobald es fertig ist, bemerkt es das "Synchronisieren" (es würde von der seriellen Hardware gepuffert werden) und antwortet:
STK_INSYNC / STK_OK (0x14/0x10)
Es sieht so aus, als ob avrdude etwas ungeduldig geworden ist und eine Zeitüberschreitung festgestellt hat, weil es es erneut mit der Abfrage "Synchronisierung abrufen" versucht. Diesmal reagiert Optiboot sofort.
Der Rest des Uploads wird im nächsten Bild beschrieben. Beispiel für das Hochladen des "Blink" -Programms.
![Optiboot-Upload-Prozess](https://i.stack.imgur.com/9htH8.png)
(Klicken Sie auf das Bild oben für eine größere Version)
Die Schritte sind:
- Abfrage: Synchronisierung abrufen? Antwort: Synchron.
- Abfrage: Parameter holen? (Hauptversion) Antwort: Version 4.
- Abfrage: Parameter holen? (Nebenversion) Antwort: Version 4.
Geräteparameter einstellen. Die folgenden Geräteparameter werden an den Chip gesendet:
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 ignoriert alle diese und antwortet mit In Sync / OK. :)
Festlegen erweiterter Geräteparameter:
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 ignoriert auch alle diese und antwortet mit In Sync / OK.
Rufen Sie den Programm-Modus auf. Antwort: Synchron / OK.
Unterschrift lesen. Optiboot antwortet mit, 0x1E 0x95 0x0F
ohne die Unterschrift tatsächlich zu lesen .
Schreiben Sie die Sicherungen (viermal). Optiboot schreibt die Sicherung nicht, sondern antwortet nur In Sync / OK.
Adresse laden (anfangs 0x0000). Die Adresse wird in Worten angegeben (dh ein Wort besteht aus zwei Bytes). Hiermit wird die Adresse festgelegt, für die die nächste Datenseite geschrieben wird.
Programmseite (bis zu 128 Bytes werden gesendet). Optiboot antwortet sofort mit "In Sync". Dann gibt es eine Pause von ungefähr 4 ms, während die Seite tatsächlich programmiert wird. Dann antwortet es mit "OK".
Adresse laden (jetzt 0x0040). Dies ist die dezimale Adresse 64, d. 128 Bytes vom Beginn des Programmspeichers.
Eine andere Seite ist geschrieben. Diese Sequenz wird fortgesetzt, bis alle Seiten geschrieben sind.
Adresse laden (zurück zu 0x0000). Dies dient zur Überprüfung des Schreibvorgangs.
Leseseite (bis zu 128 Bytes werden gelesen). Dies dient zur Überprüfung. Beachten Sie, dass selbst wenn die Überprüfung fehlschlägt, die fehlerhaften Daten bereits auf den Chip geschrieben wurden.
Programmiermodus verlassen.
Was bedeutet "nicht synchron"?
Wie Sie oben sehen können, wird erwartet, dass der Arduino bei jedem Schritt durch die Programmiersequenz mit "In Sync" (0x14) antwortet, möglicherweise gefolgt von einigen Daten, gefolgt von "OK" (0x10).
Wenn es "nicht synchronisiert" ist, bedeutet dies, dass avrdude nicht die "synchronisierte" Antwort erhalten hat. Mögliche Gründe könnten sein:
- Falsche Baudrate verwendet
- Falscher serieller Port in IDE ausgewählt
- Falscher Board-Typ in IDE ausgewählt
- Kein Bootloader installiert
- Falscher Bootloader installiert
- Karte nicht für die Verwendung des Bootloaders konfiguriert (in den Sicherungen)
- Einige Geräte sind an die Pins D0 und D1 des Arduino angeschlossen und stören die serielle Kommunikation
- Der USB-Schnittstellen-Chip (ATmega16U2) funktioniert nicht richtig
- Falsche Uhr für die Tafel
- Falsche Sicherungseinstellungen am Atmega328P (zB "Uhr durch 8 teilen")
- Platine / Chip beschädigt
- Fehlerhaftes USB-Kabel (einige USB-Kabel liefern nur Strom und sind nicht für Daten bestimmt, z. B. billige Kabel für USB-Fans)
Was ist "synchron"?
Wie oben erwähnt, bedeutet die Antwort "In Sync", dass der Arduino (Bootloader) mit dem Upload-Programm synchronisiert ist.
Welches Protokoll wird verwendet?
Das Protokoll ist das von Atmel dokumentierte STK500-Protokoll. Siehe die Referenzen unten.
Verweise
Hinweis : STK500 Version 2 wird in Optiboot nicht verwendet, ist jedoch zur Information enthalten, falls Sie Boards wie das Mega2560 verwenden.
STK500-Konstanten
/* 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'