Proč vznikl Monitor51
Jak používat Monitor51
Příkazy MONITORu51
Řešení problémů
Přizpůsobení MONIT51.INC jinému překladači
Seznam chybových hlášení zaváděcího programu


      Při vážnější práci s jednočipovými mikropočítači dojdeme nutně ke zjištění, že potřebujeme ladicí systém. Jednodušší aplikace lze sice napsat a posléze odladit „naslepo“, ale u středně velkých a větších projektů už se nám to zřejmě nepodaří. Proto vznikl tento monitor jako pomůcka pro ty, kdo chtějí jednoduše, rychle a komfortně odlaďovat své programy pro mikropočítače MCS 51 a MCS 52 (8051,8031,8751, 8052,8032,8752,89C51, ...). K jeho schopnostem patří možnost výpisu a editace vnitřní i vnější paměti dat, výpisu a editace všech registrů, možnost krokování programu, trasování programu, nastavení breakpointu atd.
Existuje principielně několik cest, jak odlaďovat své programy:
Pořídit si hardwarový simulátor jednočipového mikropočítače - je extrémně drahé a nevyplatí se
Použití programového simulátoru - tuto možnost jsem využíval, dokud nebyl Monitor51 k dispozici. V programovém simulátoru lze velmi snadno odladit matematické výpočty a různé paměťové operace, nemůžeme ale odladit komunikaci s perifériemi (tedy to, o co nám u jednočipů hlavně jde); chybí zde vazba na vlastní hardware.
Použití některého z monitorů, kterých je plno na internetu a na různých BBS - tuto cestu jsem pečlivě prozkoumával a mnoho z těchto monitorů jsem odzkoušel.

Došel jsem ale k těmto důvodům, proč mi nevyhovují:

Některé monitory potřebují, aby šlo zapisovat do paměti programu. Je tedy třeba jako paměť programu použít paměť RAM. To neodpovídá konečné konfiguraci většiny systémů.
Většina monitorů potřebuje externí paměť dat. Nelze tak program ladit na konečné verzi hardware, pokud tuto paměť nechceme v aplikaci používat.
Pokud monitory nepotřebují externí paměť, spotřebují mnoho vnitřní pamětí na pevně definovaných lokacích. Programátor se tedy musí těmto monitorům přizpůsobit, místo toho, aby se přizpůsobily jemu.
Způsob krokování programu je řešen hardwarově, přes vstup přerušení. Toto je způsob doporučený dokumentací mikroprocesoru a drtivá většina autorů se ani nenamáhala přijít na nějaký jiný. Tento způsob zabere jeden vstup přerušení, který nelze použít na nic jiného.

     Jak je patrno, vedly mne k napsání tohoto programu důvody ryze praktické. Požadoval jsem systém, který by zabíral co nejméně datové paměti, uměl všechny funkce běžných monitorů, nezabíral další vstupy přerušení, prostě abych mohl ladit programy na konečné verzi hardwarového zapojení a ne na speciální desce s procesorem v konfiguraci velmi rozdílné od konečného systému. Tento systém byl vytvořen a v následující tabulce shrnu jeho vlastnosti.

Výhody:
-zabírá málo datové paměti (asi 15 Bajtů), přičemž tato paměť je alokována na zásobníku. Postačuje tedy nechat dost místa na zásobníku. Ladíme-li programy pro 8051 a máme k dispozici 8052, lze uvolnit téměř všechny technické prostředky procesoru. Kromě toho potřebuje ještě 3 bajty na adresách 7Dh,7Eh,7Fh
-nepotřebuje externí paměť dat
-nepotřebuje stínovou paměť RAM
-ovládání přes sériovou linku rychlostí 300 - 115200 Bd (dle krystalu) s autodetekcí rychlosti
-krokování programu po instrukci
-přeskok instrukcí
-nastavení breakpointu - bodu, v němž se provádění programu zastaví
-nastavení hlídané adresy - po změně jejího obsahu se program zastaví
-výpis všech registrů 8051/52
-možnost editace obsahu všech registrů 8051/52
-možnost spuštění programu se zastavením na breakpointu
-možnost provedení odladěného podprogramu bez nutnosti jím krokovat nebo nastavit breakpoint
-trasování - provádění programu s výpisem adres a instrukcí
-editace vnitřní i vnější paměti dat
-disassembling instrukcí z paměti programu s mnoha rozšířeními oproti ostatním monitorům
-možnost vyskočit z Monitoru51 - provádění programu normální rychlostí. Je umožněn návrat zpět do Monitoru51
-načítání INTEL HEX souboru
-snadné ovládání jednoduchými příkazy

