Skip to main content

„Bárcsak lenne eggyel több hardverfunkcióm!” (egy beágyazottrendszer-tervező sóhaja)

Megjelent: 2019. augusztus 15.

1microchip lidA beágyazott elektronikai fejlesztés – az ár, a fogyasztás és az alkatrészszám minimalizálása érdekében – gyakran kényszeríti a tervezőket szokatlan megoldásokra. Ez sokkal könnyebb, ha ehhez a mikrovezérlő olyan „szabadsági fokokat” kínál, mint a kivezetések elrendezésének tetszőleges átrendezése, vagy az inicializáláson kívül más beavatkozást nem igénylő, önálló működésre alkalmas perifériák. A szerző egy váratlanul felmerült probléma megoldásának folyamatán át mutatja be ezeket a lehetőségeket.

 

Bevezetés

Van egy lényeges különbség a beágyazott rendszerek és az általános célú számítógépek programozói között: nekünk, beágyazottrendszer-tervezőknek a hardverelemek megdöbbentően széles választékával kell foglalkoznunk. Gyakran úgy gondolok magunkra, hogy a szerepünk nagyon hasonlít a tesztpilótákéhoz. Míg a pilóták nagyobbik része ugyanazzal a géptípussal repül, sőt, gyakran ugyanazt az utat teszi meg nap mint nap, mi a „repülőgépek” számos változatát és azok gyakran változó konfigurációit „repüljük”, folytonosan keresve a költség, a sebesség és a szolgáltatások optimumát, válaszul a felhasználóink és a piac igényeire. Ennek következtében a munkánk sohasem unalmas, bár néha már inkább azt kívánjuk: bárcsak unalmasabb lenne. Ebből származik az ellentmondásos viszonyunk is az innovációhoz. Egyfelől megpróbáljuk megtalálni a lehetőséget, hogy a legújabb terméktulajdonságokkal, kedvező árral és forradalmian új megoldásokkal rendelkező eszközöket használhassuk. Másrészt viszont nem lelkesedünk azért a „betanulási” folyamatért, amivel az új termék használatbavétele jár; jobban szeretnénk, ha mindenki ugyanazt a fordítóprogramot, programkönyvtárat és programfejlesztő eszközöket alkalmazná, amit mi is ismerünk, és megszerettük a használatát… a változásokról ezt gondoljuk: csak lépésről lépésre, ha kérhetnénk...

 

1microchip

1. ábra  Egy időalap-időzítőből és egy limitszámlálóból álló PWM-áramkör

 

Válasszuk ki a magunkét

A jelenkorban senkinek semmi kétsége nem lehet afelől, hogy a mikrovezérlők kínálata, amelyből választhatunk (és választanunk kell), szélesebb, mint amire szükségünk lenne. Választhatunk a szinte tetszőleges kivezetésszámot, szóhosszúságot, architektúrát, valamint a flashmemória és a RAM tetszőleges arányát képviselő típusokból. Valójában az elmúlt években a versengő eszközgyártók arra helyezték a hangsúlyt, hogy továbbiakkal egészítsék ki a választási szempontoknak ezt a felsorolását, és ezzel tovább bővítsék azt a követelménymátrixot, amely alapján ki kell választanunk a piaci kínálatból a céljainknak legjobban megfelelő típust.
Sokan vélekednek úgy, hogy az elegendően nagy órafrekvenciával és programmemória-területtel rendelkező típusokkal bármilyen feladat megoldható, pusztán az általános célú be/kimenetek felhasználásával (amibe jómagam egy A/D-átalakítót és egy inpulzusszélesség-modulátort – PWM-et – is jó ötletnek gondolok beleérteni). Ez az elgondolás majdnem úgy hangzik, mintha Alan Turingnak az „általános célú számítógépről” tett megállapításainak a következménye lenne, kiterjesztve azt az általunk művelt beágyazott elektronikai alkalmazási területre.
De remélhetőleg mi, beágyazottrendszer-fejlesztők mindannyian egyetértünk abban, hogy ez nem lenne sem észszerű, sem gyakorlatilag használható stratégia. Ha belegondolunk, végül is Alan Turing sem építette meg azt a gépet, ami máig a nevét viseli. Remélhetőleg abban is egyetértünk, hogy a jelenkori beágyazottalkalmazás-fejlesztésnek egy bőséges periféria- (funkció-) választékra van inkább szüksége, még akkor is, ha ez egy kicsit bonyolultabbá teszi a dolgokat azzal, hogy bővíti a választás alapjául szolgáló paramétermátrixot.

 

