Môže sa Arduino poškodiť, keď sa používa ako ISP programátor?

Zápisník experimentátora

Túto otázku si kladú ľudia, ktorí sa pokúšajú pomocou Arduina naprogramovať iný mikrokontrolér. Ak sú k tomu mikrokontroléru pripojené iné súčiastky a v mikrokontroléri je program, ktorý manipuluje s pinmi, cez ktoré sa programuje, je reálna šanca, že sa Arduino vďaka tomu vyskratuje? Aby sme získali odpoveď na túto otázku, poďme sa pozrieť, ako ISP programovanie funguje.

Algoritmus ISP programovania je nasledovný:

  • Nastaví sa signál reset, ktorý cieľový mikrokontrolér prepne do programovacieho stavu. Vtedy cieľový mikrokontrolér nedokáže ovládať svoje piny.
  • Programátor aktivuje SPI rozhranie.
  • Cieľový mikrokontrolér sa naprogramuje.
  • Programátor deaktivuje SPI rozhranie.
  • Vypne sa signál reset a cieľový mikrokontrolér sa spustí. Teraz už môže cieľový mikrokontrolér ovládať svoje piny.

Pre Arduino existuje program ArduinoISP. V jeho zdrojovom kóde si môžete celý algoritmus pozrieť.

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

Funkcia 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 sa Arduino poškodiť?

Vďaka tomu, že sa cieľový mikrokontrolér pred programovaním resetne a nemôže nastavovať HIGH/LOW na pine, nemôže dôjsť k nechcenému skratu na programovacích pinoch. Dôležité je ale to, aby tieto piny neboli natvrdo pripojené na napájanie alebo GND. Pokiaľ sa na nich nachádzajú LED diódy s rezistorom, je to úplne bezpečné.

Ani pripojenie na napájanie alebo GND by nemalo poškodiť Arduino. Arduino má interné ochranné diódy, ktoré na chvíľu znesú aj skrat a ISP programátor by mal veľmi rýchlo zistiť, že sa jeho piny nedajú ovládať a odpojiť sa. Z vlastnej skúsenosti môžem potvrdiť, že mikrokontroléry ATtiny85 a ATmega328P krátkodobo znesú aj prehodenie VCC a GND, takže pri bežných obvodoch by sa vám nemalo za žiadnych okolností podariť zničiť svoje Arduino.


24.02.2018


Menu