LGT8F328P Nano klón

Beindult végre nálam is klónok háborúja! Elég drága lett az Arduino Nano, ezért keresem az alternatívákat. Római István (kaptármérleg, hőmérséklet távadó) hívta fel a figyelmemet az alábbi alaplapokra. Bár ekkoriban már megvásároltam egy USB port nélküli változatot (SSOP20) ami rendkívül olcsó volt (kb. 600Ft/db).

Azonban nem tudtam vele mit kezdeni, mert a program feltöltés nem kompatibilis az Arduino világban szokványos STK500 és hasonló programozókkal. Erről még később esik szó.

Lássuk az alaplapok változatait:

A lila színű verzióval rendelkezem. Szállítási költséggel együtt 4db-ot 3600Ft-ért tudtam beszerezni. Az alaplapokra „LQFP32” azonosítót írtak rá, ez az alaplap kezelő változataiban is visszaköszön (lásd később). Lényegében ugyanazok, de a lila verzión van egy 16Mhz-s külső quartz kristály, ami pontos óra jelet állít elő. A belső órajel sem rossz, a leírás szerit 1% pontossággal állít elő max. 32Mhz-et. Azonban ennek stabilitása már nem alkalmas pontos időmérésre, de a soros port kisebb sebességen működik vele. Előre megnyugtatom a „csóró” érdeklődőket, ezek az alaplapok szinte teljesen kompatibilisek az Arduino Nano-val. Azonban van néhány igen jelentős különbség, ezért kellenek kompromisszumok a használatához.

AZ első lényeges használat béli különbség, hogy nincs benne eeprom. Pontosabban van, csak nem úgy ahogy megszoktuk. A program feltöltésekor beállítható, hogy mennyi eeprom-ot szeretnénk használni a flash program memória kárára. Mint az közismert a flash memória (memória típusokról itt találsz plusz infókat) arról híres, hogy gyors, de ezt úgy érik el, hogy az információt csak nagyobb blokkokban lehet beleírni a tároló elemekbe. Jelen esetben ez 1Kbyte. Tehát a legkisebb címezhető memória egység 1024 byte. Hogyan lehet mégis byte-okat megcímezni? Hát úgy, hogy két 1Kbyte-os blokkot kell fenntartani. Ha egy kiválasztott byte-ot akarunk megváltoztatni, akkor előtte ez éppen nem használt blokkot ki kell törölni, és az új információ figyelembevételével átmásolni az aktuális (régi) eeprom területet az újra. Ezt követően az aktuális adattal megírt területet meg kell jelölni, hogy tudjuk, hol van a friss információ. Azt nem tudom, hogy mindezt a vezérlő hogyan csinálja belül, de ezzel nem is kell foglalkozni. Tehát ha kell a programunknak 1kbyte eeprom, akkor a program memóriánk 2kbyte-al lesz kevesebb. Felmehetünk egészen 8Kbyte eeprom méretig, de ekkor már csak 16Kbyte program memóriánk marad. Sajnos ezzel még nincs vége a problémáknak. Az 1kbyte-os eeprom terület nem 1024byte, mert az aktív területet is jelölni kell, amire 4byte-ot elhasznál a vezérlő, így valójában csak 1020byte áll rendelkezésünkre. Nagyobb tárterület használata esetén talán még az előálló 4 byte-os lyukakra is figyelni kell, de mivel nem foglalkoztam ezzel behatóan, ezt nem tudom biztosan, csak sejtem. További probléma lehet, hogy a flash a gyári specifikáció szerint 100.000 újra írást bír ki. Itt azonban nem egy memória cellát írunk újra, hanem a teljes 1kbyte-os blokkot. Ráadásul minden változtatáskor lényegében 2-szer. Ez így igen kevés működési időt eredményezhet. További probléma lehet, hogy szerintem program égetéskor az előző eeprom tartalom elvész. Ezt nem próbáltam ki, csak logikusnak tűnő következtetés.  

