Micro Scope Professional poskytuje komfortní vývojové a ladící prostředí pro tvorbu rozsáhlých projektů pro MCS51 a Microchip PIC. Nastavení velkého množství parametrů umožňuje vytvoření prostředí pro různé typy aplikací a projektů "šitých na míru". Umožňuje komunikovat s hardware ( modul UMON52, modul ADuC ), ladit aplikace pro MCS51 a Microchip PIC v simulačním režimu ( modul SIM51 a PIC ) - viz Simulátor, jeho součástí je Designer .
Micro Scope Standard je plně funkční verze programu Micro Scope určená "bastlířům", začátečníkům a školám. Na rozdíl od verze Professional neobsahuje některé rozšiřující speciální funkce. Stejně jako verze Professional umožňuje komunikovat s hardware ( modul UMON52, modul ADUC ), ladit aplikace pro MCS51 a Microchip PIC v simulačním režimu ( modul SIM51 a PIC ) - viz Simulátor , spolupracuje s Designerem - viz Designer .
Micro Scope Lite je verze programu obsahující pouze simulační modul umožňující ladit aplikace bez reálného hardware. Ladící funkce jsou stejné jako ve verzi Standard. Neumožňuje však připojení hardware. Spolupracuje s Designerem, pomocí kterého lze vytvořit virtuální aplikaci a tvořit pro ni program v simulačním režimu jako pro skutečný hardware. Odladěný program lze nahrát do procesoru a spustit aplikaci na skutečném hardware.Micro Scope Lite je levný, ale výkonný nástroj pro tvorbu programů.
Všechny verze Micro Scope mají integrován vlastní assembler a podporují ladění programu na zdrojové úrovni pro jazyky C ( Keil, SDCC, Intel ) a assembler, na vyžádání je možná i podpora jazyka PL/M. Program je možnou spouštět, krokovat po instrukcích nebo funkčních blocích, je možno nastavovat body přerušení, měnit aktuální pozici programového čítače (opakovat průchod blokem programu), prohlížet a měnit obsah paměti, registrů a proměnných, disassemblovat bloky programu nebo opravovat kód pomocí in-line assembleru a další funkce - viz dále.
Porovnání všech verzí je ZDE.
Program Micro Scope běží na běžném PC a s laděnou aplikací komunikuje přes běžný sériový port nebo USB/RS232 konvertor. Funguje pod běžnými operačními systémy Windows 95/98/Me a Windows NT/2k/XP.
Aplikace lze ladit s Vaším hardware ( v případi nutnosti pomůžeme s implementací ). Standardně dodáváme Micro Scope s univerzální vývojovou deskou ED2. Plně funkční je také s deskou z RD2 Kitu, kterou dodává obchod HW serveru, a při použití jednoduché redukce ( schéma je zde ) s deskou PVK40 od firmy ASIX Praha.
Správa projektu je jedním z nejdůležitějších nástrojů prostředí uScope. Projekt se skládá ze zdrojových souborů, pravidel pro překlad a generování cílového kódu a podpůrných nástrojů prostředí uScope. Správce projektu umožňuje snadnou konfiguraci nástrojů, začlenění překladačů a linkerů a vytvoření pravidel pro překlad zdrojového kódu (direktivy, podmíněný překlad atd.). Nejdůležitějšími součástmi jsou dialogy Volby (Options) a Správa (Manažer). Při zakládání nového projektu umožňuje snadno krok za krokem provést všechna potřebná nastavení Wizard - průvodce vytvořením nového projektu. | ||||||||||||||||||||||||||||||
V dialogovém okně Volby (Options) se konfigurují základní volby projektu. Nastavují se zde typy souborů , které potom prostředek uScope registruje jako možnou součást projektu ( podporované typy jsou ‘assembler’, ‘C’, ‘PL/M’ a ‘INCLUDE’). Dále se zde volí překladač a nástroj na spojování ( linkování ) jednotlivých součástí projektu a pro generování cílového kódu pro programátor ve formátu Intel-HEX. Dále je tu záložka pro zadání podmínek překladu jednotlivých součástí projektu, záložka pro nastavování systémových proměnných a záložka pro nastavení adresářů ( directories ) pro oddělené umístění pracovních souborů, knihoven, include-souborů, výsledných souborů po provedení překladu a linkování projektu a cílového kódu pro programátor ve formátu Intel-HEX . Pro každý typ souboru lze nastavit vlastní překladač, vlastní seznam klíčových slov ( Template ) a vlastní šířka tabelátoru. Ve verzi Professional lze rovněž provést začlenění souborů neznámého typu do projektu. Všechny verze Micro Scope ( Professional, Standard, Lite ) podporují práci více uživatelů s individuálním uložením zdrojových a konfiguračních souborů. | ||||||||||||||||||||||||||||||
V dialogovém okně Správa ( Manažer ) se spravují součásti projektu. V seznamu mají být zadány jak součásti, které se pak spojují ( linkují ) do cílového souboru ( tyto součásti nazýváme programové moduly ), tak i deklarační a vložené soubory ( obvykle soubory typu .H a include soubory ). Pořadí součástí je důležité pro proces spojování, první modul musí být hlavní modul, na pořadí dalších modulů už příliš nezáleží, je však třeba, aby jejich pořadí odpovídalo pořadí v cílovém kódu. To je dodrženo vždy, pokud byl projekt vygenerován v prostředí uScope, pokud se ale ladí cílový kód vygenerovaný jiným způsobem, nemusí to být dodrženo. Program uScope při zavádění ( download ) cílového kódu provede potřebné kontroly a vyzve k opravě případných nesrovnalostí. Ve verzi Professional lze také provést začlenění knihoven a objektů do projektu. Verze Professional nabízí i jinou možnost spravování projektu, a to okno prohlížeče projektu - Project browser. | ||||||||||||||||||||||||||||||
Lze volit typ procesoru použitý v laděné aplikaci. Tato volba je potřebná k tomu, aby prostředí uScope použilo správnou sadu předdefinovaných speciálních funkčních registrů. Pokud požadovaný typ chybí, je možno importovat definiční soubor dalšího procesoru ve formátu .ASM (typicky REGcpuname.INC) nebo hlavičkový soubor jazyka „C“ (typicky cpuname.H). V souboru předdefinovaných čipů ( na obr "Select chip type" ) lze předdefinovat odkaz ( html, místní nebo síťová cesta, ... ) na dokumentaci k čipu ( pdf, doc, txt .... ). Při výběru typu čipu použitého v projektu se automaticky přiřadí tento odkaz do brožur projektu . Dokumentace je tak stále k dispozici. | ||||||||||||||||||||||||||||||
Ke každému typu souboru lze snadno nastavit vlastní překladač C a ASM i od jiných výrobců ( Keil, SDCC, ... ). Ten lze vybrat ze seznamu nebo pomocí tlačítka Browse najít jiný. | ||||||||||||||||||||||||||||||
V tomto okně ( pouze u verze Professional ) lze spravovat projekt obdobně jako v dialogovém okně Správa projektu. Kromě toho zde lze ovládat i skladbu dokumentace, použité v rámci vývoje projektu, a přehledně vést seznam poznámek a úkolu týkajících se projektu. Nově je prohlížeč rozšířen o informace o možnostech použitého procesoru ( porty, timery, ... ) a o možnosti rychlé volby dialogů pro výpočet čekacích smyček a baudových rychlostí.
Položky jsou uspořádány do přehledné stromové struktury :
Project browser umožňuje :
| ||||||||||||||||||||||||||||||
Micro Scope podporuje práci více uživatelů s individuálním uložením zdrojových a konfiguračních souborů. Nastavení adresářů ( directories ) pro oddělené umístění pracovních souborů, knihoven, include-souborů, výsledných souborů po provedení překladu a linkování projektu a cílového kódu pro programátor ve formátu Intel-HEX se provádí v záložce Directories v menu Projekt | Volby. Po spuštění se uScope podívá do registru, zda existuje klíč "HKCU\SOFTWARE\Promis\uScope" a zdali je v něm definovaná hodnota 'uScopeUserData'. Pokud ji nenajde, zkusí se podívat do "HKLM\SOFTWARE\Promis\uScope" pro stejnou hodnotu (tam ji zapíše Install). Není-li ani tato hodnota nalezena, pokusí se načíst cestu na lokalní dokumenty (obvykle "C:\Documents and Settings\%UserName%\Dokumenty"). Jestliže tato cesta existuje, přilepí k ní "\uScope", jinak se pokusí vyhledat cestu ke společným dokumentům (obvykle "C:\Documents and Settings\All Users\Dokumenty") a přilepit k ní "\uScope". Pokud ani jedna z těchto cest není nalezena a uScope je poprvé spuštěn, otevře konfiguraci uloženou v souboru "uScope.INI" z instalačního adresáře. Při úspěšném nalezení cesty 'uScopeUserData' se program podívá, zda cesta existuje a případně ji vytvoří. Dále kontroluje, zda tento adresář obsahuje alespoň jeden soubor projektu (.DPC). Zjistí-li, že ne, zkopíruje všechny uživatelské soubory z instalačního adresáře (dokumenty, zdrojové texty, přeložené cílové kódy, projekty a konfigurační soubory) do výše zmíněného adresáře a otevře projekt uložený v souboru "uScope.INI". Uživatel programu může tuto cestu kdykoli změnit (Project | Options – záložka Directories, položka Prefered user project path. Cestu lze zadat s ohledem na proměnné prostředí, tedy např. jako "%USERPROFILE\Dokumenty\uScope". Z toho plyne, že pokud se přihlašuje více uživatelů, vytvoří se lokální kopie uživatelských souborů pro každého uživatele zvlášť. Pokud je výše uvedená vlastnost z nějakého důvodu nežádoucí, lze jako adresář zadat "%ALLUSERS\Dokumenty\uScope". Pak budou mít všichni uživatelé přístup ke stejné konfiguraci a projektům. | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
Při editaci textu lze využívat množství klávesových zkratek ( hot keys ). | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Umožňuje rychle vyhledat místo deklarace proměnné nebo procedury. Pomocí Ctrl + klik na proměnné ( jméně procedury ) provede skok na místo její deklarace ve zdrojovém textu. Hledání se provádí ve všech souborech, které jsou součástí projektu. Není-li soubor se zdrojovým textem, kde se vyskytuje hledaná deklarace, otevřen, automaticky se otevře. | ||||||||||||||||||||||||||||||
Pro syntaktickou kontrolu ( překlad ) zdrojových textů lze použít kompilaci jednotlivých modulů odděleně ( compile file ), kompilaci celého projektu ( všech modulů - compile ), kompilaci spojenou s vytvořením cílového kódu ( build ), kompilaci spojenou s vytvořením cílového kódu a jeho zavedením do paměti programu laděné aplikace ( build and load ) nebo kompilaci pouze změněných a nových modulů ( make ). Kompilátor lze spustit prostřednictvím různých akcí: volbou v hlavním menu, kontextovým menu editoru zdrojového textu nebo z prohlížeče projektu klávesovou zkratkou nebo klepnutím jedno tlačítko na pruhu nástrojů. Tyto možnosti názorně dokumentuje následující obrázek, kde jsou zobrazena kontextová menu editoru kódu a prohlížeče projektu a nabídka roletového menu, i když je nutno si uvědomit, že následující obrázek vznikl fiktivním poskládáním různých akcí pouze pro názornost, v praxi lze použít vždy pouze jedinou z akci. Při překladu zdrojového textu se objeví nové okno se seznamem všech detekovaných chyb a první chyba je zvýrazněna ve zdrojovém textu. Zakotvením okna se seznamem chybových hlášením ( message ) do dolního okraje hlavního panelu vznikne uspořádání podle obrázku. Poklepáním na chybovou položku v okně seznamu hlášení se zvýrazní příslušný řádek v okně editoru zdrojového kódu. Pokud není příslušný text otevřen v jednom z oken, okno se automaticky vytvoří. Takto lze snadno nalézt místa chyb. Z přeložených součástí projektu lze sestavit cílový kód volbou Linkování projektu . Spojí (link) přeložené součásti projektu a vytvoří cílový kód. Pokud se během procesu spojování vyskytnou chyby, zobrazí se v okně zpráv. V záložce pro nastavení podmínek překladu lze definovat různé podmínky linkování. V uScope lze také spustit překlad zdrojového souboru v aktivním editačním okně, který nemusí být součástí projektu, tzn. lze překládat i soubory otevřené např. za účelem testu některých dílčích funkcí atp. | ||||||||||||||||||||||||||||||
Ke každému typu souboru lze nastavit vlastní seznam klíčových slov ( template ) - viz Správa projektu . Tyto seznamy lze libovolně upravovat a doplňovat nebo vytvářet vlastní seznamy klíčových slov. Volbou existujícího seznamu lze provádět úpravy klíčových slov v editačním okně a pak volbou [Použít] (Apply) úpravy uložit. | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Program uScope disponuje mnoha funkcemi pro ladění aplikace. Jsou to akce pro krokování a spouštění programu, programové zarážky, okna pro zobrazení vybraných proměnných nebo registrů, pruh hlavních registrů procesoru pod panelem nástrojů, disassembler, výpis zásobníku, seznam symbolů , dialog pro vyčíslení nebo změnu hodnoty výrazů atd. Po zakotvení oken k dolnímu okraji se lze mezi nimi pohybovat pomocí záložek. Volbou záložky okna „Watches“ a použitím jeho kontextového menu lze definovat položky pro sledování. Při dalším krokování lze sledovat v okně watch změny zvolených proměnných nebo registrů. Volbou záložky „Call Stack“ se objeví výpis zásobníku. Z něho lze zpětně vysledovat, odkud a jakou cestou byla procedura volána. Poklepáním na položky v tomto okně lze zobrazit volající místo procedur v okně editoru zdrojového textu. Další podporu ladění nabízí okno pro zobrazení stavu portů. | ||||||||||||||||||||||||||||||
V záložce dialogového okna „Preference“ lze nastavit vlastnosti debuggeru. Tato záložka obsahuje volby závislé na použitém klonu 8051 a verzi prostředku UMON-52. Lze zde nastavit možnost přerušit běh uživatelského programu uživatelem ( pole "Allow program halt by user" - Povolit zastavení programu uživatelem ). Další položky umožňují konfigurovat vlastnosti monitoru. Pokud používáte monitor UMON-52 společně s čipy Philips/Atmel/Temic, je možno konfigurovat některé vlastnosti, jako např. maximální velikost podporované paměti XRAM, umístění pracovní stránky paměti monitoru v XRAM, volbu X1/X2 módu a čítač, použitý jako generátor baudové rychlosti. To může být užitečné zejména pokud ladíte aplikaci, která využívá sériový interface. Zaškrtávací pole „X2 Mode“ přepne procesor do zrychleného režimu, ve kterém je instrukční cyklus pouze 6 strojových cyklů namísto standardních 12-ti. Skupina „XRAM size“ umožňuje konfigurovat maximální velikost podporované paměti XRAM. To může být vhodné pro dosažení zpětné kompatibility se staršími typy procesorů (např. Philips 89C51RD2), které měly méně paměti XRAM. Skupina „XRAM Page used by debugger“ umožňuje konfigurovat stránku paměti použitou monitorem k uložení vnitřního stavu při ladění. Pokud nemá vaše aplikace nějaké speciální požadavky, je vhodné použít stránku těsně pod nastaveným maximálním rozsahem. Skupina „Timer used as baud rate generátor“ umožňuje konfigurovat zdroj hodin pro sériový interface. Pokud laděná aplikace používá např. Timer 2 pro měření frekvence, je možno jej uvolnit zvolením doporučeného SFR BRL. Je vhodné použít stejný zdroj, jako používá laděná aplikace. | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Při ladění programu lze ve zdrojovém textu nebo v okně disassembleru nastavit programové zarážky ( přerušení, break ). | ||||||||||||||||||||||||||||||
Nastavení zarážky na pozici kurzoru lze provést několika způsoby :
V dialogovém okně "Breakpoint list" lze zarážky rušit, aktivovat nebo deaktivovat a zobrazovat jejich umístění ve zdrojovém textu nebo okně disassembleru. Poklepem na řádek se zvolenou zarážkou v seznamu zarážek ( Breakpoint List ) se provede skok do místa zarážky ve zdrojovém textu. | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Příkazem "Load" lze zavést cílový kód do paměti programu laděné aplikace ( nebo simulátoru ) a ladit jej. Krokovat program lze po instrukcích ( assembler ) nebo řádcích zdrojového textu ( C, PL/M ). Jestliže krokovaná instrukce je typu CALL, krokování se „vnoří“ do volaného podprogramu. Pokud zavedený cílový kód neobsahuje informace o číslech řádků, je k dispozici krokování po instrukcích assembleru. Pokud chcete vykonat sérii kroků, stisknete a podržíte klávesu [F7] nebo pravým tlačítkem myši stisknete a držíte tlačítko na pruhu nástrojů. Pokud se klávesou F7 provede jedna instrukce programu ( krokování ), program uScope tuto instrukci zvýrazní ve zdrojovém textu modulu. Pokud takový text neexistuje, což bývá většinou proto, že programy v jazyce „C“ obsahují knihovní moduly, otevře se automaticky okno disassembleru a zvýrazní se řádek s aktuální pozicí programového čítače. Toto okna lze zakotvit podobně jako okno prohlížeče projektu. Lze využít 3 způsoby krokování : krokovat ( Step Into, F7 ) - krokuje program po instrukcích (assembler) nebo řádcích zdrojového textu (C, PL/M), nepřeskakuje volání podprogramů. krokovat přes ( Step Over, F8 )- krokuje program po instrukcích (assembler) nebo řádcích zdrojového textu (C, PL/M), ale přeskakuje volání podprogramů. krokovat do návratu ( Step to return ) - krokuje program po instrukcích a skončí, když se na pozici programového čítače objeví instrukce RET nebo RETI. Velmi praktickým způsobem ladění aplikace je použití krokování společně s nastavením programových zarážek a využitím dalších nástrojů pro ladění . | ||||||||||||||||||||||||||||||
Tento panel obsahuje tlačítka pro rychlou volbu často používaných příkazů a obsahuje pracovní sadu registrů, akumulátor, registr B, ukazatel zásobníku, stavové slovo, programový čítač, datový ukazatel a příznaky pro MCS51. Pro PIC jsou zobrazeny stavy portů, programového čítače a dalších důležitých stavových registrů. Klepnutím na vybranou položku se zobrazí dialogové okno „Vypočíst/změnit“, ve kterém je možno tuto položku modifikovat, vyčíslovat výrazy a zobrazovat nebo měnit obsah proměnných, registrů, SFR atd. Ve verzi Professional je také zobrazeno počítadlo cyklů procesoru. | ||||||||||||||||||||||||||||||
Okno symbolického browseru zobrazuje seznam symbolů (názvů proměnných, návěští, čísel řádků, jmen SFR …) vyskytujícíh se v celém projektu. Umožňuje dva módy zobrazení : strom modulů (na obr. vlevo) nebo seznam s podrobnými údaji (na obr. vpravo). Jednoduše poklepáním myši lze zobrazovat a měnit obsah proměnných a SFR nebo vyhledávat jejich deklaraci ve zdrojovém souboru. Přepínaní obou módu se děje pomocí širokého tlačítka, vyplňujícího nízký prostor pod hlavičkou okna. V obou módech je k dispozici vyskakovací menu, s jehož pomocí lze:
| ||||||||||||||||||||||||||||||
Pro rychlou opravu kódu je v prostředí uScope implementován jednoduchý in-line assembler. S jeho pomocí je možno rychle měnit kód programu pomocí instrukcí assembleru bez nutnosti opětovného překladu a zavedení kódu do paměti. To je dalším význam prvkem pro urychlení vývoje. V okně disassembleru je možno prohlížet cílový kód produkovaný překladačem na úrovni assembleru.
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Toto okno zobrazuje zvolený úsek cílového kódu jako instrukce assembleru. V okně disassembleru lze prostřednictvím vyskakovacího menu provádět následující akce :
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Designer | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Podporované procesory | ||||||||||||||||||||||||||||||
Jsou podporovány čipy ADuC, Atmel, Philips, Temic a Dallas ( Maxim ) s pamětí Flash. Podpora jiných čipů je možná pomocí speciálního zapojení. Kompletní přehled je ZDE. | ||||||||||||||||||||||||||||||
Vývojové desky | ||||||||||||||||||||||||||||||
Aplikace lze ladit s Vaším hardware. Standardně se Micro Scope dodává s univerzální vývojovou deskou ED2. Plně funkční je také s deskou z RD2 Kitu, kterou dodává obchod HW serveru, a při použití jednoduché redukce ( schéma je zde ) s deskou PVK40 od firmy ASIX Praha. Kompletní přehled je ZDE. | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Prostředí uScope podporuje procesory Silabs ( Cygnal ) prostřednictvím sériového nebo USB adaptéru s protokolem JTAG nebo C2. Adaptér lze objednat např. v HW serveru. | ||||||||||||||||||||||||||||||
Z prostředí uScope lze přímo testovat funkčnost I2C součástek v laděné aplikaci nebo jejich simulaci v prostředí Designer. Testování součástek se provádí pomocí I2C terminálu, který je součástí uScope ( menu View ). Designer podporuje různé typy I2C součástek, např. sériové EEPROM, RTC, apod. Příklad zapojení a okno I2C terminálu : | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Součástí prostředí je vlastní assembler ASM-52. Tento assembler akceptuje Intel MCS-51 kompatibilní zdrojové soubory a vytváří cílový kód ve formátu Intel-HEX vhodný pro programování nebo download. Též produkuje absolutní OMF kód obsahující všechny důležité informace potřebné pro ladění na úrovni zdrojového textu. Ke každému typu souboru lze snadno nastavit vlastní překladač C a ASM - viz ZDE. | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Prostředí uScope si pamatuje projekt a soubory, které byly otevřeny před minulým uzavřením uScope a při jeho dalším spuštění otevře tytéž soubory. | ||||||||||||||||||||||||||||||
Mezi jednotlivými okny funguje intuitivní přesun objektů Drag and Drop - "Táhni a pusť". Např. uchopím myší proměnnou ve zdrojové textu a "odvezu" ji do oken Watches, uchopím myší název souboru v Project Browseru a "odvezu" ho do okna s otevřeným editorem - soubor se zároveň otevře. Tato funkce funguje i mezi okny prostředí uScope a ostatními okny Windows. Např. uchopím myší v průzkumníku ( nebo jinde ) soubor s výkresem a "odvezu" ho do Project Browseru/Brochures v okně uScope. Tím se soubor s výkresem stal součástí projektu a bude vždy k dispozici bez dalšího vyhledávání. | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Umožňuje přečíst obsah paměti programu ( CODE ) a uložit ho jako .HEX soubor na disk. | ||||||||||||||||||||||||||||||
Umožňuje uložit disassemblovaný kód na disk jako zdrojový text assembleru. | ||||||||||||||||||||||||||||||
Program uScope podporuje syntaxi preprocesoru jazyka C. Tuto vlastnost oceníte zejména při rozšiřování ( nebo změně ) databáze podporovaných mikrokontrolérů ( viz Výběr typu procesoru ). Prostředí uScope bez problémů importuje hlavičkové soubory (.H) jazyka „C“, pokud odpovídají ANSI definici jazyka. Pomocí direktiv #define, #ifdef atd. můžete jednoduše přizpůsobit definiční soubory potřebám laděné aplikace. | ||||||||||||||||||||||||||||||