Arduino mint ISP és Arduino rendszerbetöltő

Az Arduino ISP az Arduino-t áramkörön belüli programozóvá változtatja az AtMega chipek újraprogramozására.


Utolsó felülvizsgálat: 2022.02.04 16:50


Mitől olyan, egy Arduino mint amilyen? Sok mindentől, de az egyik legfontosabb az, hogy minden Arduino kártya könnyen programozható az Arduino szoftverrel (IDE). Elég, ha csatlakoztatja a számítógép USB-portjához, és megnyomja a "Feltöltés" ikont, hogy elinduljon egy folyamat, amely átviszi a vázlatot a mikrokontroller Flash memóriájába.

A rendszerbetöltő

A fent leírt viselkedés egy speciális kódrészletnek köszönhető, amely a mikrokontroller minden alaphelyzetbe állításakor lefut, és egy vázlatot keres a soros/USB-portról egy meghatározott protokoll és sebesség segítségével. Ha a rendszer nem észlel kapcsolatot, a végrehajtás a vázlat kódjához kerül.

Ezt a kis (általában 512 bájtos) kódrészletet "Bootloader"-nek, "Rendszerbetöltő"-nek hívják, és a mikrokontroller memóriájának olyan területén található - a címtér végén -, amelyet nem lehet normál vázlatként átprogramozni, és ilyen célra tervezték.

Az ATmega328P memóriatérképe

A rendszerbetöltő programozásához és a mikrokontrollernek az Arduino szoftverrel (IDE) való kompatibilitásának biztosításához egy In-Circuit Serial Programmer (ISP) eszközt kell használnia, ez az az eszköz, amely a mikrokontroller meghatározott kivezetés-készletéhez csatlakozik, a mikrokontroller teljes flash memóriájának programozásának végrehajtásához, a bootloaderrel együtt.

Az ISP programozási eljárás magában foglalja a biztosítékok írását is: egy speciális bitkészlet, amely meghatározza, hogyan működik a mikrokontroller bizonyos körülmények között.

Az Arduino, mint ISP

A rendszerbetöltő kód betöltésének és a biztosítékok helyes égetésének teljes folyamatát, hogy az ATmega mikrokontrollerből "Arduino" legyen, az Arduino Software (IDE) gondoskodik: egy adott menüpontot biztosít, és lehetővé teszi a különféle programozási eszközök használatát. A programozók közül az "Arduino as ISP" a legolcsóbb és legpraktikusabb megoldás arra, hogy egy másik Arduino kártyára írjanak betöltőt ATmegával, 32U4-el vagy ATtiny-vel.

A programozási folyamat VCC-t, GND-t és négy adatkivezetést használ. Három érintkező köti össze a MISO-t, a MOSI-t és az SCK-t a programozó mikro és a célmikro között, a negyedik érintkező a programozó mikroból a cél reset kivezetésére megy.

Hogyan huzalozzuk a kártyákat

A következő táblázat mutatja, hogy a MOSI, MISO és SCK kivezetései hogyan vannak kiosztva a különböző Arduino kártyákon:

Arduino kártya MOSI MISO SCK Szint
UNO vagy Duemilanove 11 vagy ICSP-4 12 vagy ICSP-1 13 vagy ICSP-3 5V
Mega1280 vagy Mega2560 51 vagy ICSP-4 50 vagy ICSP-1 52 vagy ICSP-3 5V
Leonardo ICSP-4 ICSP-1 ICSP-3 5V
Due ICSP-4 ICSP-1 ICSP-3 3.3V
Zero ICSP-4 ICSP-1 ICSP-3 3.3V
101 11 vagy ICSP-4 12 vagy ICSP-1 13 vagy ICSP-3 3.3V

Az SPI interfész - és következésképpen ezek a kivezetések - az AVR mikrokontrollerek programozására szolgáló interfész. Vegye figyelembe, hogy a MISO, MOSI és SCK következetes fizikai helyen érhetők el az ICSP csatlakozóján; ezt a csatlakozót az SPI interfészen alapuló pajzsok is használják, lehetővé téve a minden kártyán működő shieldek tervezését.

A következő képen látható Arduino UNO-n pirossal kiemeltük a csatlakotósáv kivezetéseit; sárga az ICSP csatlakozó, amely az ATmega328P-hez csatlakozik. Felhívjuk figyelmét, hogy a Rev.3 kártyán van egy ATMega 16U2 chip, amely kezeli az USB-kapcsolatot, és ez a chip átprogramozható egy ICSP2 feliratú dedikált csatlakozón keresztül, közvetlenül az ATMega 16U2 felett.

