Přednáška 3 A4B38NVS - Návrh vestavěných systémů 2015, katedra měření, ČVUT - FEL, Praha J. Fischer Grafický podkladový materiál k přednášce A4B38NVS Studium tohoto materiálu nenahrazuje účast na přednášce, která mimo jiné obsahuje výklad k prezentaci i další vysvětlení a výklad u tabule. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 1 Náplň přednášky Rekapitulace – specifikace bodované úlohy (5 bodů) komentované programy, zpráva, příprava na cvičení – vývojový diagram, strategie programu postup vývoje rozložení vývoje programu, využití simulátoru připojení 74164, případně 74HC595 Adresace paměti RAM Direktivy překladače - LTORG, direktivy – logicke operace,.. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 2 Zadání úlohy: Vestavný systém – schodišťový automat se zobrazením Úkol: Navrhněte a realizujte vestavný systém – řídicí jednotku schodišťového automatu s nastavením délky času sepnutí a jeho číslicovou indikací . Vstup jednotky: paralelně zapojená tlačítka na schodišti (schodišťové tlačítko) Výstup jednotky: ovládací výstup pro sepnutí relé (indikační LED zapnutí) Ovládací servisní část jednotky: tři servisní tlačítka (zvyš, sniž, potvrď) Indikační část jednotky: 7- segmentový zobrazovač + indikační LED stavu Funkce jednotky Funkce jednotky schodišťového automatu vychází z úvodní úlohy. Po zapnutí je jednotka ve stavu připraveno. Na segmentovém zobrazovači je indikace nastavené doby zapnutí tzap . Stiskem schod. tlačítka se aktivuje světlo na po nastavenou dobu tzap. Na servisním seg. zobrazovači se bude indikovat čas zbývající do vypnutí tvyp . Opětovným stiskem schodišťového tlačítka před doběhnutím času se doba svícení od tohoto okamžiku prodlouží opět na nastavenou hodnotu tzap . Na zobrazovači se bude indikovat nový čas zbývající do vypnutí tvyp (Pro zjednodušení lze v prog. vypustit funkci předběžného zhasínání před konečným vypnutím.) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 3 Zadání úlohy: Vestavný systém – schodišťový automat se zobrazením Funkce – detaily: Po spuštění programu bude časovač používat základní dobu tzap = 5 s. Bude se testovat stav tlačítek. Stiskem schod. tlačítka se přejde do režimu svícení až do jeho „doběhnutí“ Stiskem servisního nastavovacího tlačítka „zvyš“ (+) , nebo „sniž“( -) , se přejde do servisního režimu – nastavování velikosti doby tzap v sekundách. (Servisní tlačítka budou mít funkci „zvyš“ (+) , „sniž“( -) , „potvrdit“, (=). ) Tato hodnota tzap se bude nadále využívat až do jejího přepsání v novém nastavení. Rozsah nastavení bude 5 až 90 sekund. V úloze je nutno programem zajistit, aby se rušivě neprojevovalo působení odskoku tlačítek. Po ukončení nastavení velikosti tzap je možno aktivovat časovač schodišťovým tlačítkem. ( Pozn. V úloze se bude pro jednoduchost vždy řešit pouze jeden proces – buď nastavování nebo běh časovače, případně svícení. V reálném zařízení by nebylo možné, aby se při nastavování času (jeden proces) zablokovala funkce časovače svícení (druhý proces). A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 4 Zadání úlohy: Vestavný systém – schodišťový automat se zobrazením Obvodová realizace: K mikrořadiči STM32 se připojí tři externí servisní nastavovací tlačítka. (V reálném zařízení by byla přímo na jednotce a byla by přístupna pouze servisnímu personálu.) Jejich uspořádání na kontaktním poli vedle sebe bude v pořadí „sniž“( -) , „potvrdit“, (=) „zvyš“ (+) (zleva doprava) Jako schodišťové tlačítko se může využít uživatelské tlačítko na kitu -PA0. (Schodišťové tlačítko nahrazuje skupinu paralelně zapojených tlačítek na schodišti.) Indikační LED stavu – červená LED na kitu Indikační LED zapnutí - externí LED na kontaktním poli – (zapojená přes rezistor na GND - zem. Indikační 7- segmentový zobrazovač s LED bude připojen pomocí sério -paralelního posuvného registru (74164, příp. 74HCT595) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 5 Vysvětlení úlohy V úloze se pro jednoduchost připojí pouze jediný 7-segmentový zobrazovač s využitím posuvného registru 74164 nebo 74HCT595. (Možno i dva zobrazovače, dva registry) Pro rozlišení, který digit hodnoty se zobrazuje, se využije levá desetinná tečka (Ldp). Rozsvícená Ldp indikuje desítky, zhasnutá Ldp indikuje jednotky. Stisk tlač. „+“ zvyšuje hodnotu od 5 sekund v pořadí 6, 7, 8, 9, 1(0), 2(0), 3(0), 4(0) ....až 9(0). Další stisky tlačítka „+“ výsledek neovlivňují. Stiskem tlač. „-“ snižuje hodnotu, např. 9(0),8(0),… 3(0), 2(0),1(0), 9, 8,…5 Indikace nastavené hodnoty po potvrzení se děje zobrazením digitu s rozlišením desítek rozsvícenou Ldp. Funkce zobrazení musí být nezávislá na funkci testu tlačítek, tedy není možné, aby se při stisku tlačítka zastavilo zobrazení. Stiskem tlačítka (=) se hodnota potvrdí a uloží do paměti, kde bude k dispozici po celou dobu zapnutí přístroje, až do jejího případného nového nastavení (Zde by bylo vhodné ukládat hodnotu do paměti EEPROM nebo Flash tak, aby se zařízení chovalo jako reálný přístroj -nastavená hodnota se vždy načte). Při dalším stisku tlač. „+“ nebo “-“ pro nové nastavení se vychází z minule nastavené hodnoty. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 6 Vysvětlení úlohy /část 2 Stiskem tlačítka PA0 se aktivuje funkce časovacího relé (schodišťový automat) z minulé úlohy. V době funkce běhu časovače se bude na zobrazovači znázorňovat zbývající čas - nejdříve v desítkách sekund, pak v jednotkách sekund. Při zobrazení desítek sekund se rozsvítí Ldp a číslo bude blikat v rytmu sekund (0,5 s svit, 0,5 s tma). Při zobrazení jednotek sekund bude levá desetinná tečka - Ldp zhasnuta a zobrazované číslo bude svítit bez blikání. Tam, kde by bylo potřeba zadání ještě dále specifikovat, si autor sám stanoví způsob modifikace a implementaci a dohodne se cvičícím. Funkce programu však musí být jednoznačná, detereministická a zachycená v dokumentaci. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 7 7- segmentový zobrazovač LTS3401, společná anoda Společná anoda, připojit na + Ucc, , katody přes rezistory a spínače (příp. budič)na zem To je obvykle používaný způsob ve vestavných systémech a f g e možné zobrazení znaků ldp b c d rdp A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 8 Připojení zobrazovače posuvným registrem Posuvný registr sério – paralelní s. data Sériový vstup, paralelní výstup kaskáda klopných obvodů D posun UCC R Sériová data postupují do registru s náběžnou hranou hodinového signálu 74LS164, 74HC164 R QA R QB QH A B CLK CLR s. data posun SR1 74LS164 nul. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 9 74LS164, 74HC164 posuvný registr - funkce . s. data posun Reset – aktivní v L, nastavit do H A1 vstup seriových . dat, A2 na úroveň H (nebo opačně), příp. A1 a A2 spojit Plnění dat (posuv). dat do registru náběžnou hranou hod. signálu CLOCK (CP) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 10 Zatemnění výstupu Možné zatemnění výstupu při plnění posuvného reg. Při plnění registru by LED „poblikávaly“ - svítila by krátce ta LED, která má být zhasnuta, UCC T1 R2 zatem. displ. R1 R R QA R QB QH A B CLK CLR s. data posun SR1 74LS164 R R QA R QB A B CLK CLR QH SR2 74LS164 nul. Optimální řešení problému – použití dalšího – záchytného – registru, do kterého se přesunou a na jehož výstupu se tak objeví až správná data. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 11 Posuvný registr se záchytným registrem ´595 (74HCT595,..) Na výstup posuvného registru je připjen záchytný registr, přepis aktuálních dat z posuvného registru do záchytného reg. Není nutno zatemňovat při plnění Použití posuvných registrů ´595 a jejich variant jako výstupů ve vestavných systémech je velmi časté. /OE output enable (aktivace výstupu) připojit na L (GND) SH_CP – hodinový signál pro posun ST_CP – přepis z pos. reg. do záchyt reg. /MR- reset záchyt. registru Q´H – sériový výstup. pos reg.- pro kaskádní řazení výstupní obvody přepis s. data posun nul. RCLK SER SRCLK QA QB výst. reg. pos. reg. SRCLR SRR1 výst. záchytný registr QH QH´ 74HC595 pos. registr A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 12 Alternativy struktury ´595, TPIC6C595 Struktura 595, vhodná pro výstupy různé modifikace, např. Texas Instruments TPIC6C595 (dostupný i v GM) Schopnost budit většími proudy předpokládá buzení LED proti napájení – „open drain“, (jako „open colector“ u bipolárních obvodů) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 13 Ovládání indukční zátěže pomocí TPIC6C595 Příklad řešení ochrany tranzistoru před průrazem zvýšeným napětí při vypínání indukční zátěže (relé, ss motorek, krokový motorek) Rozpínání – pokles proudu IDS – napěťová špička na elektrodě Drain, Ochranný mechanismus – proud Zener. diodou do Gate, zamezení příliš rychlého zavření tranzistoru a rychlého poklesu proudu IDS, důsledek snížení napěťové špičky, A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 14 Použití budiče TPIC6C595 pro ovládání krokového motorku Unipolární krokový motorek - ovládání výstupem s posuvným registrem a zách.reg. vybaveným spínači (výklad – krok. motorek), analogicky – ovládání relé – indukční zátěž D U1 vinutí relé T Mproc. výměnou obvodu 74164 v úloze za obvod TPIC6C595 nebo 74HC595 doplněný spínacími tranzistory a ochrannými diodami by bylo možno v této úloze programově ovládat krokový motorek (místo 7- segmentového zobrazovače by byly připojeny čtyři spínací tranzistory NMOS, příp. NPN s dalšími diodami) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 15 Připojení tlačítek k STM32 Tlačítko, ošetření odskoků, použití vnitřního „pull up“ rezistoru v STM32 , vypuštění Rp (obsluha – pozor na statickou elektřinu při stisku tlačítka prstem, vhodné se dopředu „vybít“, jinak hrozí nebezpečí přeskoku napětí na vstup a příp. poškození vstupu STM32). +5V (+ 3,3 V) tlač . RP vst. brána A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 16 Postup řešení úlohy Rozdělit úlohu na samostatné bloky. Příprava generátoru znaků, tabulka, převod číslo na znak (v simulátoru), Příprava programu pro naplnění posuvného registru Programy pro čítání a převod na dekadické číslo Převod binárního na dekadické číslo Převod číslice na znak Přidání – „ ubrání“ informace o desetinné tečce Uložení znakové informace do paměti SRAM ( příp. registru) Vyslání znakové informace s přepínáním Podprogram zobrazení Je třeba naplánovat celkovou činnost programu, více procesů probíhajících současně Umístění tabulky generátoru znaků pomocí direktivy DCD (32 bitů), případně DCW (16 bitů) Program ve smyčce, zpracování jednotlivých úkolů. ( analogie kuchař) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 17 Postup řešení úlohy /2 Základní HW test reset 74164 pomocí resetovacího vstupu – rozsvítí se všechny segmenty Program spolupráce STM32 s 74164 funkce 1: - naplnění samé 1 a poslání do 74164 – vše musí zhasnout Naplnění samé 0 a poslání do 74164 vše se rozsvítí Naplnění danou hodnotou – rozsvícení vybraných segmentů podle „0“ generátor znaků, Ochranné rezistory 470 Ohmů do série mezi STM32 a 74164 (kontrola korektnosti napěťových úrovní UILmax pro 74164 výpočtem) Výpočet proudu segmentem, použití rezistorů o odporu 470 Ohmů Připravit kompletní schéma zapojení Připojení tlačítek, test Program, simulátor ( možno zkrátit čekací smyčku – zobrazení výst.průběhů) Dom. příprava - náhrada ovládání pos. registru- simulace ovládání jeho vstupů pomocí LED na PC8, PC9 výstupů pro pos. reg. pomocí LED – zpomalení, jeden výstup . impulsy CLK, druhý data Dobře se rozliší vyslání pro znak 8 a pro 1 A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 18 Poznámky k úloze Ovládání výstupu zobrazovače – optimální přiřazení výstupů brány, posuvného registru segmentům Jak zapojit z hlediska optimálního řešení plošného spoje, příp. drátových propojek LTS3401 a f g e ldp b c d rdp 74164 A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 19 Programové ovládání posuvného registru - test (Plnění posuvného registru je optimální s využitím rozhraní SPI , které je na čipu STM32F1xxx k dispozici.) Pro jednoduchost se však využijí dva zvolené programově ovládané piny výstupní brány. Označí se jako D – datový a C – jako hodinový. Piny D a C se mohou uvést do výchozího stavu, 0,0 (kontrolní bod programu). Na pin D se přivede informace, která se má dostat až na výstup QH, následně na pin C se přivede 1 (náběžná hrana) a v dalším zápisu pak 0. První hodnota by se měla dostat do posuvného registru. Pro test správnosti funkce obvodu ´164 a jeho oživení je možno do posuvného registru v nekonečném cyklu signálem C zapisovat střídavě data D=1 a následně D = 0. Pokud se použije frekvence zápisu C v řádu jednotek Hz, měly by se na výstupu QH a i dalších (QHA až QF) objevovat střídavě hodnoty 0 a 1, které se projeví jako okem pozorovatelné změny svitu (svítí – nesvítí) jednotlivých segmentů zobrazovače LED. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 20 Programové ovládání posuvného registru – test /2 Selektivní nastavování hodnoty na vybraný pin je možno pomocí zápisu s využitím funkce „bit banding“, nebo s využitím funkce „port bit set/reset“ u STM32. Port bit set/reset register (GPIx_BSSRR), např na bráně C (GPIC_BSSRR), je ve výkladu z přednášky 2. Rychlé zopakování: zápis hodnoty 1 do bitů 15 až 0 registru nastavuje příslušný výstupní bit do 0 zápis hodnoty 1 do bitů 31 až 16 registru nastavuje příslušný výstupní bit do 1 (celý 32 – bitový registr tak slouží pro ovládání 16-ti pinů příslušné brány) Návěští generator_znaku bude v programu po překladu představovat adresu začátku tabulky znaků. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 21 Tabulka přiřazení segmentů bitům výstupu Jednoduchý zápis, přiřazení vývodů zobrazovače výstupům posuvného registru způsobem – „aby to dobře vycházelo“ programově, Bude ale složitější vedení vodičů na kontaktním poli nebo plošném spoji Symbolický popis připojení segmentů, definice symbolu SEG_A,… SEG_A SEG_B SEG_C SEG_D SEG_E SEG_F SEG_G SEG_DP EQU EQU EQU EQU EQU EQU EQU EQU 2_00000001 ; 1 zde značí připojení seg. k výst. bitu 0 2_00000010 ; 2_00000100 ; 2_00001000 2_00010000 2_00100000 2_01000000 2_10000000 ; gfedcba forma zápisu binárního čísla např. 2_0011001 A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 22 Generátor znaků – zápis - jednoduchá forma Přímý zápis hodnot generátoru znaků verze 1 (jednoduché řešení) nula EQU 2_00111111 ; generator znaku jednicka EQU 2_00000110 a dvojka EQU 2_00111011 f trojka EQU 2_01001111 g b ctyrka EQU 2_01100110 e c petka EQU 2_01101101 ldp d rdp sestka EQU 2_01111101 sedmicka EQU 2_00000111 osmicka EQU 2_01111111 devitka EQU 2_00101111 tecka EQU 2_10000000 ; gfedcba ( „1“ znamená aktivaci proudu – např. pomocí spínacího tranzistoru NPN) při změně zapojení – nutná změna generátoru znaků, komlipace A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 23 Umístění tabulky generátoru znaků Umístění hodnot tabulky generátoru znaků pomocí direktivy assembleru DCB (8 bitů), DCW (16 bitů), případně DCD (32 bitů), Binární čísla se zadávají ve formě 2_ a následuje binární číslo, tedy např. 2_001011 binární číslo 0xED hexadecimální číslo 57 dekadické číslo Literatura: ARM DUI 0489C (ID050311), ARM® Compiler toolchain, Version 4.1 Assembler Reference , Chapter 6, část 6.3 Data definition directives www.ARM.COM A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 24 Definice generátoru znaků - přímo Definice konstant generátoru znaků v paměti (Flash) gener_zn DCB nula ; prekladač vlozi hodnotu 2_00111111 DCB jednicka DCB dvojka DCB trojka DCB ctyrka ; a tak dále (zatím se neřeší ovládání desetinné tečky) Pokud by se změnil způsob ovládání zobrazovače, tedy že bude svítit při 0, musel by se změnit generátor znaků. Při tom by pouze stačilo definovat negované hodnoty generátoru znaků. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 25 Operátor negace Jak zápis negace ?? nejedná se o instrukci procesoru, ale pouze činnost překladače buď ~ případně :NOT:A nebo A :EOR: 2_1111111 negace (všech) jednotlivých bitů (exclusive or s 1) (exclusive or – shoda bitů – dá 0, různost bitů – dá 1) nutný shodný počet bitů v čísle A (nul nebo jednotek) A:EOR: 2_0000000 ponechání (všech) jednotlivých bitů možné je i kombinovat, to je vybrané bity negovat, ostaní ponechat A:EOR: 2_1000000 neguje pouze nejvyšší bit např. některé výstupy připojené na zobrazovač přímo, další přes invertor,…. zůstává stále stejný zápis počáteční tabulky generátoru znaků A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 26 Definice generátoru znaků pomocí negace a exclusive or Definice negovaných konstant generátoru znaků v paměti (Flash) gener_zn DCB :NOT: nula ; prekladač misto hod. 2_00111111 ; vlozi negovanou hod. tedy 2_11000000 DCB :NOT: jednicka DCB :NOT: dvojka DCB :NOT: trojka DCB :NOT: ctyrka ; a tak dále Jiný způsob zápisu pomoci direktivy překladače :EOR: exclusive or podle hodnoty masky se bity nechají (pro 0) nebo negují (pro 1 v masce) maska EQU 0x11111111 ; exclusive or s 0x11111111 neguje všechny bity ; definuje se symbol maska gener_zn DCB maska :EOR: nula ; DCB maska :EOR: jednicka ; DCB maska :EOR: dvojka DCB maska :EOR: trojka DCB maska :EOR: ctyrka ; a tak dále A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 27 Definice generátoru s modifikací maskou Maska pro modifikaci (negace či přímo) jednotlivých bitů generátoru znaků se může odvodit z dalšího symbolu – primo , neguj Případně lze pro jednotlivé bity definovat, zda svítí v „0“ nebo „1“ (pokud by segmety byly např. řešeny samostatnými LED. Podle toho se překladačem modifikuje generátor znaků v paměti primo EQU neguj EQU jiné EQU ; (může být, že maska EQU 2_0000000 ; konstanta pro přímá data, svítí při 1 (high) 2_1111111 ; konstanta pro negaci , svítí při 0 (low) 2_0000011 ; dolní dva bity- segmety svítí při „1“, ostaní při“ 0“ některé znaky jsou buzeny přímo, některé přes invertor) neguj ; konkrétní přiřazení do hodnoty masky generace gener_zn DCB maska :EOR: nula ; DCB maska :EOR: jednicka ; DCB maska :EOR: dvojka DCB maska :EOR: trojka DCB maska :EOR: ctyrka ; a tak dále A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 28 Výhodnější zapojení zobrazovače Zapojení bez křížení vodičů minimalizace složitosti připojení i na plošném spoji i za cenu „přeházení“ přiřazení segmentů jednotlivým bitům změna zobrazovače ?? změna programu ?? změna generátoru znaků ??? Jak (flexibilně) tvořit generátor znaků, aby bylo možno jej bylo možno jednoduše modifikovat v závislosti na konkrétním zapojení obvodu? A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 29 Úprava tabulky přiřazení pro zjednodušení zapojení Toto se musí změnit podle realizace HW (způsobu připojení) nová tabulka připojení segmentů SEG_A EQU 2_00001000 ; SEG_B EQU 2_00010000 SEG_C EQU 2_01000000 SEG_D EQU 2_10000000 SEG_E EQU 2_00000010 SEG_F EQU 2_00000100 SEG_G EQU 2_01000000 SEG_DP EQU 2_00000001 ; výstup Qx hgfedcba tabulka říká, na který bit (D7 až D0) výstupu pos. reg., je daný seg. připojen) kontrola zápisu - v každém řádku je právě jediná „1“ v každém sloupci je právě jediná „1“ – pak jednoznačné přiřazení Výskyt jedničky ve více řádcích téhož sloupce – chyba Výskyt jedničky ve více pozicích (sloupcích) jednoho řádku – chyba A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 30 Využití operátorů překladače – assembleru Aby se při každé změně zapojení nemusel znovu vytvářet nový generátor znaků, využije se dalších funkčních možností překladače – jeho operátorů Operátory: bitové operace, posuny, aritmetické operace Pro generátor znaků – využití operátorů logického součtu po jednotlivých bitech, případně i posunů nebo rotací. Hodnoty generátoru znaků překladač sám „vypočte“ podle zadaného předpisu popisujícího připojení jednotlivých segmentů A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 31 Operátory assembleru Operátory lit. DUI 0473C Using the assembler str. 8.21 operátory rotace :ROL: A :ROL: B Rotate A left by B bits rotuj A doleva o počet pozic dle obsahu B :ROR: A :ROR: B Rotate A right by B bits :SHL: << A :SHL: B Shift A left by B bits :SHR: >> A :SHR: B Shift A right by B bits to jsou operátory assembleru, překladače, netýká se to vlastního procesoru ( není to zápis instrukcí), je to pomocný nástroj pro zjednodušení zápisu konstant a tvorbu a pro přehlednost programu obecně A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 32 Operátory assembleru operator , alt. zápis. + ……. …… :AND: & …… :EOR: ^ …… :OR: …… :NOT: ~ …… použití A+B A- B A :AND: B A :EOR: B A :OR: B :NOT: A Add A to B Subtract B from A Bitwise AND of A and B Bitwise Exclusive OR of A and B Bitwise OR of A and B Bitwise complement of A str. 8- 26 Using the assembler lit. DUI 0473C A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 33 Tabulka přiřazení segmentů , využití operátorů Reprezentace jedné hodnoty generátoru znaků jako logický součet hodnot odpovídajícím symbolů jednotlivých segmentů (SEG_A,…) Změna tvaru znaku – postačí modifikace pouze této tabulky definice hodnoty znaku pro generátor znaků ( asembler „vypočte“ hodnotu generátoru znaků pro dané připojení) gener_zn definice generátoru znaků- verze 2 a f e ldp b g c d rdp nula EQU SEG_A :OR: SEG_B :OR: SEG_C :OR: SEG_D :OR: SEG_E :OR: SEG_F jednicka EQU SEG_B :OR: SEG_C dvojka EQU SEG_A :OR: SEG_B :OR: SEG_G :OR: SEG_D :OR: SEG_E trojka EQU SEG_A :OR: SEG_B :OR: SEG_C :OR: SEG_D :OR: SEG_G sedmicka EQU SEG_A :OR: SEG_B :OR: SEG_C ctyrka EQU SEG_B :OR: SEG_C :OR: SEG_G :OR: SEG_F ; ………………….. a tak dále ( aby zbyl prostor pro samostatnou činnost čtenáře) tecka EQU SEG_DP to se nemění při změně zapojení, ale pouze při požadavku na změnu tvaru znaků (příklad z praxe - modifikace generátoru – firma J…b..) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 34 Definice generátoru znaků Zápis generátoru znaků s možností modifikace (potřebná inverze všech nebo vybraných bitů) primo EQU 2_0000000 ; konstanta pro přímá data, svítí při 1 (high) neguj EQU 2_1111111 ; konstanta pro negaci , svítí při 0 (low) jiné EQU 2_0000011 ; D7 až D2 svítí při H, D1, D0 svítí při L maska EQU neguj ; konkrétní volba formy generace ( může být, že ; nekteré znaky jsou buzeny přímo, některé přes invertor) (otázka – buzení LED „proti zemi“ nebo „proti napájení“. Pro LTS3401- . společná anoda, možné buzení pouze proti napájení, svítí při výstupu L (0) ; vlastní generator znaku se zohledněním vlastností obvodu ; umistení hodnot jednotlivých bajtu do pameti s úpravou maskou gener_zn ; zohlednění – svítí ve stavu H (high) nebo L (low) DCB nula :EOR: maska ; zde je kód pro zobrazení znaku 0 DCB jednicka :EOR: maska ; 1 DCB dvojka :EOR: maska ; 2 ; a tak dále (zatím se neřeší ovládání desetinné tečky) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 35 Adresace RAM Je potřeba zvolit úsek RAM mimo zásobník (pro uložení mezivýsledků) STM32F100RBT6B (v STM32VL Discov.) - 128 kByte FLASH a 8 kByte RAM. Inicializace zásobníku ve vzorovém projektu je na 0x20 00 02 00, Zásobník se při použití plní (instrukcí PUSH) směrem k nižším adresám Adresa 0x20 00 10 00 – daleko od zásobníku, právě uprostřed paměti RAM moje_RAM LDR.W LDR.W STR EQU 0x20001000 ; adresa RAM, která se bude používat R4, =moje_RAM ; R4 jako ukazatel do RAM R3, =0x11223344 R3, [R4] ; uložení dat z R3 do RAM (LDR.W – indikuji požadavek, aby překladač přeložil jako 32- bitovou instrukci Thumb 2) ; uloží obsah R3 (0x11223344) do pameti , ; na adrese 0x2000 1000 je Byte 0x44 ; na 0x2000 1001 je Byte 0x33 ; na 0x2000 1002 je Byte 0x22 ; na 0x2000 1003 je Byte 0x11 A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 36 Čtení znaku z generátoru ; získání grafické reperezentace znaku MOV R1, #1 ;ale zde by se jinak predavala hodnota (0 az 9 cislice) LDR.W R2, =gener_zn ; R2 ukazuje na začátek generatoru znaku ADDS R2, R2, R1 ;pricteni posunu o hodnotu cislice , zde 1 LDRB R3, [R2] ;nacteni znaku jako bajt, horni 3 bajty jsou 0 v R3 je obsah pro zobr. číslice „1“ na zobrazovači – pozitivní log. (1 – svítí) je nutno ve znaku následně nastavit, nebo nulovat bit příslušející desetinné tečce Dále použití instrukci (procesoru) Logical Shift Left, nebo Logical Shift Left, které posouvají registr přes příznak Carry, Možné využití příznaku Carry a podle jeho stavu nastavovat výstup D Pro odladění je velmi výhodné použití simulátoru v projekt, „options for target“, „debug“, se místo („Use ST link debugger“) nastaví „Use simulator“ A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 37 Adresace RAM Příklad adresace RAM , ukládání hodnot 0x11, 0x12, 0x13, 0x14 do nejnižšího byte slova V reálné aplikaci – ukládání sady hodnot odpovídající zobrazení jednotlivých znaků „video RAM“, zde jen příklad plnění moje_RAM EQU 0x20001000 LDR.W R4, =moje_RAM ; R4 jako ukazatel do RAM LDR.W R3, =0x11 ; do R3 data, která budu ukladat STR R3, [R4] ; uložení dat (word – 32 bitů) z R3 do RAM ADDS R3, R3, #1 ; inkrementace R3 pricteni 1, vR3 bude 0x12 STR R3, [R4, #4] ; ulozeni dat do RAM na adr. dle R4 zvysenou o 4 ADDS R3, R3, #1 ; inkrementace R3 pricteni 1, bude 0x13 STR R3, [R4, #8] ; ulozeni dat do RAM na adr. dle R4 zvysenou o 8 ADDS R3, R3, #1 inkrementace R3 STR R3, [R4, #0xC]; uloz. dat do RAM na adr. dle R4 zvys. o 0xC obsah R4 jako ukazatele zůstává zachován A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 38 Adresace RAM – příklad programu Program uloží (instrukce store Byte) na adr. 0x20001000 adresované pomocí R4 nejnižší Byte z registru R3, inkrementuje obsah R3 a uloží jej na adresu z R4 +1, příp. R4 +2, R4 +3 pevná volba adresy vzhledem k adrese v R4 moje_RAM LDR.W LDR.W STRB ADDS STRB ADDS STRB ADDS STRB EQU 0x20001000 R4, =moje_RAM ; .W – značí – požad. přeložit do 32 bitů instr. R3, =0x00 R3, [R4] ; uložení (jednoho) Byte na adresu 0x2000 1000 R3, R3, #1 ; přičtení 1 k obsahu R3 R3, [R4, #1] ; uložení Byte na adresu 0x2000 1001 R3, R3, #1 R3, [R4, #2] ; uložení Byte na adresu 0x2000 1002 R3, R3, #1 R3, [R4, #3] ; uložení Byte na adresu 0x2000 1003 A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 39 Adresace RAM s autoinkrementací po Byte Program uloží Byte na adresu 0x20001000 adresované pomocí R4 nejnižší Byte z registru R3, následně zvýší obsah R4 o 1 zápis [R4], #1 značí tzv. post index, jedná se o ukládání a autoinkrementaci moje_RAM LDR.W LDR.W STRB ADDS STRB ADDS STRB ADDS STRB ADDS STRB EQU 0x20001000 R4, =moje_RAM R3, =0x00 R3, [R4], #1 ; uložení byte na adresu 0x2000 1000 R3, R3,#1 R3, [R4], #1 uložení byte na adresu 0x2000 1001 R3, R3,#1 R3, [R4], #1 uložení byte na adresu 0x2000 1002 R3, R3,#1 R3, [R4], #1 uložení byte na adresu 0x2000 1003 R3, R3,#1 R3, [R4], #1 uložení byte na adresu 0x2000 1004 A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 40 Adresace RAM s autoinkrementací po slovech STR R3, [R4], #4 uloží celý registr R3 (4 byte) a inkrementuje ukazatel adresy v R4 o potřebný inkrement 4 Obdobně je možno využít instrukcí LDRB a LDR – načtení byte a načtení slova (4 byte) do registru Paměť RAM je možno v úloze využít: - pro ukládání připravených zpráv, které se budou vysílat na zobrazovač - ukládání mezivýsledků Do RAM (zvolená část jako videopaměť) se nejdříve uloží obraz toho, co se bude vysílat na posuvný registr další program pak pouze bere tato data a vysílá je na posuvný registr A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 41 Uložení a čtení ACSII znaků jako textových hlášení ; ; ; LDR.W R4, =hlaseni ; do R4 adresu pameti, kde je text hlaseni LDRB R2, [R4], #1 ; postindex – inkrementace ukazatele v R4 ……………zde by bylo volání podprogramu posílajícího někam znak LDRB R2, [R4], #1 ; ulož Byte z R2 na adresu podle R4 a inkrementuj R4 ……………………………. LDRB R2, [R4], #1 ……………………………. LDRB R2, [R4], #1 hlaseni DCB hlaseni2 DCB „123 Ahoj. start programu“ ; ulozeni ASCII znaků „321 tak to je jiz definitivni konec“ využití v samostatném projektu, výpisy hlášení Pozor taková data ukládat až za program, případně do míst programu, kde se nemohou data špatně vykládat jako programový kód. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 42 Poznámka k použítí pseudoinstrukce LDR x, = , Literal Pool LDR R2, =brana1 LDR R2, =lokace, ….. 32- bitové hodnoty odpovidající brana1, lokace,… překladač ukládá do tzv. „literal pool“ na konci úseku programu , LDR R0, =GPIOC_CRH přeloží pomocí 16- bitové instrukce THUMB LDR R0, [PC, #84] hodnota je uložena relativně vůči akt. adresovému čítač omezený rozsah („vzdálenosti“) rel. adres možnost v některých případech přetečení LDR.W R0, =GPIOC_CRH; .W zadání požadavku na překlad do THUMB-2 32- bitové instrukce, větší rozsah hodnoty posunu jiná alternativa - použití pseudoinstrukce MOV32 R0, #0xABCDEF12 (její překlad pomocí dvou 32- bitových instrukcí, instrukce MOV a MOVT) MOVT (Mov Top) (32- bitová inst. pro zápis 16 bitů dat do horní části slova) direktiva LTORG – výklad tabule, pokyn k umístění literal pool v daném místě A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 43 Poznámka -direktiva LTORG V instrukcích typu LDR.W R0, =GPIOC_CRH Uložení příslušné 32 bitové hod. za program, adresování relativně vůči PC. Omezená vzdálenost umístění dat do Literal Pool „uložiště konstant“ Zápis krátkého programu- překlad OK, přidáním bezchybných instrukcí – hlášení chyby. Při překročení jisté délky programu – překladač hlásí chybu. Řešení …. …. ; program ….. ; program ….. ; program B dále ; preskoc na dále LTORG ; tak tady si odloz konstanty – uložení bloku dat: Literal pool (analogie úklid sn…, nedokážu odhrnou vše až na konec, vytvořím lokální úložiště. Při pohybu ( běhu programu však musím „ lokální úložište konstant přeskočit, aby sed ata neinterpretovala jako programový kód - musím lokální úložiště přeskočit) DALE ….. ; program ….. ; program A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 44 Instrukce CMP, TST Instrukce CMP Rn, Operand2 (compare)- porovnání (virtuálně) provede instrukci SUBS - odečtení s nastavením příznaků N, Z, C , V, ale výsledek se neukládá Použití pro (aritmetické) porovnání velikosti obsahu registru a operandu Instrukce TST Rn, Operand2 (virtuálně) provádí instrukci ANDS – log. AND s nastavením příznaků N, Z, C , V, ale výsledek se neukládá (Použití pro zjištění, zda je na daném místě Rn (určeném polohou 1 v masce – operand 2) hodnota 1 nebo 0, operand 2 obsahuje „masku“ např. 0x01 – s jediným bitem v 1 TST R1, #0x20000 použití např, pro - zda na dané (nebo daných) pozici jsou „0“ ANDS - log. operace AND po bitech, nastavuje příznaky N a Z N do 1 , když je výsl.operace negativní, jinak nastaveno do 0 Z do 1, když je výsl. operace nulový, jinak nastaveno do 0 C do 1, když je výsl. operace CARRY „přetečení“ z nejvyšš. bitu, jinak nast. do 0 V do 1, když je výsledek operace „overflow“, součet zápor. čísel kladný,.. A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 45 Instrukce CMP, TST TST Rn, Operand2 OPERAND 2 : any constant that can be produced by shifting an 8-bit value left by any number of bits within a 32-bit word Proto je možno zapsat instrukci s velkou hodnotou přímé konstanty překladač vhodně přeloží tak, že se v instrukci využije Barrel Shifter instrukce THUMB-2 , 32- bitová Konstanta bude 1, ale před jejím použitím se posune o patřičný počet míst překlad instrukce F411 3F00 TST R1, #0x20000 F411 1F00 TST R1, #0x200000 (zjednodušení oproti zápisu demo programu Blik LED) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 46 Využití bloku „Barrel shifter“ V instrukcích ARM – možno pro zadání přímé konstanty (, která je součástí instrukce) využít její posunutí blokem „Barrel shifter“ zvýšení rozsahu velikosti zadávané konstanty (viz též lit. str. 3-45 DUI0489C_arm_assembler_reference.pdf) Operand 1 Operand 2 8 bit. hodnota Barrel shifter 5 bit. hodnota posunu (příp. reg.) ALU výsledek A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 5 bity posun doprava až 0x11111 (31 dec) nejvyšší bit 47 Využití možnosti flexibilního druhého operandu F44F 1480 MOV R4, #0x100000 přeloží, správně MOV R4, #0x100001 chyba ! nepřeloží error: A1871E: Immediate 0x00100001 cannot be represented by 0-255 shifted left by 0-23 or duplicated in all, odd or even bytes Jako přímá konstanta jde zadat číslo s jednou „1“ na libovolném místě Je možné napsat? MOV R4, #0xFFFFFF překladač si to upraví na: MOVN R4, #0xFF000000 MOV nahradí instrukcí MOVN (ulož hodnotu negovaně) a hodnotu 0xFF000000 lze vyjádřit jako 8- bitové číslo s posuny (MOV R4, #0xFFFFF bude hlásit chybu, nelze vyjádřit jako přímé nebo negované 8- bitové číslo s posuny) A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 48 Using a Barrel Shifter:The 2nd Operand (dle mater. ARM) Operand 1 Operand 2 Barrel Shifter ALU Result Register, optionally with shift operation Shift value can be either be: 5 bit unsigned integer Specified in bottom byte of another register. Used for multiplication by constant Immediate value 8 bit number, with a range of 0-255. Rotated right through even number of positions Allows increased range of 32-bit constants to be loaded directly into registers A4B38NVS, 2015, J.Fischer, kat. měření, ČVUT - FEL, Praha 49
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
advertisement