1microchip list

1. programlista  A Timer2 alapértékének beállítása

 

Csapdába esünk, majd váltunk

Még manapság, a beágyazott vezérlési megoldási lehetőségek széles választéka ellenére sem ismeretlen előttünk mint tervezők előtt, hogy elkezdünk dolgozni egy projekten egy adott mikrovezérlő-típus felhasználásával, és csak a projekt előrehaladása közben vesszük észre, hogy egy másik típusra kell váltanunk. Ne feledjük: ez nem a próbálkozás hiányából adódik, és nem csak a lusta mérnökökre jellemző, akik a projekt indításakor kihagyják az igények és megoldási lehetőségek megfelelő elemzését, hanem azokra is, akik elvégzik a megfelelően alapos előkészületeket az elemzés területén is. A kényszerű típusváltás sokkal gyakrabban a feladat bonyolultságának következménye: ez olyan, mint egy sakkjátszma, amelyben csak véges számú lépést tudunk előre végiggondolni. Nehéz előre látni, hogy a különféle perifériák milyen kölcsönhatásba kerülnek egymással, miközben sorra beépítjük azokat az alkalmazásunkba, de az is előfordulhat, hogy nem tudjuk előre jelezni, milyen változásokon megy keresztül a hardvermegoldás a fejlesztési folyamat során a projektkövetelmények menet közbeni változása miatt (ahogy mindig történni szokott), miközben egyre közelebb kerülünk a tervezési folyamat befejezési határidejéhez.
A legjobb esetben a mikrovezérlő lecserélése csak kisebb törést okoz a folyamatban, ha vagyunk olyan szerencsések, hogy ugyanannak a gyártónak ugyanazon termékcsaládjában találunk alkalmas cseretípust. A dolgok sokkal rosszabbul is alakulhatnak, ha nincs ilyen választási lehetőségünk, és ez rákényszerít minket arra, hogy másik termékcsaládot válasszunk. Ez gyakran egy dominóeffektus-szerű eseménysorozatot indít el, ha például megváltozik az eszköz lábkiosztása vagy más perifériafunkciók használatba- vételére kényszerülünk.

 

A magfüggetlen perifériák kínálnak menekülési útvonalat

Ezek a problémák úgy kezelhetők a legjobban, ha előre betervezzük azok megoldását is. A legkorszerűbb mikrovezérlő-családokban okos módszerek vannak arra, hogyan rendezzük át a kivezetéseiket a kínált perifériák igényeinek megfelelően. Nem arról beszélek, hogy (mint a 90-es években) van egy alternatív változat a kivezetések elrendezésére. Sokkal inkább arról, hogy az analóg és digitális perifériafunkciók kivezetéseinek elrendezése teljesen és korlátozás nélkül konfigurálható. Például a Microchip 8, 16 és 32 bites mikrovezérlő-kínálatában ez Peripheral Pin Select (PPS – perifériakivezetés-választás) néven ismert: az eszköz bármely kivezetése kijelölhető bármelyik (akár több, bizonyos modelleknél akár 64 különböző) periféria bemeneteként, és bármely perifériakimenet egyszerre akár 16 (egyes típusokon akár 32) különböző kimeneten is megjeleníthető. Az A/D-átalakítók analóg bemenetei hasonlóképpen hozzárendelhetők az eszköz kivezetéseinek csaknem bármelyikéhez (40 kivezetés esetén akár 35 kivezetéshez is).
Miközben ez önmagában is hatalmas biztosítéka a jövőben várható tervezési változásokra való könnyebb válaszadásnak, a játékszabályok igazi megváltoztatását a Microchip termékeiben a magfüggetlen perifériák (Core Independent Peripherals – CIP) bevezetése hozta magával. Ne feledjük: nem ez volt az elsődleges ok, amiért a CIP-eket bevezette a vállalat. A magfüggetlen perifériák eredeti célja az volt, hogy csökkentse a mikrovezérlő központi egységének a munkaterhelését azzal, hogy amennyire csak lehetséges, automatizálja azokat az alacsony szintű és koordinációs tevékenységeket, amelyek a hagyományos perifériafunkciók megvalósításához szükségesek. A szabadon áthelyezhető kivezetésfunkciók és a rugalmasan felhasználható CIP-ek – mintegy „mellékhatásként” – azonban a projekt előrehaladása közben felmerülő tervezési „krízishelyzetek” megoldására is igen alkalmasak.

 

Egy gyakorlati példa: csináljunk PWM-funkciót „a semmiből”

