UNIVERZITA TOMÁŠE BATI VE ZLÍNĚ FAKULTA APLIKOVANÉ INFORMATIKY PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 8 Využití sériové komunikace 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: MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD
2 Cvičení 8 Využití sériové komunikace STRUČNÝ OBSAH CVIČENÍ: Ovladač pro sériové rozhraní mikropočítače HCS08 Ukázkový program odesílání textu na SCI Úkoly k procvičení VSTUPNÍ ZNALOSTI: Toto cvičení předpokládá znalosti o sériové komunikaci získané na přednáškách a znalosti programování mikropočítače HCS08 z předchozích cvičení. CÍL: Na tomto cvičení si ukážeme, jak lze v programech využít obvod pro sériovou komunikaci (SCI). Cílem je naučit se využívat sériovou komunikaci pro přenos dat mezi mikropočítačem a např. osobním počítačem. Cvičení se vztahuje k těmto otázkám Paralelní a sériová komunikace, možnosti HC08
3 Řešené příklady Příklad 1 Odesílání textu na sériovou linku Úkol: Vytvořte program, který bude prostřednictvím sériového komunikačního rozhraní SCI 1 periodicky odesílat na terminál text Hello World. Zajistěte, aby se text vypisoval v okně terminálu vždy na nový řádek. Zvolte přenosovou rychlost 19200 Bd Řešení Po inicializaci sériového rozhraní bude program v nekonečné smyčce odesílat nadefinovaný textový řetězec. Odřádkování bude dosaženo odesláním sekvence znaků CR ($0D) a LF ($0A). Princip práce se sériovou linkou je při použití ovladače velmi podobný práci s displejem. Pro vypsání textového řetězce na sériovou linku voláme jiný podprogram než pro výpis na displej, ale stejně jako u příkladu pro displej musíme nejprve tento textový řetězec definovat, pak musíme inicializovat sériovou linku (sci1_init) a poté odešleme textový řetězec na sériovou linku podprogramem sci1_str_out, kterému v registru H:X předáme adresu textového řetězce. Je dobré si také uvědomit, že na sériovou linku se na úrovni zařízení odesílají vždy jednotlivé znaky. Podprogram ovladače pro odeslání celého řetězce tedy obsahuje v sobě smyčku, která zajistí postupné odeslání všech znaků v řetězci až po ukončovací znak (null). Zdrojový kód programu podle zadání: ; code section MyCode: SECTION text dc.b 'Hello World' ; textovy retezec dc.b 0 CRLF dc.b $0d, $0a ; sekvence pro odradkovani dc.b 0 main: _Startup: ldhx # SEG_END_SSTACK ; initialize the stack pointer txs
4 cli ; enable interrupts lda #BD19200 ; kod prenosove rychlosti do A jsr sci1_init ; inicializace SCI, prenosova rychlost 19200Bd opakuj ldhx #text jsr sci1_str_out ; vysleme textovy retezec na SCI1 ldhx #CRLF jsr sci1_str_out ; odesleme odradkovaci sekvenci jsr cekej bra opakuj Obr. 1 Zdrojový kód ukázkového programu na práci se sériovou linkou Vysvětlení programu Při vytváření projektu nezapomeňte do projektu přidat i soubory ovladače, jak je to popsáno v ukázkovém programu pro práci s displejem (obr. 7.2). Jedná se o soubory sci_gb60.asm a sci_gb60.inc. Do kódu v main.asm ještě připište řádek INCLUDE 'disp_gb60.inc' a to na začátek souboru, za řádek INCLUDE 'derivative.inc', který tam byl vložen průvodcem při vytváření kostry projektu. Podprogram cekej můžete zkopírovat např. z ukázkového programu pro blikání LED, výpis 5.2. Měl by čekat cca 1 sekundu. Program nejprve inicializuje sériové rozhraní pro komunikaci rychlostí 19200 bd, viz. LDA #BD19200 a volání podprogramu ovladače sci1_init. Textový řetězec hello world máme uložen v proměné text, jejíž adresu nahrajeme do registru H:X a poté voláme podprogram sci1_str_out, který tento text odešle na sériovou linku. Poté se odesílá řetězec CRLF, do nějž jsem vložili ASCII kód znaků pro odřádkování. Odřádkování se realizuje odesláním dvou znaků*, a to CR (ASCII kód 13 ) a LF (ASCII 10). Jak je vidět v ukázkovém kódu, při definování tohoto odřádkovacího řetězce ukládáme do paměti přímo ASCII kódy obou znaků direktivou DC.B. Aby byl řetězec správně zakončen musí být za oba znaky vložena ještě nula. Po krátké prodlevě voláním podprogramu cekej pak náš program pokračuje skokem na návěští opakuj a celé vysílání se opakuje.
5 Poznámka: CR je zkratka Carriage return (návrat vozíku) a LF pro Line Feed (posunutí řádku). Z toho je patrná inspirace psacím strojem, kde se přesun na nový řádek realizuje pomocí dvou operací posunutí vozíku na začátek a pootočení válce o řádek. Překlad a testování programu Protože program bude nyní komunikovat po sériové lince, jeho otestování bude trochu složitější než u displeje. Po nahrání programu do mikropočítače a jeho spuštění zavřete okno debuggeru, protože pro nahrávání a ladění našeho programu do mikropočítače využívá debugger stejný sériový port, který nyní bude využívat i náš program. Pak na PC spusťte program tzv. terminál. Tento program slouží pro textovou komunikaci s jiným zařízením pomocí různých přenosových médií, včetně sériové linky. My jej použijeme pro zobrazení textu, který náš program v mikropočítači odesílá na sériovou linku. Můžete použít např. freeware terminál program Tera Term nebo Hyperterminál, který je součástí Windows a najdete jej v Nabídce Start -> Příslušenství -> Komunikace. V terminálovém programu musíte nastavit, který port se má použít pro komunikaci. Toto nastavení záleží na tom, do kterého portu máte připojen vývojový kit sériovým kabelem. Nejčastěji to bude COM1, případně COM2. V programu Tera Term musíte po spuštění vybrat druh komunikace serial tj. po sériové lince. Viz obr. 2.
6 Obr. 2 Spuštění programu Tera Term Poté v menu Setup zvolte Serial port. viz obrázek. Obr. 3 Otevření nastavení sériové linky v programu TeraTerm Otevře se okno s nastaveními sériového portu. Zde nastavte port (např. COM1) a přenosovou rychlost (baud rate) na 19200 právě takovou rychlost jsme nastavili v našem programu v mikropočítači a aby mohla komunikace fungovat, musí být v terminálu nastavena stejná rychlost, viz obr. 4.
7 Obr. 4 Nastavení sériové linky v programu Tera Term Pokud máte parametry komunikace nastaveny správně, měly byste nyní vidět v okně terminálu hlášení Hello World, které se bude vypisovat na další a další řádky. Příklady k procvičení 1. Vytvořte program, který bude přijímat znaky přicházející ze sériového rozhraní a zobrazovat je na prvním řádku displeje. Jakmile bude řádek zcela zaplněn, smažte první řádek displeje a pokračujte ve výpisu opět od začátku řádku. Přenosovou rychlost sériového rozhraní nastavte na 19200 Bd. Poznámka: Znaky odesílejte do mikropočítače pomocí libovolného terminálového programu, např. TeraTerm. Nezapomeňte nastavit správnou přenosovou rychlost i na straně PC. 2. Vytvořte program, který bude snímat s frekvencí 5Hz polohu potenciometru a odesílat naměřená data na displej a sériové rozhraní. Pomocí tlačítek SW1 a SW2 bude možno spustit a zastavit měření. Aktuální stav programu bude zobrazován na 1.řádku displeje, druhý řádek bude informovat o aktuální nasnímané poloze potenciometru. Příklad výstupu na displej je na následujícím obrázku.
8 Obr. 5 Příklad výstupu na displej pro program podle úkolu 2 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