Nevýhody:
- zabírá asi 15 B vnitřní paměti (pro odkládání registrů) na zásobníku + 3 bajty na adresách 7Dh,7Eh,7Fh
- je poměrně velký - kolem 10 KB (nevadí, máte-li simulátor EPROM aspoň 32K). Veli- kost narostla při použití postupů, jež měly za úkol minimalizovat počet využitých registrů a tím zabranou paměť
- v módu trasování, spuštění programu (příkaz G) a provedení podprogramu (příkaz C) není rychlost provádění programu rovna reálné rychlosti, ale je nižší. Každý krok je totiž synchronizován s přerušením od sériové brány, takže rychlost provedení je závislá na rychlosti přenosu. Je to daň za to, že není použit externí vstup přerušení. Program lze spustit normální rychlostí (příkazem Q), sériovou linku (opět na rozdíl od mnoha monitorů) lze v omezené míře využít; okupace sériové linky je principielní nevýhoda všech monitorů, běžících přímo v procesoru. Nelze ji beze zbytku odstranit - nějak se s procesorem komunikovat musí. Po dodržení některých zásad lze ladit i programy se sériovou komunikací.




     Monitor51 se ovládá přes sériovou linku z osobního počítače. Nezáleží na typu počítače a ani na typu operačního systému. Komunikace je ryze textového charakteru. Formát přenosu je osm datových bitů, žádná parita, 1 stopbit a rychlost v rozmezí 300 - 115200 Bd (dosažitelná rychlost závisí na typu procesoru a kmitočtu krystalu). Pro nižší kmitočty krystalu je třeba volit nižší rychlosti komunikace. Monitor51 rychlost automaticky detekuje a přizpůsobí se jí, je-li to možné. Protože některé krystaly neumožňují určité rychlosti, doporučuji při testování začít s rychlostí 1200 Bd a postupně ji zvětšovat. (Pro MCS 51 a krystal 11,0592 MHz je nedosažitelná jen rychlost 38400 Bd, ale lze použít až 57600 Bd, pro MCS 52 se stejným krystalem lze použít až 115200 Bd a jiné omezení není).Po RESETu převezme Monitor51 vládu nad procesorem a ten lze potom ovládat příkazy, které budou popsány v příslušném oddílu.
Ke komunikaci s PC lze s výhodou použít kompaktní převodník RS232 -> TTL.



1. Na začátek svého programu doplňte:

  mon_start	equ	xx00h
  $include(monit51.inc);
      Adresa návěští mon_start může být jakákoliv, musí ale splňovat omezení - použití násobků 256 (to znamená např. 0B00h,0F00h,1500h apod.). Místo xx00 doplňte tedy Vámi zvolenou adresu.

2. Přeložte svůj program např.:
asm51.exe muj_prg.asm
3. Spusťte.
monit51 muj_prg.hex [/ob] [/oh]
      Prvním argumentem programu monit51 je název Vašeho přeloženého programu (s příponou HEX nebo BIN), zde muj_prg.hex. K tomuto programu bude doplněn Monitor51. Pokud je Váš program ve formě INTEL HEX a chcete výstup v podobě binární, použijte na místě druhého argumentu přepínač /ob (output as binary). Pokud je Váš program v binární formě a chcete výstup v INTEL HEX, použijte přepínač /oh (output as INTEL HEX). Pokud přepínač neuvedete, použije se pro výstup typ shodný se vstupním souborem. Seznam chybových hlášení zaváděče je v kapitole VI.