Gyakorlati példaként egy nemrég történt esetet idézek fel. Egy automotív érzékelőnek egy továbbfejlesztett változatán dolgoztunk, amelyben néhány időzítőt, egy 10 bites impulzusszélesség-modulátor (PWM) modult és egy analóg komparátort használtunk, amely mind megtalálható volt egy PIC16F18855 mikrovezérlő 28-kivezetéses tokozatában. Hamarosan felismertük, hogy az éppen folyamatban levő tervezési munka kemény korlátozásba ütközött: a tervezés folytatásához egy 12 (vagy több) bitnyi felbontású PWM-regiszter is szükségessé vált. Szerencsétlenségünkre ilyen eszköz nem állt rendelkezésre a választott mikrovezérlő perifériakínálatban. A hasonló, azonos tokozattípusú, kivezetésszámú és lábkiosztású 8 bites PIC mikrovezérlőknek vagy a programmemóriája volt kevés, vagy nagyobb, bőségesebb perifériaválasztékú modelleket használhattunk volna – természetesen magasabb áron, miközben mindössze egyetlen 12 vagy magasabb felbontású PWM-regiszterre lett volna csupán szükségünk.
Szerencsére a PWM-perifériafunkciót könnyű összerakni a mikrovezérlőben is, ha néhány rugalmasan használható funkcióblokk és némi „ragasztó” logika is megtalálható a szabad erőforrások között. Bármilyen PWM két lényeges elemből áll: egy periodikus impulzusjelű óragenerátorból és egy küszöbérték- (limit-) számlálóból. Az 1. ábrán látható, hogyan lehet két perifériafunkciót – nevezetesen egy periodikus órajelforrást és egy limitszámlálót összekapcsolni annak érdekében, hogy periodikus jelet kapjunk. Az ábráról leolvasható, hogyan adódik az eredményül kapott négyszögjel kitöltési tényezője.

 

2microchip

2. ábra  Az MPLAB Code Configurator (MCC) dialógusablaka a Timer2 konfigurálásához

 

Az időalap beállítása

Az időalapot bármilyen szokásos időzítővel meg lehet valósítani, amely a kívánt frekvenciával (esetünkben kb. 500 Hz-cel) periodikus jelet képes előállítani. A mi alkalmazásunkban az időzítő lehetett bármilyen 8 bites, egyszerű időzítő/számláló, akár más funkciókkal (PWM-ekkel vagy mással) megosztva is. Alkalmazásunkban „újrahasznosítottuk” a Timer2, egy alapkiépítésű 8 bites, végértékregiszterrel (T2PR) ellátott időzítő kimeneti jelét.
A Timer2 modul mint időalap konfigurációja mindössze egy regiszterpár alapértékének beállításából áll, amint az az 1. programlistában is látható.
Egy ilyen inicializáló rutin kidolgozásának hagyományos módja megkívánná, hogy mélyen „ássuk bele magunkat” a kiválasztott PIC mikrovezérlő terjedelmes kézikönyvébe, gondosan meghatározva, hogy ehhez mely regiszterek melyik bitjeit kell beállítani, és hogyan. Ez – még egy egyszerű periféria esetén is – hosszadalmas és számos hibalehetőséget rejtő folyamat. Sokkal jobb, ha felhasználjuk a manapság már széles körben ismert MPLAB Code Configurator szolgáltatásait, amely egy, az MPLAB integrált fejlesztőkörnyezetébe beépített gyors fejlesztőeszköz (plugin). Ez lehetővé teszi, hogy ugyanazt a kódot, – egy, az 1. programlistához hasonló alapérték-beállító (inicializáló) rutint – mindössze néhány egérkattintással állíthassuk elő. Valójában ezt a programfejlesztő eszközt gyakran használják arra is, hogy a fejlesztő megismerkedjen az eszköz beállításában rejlő lehetőségekkel, illetve gyors kísérleteket végezhessen a magfüggetlen perifériák által kínált számos üzemmód felhasználásával.
A 2. ábrán látható, hogyan lehet láthatóvá tenni a Timer2 opcionális lehetőségeit és csupán néhány választható opció és szövegbeviteli ablak segítségével hogyan lehet beállítani azokat az alkalmazás igényeinek megfelelően.

 

3microchip magyar

3. ábra  A jelidőzítés-mérő (Signal Measurement Timer – SMT) tömbvázlata

 

A limitszámláló konfigurálása

