Může se Arduino poškodit, když se používá jako ISP programátor?

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í:

  • Nastaví se signál reset, který cílový mikrokontrolér přepne do programovacího stavu. Tehdy cílový mikrokontrolér nedokáže ovládat své piny.
  • Programátor aktivuje SPI rozhraní.
  • Cílový mikrokontrolér se naprogramuje.
  • Programátor deaktivuje SPI rozhraní.
  • Vypne se signál reset a cílový mikrokontrolér se spustí. Nyní už může cílový mikrokontrolér ovládat své piny.

Pro Arduino existuje program ArduinoISP. V jeho zdrojovém kódu si můžete celý algoritmus zkontrolovat.

Funkce start_pmode

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;
}

Funkce end_pmode

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;
}

Může se Arduino poškodit?

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


Menu