Programozási órák arduino
A lecke leírja, hogyan működik együtt az Arduino tábla belső EEPROM-jával, az adatok sértetlenségének ellenőrzése során a tárolás és az átvitel során.
Belső EEPROM az Arduino rendszerben.
Az EEPROM nem felejtő memória. Megfejtésre kerül az elektromosan törölhető programozható, csak olvasható memóriaként. Olyan adatok tárolására szolgál, amelyeket a tápfeszültség kikapcsolásakor tárolni kell.
Az Arduino kártyák különböző térfogatú EEPROM-okat használnak a használt mikrokontroller típusától függően.
A belső EEPROM hangereje
Ez a memória mennyisége elegendő ahhoz, hogy tárolja a módokat, a folyamat paramétereit, együtthatóit stb.
- Az EEPROM elve egy félvezető szerkezet dielektrikájában lévő elektromos töltésen alapul. A díjakat nem mindig tárolják, de a fejlesztők 20 évig garantálják.
- Az EEPROM korlátozott számú felvételi ciklust tartalmaz, általában legalább 100 000.
- Az EEPROM-ban tárolt információk felvétele meglehetősen hosszú ideig, körülbelül 3 ms-ot igényel.
- Az EEPROM olvasása késedelem nélkül történik, és a memória erőforrása nem csökken.
Az Arduino-nál a nem felejtő memóriával való munkához EEPROM könyvtár tartozik. Két funkciója van az EEPROM-ban lévő byte írására és olvasására.
byte olvasott (int cím)
void write (int cím, byte érték)
A program ellenőrzi a rekordot az EEPROM-ban.
Írjunk egy egyszerű programot az EEPROM működésének ellenőrzésére. A program legfeljebb 16 szimbólumot rögzíthet a soros portról, és a ciklus kimenete 16 szimbólumot olvasható le az EEPROM-ból. Az Arduino IDE portmonitor segítségével adatokat tudunk írni az EEPROM-ra és megfigyelhetjük a nem felejtő memória tartalmát.
// ellenőrizze az EEPROM működését
#include
int i, d;
void beállítás ()
Serial.begin (9600); // inicializálja a 9600 sebességű portot
>
void loop ()
// olvasd el az EEPROM-ot és a 16. kimenetet a soros portra
Serial.println ();
Serial.print ("EEPROM =");
i = 0; míg (i <16)
Serial.print ((char) EEPROM.read (i));
i ++;
>
// ellenőrizze, hogy vannak-e adatok írni
ha (Serial.available ()! = 0)
késleltetés (50); // várakozás az adatvétel vége felé
A programot az Arduino táblaba töltjük, mi ellenőrizzük. Nyissa meg a monitor portját, és küldje az adatokat a táblára: "Ellenőrizze az EEPROM-ot".
Az adatok az EEPROM-ba vannak írva, és most megjelenik a monitorablakban. Ha leválasztjuk a kártyát a számítógépről, majd újracsatlakoztatjuk, az adatokat továbbküldjük a számítógépnek. Ezeket nem felejtő memóriában tárolják, és nem változnak, ha a tápellátást kikapcsolják.Az adatok integritásának ellenőrzése.
Az EEPROM rendszerint a program számára feltétlenül szükséges adatokat tárolja. Például, ha hőszabályozót készítesz, akkor lehet. a hőmérsékletet, a szabályozó együtthatóit, a védelmi funkció paramétereit és hasonlókat. Képzeld el, hogy ezek a paraméterek megsérülnek, és a vezérlő továbbra is működni fog. A fûtõelemet teljes teljesítmény mellett bekapcsolhatja és elfogadhatatlanul magas hõmérsékletet állíthat be. Ha az együtthatók helytelenek, a vezérlő "rongyokba" kerülhet. A védelmi funkciók leállnak. A baj nagy lesz.
De a helyzet, ha az EEPROM-ban lehet pontatlan adat, meglehetősen valódi.
- Amikor először kapcsolja be az eszközt, az EEPROM adatai érvénytelenek. Egyszerűen még nem kérték fel őket.
- Az adatoknak az EEPROM-ba történő írása idején a kártya áramellátása leállítható, majd egyes adatok rögzítésre kerülnek, és egyesek nem lesznek időben.
- Az EEPROM korlátozott számú írási ciklussal rendelkezik, és ez a tulajdonság az adatok memóriában történő adatvesztéséhez is vezethet.
Ezért rendkívül fontos annak biztosítása, hogy az EEPROM megbízható adatokat tároljon. Abban az esetben, ha téves, a programnak bizonyos intézkedéseket kell tennie. Ez lehet:
- az EEPROM-ból származó adatok másolatát használja;
- a vészhelyzeti üzemmódra speciálisan létrehozott adatokat használ;
- Húzza ki a készüléket;
- jelezzen hibát;
- és sok más lehetőség.
Az adatok sértetlensége azt jelzi, hogy az adatok nem változtak tárolás, átvitel, megjelenítés stb. Alatt. Az adatok integritását ellenőrizni lehet minden olyan helyzetben, amely potenciálisan veszélyt jelenthet az adatok romlására. Az adatok megbízhatóságának ellenőrzése általában:
- Nem felejtő memóriában (EEPROM, FLASH, HDD ...).
- Adatátvitel (soros interfészek, WiFi, GSM, TCP / IP ...).
- A memóriában különösen fontos adatokhoz.
- Egyes komponensek (pl. A DS18B20 érzékelő) kommunikációs protokollt tartalmaznak integritás-vezérléssel.
Az integritás felügyeletéhez az adatblokkhoz hozzáad egy ellenőrző kódot. Ezt a kódot egy bizonyos algoritmus számítja ki az adatok írása során. Az adatok ellenőrzésekor a kód újraszámítása és összehasonlítása a felvétel során keletkezett kóddal történik. Ha a kódok nem egyeznek, az adatok helytelenek.
A vezérlőkód kiszámításának algoritmusa meghatározza az adathiba meghatározásának valószínűségét. Nagyszámú algoritmus létezik vezérlőkódok létrehozására: ciklikus kódok, különböző hasítási funkciók. De a vezérlőkód kiszámításához a legegyszerűbb mód az ellenőrző összeg.
Egyszerűen csak az adatblokk összes bájtjának matematikai összegét adja meg. Az ilyen algoritmusnak minimális erőforrásra van szüksége a megvalósításhoz, és egyidejűleg meglehetősen nagy valószínűséggel teszi lehetővé a hibás adatok kis mennyiségű információinak meghatározását. Az ellenőrző összeg különböző számjegyű lehet. A minimális verzióban ez egy byte. Ebben az esetben az összeg túlcsordul, ami csökkenti a hibák észlelésének valószínűségét.
Mindig alkalmazom az exkluzív OR műveletet a számított E5h kódszámú ellenőrzőösszeggel. Ez lehetővé teszi, hogy kizárjon egy nagyon valószínű helyzetet, ha az összes adat 0. A 0 összeg 0. Akkor, ha az adatblokk tévesen nullázódik (és ez történik), akkor az egyszerű összeg nem számítja ki ezt a hibát. És ha az összes 0 ellenőrzőösszeg egyenlő E5h-val, akkor a hiba észlelhető.
Adjuk hozzá az adatok integritásának ellenőrzését az előző programhoz.
// ellenőrizze az EEPROM működését
#include
int i, d;
byte összeg; // ellenőrző összeg
void beállítás ()
Serial.begin (9600); // inicializálja a 9600 sebességű portot
>
void loop ()
// az ellenőrző összeg kiszámítása
összeg = 0;
i = 0; míg (i <16)
összeg + = EEPROM.read (i);
i ++;
>
// Checksum checksum
ha ((sum ^ 0xe5) == EEPROM.read (i))
// a szabályozási mennyiség helyes
// olvasd el az EEPROM-ot és a 16. kimenetet a soros portra
Serial.println ();
Serial.print ("EEPROM =");
i = 0; míg (i <16)
Serial.print ((char) EEPROM.read (i));
i ++;
>
>
más
// az ellenőrző összeg helytelen
Serial.println ();
Serial.print ("EEPROM = adathiba");
>
// ellenőrizze, hogy vannak-e adatok írni
ha (Serial.available ()! = 0)
késleltetés (50); // várakozás az adatvétel vége felé
// írni az EEPROM-nak
összeg = 0;
i = 0; míg (i <16)
d = Serial.read ();
ha (d == -1) d = ''; // ha a karakterek készek, üres helyek
EEPROM.write (i, (byte) d); // EEPROM bejegyzés
összeg + = (byte) d; // az ellenőrző összeg kiszámítása
i ++;
>
EEPROM.write (i, sum ^ 0xe5); írja be az ellenőrző összeget
>
késleltetés (500);
>
Csak azt tudom, hogy a program nem 16, hanem 14 karaktert tartalmaz, mert a portmonitor minden sorhoz hozzáadja a \ r és \ n sorszimbólumokat.
Töltse le a programot és futtassa a monitort.
Adathibaüzenetek futnak az ablakban. Még nem töltöttünk fel adatokat az EEPROM-ra, és az algoritmus elismeri ezt a helyzetet. Küldünk egy sort, például "check". Most az ablak megjeleníti az EEPROM adatait.
Ugyanígy megvédheti az adatok sértetlenségét a soros porton. Bármilyen impulzus zaj torzíthatja a jelet a kommunikációs kábelen és adathiba keletkezhet. Természetesen a számítógépen lévő adatok fogadására szolgáló programnak támogatnia kell egy ellenőrzőösszeggel rendelkező protokollt. Az Arduino IDE port monitorja nem rendelkezik ezzel a funkcióval.
A következő leckében megtanuljuk, hogy mi a C mutatója az Arduino-nak, megtudhatjuk, hogyan írhatunk különböző típusú EEPROM-adatokat (int, float ...).
Az E5h nem Assembler parancs. Ez egyszerűen egy olyan szám, amely hozzáadódik az ellenőrzőösszeghez, hogy kizárja a helyzetet, ha minden adat 0, és az ellenőrző összeg 0.
Idézem a leckét:
"Az exkluzív-VAGY műveletet mindig az E5h kóddal rendelkező számított ellenőrző összegre alkalmazom. Ez lehetővé teszi, hogy kizárjon egy nagyon valószínű helyzetet, ha az összes adat 0. A 0 összeg 0. Akkor, ha az adatblokk tévesen nullázódik (és ez történik), akkor az egyszerű összeg nem számítja ki ezt a hibát. És ha az összes 0 ellenőrző összeg egyenlő E5h-val, akkor a hiba észlelhető. "
Jó utat, de van egy hátránya.
Ha a program megváltoztathatja a beállításokat, nem minden adatot, hanem csak egy részét kell menteni, amikor elhagyja a menüt. És van egy csomó adat például. Ezután minden alkalommal újra kell számolnia az egyes adatok ellenőrző összegét.
Mondja meg, kérlek, értem helyesen:
- Azáltal, hogy az összes bájt EEPROM tartalmat egy bájtösszeggel egészíti ki, rendszeresen túlcsomagoljuk ezt a bájtot, és
- egy bizonyos, de határozott pillanatban az összeg 0-n halad át
- a korábbi feltételekkel kapcsolatos információk szinte teljesen elveszettek
- és ha egymás után két bájtot vált át a sorozathoz a 0 átmenetek között, akkor
- a csekkünk nem mutat semmilyen gyanúsat
ez sebezhetőség? hagyja az ilyen esemény valószínűségét, és nullára ...
Üdvözlünk!
Ha a bájt tele van, az információ nem teljesen elvész. A bájt nem áll vissza, de a maradék összeg marad benne. Bár valójában az összeg nem a legjobb módja a vezérlőkód létrehozásának. Ez a legegyszerűbb módja. Sokkal hatékonyabb a ciklikus kódok használata. Az 56. leckében megérintem ezt a témát.