A limitszámláló egy kissé összetettebb, bár egyáltalán nem szükségtelenül bonyolult vagy ritka funkció. Ha elindítottuk, ez a számláló felfelé számlál mindaddig, amíg (mint neve is mutatja) egy beállított limitet el nem ér. Ekkor egy impulzust állít elő, majd leáll. Az alaphelyzetbe állítása és újraindítása a következő indítójel vételekor történik. Ezt a funkciót gyakran nevezzük újraindítható (retriggerable) monostabil áramkörnek, vagy ahogy a PIC-szakirodalomban nevezik: hardver limit időzítőnek (Hardware Limit Timer – HLT).
Szerencsétlenségünkre – mivel 12 bitnyi vagy nagyobb felbontást várunk el a PWM kitöltési tényezőjétől – a PIC mikrovezérlőkben tipikusan megtalálható HLT nem felel meg ennek a célnak. A korszerű PIC mikrovezérlőkben – még a számozott időzítők esetében sem – fordul elő 8 bitesnél nagyobb kapacitású számlálóval rendelkező HLT. Viszont van egy másik – kevésbé ismert – periféria, amellyel a kívánt felbontás elérhető. Ez a jelidőzítés-mérő (Signal Measurement Timer – SMT) periféria, amelynek tömbvázlata a 3. ábrán látható.
Ha a HLT „egy kicsit több”, mint egy időzítő, mivel egy többlet indító/reset bemenettel rendelkezik, az SMT lényegében egy olyan időzítő, amelynek két ilyen többletbemenete van. Több érdekes módja van annak, hogyan lehet kombinálni ezt a két bemenetet idő, frekvencia vagy kitöltési tényező mérésére – mint arra a nevéből is következtethetünk.
A mikrovezérlő kézikönyve nem kevesebb, mint 11 ilyen üzemmódot ismertet, amely elég sok ahhoz, hogy elijessze a kezdő felhasználót, és az SMT-t a leginkább félreértett és a legkevésbé kihasznált CIP-ek egyikévé tegye. E helyen nincs mód arra, hogy mélyen belemerüljünk ezeknek az üzemmódoknak a részleteibe. Elégséges megemlíteni ezek egyikét, a – talán félrevezető nevű – Window Measurement Mode-ot (ablakmérési üzemmódot), amely az SMT-t lényegében HLT-vé alakítja át. Ám ez valójában egy igen „nagy” HLT, mivel 24 bites számlálót és 24 bites periódusidő-regisztert tartalmaz.
A Signal Measurement Timer (SMT1) konfigurálásához ismét csak az MCC-re hagyatkozhatunk, amely jelentősen leegyszerűsíti ezt a műveletet (lásd a 4. ábrát). Ennek eredményeképpen automatikusan generálódik az alapérték-beállító, inicializációs funkció, amelyhez hasonlót a 2. programlista mutat, pontosan úgy, ahogy arra az 1. programlistánál láttunk példát. Csupán néhány kommentet fűztünk a forrásszöveghez az olvashatóság és a világosság kedvéért.

 

2microchip list

2. programlista  Inicializáló funkció az SMT1 modulhoz

 

3microchip list

3. programlista  A CLC modul konfigurálása S/R-lacthként

 

Az S/R tároló konfigurálása

Az időalap-időzítő és a limitszámláló egyesítése az S/R (Set/Reset) tároló (latch) feladata. Ez a funkció számos PIC mikrovezérlőben elérhető, de az elmúlt hat évben a magfüggetlen perifériák (CIP-ek) „oszlopos tagjainak” egyike, a konfigurálható logikai cella (Configurable Logic Cell – CLC) nyolc funkciójának egyikeként érhető el. Az 5. ábra mutatja, hogyan kell a két részegység kimeneti jelét az S/R-latch bemeneteire csatlakoztatni. (Megjegyezzük, hogy az 5. ábrát közvetlenül az MPLAB Code Configurator szoftver CLC-konfiguráló ablakában előállított grafikus képből másoltuk ki.)
Akár felhasználjuk a gyors fejlesztőeszközt (az MCC-t), akár kézzel készítjük el a perifériát konfiguráló funkciót, az eredmény egy rövid inicializáló programfunkció, amely csupán értéket ad a periféria néhány érintett regiszterének (3. ábra).

 

4microchip

4. ábra  Az MCC dialógusablaka az SMT1 modul konfigurációjához