4. Nahrajte program
muj_prg.hex
do paměti mikroprocesoru (do simulátoru paměti EPROM)

5. Spusťte program pro sériovou komunikaci (např. Hyperterminál z MS Windows, TELIX, minterm pod Linuxem a pod.) a nastavte vhodnou rychlost a formát přenosu (8 bitů, 1 stop bit, žádná parita).

6. Resetujte aplikaci a stiskněte klávesu ESCAPE; Monitor51 tím detekuje rychlost komunikace, vypíše logo autora a typ procesoru a můžete začít pracovat.


     Váš program nesmí obsahovat direktivu ORG s adresou nižší než 26h. Je to dáno tím, že na této adrese je odskok na obsloužení přerušení od sériové linky, které se používá pro komunikaci. Pokud chcete ve svém programu používat odskoky na přerušení, editujte přímo soubor „monit51.inc" a doplňte odskoky na obslužné programy do něj. Pro běžné programy doporučuji použít ORG 30h nebo vyšší anebo tuto direktivu nepoužít vůbec.


Seznam všech příkazů MONITORu


Detailní popis všech příkazů MONITORU naleznete zde.

Po vypsání loga a typu procesoru se vypíšou tři řádky programu a objeví se kurzor „>". Obrazovka bude vypadat např. takto:

INTERNAL MONITOR 8051/52, ver.4.3  (C)2000  MARTIN HANKOVEC  NEGATRON RESEARCH

 MCS 52 DETECTED

>    0034    77  00              MOV         @R1,#00H
    0036    DA  FC              DJNZ        R2,FCH(rel)
    0038    78  20              MOV         R0,#20H

>
     Řádka MCS 51 (nebo MCS 52) DETECTED nám říká, jaký máme v aplikaci procesor. Po detekci typu použije Monitor51 pro sériovou linku buď čítač/časovač 1 (u MCS 51), nebo čítač/časovač 2 (u MCS 52). Umožňuje nám to plně využít nejvyšší komunikační rychlosti daného typu procesoru. Na prvním ze tří řádků je vždy instrukce, která se právě bude provádět. Pod ní jsou zobrazeny následující dvě instrukce. Nyní můžeme vložit některý z příkazů Monitoru51.
      Dbejte, prosím, na to, abyste měli přepnutou klávesnici do módu malých znaků (vypnut CAPS LOCK), protože některé pří kazy se zadávají stiskem SHIFT + klávesa (to znamená velké písmeno) a mohlo by dojít k omylu.




      Monitor51 využívá pro své proměnné zásobník. Dbejte na to, aby na zásobníku bylo dost místa (asi 20 B). Zásobník může být umístěn kdekoliv nad adresou 40h. V této verzi zabírá monitor ještě 3 bajty od adresy 7dh (7dh, 7eh, 7fh). Při ladění aplikací s 8051 se mi nejvíce osvědčilo vložit pro ladicí účely do zařízení procesor 8032 (256 B RAM) a zásobník nastavit nad 80h. Procesory jsou shora kompatibilní a tedy po odladění aplikace jenom vyměním procesor zpět za 8031 a vše funguje, jak má.

     Registry editujte zásadně příkazem R; při běhu Monitoru51 jsou některé registry odloženy a nenacházejí se na své obvyklé adrese. Zásadně nedoporučuji pro editaci obsahu registrů použití příkazu I. Mohlo by dojít k přepisu proměnných Monitoru51 a ke zhroucení systému.

