UNIVERZITA TOMÁŠE BATI VE ZLÍNĚ FAKULTA APLIKOVANÉ INFORMATIKY
PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 6 Práce s analogově‐digitálním převodníkem Jan Dolinay Petr Dostálek Zlín 2013
Tento studijní materiál vznikl za finanční podpory Evropského sociálního fondu (ESF) a rozpočtu České republiky v rámci řešení projektu: CZ.1.07/2.2.00/15.0463, MODERNIZACE VÝUKOVÝCH
MATERIÁLŮ A DIDAKTICKÝCH METOD
Cvičení 6 – Práce s analogově‐digitálním převodníkem
Cvičení 6 – Práce s analogově‐digitálním převodníkem
STRUČNÝ OBSAH CVIČENÍ:
Programová obsluha A/D převodníku Ukázkový program – sloupcový indikátor s LED Úkoly k procvičení
VSTUPNÍ ZNALOSTI: Toto cvičení předpokládá znalosti získané na předchozím cvičení a účast na přednáškách.
CÍL:
Na tomto cvičení si ukážeme, jak lze v programech využít AnalogověDigitální převodník (A/D). Cílem cvičení je naučit se využívat A/D převodník k získání a zpracování analogové vstupní hodnoty (např. ke změření napětí na vstupu mikropočítače). Díky tomu můžeme v programech pracovat s údaji z okolního světa, např. teplotou nebo tlakem, získanými ze snímačů s analogovým výstupem.
Cvičení se vztahuje k těmto otázkám
Programová obsluha analogových a diskrétních vstupů a výstupů
MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD CZ.1.07/2.2.00/15.0463,
2
Cvičení 6 – Práce s analogově‐digitálním převodníkem
Řešené příklady Příklad 1 – Použití A/D převodníku
Úkol: Vytvořte podprogram, který rozsvítí 0 až 4 LED diody v závislosti na nastavení potenciometru na vývojovém kitu.
Řešení Na vývojovém kitu je osazen potenciometr (proměnný rezistor), který umožňuje měnit napětí na jednom ze vstupů A/D převodníku, konkrétně na kanálu 0. Hodnotu napětí nastavenou tímto potenciometrem budeme zjišťovat pomocí A/D převodníku a to ve smyčce (aby program průběžně reagoval na změny nastavení potenciometru) a podle její velikosti rozsvítíme příslušný počet LED. Návrh rozsahu svitu pro jednotlivé LED (v % rozsahu): 0 – 10% 11 – 25% 26 – 50% 51 – 75% > 75%
= žádná LED nesvítí = svítí LED1 = svítí LED1 a LED2 = svítí LED1, LED2, LED3 = svítí všechny LED.
Vývojový diagram je na následujícím obrázku.
MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD CZ.1.07/2.2.00/15.0463,
3
Cvičení 6 – Práce s analogově‐digitálním převodníkem
4
Obr. 1 – Vývojový diagram příkladu
Slovně je možno popsat princip programu takto: Nejprve je třeba provést inicializaci portů a převodníku, což znamená nastavit piny portů, kde jsou připojeny LED diody jako výstupní, nastavit A/D převodník na 10-ti bitový režim atd. Zahájíme převod (zapsáním hodnoty do registru ATD1SC) Čekáme na dokončení převodu Pomocí několika podmínek rozsvítíme pro každý rozsah naměřené hodnoty (výsledku převodu) příslušný počet LED diod. Protože používáme rozlišení převodníku 10 bit, je maximální hodnota výsledku převodu 210 tj. 1024.* Čekáme 100 ms (aby převody neprobíhaly zbytečně rychle za sebou) Skokem se vracíme na začátek programu, na místo kde se spouští převod a tím danou část programu neustále opakujeme (a aktualizujeme tak počet rozsvícených LED podle aktuální hodnoty nastavené potenciometrem). * Odtud jsou vypočteny číselné hodnoty v podmínkách ve vývojovém diagramu- srovnejte s procentuálními hodnotami uvedenými v zadání. Např. pro nastavené napětí 26 až 50% rozsahu má svítit LED1 a LED2. 26% z 1024 je 266,4. Proto jestliže výsledek převodu je větší než 266, rozsvítí se kromě LED1 (podmínka > 112) také LED2.
MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD CZ.1.07/2.2.00/15.0463,
Cvičení 6 – Práce s analogově‐digitálním převodníkem
Potřebné instrukce BLS – Skok jestliže je číslo v uvažovaném registru A menší nebo rovno číslu v paměťové buňce. (Branch Lower or Same)BCLR – Skok má-li uvažovaný bit v paměťové buňce nulovou hodnotu (Branch if Bit Clear) CPHX – Porovnání registru H:X a dvoubajtového čísla v paměti popř. přímého operandu.
Vysvětlení programu Zde je zdrojový kód programu. Kromě hlavního programu je použit také podprogram cekej, který realizuje pozastavení běhu programu na přibližně 0,1 sekundy. Funguje stejně jako čekací podprogram uvedený dříve s tím, že navíc uchovává obsah registrů H, X a A. ; masky m_LED_off
EQU
%00001111
; kod porogramu mov #$ff,PTFD zhasnuty mov #%00001111,PTFDD mov #%00000001,ATD1PE mov #%11000100,ATD1C ; …zarovnani vpravo, ATD clock 2MHz) lda PTFD ora #m_LED_off sta PTFD mov #%00000000,ATD1SC ; jednorazovy prevod, kanal 0 nav1 lda ATD1SC and #%10000000 beq nav1 ldhx ATD1RH cphx #112 bls nav2 bclr 0,PTFD nav2 cphx #266 bls nav3 bclr 1,PTFD nav3 cphx #522 bls nav4 bclr 2,PTFD nav4 cphx #767 bls nav5 bclr 3,PTFD
; po prepnuti rezimu portu budou LED ; PTF0 - PTF3 vystupni rezim ; pin PTB0 prepnut do rezimu vstup AD prevodniku ; inicializace prevodniku (AD zap, 10bit…
opakuj
; zhasneme vsechny LED ; spusteni prevodu - preruseni zakazano, ; cekej na dokonceni prevodu
; nacteme do reg. H:X vysledek prevodu
; je vetsi -> rozvistime LED1
; je vetsi -> rozvistime LED2
; je vetsi -> rozvistime LED3
; je vetsi -> rozvistime LED4
MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD CZ.1.07/2.2.00/15.0463,
5
Cvičení 6 – Práce s analogově‐digitálním převodníkem nav5
jsr bra
cekej opakuj
; CEKEJ – podprogram pro pozastaveni na cca 100 ms cekej PSHH ; uloz pouzivane registry na zasobnik PSHX PSHA LDA #2 n2 LDHX #$FFFF n1 AIX #-1 ; H:X = H:X-1 (pozor, nenastavuje priznaky) feed_watchdog ; reset watchdogu CPHX #0 ; je H:X = 0? BNE n1 ; pokud ne, skoc na n1 DECA ;A=A-1 BNE n2 ; je A=0? Pokud ne, skoc na n2 PULA PULX PULH ; obnov puvodni obsah registru ze zasobniku RTS ; navrat z podprogramu Obr. 2 – Kód hlavního programu pro ukázku práce s A/D převodníkem
Kód začíná nastavením pinů portu F (kde jsou připojeny LED diody) do výstupního režimu. Pin portu B, na kterém je připojen potenciometr se zápisem do registru ATD1PE nastaví jako vstup pro A/D převodník, ostatní piny jsou ponechány v režimu běžných vstupů nebo výstupů. Dále zápisem do registru ATD1C nastavíme A/D převodník do režimu 10-bitového převodu, zarovnání výsledku vpravo a podle doporučení v dokumentaci k mikropočítači jsme také nastavili hodinový kmitočet převodníku na 2 MHz. Do programu pak vložíme návěští opakuj, protože na toto místo se bude program vracet pro provedení dalšího měření. Zápisem do registru ATD1SC vybereme jako vstup převodníku kanál 0 (protože na tom je připojen potenciometr) a spustíme převod. Protože převod trvá určitou dobu, musí program před přečtením výsledku počkat na dokončení převodu. Dokončení převodu signalizuje převodník nastavením příznaku v registru ATD1SC (a případně i přerušením, ale toho v tomto programu nevyužíváme). Nastavení příznaku na 1 se testuje pomocí logického součinu AND s maskou, ve které je na místě příznaku hodnota 1. Dokud není příznak v registru ATD1SC nastaven na 1, bude logický součin 0 x 1 tj. 0 a provede se tedy skok BEQ na návěští nav1. Program zde tedy setrvá tak dlouho, dokud se v nejvyšším bitu registru ATD1SC neobjeví hodnota 1 (což signalizuje dokončení převodu). Výsledek převodu je pak uložen ve dvojici registrů ATD1RH a ATD1RL. Protože jsme nastavili zarovnání výsledku vpravo, je vlastně spodních 8 bitů výsledku v registru ATD1RL a horní 2 bity v registru ATD1RH. Na dvojici výsledkových registrů ATD1RH: ATD1RL se proto můžeme dívat jako na jedno číslo o velikosti 16 bitů. Toto číslo můžeme načíst do MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD CZ.1.07/2.2.00/15.0463,
6
Cvičení 6 – Práce s analogově‐digitálním převodníkem
registru H:X. Obsah registru H:X pak porovnáváme s pevně nastavenými konstantami, které představují prahové hodnoty pro rozsvícení jednotlivých LED diod. Jestliže je naměřená hodnota (výsledek převodu) větší než příslušný práh, např. 112 nebo 266, provede se vynulování odpovídajícího bitu v datovém registru portu F (PTFD) a tím rozsvícení dané LED diody. Vynulování se provádí instrukcí BCLR (bit clear). Pokud naopak není naměřená hodnota větší než práh, vynulování se přeskočí skokem BLS (skoč pokud je menší nebo rovno). Princip je znázorněn a okomentován na následujícím výpisu kódu :
nav2
LDHX CPHX BLS BCLR CPHX
ATD1RH #112 nav2 0,PTFD #266
; nacteme do reg. H:X výsledek převodu ; porovnáme H:X s prahovou hodnotou, zde zvolena 112 ; jestliže je číslo v H:X menší nebo rovno 112, skočíme na nav2 ; jestliže je větší, rozvistime LED1 (vynulováním bitu na portu F)
Hlavní program končí po vyhodnocení všech prahových hodnot skokem na návěští opakuj, viz instrukce BRA opakuj. Testování programu Po překladu program nahrajte to vývojového kitu postupem uvedeným dříve a spusťte plnou rychlostí. Otáčejte potenciometrem a sledujte jak se postupně rozsvěcují a zhasínají LED diody v závislosti na poloze potenciometru.
Příklady k procvičení 1. Upravte program tak, aby se na výsledek převodu nečekalo ale využilo se přerušení. 2. Vytvořte program, který bude v závislosti na nastavení potenciometru měnit frekvenci blikání LED. Zároveň bude možno pomocí tlačítek SW1 a SW2 měnit počet blikajících diod od jedné po všechny čtyři. SW1 bude mít význam (+), tj. bliká o jednu LED více; SW2 (-) tj. bliká o jednu LED méně.
Doplňující zdroje [1]
Freescale: Firemní dokumentace pro mikropočítače HCS08, dostupné online: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=S08GB&nodeId= 01624684491437EDD5
MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD CZ.1.07/2.2.00/15.0463,
7