Mivel az alkalmazásunkhoz felhasznált PIC16F188xx eszközök két SMT-modult tartalmaznak, nem csak egy, de két, dupla felbontású PWM-modul összeállításához elegendő erőforrás áll rendelkezésünkre.
Néhány további kódsorral teljessé tehetjük a PWM konfigurációját, és lehetővé tesszük a kimeneti periodikus impulzussorozat kitöltési tényezőjének kényelmes beállítását. A 4. programlistán megvalósítjuk a teljes perifériainicializálást azzal, hogy egyetlen programlistában egyesítjük a három felhasznált periféria egyedi inicializáló kódsorait. Az új PWM indítását és leállítását most a limitszámlálóval (SMT1) végezzük, és – ahogy terveztük – a kitöltési tényezőt a 24 bites SMT periódusregisztere segítségével állítjuk be. Mielőtt a kitöltési tényező értékét módosítanánk, bépítettünk egy apró módosítást: egy egyszerű szinkronizációs programhurkot iktattunk közbe annak érdekében, hogy a kimeneti jelben ne keletkezzen nem tervezett impulzusjel (glitch).

 

4microchip list

4. programlista  Az új PWM-modult konfiguráló és vezérlő funkció 

 

A PWM effektív felbontása

Általános tévhit a kezdő felhasználók körében, hogy a PWM-regiszter felbontása azonos annak az időzítőnek a bitszámával, amely az impulzus időtartamát (és ezzel a kitöltési tényezőt) meghatározza. E definíció szerint mi most egy 24 bites PWM-funkciót valósítottunk meg – ám ez nem igaz.
A tény az, hogy a periódusidő és a kitöltési tényező egymástól nem független mennyiségek: mindkettőt – mint azt az eddigiekben már láttuk – időzítőszámlálók határozzák meg, és mindegyik közvetlenül függ a mikrovezérlő perifériális órajelétől.
Bármilyen adott perifériális órajelnél a számláló a felelős annak az időnek a meghatározásáért, ami alatt az a beállított maximális impulzusszámot (MaxCount) eléri – mielőtt az időalap-periódus megismétlődne. Ebben a pillanatban a PWM-regiszter eléri a kitöltési tényező 100%-át, és a regiszter többi (fizikailag létező) bitje nem változtatja meg az állapotát (mintha ott sem lennének – A szerk. megj.) Az alábbi képlet adja meg a korábbiak szerint újonnan létrehozott PWM effektív (valóságos) felbontását:

 

MaxCount = tperiod · fclock

 

A mi esetünkben tperiod = 2,048 ms, és a perifériás órajel 32 MHz (vegyük észre, hogy az SMT közvetlenül a maximális rendszerórajelről kap vezérlést, és nincs korlátozva a CPU utasításciklusának órajele által, amely ennek negyedrésze (mint az általában a legtöbb PIC perifériánál is szokásos). Így a számlálóval megszámlálható impulzusok maximális száma:

 

MaxCount = 65 536


A PWM bitekben kifejezett effektív felbontása ennek 2 alapú logaritmusa, ami éppen 16 bit. Ez az eredmény igazolja, hogy az új PWM-modul valóban pontosabb a PIC-sorozat szabványos 10 bites PWM-moduljainál, és ezzel túlteljesíti az eredetileg kitűzött célt.

 

5microchip

5. ábra  Az S/R-latch konfigurálása az MPLAB Code Configurator segítségével

 

Összefoglalás

A folyamat eredménye, hogy létrehoztunk egy új és hatékony 16 bites PWM funkciót, amelyhez egyáltalán nem használtunk fel külső alkatrészeket. Ehelyett egyszerűen megfelelően konfiguráltunk, kapcsoltunk össze és hasznosítottunk újra néhányat a csipen már létező funkciókból. Talán még figyelemreméltóbb, hogy úgy tudtunk létrehozni egy új perifériát, hogy annak használatbavételéhez nem volt szükség a NyÁK-lap mintázatának újratervezésére, mivel a Peripheral Pin Select (PPS) képesség lehetővé teszi, hogy az új funkciót bármelyik csatlakozópont(ok)on tegyük elérhetővé. Továbbá az újonnan létrehozott modul teljesen autonóm funkcióként viselkedik (mint a CIP-ek általában), és nem igényel semennyi processzoridőt a folyamatos működés fenntartása közben, csupán a rendszerindításkor kell beállítani a konfigurációs paramétereket, és alkalmilag, szükség esetén a kitöltési tényezőt meghatározó regiszter tartalmát.

 

Szerző: Lucio Di Jasio – Microchip Technology, Inc.

 

Az olvasó további információkat talál az alábbi webhelyeken:
PIC16F18855 datasheet: http://www.microchip.com/wwwproducts/en/PIC16F18855
MPLAB Code Configurator: http://microchip.com/mcc
CIPs: www.microchip.com/cip

 

 www.microchip.com

 

Még több Microchip