Vannak azonban pozitív tulajdonságok is:

  • Az órajel lehet 32Mhz (és ennél alacsonyabb értékek is 32Khz-ig), így a program sokkal gyorsabban fut. Ráadásul a vezérlőben kevesebb ciklust igényel az elemi gépikódú utasítások végrehajtása, így még 16Mhz-n is sokkal gyorsabb mint a Nano. Találhatók a neten erről tesztek, ha valakit érdekel.
  • Alacsony órajellel meglehetősen alacsony az alaplap fogyasztása. Kicsit lejjebb látható a táblázat.
  • Nem hat, hanem 8 PWM kimenetet lehet használni.
  • Van 1 db valódi analóg kimenet (DAC), ami sajnos csak 256 jelszintet tud generálni a a 4-es kivezetésen. Azonban ez is sok mindenre elég, pl. analóg jelgenerátort lehet belőle építeni. A kimenő feszültség többféle feszültség intervallumra beállítható (lásd később).
  • Van a vezérlőben analóg komparátor. Ez nincs az ATMega328-ban. Nem is ismerem a pontos működést, szükségem még nem volt rá. Elméletben két analóg bemenet jelszintjét tudja összehasonlítani. Ez más, mintha megmérem a két analóg bemenetet és a kapott eredményeket a programmal hasonlítom össze. Az analóg komparátor fénysebességgel működik, és ha egyik feszültség nagyobb mint a másik, akkor megszakítást generál. Az analóg komparátor egyik bemenete lehet a DAC is.
  • Vannak nagyáramú kimenetek, amik max. 80mA áramot képesek kipréselmi magukból Ebből 2 db-is található, még nem próbáltam ki ezeket. Kicsit zavaros volt számomra a leírás, de úgy tűnik a többi kimenet 12mA áramot szolgáltat. 6db kimenet azonban emelt áramú 40mA-re emlékszem. Egyenlőre nem is látok rá igényt a saját gyakorlatomban ezekre a tulajdonságokra. Itt jegyzem meg, hogy van egy angolra fordított kínai-angol adatlap. Elég nehezen használható, de azt olvasgattam. Persze a Google fordított magyarra angolról! Szerintem a kínait angolra is a Google csinálta, így a dupla nyelvi transzfer gyászos eredményre vezetett. Időnként inkább maradtam az angolnál.

Fogyasztási adatok:

A többi tulajdonság nagyjából azonos, sőt talán még az alaplap lábkiosztása is:

Nyilván nem lehet az Arduino AVR könyvtár kezelővel használni ezt az alaplapot, de két jól használható alaplapkezelőt is találtam:

Az Arduino IDE file / beállításo menüpontban a „További alaplap kezelő URL-ek” közé írjuk be a kivetkező sorokat pluszban:

https://gitee.com/nulllab/nulllab_arduino/raw/master/package_nulllab_boards_index.json

https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json

Ha ezt követően megnyitjuk az alaplapkezelőt (eszközök / alaplap:… / alaplap kezelő) a következő könyvtárakat találhatjuk meg:

Ha nem lenne olvasható, a kereső szavak „lgt8fx” és „null”! Mindkettőt feltelepítettem.

A könyvtárkezelő megtalált bejegyzésein javaslom a „More Info” illetve „Online Help” linkek kipróbálását. Hasznos infókhoz lehet hozzájutni!

A kétféle alaplapkezelő közül a Nulllab-os azért tetszett jobban, mert az alaplap tulajdonságai között az eeprom méretet is be lehet állítani feltöltés előtt, és erre szükség lehet. Itt kell megjegyeznem, hogy az eeprom-al más problémák is vannak, mint amikről már szó esett. Ha 1kbyte-nál nagyobb méretet állítunk be, akkor a bootloader felülíródik, és nem fogunk tudni kényelmesen USB porton keresztül programot tölteni az alaplapra. Ekkor csak programozóval az SWC és SWD valamint RST kivezetések (a nyák rövidebb élére csoportosították ezeket a kivezetéseket a Vcc és GND-val együtt) felhasználásával lehet programot feltölteni. Ehhez persze speciális programozó kell, amit egy újabb LGT8F328p alaplap vagy egy Arduino UNO (nano) segítségével tudunk készíteni magunknak. Ezzel visszaégethetjük a bootloadert is, és ismét szól a hatlövetű! A programozót meg kell építeni, és szoftver is kell hozzá. A szoftver megtalálható az „LGT8fx Boards” alaplapkezelő példa programjai között „LarduinoISP” néven. Némi segítséget találtam a github-on itt: https://github.com/LGTMCU/LarduinoISP

Itt található egy bekötési ábra és program is:

A kivezetés felíratok (ha esetleg nem lenne olvasható) balról jobbra haladva: GND, Vcc, RESET, SWD, SWC. Ezen az ábrán már biztosan el lehet indulni. Egyenlőre nem akarok ezzel foglalkozni. Igyekszem nem elrontani az alaplapjaimat az eeprom funkcióval, és az USB port nélküli alaplapomat is kidobom inkább.

