A mikrokontroller alapú rendszerekben a hobbi és a profi fejlesztő kezében – szinte minden félvezető idővel megsérülhet, hibás lehet. Míg ez a diszkrét vagy céleszközök esetén teszteléssel (működik vagy sem) könnyen megállapítható – addig processzoros rendszerek esetén a komplexitás miatt ez kérdéses lehet.
Arduino esetén – főleg kezdőként – sokszor hajlamosak vagyunk a szoftverre, hardware környezetre fogni a nemműködést. És persze az alap, hogy a processzorlapkára fogunk mindent…
Arduino lapok esetén gyakran felmerül kérdésként, hogy: a lapka jó-e még, nem ártott-e meg neki a legutóbbi rövidzár illetve túláram, vagy egyszerűen csak a műszálas ruhában a feltöltődési szikra. Számos tünet lehet, ami gyanúra ad okot: melegedés, füst, hibázó programfutás, parázsló fényű LED-ek…
Hosszú lesz a cikk…. Hiszen több oldalról is vizsgálható a felvetett probléma…
Hozzávalók
- 1x Arduino UNO (R3,CH340) alaplap
- Ellenállások (470k, 10k)
- LED-ek többféle színben
Az induláshoz csak néhány dologra van szükség. Lehet, hogy nem mindenre lesz szükség, attól függően, hogy mi van már meg belőle….
De hogyan teszteljünk?
Sok-sok megoldást lehet egy problémára kidolgozni. A cikkben is igyekeztem körüljárni a problémákat több oldalról is – egyre közelebb jutva a probléma megoldásához vagy felderítéséhez.
-1. Tápellátás
A minimális tesztelési követelményt megelőzi, hogy a lapkát feszültség alá helyezve – mutasson legalább minimális életjelet. Ez általában a tápfeszültség visszajelző LED világítása.
Tápellátást a lapok a külső tápcsatlakozón át vagy az USB csatlakozáson keresztül kaphatnak. A tápbemeneten át 7.5V…16V feszültséget adhatunk a lapokra – a belső tüske a pozitív kivezetés (a csatlakozó mérete szabványos: 5.5/2.1 mm).
Az itt bejutó nyers egyenfeszültségből kerül előállításra a rendszer 5V belső feszültsége. Ideális esetben – ha nincs egyéb követelmény a lapka áramfelvételével kapcsolatban – a külső tápfeszültségnek 9V egyenáramot javasolt adni. (Tipp: ugyan a 12V még elfogadható, azonban ekkor a rendszer teljes áramfelvétele lehetőleg 300mA alatt maradjon!) Az 5V rendszer és a bemeneti 9…12V közti szabályzást az esetek 95%-ában ún. áteresztő stabilizátor végzi – ennek alapvető tulajdonsága, hogy a fölösleges teljesítményt hőként adja le (azaz elfűti)…
Az elfűtött energia a stabilizátoron fellépő feszültségesés és az átfolyó áramerősség szorzata:
P=(Ube – 5V) *Iaramkor
A kis méretű és ráadásul lakkozott hőleadó felület miatt hőfokemelkedés indul el és így a szabályozó hővédelme akár be is kapcsolhat! (Tipp: a kisebb teljesítmény elfűtését a 9V külső tápfeszültséggel érhetjük el).
Ha a külső tápfeszültség nem szükséges – vagy úgyis a számítógépről használjuk a lapkát – az USB 5V feszültsége is biztosíthatja a működést. A PC védelme érdekében egy 500mA-es úgynevezett regenerálódó túláramvédő biztosíték került beépítésre (ismert még: polifuse, multifuse néven is), mely a túlzott áramfelvétel esetén a számítógépet megvédi.
Bármelyik külső tápellátást is biztosítjuk a lapka részére – a tápfeszültség-visszajelző LED-nek egyfolytában világítania kell (sőt, még pulzálás sem lehet!). Tipp: Ha az USB vonalon át és a külső táp felől is rendelkezésre áll az áramellátás, akkor a lapka elektronikája automatikusan a külső táplálásra kapcsol át (és ekkor az USB csak a kommunikációért felel).
Fontos! Az áram alá helyezéskor meleg vagy forró alkatrész nem lehet az áramköri lapon!
0. A soros vonal tesztje
Az áramkört a PC-re csatlakoztatva a feltöltési soros portnak meg kell jelennie az eszközkezelőben. Azonban, ha sárga felkiáltójeles eszközként jelenik meg a csatlakoztatott áramkör (Windows alatt) – akkor meghajtóeszköz-hibával állhatunk szemben. Ebben az esetben a meghajtóprogram frissítése illetve a driver ellenőrzése válik szükségessé…(Tipp: egyes régebbi operációs rendszerek esetén a meghajtóprogram telepítése nem automatikus – a felhasználónak kell megtennie.) Az USB és a sorosport illesztéséről, a működés háttérről az erről szóló tematikus cikkben lehet olvasni: Számítógép USB port – soros illesztés (és minden ami a buktatókkal együtt jár).)
Az ellenőrzések során nem komplexen az összes rendszert egyszerre kell megvizsgálni – hisz így akár egyetlen kisebb hiba is a teljes rendszer működésképtelenségét mutatja; pedig csak egy-egy rész ellenőrzésével lehetséges lenne a hiba behatárolása. Az Arduino rendszerek kulcs funkciója, hogy a számítógéppel a soros-USB átalakítón keresztül kommunikálni lehet – elsőként ennek működőképességéről kell meggyőződni.
A vizsgálat az PC-USB funkcionális egységre kell hogy kiterjedjen – a processzor és környezete nem szabad, hogy „bekavarjon” a teszt folyamatába! Ehhez két lehetőség kínálkozik: a processzort kivesszük az áramköri lapból (klasszikus DIP tokos UNO esetén ez egyszerűen megoldható) vagy a processzort ún. RESET állapotban tartva kihasználhatjuk, hogy ekkor minden kivezetése bemenetté (illetve tri-state (ún. lebegő) állapotban levővé) válik.
Tipp: RESET gomb nyomva tartása helyett a RESET kivezetést és a GND-t a csatlakozósorban is összeköthetjük.
A tesztelés során a D0 és D1 kivezetéseket (Arduino soros kommunikációs vonala) összekötjük (ún. loopback tesztet hozunk létre). Az Arduino keretrendszerben az Eszközök → Port alatt az áramköri lap által használt soros portot választjuk ki, majd az Arduino terminal emulátorát megnyitva (Arduino → Eszközök → Soros monitor) kiírunk a soros vonalra valamit és elküldjük.
A küldést és a fogadást a Tx illetve Rx LED jelzi azonban a visszajövő adat az Arduino képernyőn nem minden illesztőchip használata esetén jelenik meg (pl. CH340 esetén nem látszik a vett adat)!
1. Szoftver/bootloader teszt
A legelső teszt, hogy a processzorunkkal kommunikálni tudjunk. Ideális esetben az áramkör a gyárilag beépített bootloadere még működik. Ennek ellenőrzése egyszerűen történhet: a Reset gombot megnyomva a D13 (vagy L jelzett) visszajelző LED felvillanással vagy villogással jelzi az üzemszerű működést. (Ha ez nem történik meg, akkor lehetséges hogy a processzor sérült, vagy a bootloader előre beégetett szoftvere hiányzik. Az újraprogramozást az AVR programozása külső programozóval cikk taglalja.)
A bootloader tesztelése a legegyszerűbben az Arduino keretrendszer segítségével történhet meg – valamelyik alapprogram feltöltésével. Ez célszerűen a Blink névre hallgat (Arduino → Fájl → Példák → 01.Basic → Blink útvonalon érhető el).
Az áramköri lap kiválasztása (Eszközök → Alaplap) után a kapcsolódási port (Eszközök → Port) meghatározása következik. Tipp: Az alaplap pontos meghatározása mind a processzort, mind a bootloader működését is meghatározza (pl. Arduino Nano lehet old vagy new bootloaderrel szerelt is!)
A mintaprogram feltöltése a Vázlat → Feltöltés menüben indítható. A feltöltés folyamata során a Tx és az Rx LED villogással jelzi a kommunikációt. A sikeres feltöltés végén az Arduino státuszsorában megjelenő Feltöltés kész üzenet jelzi. Hiba esetén piros kiírást látunk a fekete üzenőterületen! (Tipp: A Fájl → Beállítások → Bővebb kimenet mutatása pontban a fordításkor és a feltöltéskor is legyen kipipálva – így a fordítási és a feltöltési üzenetek is láthatóak.)
A sikeres feltöltés után a Blink program feltöltésével ellenőriztük le a bootloader és a feltöltési alapfunkciók működését. A feltöltés után a Blink programban megadott 1 másodperc világítás, 1 másodperc sötét LED a normál működést jelenti.
2. Rendszerfeszültség
Ha már a rendszerfeszültségről volt szó – azok tesztelése sem maradhat el – hiszen ha hiányzik, akkor az ugyanúgy működési problémákat okozhat. A kimutatása egyszerű: a tápfeszültség-kivezetésre 1-1 LED-et teszünk – mintegy visszajelzésként a tápfeszültség és a GND közé (persze védőellenállással).
Azt, hogy a feszültség értéke megfelelő-e: egy trükkel vizsgálhatjuk nagyon könnyen. Nem, nem egy multiméter. Hanem a látást vesszük alapul, meg azt a trükköt, hogy ha azonos sorozatból származó LED-eken azonos áram folyik át, akkor azonos fényerőt produkálnak. És az emberi szem a fényeket a fényerősség különbségként is érzékeli. A trükk, hogy a LED-eket olyan tartományban használjuk, ahol kis áramváltozás is már nagy fényerőváltozást okoz (áram, mert a LED-ek előtét-ellenállásán és a LED-en levő feszültségesés az bizony áramot hajt át a LED fénykibocsátó félvezető rétegén keresztül.) Az ideális a Piros színű LED – kb. 2-3 mA átfolyó áramnál.
A vizsgálandó tápfeszültségek: a 3.3V, 5V illetve, ha szükséges a külső betáp feszültsége. Így a kapcsolás részlete a háromféle feszültség figyelésére:
Tipp (utolsó LED): az Aref belső ADC referenciafeszültsége is ellenőrizhető. Itt beállításfüggő a névleges Aref feszültsége: chiptől és beállítástól függően 1.1V vagy 2.56V vagy 5V lehet. (A kivezetés terhelhetősége ~5mA!). Az ábrán VCCINT-ként jelölve.
Az I/O tesztek vizuális ellenőrzésekor nem csak az adott kivezetés működőképességét láthatjuk, hanem, az esetleges föld-, táp- vagy szomszédos kivezetésekkel való zárlat is láthatóvá válik….
3. I/O teszt
Az áramköri lapok leggyakoribb meghibásodása a ki/bemenetek sérülése. Ezt okozhatja túlterhelés, rövidzár, túlfeszültség, sztatikus kisülés, induktív áramlökés, meg még jónéhány károsító hatás. A ki-/bemenetek a mikrokontroller alapú rendszerek működésének alapját képezik, hiszen a külvilág fele ezeken a kivezetéseken át lehet kommunikálni. A ki- és bemenetek az angol szaknyelvből származóan Input-Output (vagy rövidítve I/O) néven ismertek.
Tipp: A D0/D1 kivezetés funkcionálisan már tesztelésre került, hiszen a programkód ezen át tölthető fel.
A legegyszerűbb I/O funkcionális teszt, hogy az adott kivezetést kimenetre kapcsolva magas illetve alacsony szintre kapcsoljuk és ennek meglétét ellenőrizzük. Ha ide egy LED-sort kapcsolunk, akkor gyakorlatilag egy futófényt hozhatunk létre. Ha a kimenetre mind a magas, mind az alacsony állapotra egy LED-et kötünk be, akkor alacsonyra és magasra állítva is kigyújthatunk egy LED-et. Ha a kivezetés szakadt vagy bemenetre állított, akkor mindkét LED halványan világít. Ez így leírva bonyolult, de a megvalósítás kapcsolási rajza szemléletessé teszi:
A kontroller minden kivezetése alapesetben bemeneti állapotban található – Reset után a standard, belső funkcionális hardware alapinicializálás miatt (lásd bővebben a kontroller adatlapjában). Ezt az alapállapotot természetesen utána a futó programból át lehet állítani.
Reset állapot
Fontos! A reset gombot nyomva tartva van a mikrokontroller Reset állapotban tartható. A gomb elengedése után a bootloader programja kezd futni – ebben a programban a D13 visszajelző LED kimeneti állapotba kerül, a D0/D1 kivezetés pedig a soros kommunikációhoz inicializálódik.
A haladó információk iránt érdeklődőknek egy kis kiegészítés:
A reset gomb elengedése után (vagy a tápfeszültség megjelenésekor) az órajel stabilizálódik (Ennek ideje a kontroller konfigurációs biztosítékbiteknél 65msec + 254 órajel az Arduinohoz konfigurálás esetén). Ezzel párhuzamosan a tápfeszültség is figyelésre kerül és ha adott feszültségszint alatt van, akkor a kontroller továbbra is reset állapotban marad. Ez a tápfeszültségfüggő reset-figyelés az ún. BOD (BrownOutDetect). Ez a feszültségszint az 5V rendszerek esetén 4.3V-ra van konfigurálva. Ezért indul újra a chip például nagyobb relék meghúzásakor fellépő feszültségesés esetén.
A reset állapotot sok esemény kiválthatja – például ezek a lehetőségek az Atmega328P adatlapjából :
Ezen 4-féle lehetőség mind RESET állapotot hoz létre:
- Power on reset (bekapcsolás/tápfeszültség megjelenése)
- WatchDogTimer reset
- Brown Out reset (feszültségfigyelés)
- Külső reset
Kimenetek modellezése
A kimenetek ellenőrzése könnyen modellezhető. Ehhez elég megnézni az adatlap vonatkozó részét:
Az I/O kivezetések alapesetben bemenetek (kikapcsolt felhúzó-ellenállással), így a kivezetésen levő kettős-LED-ek halványan világítanak. A kimenetek beállítása a főprogram elején megtörténik, ugyanis a bootloader által a D0/D1 kivezetések sorosporti beállítását vissza kell állítani az alapértelmezett bemeneti I/O funkcióra (mert ugye bekapcsoláskor a bootloader – mint program, – már lefutott és átállított pár beállítást).
A teszt során a vizsgált kivezetést kimenetre kell állítani és magas/alacsony szintet adni rá. A működést szemmel lehet tesztelni.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void setup() { Serial.begin(9600); Serial.end(); //A D0 és D1 kivezetés felszabadul for(int i=0; i<19; i++){ pinMode(i,OUTPUT); } } void loop() { for (int i=0;i<19;i++){ digitalWrite(i,HIGH); delay(100); digitalWrite(i,LOW); } } |
A könnyebb illetve gyorsabb teszthez egyszerű minták is beállíthatóak – így a rendellenes működés könnyebben észrevehető (például a felváltva futó fény):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | void setup() { Serial.begin(9600); Serial.end(); //A D0 és D1 kivezetés felszabadul for(int i=0; i<19; i++){ pinMode(i,OUTPUT); } } void loop() { for (int i=0;i<19;i++){ if ((i mod 2)== 0) { digitalWrite(i,HIGH); } else { digitalWrite(i,LOW); } delay(100); if ((i mod 2)== 0) { digitalWrite(i,LOW); } else { digitalWrite(i,HIGH); } } for (int i=1;i<19;i++){ if ((i mod 2)== 1) { digitalWrite(i,HIGH); } else { digitalWrite(i,LOW); } delay(100); if ((i mod 2)== 1) { digitalWrite(i,LOW); } else { digitalWrite(i,HIGH); } } } |
→ A teljes program ide kattintva letölthető. (Hosszú lenne ide beilleszteni.)
A programkódok trükkje, hogy az összes funkcionális kivezetés használható digitális I/O lábként (kivéve az Atmega328P A7/A6 lába a speciális pro mini esetén.).
A serial.* utasítások magyarázata az Arduino súgóban vagy a 60+15 nap alatt tanfolyam keretében megismerhető.
Tápfeszültség-trükk
Ha a tesztpanelt több alaplapon is használni szeretnénk, akkor univerzálisnak kell lennie. Ennek egyik sarokköve azonban, hogy egyes panelek 3.3V rendszerfeszültségűek és a bemenetein nem (vagy nem mindegyiken) viselik el az 5V feszültséget (ilyen alappanelek: Arduino Due, ESP8266/ESP32 alapú panelek, STM32 chipcsaládra épülő lapok). Az Arduino standard panelek az R3 lábkiosztás bevezetésével a rendszerfeszültséget megjelenítik az IORef lábon! Azaz a LED-ek közösített pozitív ágát elég ide kötni az 5V rendszer helyett… De ennek a következménye az, hogy a két LED működtetését meg kell tudni oldani a 3.3V tápfeszültségről.
Ebben a kialakításban csak a piros LED jöhet szóba, mivel ezek nyitófeszültsége a legalacsonyabb: 1.4…1.6V (Tipp: Infravörös fényben ha látunk, akkor az infraLED is megfelelő a maga ~1.2V nyitófeszültségével…). Jelen megvalósításban (lebegő I/O kivezetés esetén) a 2 db piros LED világít és a maradék feszültség: 3.3V – (2 x 1.5V) = 0.3V. Az áramkorlátozó ellenállás értéke így: 0.3V/1mA = 300Ohm. Ezt igazságosan kétfelé osztva kb. 2×150 Ohmos lesz a két ellenállás. Vagy hasonló értékű, ami a fiókban van… (100…220Ohm). Így ha az I/O kivezetésen magas vagy alacsony feszültség jelenik meg, akkor a LED-en átfolyó áram: I=(3.3V-1.4V)/100Ohm =19mA.
Optikailag, így ha az I/O kivezetés bemenet/lebeg, akkor a LED-eken ~1mA áram folyik át, míg alacsony vagy magas szinten tartott I/O kivezetés esetén ~15mA. Így a LED-ek fényereje is utal arra, hogy épp milyen állapotban van a kivezetés.
Persze, ha 3.3V-os paneleket nem kell tesztelni, akkor ez az eszmefuttatás csak egy oldalági kitérő volt…. (ami ugyanúgy alkalmas 5V rendszerek esetére is – az ellenállás javasolt értéke ekkor 2 x 1kOhm).
Lábak száma és a tesztpanel
Persze a tesztekhez nem szükséges 1000+1 shield kivitelű tesztpanelt gyártani minden egyes lapkához – a Mega shield megfelel az összes Mega, Uno, Leonardo lábkiosztású áramköri laphoz; ahogyan a Pro mini – Pro Micro lapokhoz is elég lehet egy egyszerű csupalyuk NyÁK-lapocska. Némi trükkel ezen a csupalyuk panelen a NodeMCU / D1 mini család tesztáramköre is összehozható…
Analóg rendszerteszt
A kapcsolás lényege – egyetlen lábcsoporton keresztül bemutatva…
A mérés három alapelven nyugszik:
- A bemenetre konfigurált kivezetések nagyimpedanciás, de legalábbis MegaOhm bemeneti ellenállást képviselnek (nem terhelik a rákapcsolt külső feszültségszintű (nagy árammal meghajtott jeleket)),
- Kimenetként erős meghajtást képviselnek, akár 20mA áramot is átküldhetünk rajtuk,
- Az analóg bemenet >10k bemeneti ellenállású, ugyanakkor ha nagyobb bemeneti ellenállású eszköz mérésére használjuk – csak kimértékben lesz zavarérzékeny és nem romlik jelentősen a pontossága sem.
A mérési trükk: vegyünk (legalább) 3 kivezetést és ezeket azonos ellenállással kössük össze. És a közös pontot egy minimum 15x nagyobb ellenállásból álló ellenállásosztóval fél tápfeszültségere húzzuk. Így a közös pont nem „lebeg” ha mindhárom láb bemenet (input) akkor sem – ugyanakkor a 3 kimenetre állított láb az ellenállásokon keresztül el tudja húzni a közös ponti feszültségszintet. És ezt a közös pontban lévő feszültséget a beépített analóg bemeneti lábra kapcsolva mérhetjük…
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
D7 | x | 1 | 0 | 0 | 0 | 1 | 0 |
D6 | x | x | 1 | 0 | 1 | 1 | 0 |
D5 | x | x | x | 1 | 1 | 1 | 0 |
A0 (Vcc) | 1/2 Vcc | 1 Vcc | 1/2 Vcc | 1/3 Vcc | 2/3 Vcc | 1 Vcc | 0 GND |
Az egyes állapotok igazságtáblázata a bemeneti lábak függvényében:
- x – Bemenet
- 1 – Logikai H kimenet
- 0 – Logikai 0 kimenet
- A0 – az analóg bemeneten mérhető feszültség (Vcc-arányban)
Tipp: a feszültségeket az IOref lábhoz képest is lehet mérni (Vcc helyett a közös pont az IOref) mérjük – így a 3.3V és 5V rendszerek is egyszerűen mérhetőek… Fontos azonban tudni, hogy a mért feszültségtartománynak a kiértékeléshez a GND és a Vcc közt kell lennie!
Programkód belső működése
A program komplex a működése során a D0/D1 kivezetésen írja vissza a PC felé az eredményt, valamint a dedikált analóg kivezetésen át történik a mérés és ehhez D2 és D3 kivezetések adják a két referencia digit kivezetéseket.
A program több fő részre tagozódik:
- TEST 001 – az analóg méréshez a kivezetés nem sérült-e?
- TEST 002 – a digitális lábak H szintje megfelelő-e?
- TEST 003 – a digitális lábak L szintje megfelelő-e?
- TEST 004 – az analóg lábak digitális H szintje megfelelő-e?
- TEST 005 – az analóg lábak digitális L szintje megfelelő-e?
- TEST 006 – analóg lábak analóg feszültség-mérése megfelelő-e (közép-feszültség – 2.5V)?
- TEST 007 – analóg lábak analóg feszültség-mérése megfelelő-e (felső-feszültség – 3.33V)?
- TEST 008 – analóg lábak analóg feszültség-mérése megfelelő-e (alsó-feszültség – 1.66V)?
A feltöltött kód kétféle módú működést tud:
- Soros vonalon a részeredményeket visszaírja és kiértékel, és
- Vak (soros kivezetés nélküli) módban az Ok-/hiba-kódot elvillogja.
Az eredmény képe (soros vonal):
És a hiba (D6 és D7 közti rövidzár) megkeresése és eltávolítása után:
→ A teljes program ide kattintva letölthető. (Hosszú lenne ide beilleszteni.)
A digitális és analóg kivezetések ellenőrzése az alábbi logika alapján történik (lásd a programkódban sorról-sorra ellenőrizve):
- az analóg jel mérése: A0 kivezetésen történik,
- a D0/D1 kivezetések működőképességét feltételezzük (soros kommunikáció / program feltöltése miatt),
- A digitális kimeneteken a kapcsolgatott ellenállások a D2, D3 kivezetéseken vannak (alap-ellenállások) és ezeket lehet kombinálni a D4…D19 kivezetéseken lévőkkel,
- Az analóg jelszinteket az A1…A5 kivezetéseken is meg lehet mérni (ADC működési teszt).
3. Kiegészítő tesztek
A rendszerben néhány beépített eszköz még rendelkezésre áll, hogy funkcionális tesztet hajtsunk végre. A meghibásodások során az I/O hibák után a belső adattárolási hibák következnek: SRAM, Flash, EEPROM.
Az SRAM meghibásodás inkább véletlenszerű fagyásokat okoz – és az átmenetileg tárolt tartalom sérül meg pl. röntgen, háttérsugárzás, BOD nélküli tápfeszültség-ingadozás miatt. De fontos még a memóriakezelés esetleges hibakezelése is – itt az ún. heap elfogyása kritikus. Ez nem a chip hardware meghibásodására vezethető vissza, hanem a memória kihasználásának korlátaira. Bővebben a →Memóriakezelési problémák cikkben olvashatsz róla…
A Flash (program) memória sérülése programozási anomáliára vezethető vissza – például tápfeszültség-ingadozás programozás alatt. Fontos! Az újabb bootloader (Uno, Mega, stb – optiboot néven is fut, 512byte méret) nem véges tényleges Flash memória visszaolvasását ellenőrzéskor! Az összehasonlításra küldött adatot adatot adja csak vissza – nem a ténylegesen Flashba beírt adatot! A régi (old boootloader: diecimila, duemilanove, nano alaplapok esetén) végez csak tényleges Flash memóriába beírás utáni kiolvasási ellenőrzést!
EEPROM-teszt
Az EEPROM tesztelése viszonylag egyszerű, hiszem a futó programból lehet a háttértár tartalmát byte szinten módosítani. A legegyszerűbb ellenőrzés, hogy az adott memóriarekeszbe beírt adatot visszaolvassuk és összehasonlítjuk, hogy tényleg ezt írtuk-e be.
Fontos! Az EEPROM-ok élettartama nem végtelen – legkedvezőtlenebb esetben cellánként 100.000 írást garantál az adatlapja! (Cellánként és nem a teljes EEPROM területre – összesen)!
Az EEPROM írási teszt eredménye:
vagy pedig hiba esetén:
→ A teljes program ide kattintva letölthető. (Hosszú lenne ide beilleszteni.)
Hőfokteszt
Néhány kontroller belső hőmérővel is rendelkezik. Ezek működésének alapja, hogy egy belső diódán eső feszültség-változását lehet mérni. A szilicium-dióda esetén a változás kb. 10mV/C. A gyártási szórás miatt abszolút hőmérsékletmérésre nem alkalmas, csak a hőmérséklet változását lehet vele követni. Az analóg rendszerben érhető el – ATMega328P mikrokontroller esetén a 8. ADC csatornára van kötve.
A folyamatos hőméréssel kontrollálható a chip működése: a hőfok megszaladása jelentős (külső) áramra, zárlatra utal. Így elegendő a processzor belső hőfokteszt többszöri lefutása során ellenőrizni a hőfok emelkedését. De mely chipekben van hőfokszenzor?
- ATmega8 : No
- ATmega8L : No
- ATmega8A : No
- ATmega168 : No
- ATmega168A : Yes
- ATmega168P : Yes
- ATmega328 : Yes
- ATmega328P : Yes
- ATmega1280 (Arduino Mega) : No
- ATmega2560 (Arduino Mega 2560) : No
- ATmega32U4 (Arduino Leonardo) : Yes
A programkód is egyszerű:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | void setup() { Serial.begin(9600); ADMUX = 0xC8; // turn on internal reference, right-shift ADC buffer, ADC channel = internal temp sensor delay(10); // wait a sec for the analog reference to stabilize } void loop() { Serial.println(averageTemperature()); // so we can debug delay(500); // just to slow things down a bit } int readTemperature() { ADCSRA |= _BV(ADSC); // start the conversion while (bit_is_set(ADCSRA, ADSC)); // ADSC is cleared when the conversion finishes return (ADCL | (ADCH << 8)) - 342; // combine bytes & correct for temp offset (approximate)} } float averageTemperature() { readTemperature(); // discard first sample (never hurts to be safe) float averageTemp; // create a float to hold running average for (int i = 1; i < 1000; i++) // start at 1 so we dont divide by 0 averageTemp += ((readTemperature() - averageTemp)/(float)i); // get next sample, calculate running average return averageTemp; // return average temperature reading } |
Ez a processzor belső hőmérsékletének mérése nem használható a környezeti hőmérséklet leolvasására – mivel a működési melegedés is meghamisítja a mérést. Ha mégis szükség van a környezet monitorozására , az esetben lehetséges, ha a chip belső hőmérője:
- frissen bekapcsolás után, vagy
- 10 perc alacsony áramfelvételű (idle/sleep) módban tartás után
kerül kiolvasásra. A belső hőmérsékletszenzor által visszaadott érték akkor is használható, ha a normál üzemi hőmérséklet és a környezeti hőmérséklet ismert. Ekkor a normál működés közben (terhelés és számításfüggő!) a belső hőmérséklet 1…5 fokkal emelkedik – az normál állapot. Azonban a 20 fokos emelkedés már működési problémát jelez.
Tipp: Magas hőmérsékletű helyzetekben a kalibrált hőmérséklet-leolvasás megelőzheti az áramkör illetve a teljes elektronika károsodását. A legtöbb AVR lapka működési hőmérséklethatára 85 Celsius fok – így ha a belső hőmérséklet 80 fokot eléri – egyszerűen vész-üzemmódú lekapcsolást kell indtani és hibajelet generálni.
Fontos! A belső mérődióda abszolút hőfokértéke nem pontos! A gyártási szórása magas, ezért csak a változás monitorozásra alkalmas – a korrekcióval lehetséges a kapott értéket módosítani.
Az eredmény soros monitoron követhető. A változás oka az volt, hogy a ATMega328P chipőre az ujjamat rátettem, és a testhőmérséklet ~35 fokos felülete is melegítette a chip házát. Még semmi drasztikus beavatkozást nem végeztem. Azonban rövidzár vagy egyéb drasztikus hiba esetén a hőfokemelkedés 1-5 fok is lehet másodpercenként!
Tipp: az AVR chipek I/O kivezetései 20…40mA terhelhetőségűek és túlterhelés esetén áramgenerátor jellegű működésűek lesznek. Egyéb kontrollerek esetén is az adatlapokat kell mintaként tekinteni! Azonban az adatlapban megadott limitek összetettek: AVR esetén a táplábak, a porton levő áramigények összessége és az egyedi kivezetések áram-átvezetési képességei is különböző mértékben korlátozottak! Egyes kontrollerek esetén a magas illetve az alacsony szintű kimeneti állapotok terhelhetősége is eltérő lehet!
Zárszó
A korábbi tesztek során oda kellett figyelni, hogy a teszt teljesen jól fut-e le, és nem is egy számítógép érzékeli az eredményt. Így sok alappanel tesztje egy idő után nagyon fárasztó sok mindenre oda kell figyelni. Sokkal egyszerűbb, hogyha egy előszűréssel a jó/nemjó eredményt pl. egy LED elvillogja a panelen. A holmi úgyis tele van LED-ekkel gyárilag is – erre a célra akár a D13 kivezetésen levő LED is használható.
A trükk, hogy a LED-en a villogás a kivezetés állapotával összefügg, yg a tesztelések során ezt is időnként figyelembe kellett venni. Kettős funkció, hogy épp mérünk rajta, de ugyanakkor a villogással is jelzi a folyamatot – ez a logika nem működik (pl. I/O teszteléskor biztosan hibás eredményt kapnánk).
Azonban a tesztfolyamat végén, amikor már további tesztelés nem lesz – a D13 kivezetés LEDje már felhasználható ilyen célra. Egyszerűen kimenetre állítva a jó/nemjó állapotot villogással jelezheti (pl. jó: lassú villogás, hibás eredmény: gyors villogás). Ha pedig a részletes eredményeket kell ellenőrizni és behatárolni a hibát – ott elegendő a soros monitoron át elolvasni a részletes hibaüzenetet….
Ez a nem is olyan rövid leírás az AVR alapú lapokat járta körbe. De az Arduino alá már rengeteg egyéb rendszer is illeszthető – azok esetén szintén hasonló logikával lehetséges a jóságteszteket alkalmazni (persze igazodva a chipek sajátságaihoz).
Letöltés
A cikkben szereplő programkódok →ide kattintva letölthetőek. Jelenlegi verzió:1.0
A belső tartalma:
- EEPROM teszt
- Hőmérő-teszt
- ArduinoTestSuite (eljáráskönyvtár)
- I/O LED alapú teszt
- ADC alapú alappanel teszt
Felhasznált források