Pokud se Monitor51 zastaví při provádění podprogramu příkazem C a nehlásí dosažení breakpointu, je třeba zkontrolovat, zda prováděný podprogram neobsahuje několik vnořených podprogramů. Při příkazu C Monitor51 provádí program, dokud se neobjeví instrukce RET nebo RETI, případně breakpoint. Nelze tedy tímto způsobem provést vnoření větší než o jednu úroveň. Řešení tohoto problému tkví v nastavení break- pointu za adresu skoku na podprogram a použití příkazu G.
Pokud se Vám po nastavení rychlosti sériové komunikace v příslušném komunikačním programu zobrazí po stisku ESCAPE nesmyslné znaky, potom nelze s použitým krystalem tuto rychlost použít. Pro nejobvyklejší krystal 11,0592 MHz lze dosáhnout s 8051 rychlost 57600 Bd, s 8052 rychlost 115200 Bd. Pro 12 MHz a 8051 je dosažitelná rychlost jen 4800 Bd.
Hlásí-li překladač chybu, potom jste možná použili direktivu ORG se špatným (nízkým) argumentem. Musíte ji buď odstranit, nebo argument zvětšit.
Monitor51 vykonává jiné příkazy, než které chcete - zřejmě jste zapomněli přepnout na malé znaky (vypnout CAPS LOCK) nebo máte nastaven nevhodný formát dat - správně má být 8 bitů, žádná parita a jeden stop bit.



Soubor monit51.inc obsahuje pouze několik definic návěští, proto může být snadno přizpůsoben jakémukoliv překladači.






Zaváděč Monitoru51 dává několik chybových hlášení, jejichž seznam s popisem příčin je níže:

ERROR - INTEL HEX input file ... cannot be opened ! Špatné (neexistující) jméno vstupního INTEL HEX souboru, případně špatný formát souboru.
ERROR - INTEL HEX input file ... cannot be opened ! Špatné (neexistující) jméno vstupního INTEL HEX souboru, případně špatný formát souboru.
ERROR - BIN input file ... cannot be opened ! Špatné (neexistující) jméno vstupního binárního souboru.
ERROR - File Monit51.bin cannot be found ! Datový soubor monit51.bin neexistuje. Dodejte ho do stejného adresáře se zaváděčem. (obsahuje data Monitoru51)
ERROR - Monitor51 start address ....h is bad - use address xx00h only ! Pro Monitor51 jste použili adresu, jejíž dolní část není 00. Pokud jste použili např. 1234h, použijte místo toho 1200h nebo 1300h
ERROR - Monitor51 start address ....h is under end address of Your program ! Příliš nízká počáteční adresa Monitoru51, který by tak zasahoval do Vašeho programu.
ERROR - File Monit51.bin is corrupted! Chyba v souboru monit51.bin - použijte soubor z originální distribuce.
ERROR - Monitor51 start address is to high - Monitor51 exceeds address FFFFh ! Příliš vysoká počáteční adresa Monitoru51 - jeho konec přesáhne FFFFh. Použijte nižší adresu. Délka Monitoru51 je asi 10KB, proto nejvyšší použitelná adresa je kolem D800h.
ERROR - BIN output file ... cannot be written ! Chyba při zápisu výstupního souboru - málo místa na disku, disk chráněn proti zápisu apod.
ERROR - INTEL HEX output file ... cannot be written ! Viz výše.
ERROR - File Monit51.inc is not included into source program! Pravděpodobně jste vynechali instrukci $include(monit51.inc) ve svém programu.


Monitor51 byl testován, ale nelze vyloučit závady. Pokud na takovou narazíte, dejte mi, prosím vědět.
Tento program je dílem Martina Hankovce, který také vlastní veškerá práva. Smí být volně šířen za těchto podmínek:
1) Šířený balík musí obsahovat tyto soubory:
monit51.exe - zaváděcí program pro Monitor51
monit51 - zaváděcí program pro LINUX/i386
monit51.bin - datový soubor Monitoru51
monit51.inc - definicni soubor Monitoru51
navod.txt - navod
manual.txt - návod v anglickém jazyce
example1.asm - příklad
example2.asm - příklad

2) V žádném šířeném souboru nesmí být provedeny změny. Právo na změny si vyhrazuje pouze autor.

3) Autor neodpovídá za žádné škody, které by mohly vzniknout použitím tohoto produktu.

Doufám, že Vám práce s tímto programem přinese uspokojení a že se Vaše práce při návrhu s jednočipovými mikropočítači ulehčí.

Martin Hankovec NEGATRON research


Vytisknout stránku Velikost 88 kByte



Zpátky Zpátky
© DH servis 2002 -