Az alábbi képen látható, hogy a Nulllab alaplap kezelő esetén milyen beállítások állnak rendelkezésre.

A „variant” sorban véletlenül „LGT328P-LQFP48”-at állítottam be, pedig az én alaplapom valójában „LGT328P-LQFP32”, de így is működik a feltöltés.

A program feltöltés működik, de sajnos az alaplap információk kiolvasása már nem, így nálam minden feltöltés végső soron hibára fut. Ez azonban egy olvasási hiba, ettől még a program kikerül a chip-re és működik. Az olvasás megszakadására várni is kell egy kicsit, ami zavarja a folyamatokat, de közben már lehet nézegetni a működő programot, sőt még a sorosport is működik. Így ezzel a problémával még nem nagyon akartam foglalkozni, inkább hozzászokok, mint értékes időt töltsek vele. Esetleg csak nálam jelentkező hiba, mert már agyon nyúztam az Arduino IDE-met, legalább 6-7 alaplapkezelő van rajta, és volt már minden, még lefagyás utáni Windows reset is!

Miért kell a másik alaplapkezelő (LGT8fx boards)?! Ez is működik minden tekintetben, csak épp az eeprom méretet nem lehet beállítani rajta. Azonban kicsivel több minta programot adtak hozzá, így a példák között vannak olyanok, amik a másikban nem. Nem szabad elfelejteni, hogy az alaplapot mindig ki kell választani az eszközök / alaplap menüpontban, és a kiválasztott alaplaphoz tartozó példák csak ekkor jelennek meg. Tehát tanulás közben váltogatni kell az alaplapok között! Vagy a példa programokat meg is lehet keresni a merevlemezen. Az én gépemen itt található: C:\Users\Zoli\AppData\Local\Arduino15\packages\lgt8fx\hardware\avr\2.0.0\libraries. Természetesen az elérési útvonal mindenkinél más lesz. A gépemen „Zoli” a felhasználó, akivel bejelentkeztem!

Engem első körben az érdekelt, hogy milyen pontos a beépített órajel. Írtam is egy picike programot, ami 60 másodperc időzítést követően ír valamit a soros monitorra, és ott leolvashatom a számítógépen pontos pillanatnyi idejét. Szerzői jogdíjas, csak nézni szabad használni nem. Írj másikat!

int i=0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(i++);
  delay(60000);                      
}

Eredmények a belső órajel (32Mhz) használatával:

07:25:54.264 -> 0
07:26:54.113 -> 1
07:27:53.931 -> 2
07:28:53.788 -> 3
07:29:53.599 -> 4
07:30:53.450 -> 5
07:31:53.287 -> 6
07:32:53.083 -> 7
07:33:52.919 -> 8
07:34:52.758 -> 9
07:35:52.631 -> 10
07:36:52.434 -> 11
07:37:52.279 -> 12
07:38:52.123 -> 13
07:39:51.957 -> 14
07:40:51.784 -> 15
07:41:51.627 -> 16
07:42:51.455 -> 17
07:43:51.287 -> 18
07:44:51.103 -> 19
07:45:50.967 -> 20
07:46:50.795 -> 21
07:47:50.640 -> 22
07:48:50.456 -> 23
07:49:50.272 -> 24
07:50:50.134 -> 25
07:51:49.961 -> 26
07:52:49.809 -> 27
07:53:49.616 -> 28
07:54:49.457 -> 29
07:55:49.311 -> 30

Látható, hogy 30 perc elteltével a chip órajele már tekintélyes, közel 5 másodperc eltéréssel rendelkezik. Ez azonban belefér a specifikációban megadott 1%-ba (0.3%). A sorosporti kommunikáció valószínűleg biztonságban van alacsonyabb sebességeken. 9600 baud biztosan megy, 115400 feletti sebességeken ebben már nem lennék biztos!

Ha a külső 16Mhz-s órajelet választjuk ki, akkor az eredmény:

07:58:11.409 -> 0
07:59:11.400 -> 1
08:00:11.406 -> 2
08:01:11.419 -> 3
08:02:11.401 -> 4
08:03:11.435 -> 5
08:04:11.413 -> 6
08:05:11.417 -> 7
08:06:11.416 -> 8
08:07:11.429 -> 9
08:08:11.453 -> 10
08:09:11.466 -> 11
08:10:11.473 -> 12
08:11:11.477 -> 13
08:12:11.472 -> 14
08:13:11.485 -> 15
08:14:11.448 -> 16
08:15:11.484 -> 17
08:16:11.475 -> 18
08:17:11.479 -> 19
08:18:11.464 -> 20
08:19:11.476 -> 21
08:20:11.480 -> 22
08:21:11.508 -> 23
08:22:11.487 -> 24
08:23:11.492 -> 25
08:24:11.520 -> 26
08:25:11.527 -> 27
08:26:11.531 -> 28
08:27:11.535 -> 29
08:28:11.520 -> 30
08:29:11.536 -> 31
08:30:11.531 -> 32

Az eltérés ebben az esetben a várakozásnak megfelelő mindössze 0,12 másodperc az eltérés. Ez napi 3 másodperc alatt van, ami megfelel egy quartz kristály pontosságának.

Izgalmas lehetőségeket rejt az analóg kimenet. A DAC mint már említettem 8 bites, tehát 0V-tól Vref feszültségig állítható be 256 (illetve 255) lépésben. A referencia feszültség kijelölhető a következő értékekre (megjegyzem, az ADC esetén ugyanezek a referencia lehetőségek állnak rendelkezésre):

  • DEFAULT, 5V-ot használ.
  • EXTERNAL, a REF érintkező feszültségét használja.
  • INTERNAL4V096, 4,096 V-os belső referenciafeszültséget használ.
  • INTERNAL2V048, 2,048 V-os belső referenciafeszültséget használ.
  • INTERNAL1V048, 1,048 V-os belső referenciafeszültséget használ.

Aki foglalkozik elektronikus áramkörökkel, annak érdekes lehet a belső felépítés érintett része:

Látható, hogy 255 db azonos ellenállásból felépített feszültségosztó állítja elő a kimenő feszültséget (elszínezett blokk a rajzon). Így ennek linearitása nem biztos, hogy tökéletes, ahogy sikerültek az ellenállások, olyan lesz a kimenő feszültség. Olvastam is egy cikket, amiben kritizálták a kimenet működését. Rákötöttem a multiméteremet, de nem szántam rá időt, hogy pontosan kielemezzem. Ránézésre az történt amit vártam!

Íme a példaprogramom, amivel kipróbáltam a DAC-ot:

byte level=0;

void setup() {
  Serial.begin(9600);
  pinMode(4,ANALOG);         //4-es kivezetés analóg kimenet lesz
  analogReference(DEFAULT);  //az analóg kimenet referencia feszültsége a tápfesz
}

void loop() {
  analogWrite(4,level);      //beállítjuk a kimenet feszültségszintjét
  level++;
  Serial.println(level);
  delay(200);                      
}

A következő lépésben az érdekelt, hogy mennyire kompatibilis a működés azokkal a program könyvtárakkal (függvény osztályokkal) melyek használják a chip belső időzítőit. Úgy emlékszem, hogy az onewire könyvtár ilyen. Elővettem hát a Dallas DS18B20 egyvezetékes hőmérőt, bekötöttem, és feltöltöttem az itt található legelső mintaprogramot. Nagy megnyugvással konstatáltam, hogy ez is működik.

Hozzáláttam, hogy kipróbáljam a Radiohead könyvtárat, és rákötöttem egy RF433 Mhz-s vevőt az alaplapra. Szerencsére a lakásunkban pont van egy adóberendezés, az időjárás állomásom szeles időben minimum percenként működteti az adót. Nagy meglepetésemre feles eredmény született. Az adást érzékeli a vevő, de a visszadott (vételre került) adatokat nem sikerült visszaállítani. Csupa 0 érkezett! Sajna a vevőn még nem volt antenna, így ez is okozhatja a hibát, de rosszat sejtek. Minden esetre ezzel még küzdenem kell, építeni kell egy adót, és részletesen megvizsgálni, hogy mi történik. Ehhez minden meg van, csak idő nincs, de ígérem visszatérek rá. Leírom az eredményt!

Egyenlőre eddig jutottam a vizsgálatban. Egyenlőre annyit tudtam megállapítani, hogy ez a chip „szinte” teljesen kompatibilis az ATMega328-al! Lehet bátran vásárolgatni!

Mennyire volt hasznos amit olvastál? Értékelés után szövegesen is leírhatod megjegyzéseidet és véleményedet!

Kattints egy csillagra az értékeléshez!

Szövegesen is leírhatod véleményedet! Ha kérdésed van, ne felejtsd el megadni az email címedet!