V minulej časti sme sa v krátkosti zoznámili s (výškovým) senzorom MPL3115A2 od firmy NXP (FreeScale).
Sľúbili sme, že vám ukážeme tú najjednoduchšiu (a aj pre amatérov zrozumiteľnú) cestu, ako s ním pracovať.
A ukázali sme si pár riadkov kódu, ktorými sme senzor iniciovali tak, že teraz už pracuje – meria (nadmorskú) výšku a nám stačí si hotové výsledky už len „vyzdvihnúť“.
Dnes si v úvode porovnáme Hexa (šestnástkové) a Binárne (dvojkové) čísla a potom opäť pomocou len dvoch riadkov kódu si zo senzora „vyzdvihneme“ našu aktuálnu nadmorskú výšku, aby sme ju potom mohli použiť napr. v telemetrii alebo zobraziť na LCD-displeji.
autor: Janko O.
V predchádzajúcej časti sme si povedali, že skôr ako začne senzor MPL3115A2 pracovať – merať, musíme ho iniciovať, teda „povedať“ mu, čo a ako má merať. To sa robí pomocou tzv. registra, teda riadiaceho registra, s (pre nás najvyššou) dôležitosťou 1, ktorý sa volá: Control Register 1 – a má označenie: CTRL_REG1, ktorého podoba (štruktúra) je takáto:
Má Adresu AdrReg = $26 a my sme do neho poslali „povely“ $B8 (Hexa-číslo B8) a potom $B9 (Hexa-číslo B9) .
Lenže …
Povedzme si rovno, že Hexa-čísla sú také čudné – pre normálneho (počítačmi neposadnutého) človeka neprirodzené. Kto ich používa? Okrem milovníkov počítačov asi nikto!
My sme Hexa-číslom s hodnotou B8 ($B8) iniciovali náš senzor, ale akosi „potichu“ sme sa zmierili s tým, že vlastne ani poriadne nevieme, čo to Hexa-číslo B8 je a čo s takým dôležitým registrom, ako je Control Register 1 (CTRL_REG1), vlastne urobí.
Ale oveľa prehľadnejšie a zrozumiteľnejšie to začne byť, keď si to Hexa-číslo prevedieme do Binárneho (dvojkového) tvaru. PIC Basic Compiller na Binárne vyjadrenie používa prefix %, takže Hexa-hodnota B8 ($B8) bude mať dvojkovú podobu nasledujúcu:
%10111000 je to isté ako $B8
Možno si (pri prvom pohľade) poviete: „No to sme si pomohli!?“
Ale áno, pomohli sme si. Keď jednotlivým symbolom Control Registra 1 (viď obrázok hore) priradíme túto kombináciu jednotiek a núl, tak naraz presne vieme, čo sme v registri nastavili.
Poďme z ľava do prava (hoci sa to väčšinou robí skôr naopak):
Symbol ALT bude mať hodnotu 1. To znamená, že senzor je v režime ALTIMETER – výškomer. Keby mal hodnotu 0, tak senzor je v režime PRESSURE – tlakomer.
Symbol RAW nemá v našom super-jednoduchom nastavení miesto a preto nás nezaujíma (necháme prednastavenú 0).
Symboly OS[2:0], teda tri symboly: OS2, OS1 a OS0 určujú mieru prevzorkovania (OverSampling) a ich význam je patrný z (nám už známej) tabuľky:
Symboly RST a OST nevyužijeme (nepotrebujeme), takže nás opäť nezaujímajú.
Symbol SBYB (Stand By) je však veľmi dôležitý: ako sme spomínali v minulej časti, najprv musí byť senzor v režime Stand By (SBYB = 0) a až potom sa aktivuje tak, že SBYB = 1 a senzor začne merať.
Keď sa teraz pozriete na (nám už známe) príkazy:
I2cWrite SDa, SCl, AdrIO, AdrReg, [$B8]
I2cWrite SDa, SCl, AdrIO, AdrReg, [$B9]
tak vidíte, že jediným rozdielom medzi nimi je to, že „povel“ $B8 (%10111000) sa zmenil na [$B9] (%10111001), teda SBYB (Stand By) sa zmenilo z 0 na 1, čiže zo stavu Čakaj - na stav Meraj. Aké jednoduché a jasné!
Preto my v našich programoch na zobrazenie stavu registrov ZÁSADNE používame Binárne zobrazenie: je to názornejšie, prehľadnejšie a ľahšie sa tak vyhneme chybám.
Adresy obvodov a Adresy (čísla) registrov nechávame v Hexa-podobe, pretože tak sú uvádzané v datašítoch a na názornosť a prehľadnosť programov to nemá žiadny vplyv.
Toto je však len náš názor, náš postoj – naša voľba, ktorú my ale nikomu nevnucujeme!
Keby sme teraz týmto „našim“ štýlom mali vyjadriť (v minulej časti spomínanú) subrutinu inicializácie, tak by vyzerala nasledovne:
MPL3115_Init:
AdrIO = $C0
AdrReg = $26
I2cWrite SDa, SCl, AdrIO, AdrReg, [%10111000]
I2cWrite SDa, SCl, AdrIO, AdrReg, [%10111001]
Return
No a teraz poďme pokročiť ďalej:
Senzor MPL3115A2 je teda Iniciovaný (nastavený) a následne Aktivovaný (už meria) a ako sme si povedali, do svojich troch (8-bitových) výstupných registrov začína „sypať“ dáta. Celočíselná (16-bitová) hodnota, teda priamo nadmorská výška v metroch, je každých 512 milisekúnd aktualizovaná v dvoch registroch: OUT_P_MSB (Horný Byte = horných 8 bitov, adresa $01) a OUT_P_CSB (Dolný Byte = dolných 8 bitov, adresa $02). Zlomky metrov sú k dispozícii v registri OUT_P_LSB (adresa $03), ktorý nás zatiaľ nemusí zaujímať (možno neskôr ).
Ešte pred stiahnutím týchto registrov zo senzora si niekde na začiatku programu „stvoríme“ (16-bitovú premennú (teda typu Word) s príznačným menom Výška :
Vyska Var Word
PIC Basic Compiler umožňuje v rámci „Wordovskej“ (16-bitovej) premennej pracovať s ňou buď ako s celkom, teda v našom prípade ako s (16-bitovou) premennou Vyska, alebo ako s jej „polovicami“, teda vlastne akoby samostatnými „Bytovými“ (8-bitovými) premennými: Vyska.HighByte a Vyska.LowByte.
To nám umožní elegantne do tejto „samo-druhej“ premennej potom pomocou dvoch riadkov kódu priamo uložiť (nadmorskú) výšku v metroch:
ReadDataAltitude:
AdrReg = $01
I2cRead SDa, SCl, AdrIO, AdrReg, [Vyska.HighByte]
AdrReg = $02
I2cRead SDa, SCl, AdrIO, AdrReg, [Vyska.LowByte]
Return
Keby sme to chceli napísať ešte v jednoduchšej (ale menej prehľadnej) forme, tak by to vyzeralo takto:
ReadDataAltitude:
I2cRead SDa, SCl, $C0, $01, [Vyska.HighByte]
I2cRead SDa, SCl, $C0, $02, [Vyska.LowByte]
Return
čo sa dá ľudskou rečou preložiť ako:
Prvý príkaz:
Pomocou I2C prečítaj (Read) po linkách SDa a SCl, z obvodu s Adresou $C0 (Adresa senzora MPL3115A2), konkrétne z registra s Adresou $01, hodnotu Horného Bytu (nadmorskej) výšky a ulož ju do premennej s názvom Vyska.HighByte.
Druhý príkaz:
Pomocou I2C prečítaj po linkách SDa a SCl, z obvodu s Adresou $C0, konkrétne z registra s Adresou $02, hodnotu Dolného Bytu (nadmorskej) výšky a ulož ju do premennej s názvom Vyska.LowByte.
Takto jednoducho sme zo senzora MPL3115A2 „vymámili“ aktuálnu (16-bitovú) hodnotu nadmorskej výšky (Vyska). Čo s ňou ďalej budeme robiť, je len na nás.
My, v našej PC Telemetrii, túto hodnotu pomocou doplnených hore-spomenutých riadkov kódu získavame v rámci „letového“ modulu našej PC Telemetrie. Tento modul je umiestnený v modeli, je osadený procesorom (mikrokontrolérom) PIC16F88 a riadený našim programom, vytvoreným v PIC Basic Pro Compileri:
Telemetrický modul - vpravo dole. Ďalšie dva moduly sú súčasťou Umelého horizontu.
Aktuálna (nadmorská) výška modelu (hodnota Vyska) je spolu s ďalšími „telemetrickými“ hodnotami (napätia jednotlivých článkov pohonnej LiPol batérie, odoberaný prúd, spotrebovaná energia, napätie palubnej inštalácie (BECu), prípadne: otáčky motora, letová rýchlosť modelu) „zabalená“ do nášho prenosového protokolu a odoslaná do zobrazovacieho modulu na zemi – pred oči pilota – do minipočítača BenQ:
Na nasledujúcej fotografii už je v akcii aj výškomer a rýchlomer modelu Harmony. Naša PC Telemetria už je v novom - tzv. Ratrak dizajne.
Ale kto chce, môže si túto hodnotu zobraziť na LCD displeji (pripojenom k PIC-mikrokontroléru) a to pomocou jediného príkazu PIC Basic Compilera:
LcdOut "Vyska: ", #Vyska, " metrov nm"
Na displeji potom uvidíme toto:
Ako pripojiť LCD-displej k mikrokontroléru a ďalšie veci, si môžeme ukázať v niektorej z budúcich častí seriálu.