Zápisník experimentátora
Tuto otázku si kladou lidé, kteří se pokoušejí pomocí Arduina naprogramovat jiný mikrokontrolér. Pokud jsou k tomu mikrokontroléru připojeny jiné součástky a v mikrokontroléru je program, který manipuluje s piny, přes které se programuje, je reálná šance, že se Arduino díky tomu vyzkratuje? Abychom získali odpověď na tuto otázku, pojďme se podívat, jak ISP programování funguje.
Algoritmus ISP programování je následující:
Pro Arduino existuje program ArduinoISP
. V jeho zdrojovém kódu si můžete celý algoritmus zkontrolovat.
void start_pmode() {
// Reset target before driving PIN_SCK or PIN_MOSI
// SPI.begin() will configure SS as output, so SPI master mode is selected.
// We have defined RESET as pin 10, which for many Arduinos is not the SS pin.
// So we have to configure RESET as output here,
// (reset_target() first sets the correct level)
reset_target(true);
pinMode(RESET, OUTPUT);
SPI.begin();
SPI.beginTransaction(SPISettings(SPI_CLOCK, MSBFIRST, SPI_MODE0));
// See AVR datasheets, chapter "SERIAL_PRG Programming Algorithm":
// Pulse RESET after PIN_SCK is low:
digitalWrite(PIN_SCK, LOW);
delay(20); // discharge PIN_SCK, value arbitrarily chosen
reset_target(false);
// Pulse must be minimum 2 target CPU clock cycles so 100 usec is ok for CPU
// speeds above 20 KHz
delayMicroseconds(100);
reset_target(true);
// Send the enable programming command:
delay(50); // datasheet: must be > 20 msec
spi_transaction(0xAC, 0x53, 0x00, 0x00);
pmode = 1;
}
void end_pmode() {
SPI.end();
// We're about to take the target out of reset so configure SPI pins as input
pinMode(PIN_MOSI, INPUT);
pinMode(PIN_SCK, INPUT);
reset_target(false);
pinMode(RESET, INPUT);
pmode = 0;
}
Díky tomu, že se cílový mikrokontrolér před programováním resetne a nemůže nastavovat HIGH / LOW na pinu, nemůže dojít k nechtěnému zkratu na programovacích pinech. Důležité je ale to, aby tyto piny nebyly natvrdo připojené na napájení nebo GND. Pokud se na nich nacházejí LED diody s rezistorem, je to naprosto bezpečné.
Ani připojení na napájení nebo GND by nemělo poškodit Arduino. Arduino má interní ochranné diody, které na chvíli snesou i zkrat a ISP programátor by měl velmi rychle zjistit, že se jeho piny nedají ovládat a odpojit se. Z vlastní zkušenosti mohu potvrdit, že mikrokontroléry ATtiny85 a ATmega328P krátkodobě snesou i prohození VCC a GND, takže při běžných obvodech by se vám nemělo za žádných okolností podařit zničit své Arduino.
24.02.2018