Egyes Arduino kártyákon (lásd a fenti táblázatot) a MOSI, MISO és SCK kivezetések ugyanazok, mint a digitális 11, 12 és 13 kivezetések. Ezért sok oktatóanyag arra utasítja Önt, hogy csatlakoztassa a céleszközt ezekhez a kivezetésekhez. Ha ezt a vezetékezést praktikusabbnak találja, adja meg a USE_OLD_STYLE_WIRING definíciót. Ez akkor is működik, ha nem UNO-t használ. (Az UNO táblával erre nincs szükség).

A fenti képen két UNO kártyát csatlakoztatunk a bootloader égetéséhez a "old style" csatlakozásokkal: a felső tábla a Target (cél), az alsó tábla a Programmer (programozó). Figyelje meg a sárga kapcsolatot a programozó D10 és a cél RESET között. Az MKR kártyákon a D10 nem használható a resethez; javasoljuk a D6-ot, és ne felejtse el megváltoztatni az ArduinoISP vázlat 73. sorát - #define RESET 10 -, és a 10 helyett "6"-ot kell írni.

Ez az Arduino NANO az ICSP-csatlakozón keresztül van programozva a programozó UNO kártya D10-D13-as kivezetésétől vezetékezve.

A fenti Arduino MEGA egy Arduino UNO-t programoz, amely összeköti a D51-D11, D50-D12, D52-D13, GND-GND, 5V-5V és D10-et a RESET-hez. Az ilyen típusú kártyákhoz egy 10 µF-os elektrolit kondenzátorra van szükség, amely a RESET-hez és a GND-hez csatlakozik, a pozitív (hosszú láb) a RESET-hez van csatlakoztatva. A kondenzátort azután kell elhelyezni, hogy a programozói kártyára fel lett töltve az ISP vázlat.

A programozókártya RESET-hez és GND-jéhez csatlakoztatott 10µF-os elektrolitkondenzátor csak azokhoz a kártyákhoz szükséges, amelyek interfésszel rendelkeznek a mikrokontroller és a számítógép USB-je között, mint például a Mega, UNO, Mini, Nano. Az olyan kártyáknak, mint a Leonardo, az Esplora és a Micro, amelyeknél USB-t közvetlenül a mikrokontroller kezeli, nincs szükségük kondenzátorra.

A feszültségekről

Az Arduino lapcsalád 5V-os és 3,3V-os eszközöket tartalmaz. Ha olyan Arduino-t használ, amely nem tolerálja at 5 V-ot (Due, Zero, ...) programozóként, ügyeljen arra, hogy a programozó kivezetéseit ne tegye ki 5 V-nak. Ennek egy egyszerű módja a teljes rendszer (programozó és célpont) tápellátása 3,3 V-tal.

A fenti képen az MKR1000 és az UNO közötti kábelezés látható. A fent leírtak szerint minden 3,3 V-on működik, amelyet az MKR1000 VCC-ből és GND-ből vettek, és az UNO 5 V-ra és GND-re küldik. Ugyanez a kapcsolat hozható létre az UNO ICSP-jével az oldalon ismertetett kiosztást követően. A vezetékekhez ugyanazokat a színeket használtuk, mint a többi képen, hogy könnyebben válthasson át a "régi vezetékezésről" az ICSP csatlakozóra. Kérjük, vegye figyelembe, hogy az MKR kártyák családja ugyanazt a kivezetést használja, ezért bármilyen MKR kártyát használhat ISP programozóként. Ha MKR kártyát használ ISP programozóként, ne felejtse el megváltoztatni az ArduinoISP 73-as sorát, amely meghatározza az MKR kártyán használt tényleges kivezetést, hogy állítsa vissza a célt (6 a fenti képen).

Megjegyzés: A csatlakozások és vezetékek beállítása közben ne csatlakoztassa az USB-t, és ne csatlakoztassa a kártyákat a tápellátáshoz. Azt is javasoljuk, hogy először programozza be az ISP programozóként használt Arduino-t, mielőtt folytatná a vezetékezést a célkártyához.

A vázlat betöltése

A programozóként használt Arduino-hoz speciális vázlatra van szükség. A Példák > 11. ArduinoISP > ArduinoISP alatt találja meg.

A vázlat sorain végighaladva számos paramétert talál, amelyeket be kell állítani a cél kártyának megfelelően. Ezeket a paramétereket azonban az Arduino Software (IDE) által támogatott minden rendszerbetöltőhöz/kártyához egy adott fájl állítja be. A többi paramétert a megjegyzések egyértelműen elmagyarázzák, és csak akkor módosítsa, ha tudja, mit csinál. A vázlat három LED-et is támogat, amelyek vizuális visszajelzést adnak a programozási folyamatról.

A vázlat feltöltéséhez az Arduino kártyára - arra, amelyet programozóként fog használni - ki kell választania a kártya típusát és portját, majd a szokásos módon folytathatja.

Programozza be a rendszerbetöltőt

Ha az összes vezeték be van állítva, akkor át kell váltania arra a kártyatípusra, amelyet a rendszerbetöltővel programozni szerete. Ez a lépés kötelező a megfelelő rendszerbetöltő kód és a biztosítékok konfigurációjának kiválasztásához. A programozási eljárás minden írási művelet előtt ellenőrzi a mikrokontroller aláírását, de sok kártya ugyanazt a mikrovezérlőt használja, és mindegyik kártyának saját rendszerbetöltője van. A port továbbra is az ArduinoISP portja marad.

Válassza a "Bootloader égetése" lehetőséget az eszközök alatt, és várja meg a megerősítő üzenetet az Arduino Software (IDE) felületének alsó részén. Ha csatlakoztatta a LED-eket, vizuálisan követheti a folyamatot.

A soros programozási mód

A programozási folyamat a három SPI-vonalat (MISO, MOSI és SCK) kezeli a szabványos SPI programozási protokoll szerint, ugyanúgy, mint az SD memóriakártyák olvasását és írását. Az egyetlen különbség a memóriakártyák között a CS (Chip select) csatlakozó hiánya. Az AVR mikrokontrollereinken a RESET kivezetést használjuk, amely leállítja bármely sketch vagy bootloader végrehajtását, és a mikrokontrollert egy meghatározott állapotba hozza, ahol figyeli az SPI interfészről érkező parancsokat. A legelső parancs, amelyet a protokoll megkövetel, az, amikor belép a mikrokontroller a soros programozási módba.

Ha ez a speciális mód aktív, akkor írhatunk és olvashatunk minden mikrokontroller programozható területet: Flash, EEPROM és biztosítékok. A Flash memória végén található a rendszerbetöltő kódterület, amint a cikk elején található képen látható. A "Bootloader égetése" eljárás a mikrokontroller biztosítékait is megfelelően beállítja a kártya kialakításának megfelelően. Ez az egyik oka annak, hogy miért kell beégetned a rendszerbetöltőt, kiválasztva a listából a pontos kártyamodellt.

A programozás technikai vonatkozásai

A mikrokontroller programozásához használt nyílt forráskódú szoftver az avrdude. A folyamat négy lépésből áll: a chip bootloader részének feloldása, a biztosítékok beállítása a chipen, a rendszerbetöltő kód feltöltése a chipre, a chip rendszerbetöltő részének visszazárása.

A biztosítékok kezelése a kártyához tartozó egyes paraméterfájlokban tárolt beállítások szerint történik, elkerülve az esetleges hibákat.

A biztosítékok kezelése, általában három bájtból – alacsony, magas és kiterjesztett – a bootloader programozás legkényesebb aspektusa: a rossz biztosítékbeállítás tönkreteheti a mikrokontrollert és a kártyát. A biztosítékok meghatározzák a mikrokontroller funkcióinak számos aspektusát, például: különböző órajelforrások kiválasztása és a chip futási sebességének módosítása, a chip működéséhez szükséges minimális feszültség beállítása (brownout), annak beállítása, hogy használjunk-e rendszerbetöltőt vagy sem, mennyi memória legyen lefoglalva a rendszertöltő számára (256-2048 szó - 512-4096 bájt), letiltja a visszaállítást vagy a soros programozást, és leállítja az EEPROM-adatok törlését új vázlat feltöltésekor.

A biztosítékok részletes leírása az egyes mikrokontrollerek adatlapján található.

Minden beállításnak megvan a maga haszna, és logikus, hogy a fejlesztő zárolhatja a chipet, és megvédheti az ISP programozásától, de előfordulhat, hogy tévedésből rosszul állítja be a biztosítékot, ami kizárja a programozási folyamatból az ISP interfészen keresztül. A mikrokontroller helyreállításához nagyfeszültségű soros programozóra kell támaszkodnia, amely 12 V-ot használ a biztosítékok visszaállításához.

Összegzés: égesse be a Bootloadert 8 lépésben

  • Nyissa meg az ArduinoISP firmware-t (a példákban) az Arduino kártyához.

  • Megjegyzés az Arduino 1.0-hoz: egy apró változtatást kell végrehajtania az ArduinoISP kódon. Keresse meg a heartbeat() függvényben azt a sort, amely azt mondja, hogy "delay(40);" és módosítsa "delay(20);"-ra.

  • Az Eszközök > Alaplap és Port menüben válassza ki azokat az elemeket, amelyek megfelelnek a programozóként használt kártyának (nem a programozás alatt álló kártyának).

  • Töltse fel az ArduinoISP vázlatot.

  • Vezetékezze az Arduino kártyákat.

  • Az Eszközök > Alaplap menüben válassza ki azt az elemet, amely megfelel annak a kártyának, amelyre a rendszerbetöltőt be szeretné írni (ne azt a kártyát, amelyet programozóként használ). A részletekért lásd a kártya leírását a környezet oldalon.

  • Válassza ki az Arduino as ISP-t az Eszközök>Programozó menüben.

  • Használja a Bootloader égetése parancsot.

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.