Schizofreny - 8051 a klony (AT89C2051) - programování bez vypalování.
(Není to jen text, obrázky a jiné soubory jsou pod odkazy.)

Pokud se jednochipy řady 51 zabýváte, chcete začít nebo už Vás nebaví neustále přehazovat onu 51 z patice do programátoru a zpět, chcete si vyzkoušet kus kódu a nechce se Vám zase dělat novou desku, potřebujete kus ověřeného kódu a programátor zrovna není po ruce nebo si jen tak chcete hrát nebo se učit pracovat s 51 a zdá se Vám 1000 přepisů FLASH paměti ATMELa málo ? Pak je tady Schizofreny. Schizofreny je malý systém, který natáhne do RAM paměti program a pak se celý přehodí do módu s externí ROM pamětí. Tuto ROM tady právě nahrazuje RAM, do které se program natáhl ze sériového portu. Nebylo by na tom nic zvláštního, kdybych zde nepoužil nápad, jak si nechat celé brány P1 a P3 naprosto k volnému použití pro program a neblokovat si je pro použití systémem.

Proč Schizofreny ?

Celý systém se chová s trochou nadsázky jako dvě různé osobnosti. Během konstrukce tohoto systému mne pak logicky nic jiného nenapadlo.

Popis funkce.

Tedy jak to celé pracuje. Jednochipy čistokrevné řady 51, jsou schopny pracovat s externí nebo interní pamětí programu, což leze přepnout vstupním signálem /EA. Tedy do interní paměti programu jsem uložil loader, který začne po startu natahovat data ze sériového portu a přímo je zapisuje do externí SRAM. Pro tento zápis potřebujeme signál /WR, který sedí na pinu P3.6 a nějaký signál pro čtení RAM, abychom se mohli přesvědčit, co jsme do RAM zapsali. Protože ale 51 dokáže číst paměť programu jako data pomocí instrukce MOVC, při které nepotřebuje signál /RD, ale pracuje se signálem /PSEN, nezapojil jsem /RD k paměti, ale nechal jsem ho volný, tedy P3.7 teď máme nepoužitý. Pomocí MOVC ale čteme paměť programu a protože jsme teď v interní paměti, které máme 4kB, pomohl jsem si tím, že jsem implementoval jen 32kB RAM a signál A15 nepoužil. Tím mám od adresy 8000h tentýž adresní prostor jako od 0h, který je ale dole překryt interní pamětí programu. Tedy pokud nyní budu zapisovat jako data natahovaný program, je jedno, jestli jej budu zapisovat do paměti dat pomocí instrukce MOVX od 0h nebo od 8000h, ale číst pro verifikaci pomocí MOVC jej musím od 8000h. Pokud tedy data natáhnu, uvedu 51 do resetu, přehodím /EA do 0 (externí paměť programu) a uvolním reset (dám ho do 0), rozběhne se program z RAM od adresy 0. No a abych si nemohl programem z RAM přepsat tu samou RAM jako data, je signál /WR, který je zároveň P3.6, připojen přes relé, které jej odepne od paměti, kde zůstane jen přidaný zvedací odpor 47k, tedy /WR je neaktivní a připne ho na pinovou lištu s uživatelskými piny a tedy má uživatelský program k dispozici P3.6, jako by se nikdy pro /WR nepožil. Na pinové liště je pin přizvednut odporem 47k, aby v době natahování vypadal jako v klidu, tedy ve vyské úrovni. Jediná změna oproti čisté P3.6 je právě v tom zvedacím odporu, který způsobí, že se jeví, jako by měl tento pin jen poloviční hodnotu pull-up odporu oproti normálu, což snad ale nemůže ničemu vadit. Protože jsem natahoval program přes RS232 a komunikoval pomocí RXD a TXD, což jsou P3.0 a P3.1, musíme si je pro provádění programu uživatele také nějak převzít. Pro TXD na 51 je to jednoduché, tam je jen pomocí vstupu připojena MAX232 a tak nám to nijak P3.1 neovlivní, jen se prostě budou dál přenášet úrovně na RXD řídícího PC, což ničemu nevadí a použijeme-li pin P3.1 jako TXD, pak si můžeme do PC posílat nějaké data atd. Pokud jej použijeme jinak, budou zkrátka jen do PC téct hlouposti, nic víc. S P3.0, tedy RXD je to trošku horší. Tam je totiž nutné zajistit, aby nám výstup z MAX232 neovlivňoval P3.0. Udělal jsem to tak, že jsem dal mezi P3.0 a MAX232 další kontakt relé, které jej zase přepne na pinovou lištu a odepne od MAX232. Někdy se nám ale může hodit, zůstat s MAX232 propojeni a brát pro uživatelský program data z RS232 PC, proto jsem kontakt relé ještě přemostil jumperem, kterým si tuto možnost můžeme zvolit tak, že jej zasuneme. Dále jsem ještě zapojil mezi výstup z MAX232 a RXD schotkyho diodu a to směrem od 51 do MAX232 a to z důvodu, že pokud by chybný uživatelský program stáhl P3.0 do nízké úrovně, tekl by do 51 zbytečně proud. Tento proud jsem měřil u ST232, což je ekvivalent MAX232 a naměřil jsem 16mA, což je zbytečné a vhodná dioda BAT42 je docela laciná. MAX232 tak může stahováním P3.0 přes diodu do nuly (P3.0 má asi 50k pull-up) komunikovat s 51, jako by tam ta dioda nebyla. Z tohoto pohledu by se relé mohlo zdát zbytečně navíc, ale z hlediska možnosti připojení různých uživatelských zařízení na P3.0 se mi jevilo vhodné jej takto chránit, aby v případě vyslání dat z PC (třeba neúmyslně) za běhu uživatelského programu nedošlo k problémům. Navíc kontakt relé byl k dispozici. Jinak použité relé Meisei M4-5H není obyčejný cvakající kus špalku, ale bezvadné relé i pro malé signály. Spousta lidí si totiž neuvědomuje, že relé má i minimální proud kontaktem a pokud jím onen minimální proud neteče, může se kontakt chovat i jinak než kus drátu. U tohoto relé je minimální proud kontaktem 10 mikroampér, což vzhledem k našim přidaným 47k pull-up odporům pro ošetření odepínaných pinů krásně splníme. Celé zařízení je ovládáno z RS232. Tady jsem zvolil ovládání reset signálu 51 pomocí linky RTS a DTR jsem použil pro přepínání relé a signálu /EA pro ovládání volby interní/externí paměť programu. Linka DTR také přepíná mezi dvěma oscilátory. RXD a TXD se využívají pro přenos uživatelského programu a také pro případnou komunikaci s PC během uživatelského programu. Lze konstatovat, že bez PC (nebo jiného zařízení s RS232) je Schizofreny nepoužitelná a je nutné ji pomocí tohoto portu ovládat. Ale vraťme se k oscilátoru. Protože uživatelské aplikace často používají různých hodnot krystalů, tedy různých taktovacích frekvencí, nechtěl jsem zůstat u jednoho pevného kmitočtu. Pokud bych umístil pro krystal jednu patici, mohl by jistě systém běhat na různých frekvencích, ale pak bych neměl určitou časovoy základnu pro generování přenosové rychlosti s PC přes RS232. Proto jsem se rozhodl 51 taktovat z externího oscilátoru. Tento je složen z hradel 74HC00 a to tak, že dvě hradla slouží jako 2 oscilátory, z nichž jeden má pevný krystal a druhý patici pro jeho výměnu. Oscilátory kmitají jen při vysoké úrovni na druhém vstupu hradla a tak jsem volbu oscilátoru vyřešil jedním hradlem zapojeným jako invertor a jedno hradlo oscilátoru řídím přímo a druhé z druhého oscilátoru přes invertor. Výstupy těchto oscilátorů jsou vedeny do posledního NAND hradla 74HC00 a protože nekmitající oscilátor má výstup ve vysoké úrovni, přenáší výstupní hradlo kmitočet kmitajícího oscilátoru. Není to superřešení, bylo by asi hezčí nechat kmitat oba oscilátory a vybírat si ten správný. Trochu jsem se i bál, jestli bude zvolený oscilátor ochotně nakmitávat. Obavy se ale ukazaly liché a tak je toto řešení jednoduché a použitelné. Protože se mohou 74HC00 od různých výrobců lišit v parametrech, uvádím, že jsem použil výrobek ST, tedy M74HC00B1, ale věřím, že od dalších výrobců budou pracovat stejně dobře. Schizofreny je pak srovnatelná s 8051 s 32kB externí ROM a tedy volnými branami P1 a P3, nebo se dá použít pro programy pro AT89C2051 s tím rozdílem, že zde nemáme vstupy komparátoru na P1.0 a P1.1, P1.0 a P1.1 mají zhruba 50k pull-up, což u AT89C2051 nemají a máme navíc dostupný pin P3.6, který se u AT89C2051 používá jako vstup z již zmíněného komparátoru. Dá se tedy říci, že programy pro AT89C2051 se dají podle použití P1.0 a P1.1 buď zkoušet rovnou, nebo po přidání externího komparátoru a jako vstupy se použijí jeho vstupy, nebo v nejhorším případě to nebude zcela možné, protože se používají v aplikaci P1.0 a P1.1 jako vstupy s vysokou impedancí a občas se použijí jako výstupy, které stahuje do nuly. Zde by se mohly ukázat integrované pull-up na P1.0 a P1.1 jako překážka.

Dále jsem použil jumper za stabilizátor napětí 7805 a to z důvodu, že někdy se může hodit napájet celé zařízení z jiného zdroje a tak si vytažením jumperu můžeme odepnout náš zdroj a použít napájení třeba z jiné desky. Odpor 1k u stabilizátoru je jen ranou na jistotu, protože některé kousky stabilizátoru 7805 nepracují při nulovém odběru proudu a pokud by byl jumper vytažen a napájení stabilizátoru připojeno, mohlo by se na výstupu 7805 objevit vyšší napětí než oněch žádaných 5V a při připojení jumperu by mohlo poškodit zbytek elektroniky i když by tam bylo jen na malý moment. V každém případě odběr 5mA navíc nevadí a odpor téměř nic nestojí.

Také jsem vyvedl na pinovou lištu sběrnice a to z důvodu, že lze na ni připojit například externí paměť dat a vzhledem k tomu, že relé signál /WR přepíná mezi natahování programu a jeho prováděním mezi dva piny, externí paměť dat zůstane nedotčena během natahování programu a na stranu druhou, přístupy do paměti programu za běhu programu nezničí program jeho přepsáním. Lze také propojit na této liště /WR tak, aby mohl ovládat RAM systému i za běhu programu, tedy aby signál /WR nebyl pomocí relé rozpojen a tak si psát samomodifikační programy. Protože to ale nemá příliš valný smysl, nevyvedl jsem tuto možnost jako zvláštní jumper, ale lze takový jumper vložit na pinovou lištu vyvedené sběrnice a to přesně mezi signály /WR (/EA=0) a /WR (/EA=1), tedy na čtvrtý a pátý pin od spodu lišty sběrnice. Tato možnost je ale spíše pro experty a pokud Vám není činost systému zcela jasná, raději piny sběrnice nevyužívejte, dokud je nepochopíte. Jinak u klasického zapojení 51 s externí pamětí programu ROM nebo interní pamětí programu nelze samomodifikační programy stejně použít, tedy je to opravdu jen hříčka pro zasvěcené nebo HW kouzelníky. Při připojování externí paměti dat k tomuto experimantálnímu systému doporučuji pro ochranu propojit datovou sběrnici mezi systémem a externí pamětí dat pomocí odporů. Zkoušel jsem na podobném systému odpory 2k2 a neměly žádný vliv na funkčnost této externí paměti (pro úplnost 51 běhala na 12MHz). Odpory chrání externí paměť a 51 před tekoucím proudem do P0 programem stažené do nízké úrovně při programem shozené P3.7 také dolů, což je zároveň signál /RD. Pak by adresované paměťové místo mohlo obsahovat jedničky, což by znamenalo zkratování výstupu SRAM přes P0 do země. Pokud se v tomto textu ztrácíte, raději podotýkám, že to se týká další paměti navíc, ne té, která tady už v systému existuje, ta je v bezpečí. Také na vyvedenou sběrnici můžete připojit třeba 74HC573 a pro získání signálu /LE použít NOR hradlo, napojené vstupy na A15 a /WR (/EA=0). Tím získéme osmibitový výstup, na který lze zapisovat pomocí instrukce MOVX na adresu 0h až 7FFFh. Protože takový port zabere jen /WR (P3.6) a A15 jinak nepožitou navíc, získáme za cenu ztráty jednoho I/O pinu 8bit výstup a budeme-li dekódovat adresové signály důkladněji, můžeme jich vyvést i podstatně více. Lze také použít pro získání signálu /LE pro 74HC573 jen invertor na signál /WR (/EA=0) a pak bude takto vzniklý výstupní port adresovatelný na všech adresách pomocí instrukce MOVX jako externí paměť dat. Způsobů jak dekódovat takové adresy a signál /WR je spousta co se zapojení týče. Hezká je také varianta, kdy každý adresový signál podle stavu řídí při /WR zápis do jednotlivých 74HC573 a pokud je to potřeba, můžeme nahodit hodnotu do několika 74HC573 najednou podle toho, v jakém stavu je každý adresový bit přináležící konkrétní 74HC573. Ale to už jsem zase odbočil, je těžké se nenechat unést.

Pokud se Vám zdály předchozí řádky zmatené, nesrozumitelné nebo je to na Vás ještě trochu moc, pak na ně klidně zapomeňte. Buď na to přijdete sami, nebo to nebudete potřebovat a Schizofreny je opravdu jedno, jestli jí rozumíte, nebo ji používáte jako laik a nepotřebujete chápat její filozofii. Je také možné, že jsem to popsal trochu zmateně, ale spisovatel už zkrátka ze mne asi nebude, takže bych byl šťasten, kdyby to alespoň někdo z mého výkladu pochopil - jestli je to vůbec možné :-).

Důležité.

Při vypalování AT89C51 si nezapomeňte vypálit LOCK BITy 1 a 2. Druhý způsobí to, že se stav /EA zapamtuje při resetu a tak nelze ani náhodně přehodit provádění programu mezi interní a externí pamětí programu za běhu, což se mi zdálo docela vhodné. Bit 1 je nutné vypálit, když se vypaluje bit 2, a tedy jej vypálíme také. Lze fyzicky vypálit jen bit 2 sám, ale není to korektní stav. LOCK BIT 3 určitě NEVYPALOVAT. Zakázal by Vám provádění programu z externí paměti a tudíž by zabránil funkci celého systému. Pokud nevypálíte LOCK BIT žádný, pracovat to bude také, jen pokud se přehodí za běhu programu /EA, může program opravdu dělat absolutně cokoli jsme nechtěli. Přepnutí relé za běhu programu je ale stejně zmatečný stav, ať už se přepíná /EA jakkoli, ale při bezpečném připojování periférií ani tak systému nehrozí destrukce. Bezpečným zde rozumím například nepouštět do brány tvrdé napětí v H bez ochraného odporu nebo diody ve směru z brány, protože je i možnost spustit zmatek v RAM, který se v ní objeví po připojení napájení. Tedy bezpečné je počítat s jakýmkoli stavem kterékoli brány, i když jste si naprosto jist tím co děláte, toť vše.

Použité součástky a zapojení.

  • Jako jednochip 51 byl zvolen AT89C51 z důvodu dostupnosti a případné snadné obměny firmware (loaderu), ale nemyslím, že by to kdy bylo potřeba. Verze na 24MHz je určitě vzhledem k výměnným krystalům fajn.
  • Pro stabilizici napětí je použit 7805, s ohledem na možné připojení dalších obvodů je použit pro rezervu.
  • Chladič na 7805 je možné namontovat, pro funkci bez přidaných periférií s větším odběrem není potřeba, osobně tam mám jen malé křidélko.
  • RAM je stále aktivní, tedy /CE je na GND z důvodu jednoduchosti, větší spotřeba zde není podstatná.
  • Dioda mezi MAX232 a RXD 51 je BAT42 a to z důvodu nižší hodnoty napětí úrovně L, méně napětí zůstane na diodě.
  • Na ostatních místech kde jsem BAT42 použil je to z důvodu, že jsem je měl po ruce.
  • Na místě MAX232 lze použít levný klon jako ICL232, já použil ST232.
  • RAM 32kB je trošku oříškem. Samozřejmě se jedná o statickou RAM, tedy SRAM. Tyto se používaly dřive jako cache paměti pro PC a jejich přístupové doby 12 až 20ns zde ani zdaleka nevyužijeme. Dříve byly naprosto běžně v prodeji. Dnes už se ale z prodejen vytratily a je to škoda. Sehnat se občas dají v SMD provedení. Je to logický proces, kdy se skončením éry 486 a nástupem obřích cache pamětí se tito dnes už trpaslíci vytratili. Pokud je budete shánět, doporučuji bazary PC, kde se dají sehnat 486 desky za solidní ceny a často bývají osazeny právě těmito SRAM v úzkých soklech DIL28. Když prodejci neřeknete na co tu desku vlastně chcete a budete se tvářit, že tu desku tedy neochotně koupíte za nějakou nízkou cenu, podaří se Vám tyto paměti koupit za babku, stačí si je jen doma vyjmout z patic. Typy se kterými jsem pracoval jsou UM61256, AS7C256 a W24257, všechny jsou pinově kompatibilní a jistě je těch typů více, píši jen ty, které znám ze své zkušenosti. Pokud nic neseženete, můžete použít i velice snadno dostupnou 6264 od kteréhokoli výrobce, ovšem za cenu jen 8kB paměťi místo původních 32kB a úpravy desky plošných spojů. Malá úprava v programu 51 by také nebyla v případě jen 8kB SRAM špatná, aby se nanatahovalo více než 8kB programu.

Co takhle AT89C52 ?

Lze použít bez jakýchkoli úprav také. Že má větší interní paměť programu, tedy 8kB je zde nepodstatné, loader má totiž ubohého čtvrt kila. Důležité ale je, že má místo 128B interní RAM 256B a má navíc TIMER2, který se leckdy hodí. Jinak je ale i s AT89C52 systém plně kompatibilní s 8051.

Taktování 11.0592MHz.

Když jsem začal kreslit fázový závěs pro řízení taktování, začal jsem mít pochybnosti, jestli si to ještě bude chtít někdo postavit. Proto jsem zvolil jednoduchou variantu s výměnými krystaly. Krystal 11.0592MHz je v systému připájen a používá se pro taktování v módu natahování programu. Druhý výměný krystal vkládám do patice, která vznikla z precizní patice tím, že jsem ji v místě pinu vždy přecvaknul štípacími kleštěmi a pin vypadl. Pak jsem piny samotné bez plastu zapájel do desky. Krystaly v nich drží tak akorát, ale asi by se dal najít i ještě lepší způsob. Protože nerad hledám krystaly po celém okolí, připájel jsem jak je zakresleno několik těchto patic navíc. Do těchto vzniklých konektorů si pak můžeme odložit další krystaly, tedy mají své místo a jsou vždy po ruce. Zkoušel jsem krystaly 3.2768 MHz až 24 MHz, žádný problém se nevyskytl, se všemi to běželo dobře. Pokud pro uživatelský program požadujete také 11.0592 MHz, pak jej také vložte do patice (budou v systému dva stejné).

Schéma.

Zobrazí se nakliknutím.

Přece jen jsem jej dal zvlášť, je trošku větší.

Deska plošných spojů.

Zobrazí se nakliknutím - strana spojů.

Vytisknutím ve 300dpi pixel na pixel, získáte předlohu 1:1, proto je ten obrázek tak veliký. Zvolte k tisku program, který tisknout pixel na pixel umí, experimenty s různým natahováním obrázku v programu který to neumí a zkoušení velikosti může dopadnout dost kostrbatě. Stejně ale doporučuji před výrobou desky zkusit na vytištěné předloze rozteč budoucích děr pomocí přiložení kusu integráče, proč asi není třeba říkat. Pokud se Vám deska zdá příliš veliká na to co na ní je, máte naprostou pravdu. Chtěl jsem, aby si mohl desku udělat i chudý amatér a případně ji nakreslit i rukou centrofixem. Při této velikosti a jednostrané desce je to dobře možné, jen to vyžaduje trpělivost. Zrovna tak drátových propojek je zde dost, ale ty nic nestojí, jen trochu času pro amatéra hezky stráveného aktivním odpočinkem :-). Můžete si desku klidně navrhnout i jinak, jak Vám to vyhovuje. Pro začátečníka může být na mé desce výhodné i netaháním spojů mezi piny. Jde mi především o bastlíře a začátečníky a tomu jsem celý návrh desky podřídil. Pokud chcete použít desku rozměru 160x100 (euro formát), pak stačí dát trochu blíže sobě spoje adresových signálů do SRAM mezi SRAM a okrajem desky. Tím ušetříte onen kousek, o který je deska větší než ta klasika o které zde píši. Celou Schizofreny jsem důkladně otestoval, jestli díky dlouhým spojům vedeným vedle sebe nedochází k nějakým problémům. Sice jsem již tahal sběrnice na podstatně delší vzdálenosti, ale opatrnosti nikdy není dost. Takže tato deska se chová naprosto korektně, je odzkoušená.

Osazení.

Zobrazí se nakliknutím - strana součástek.

Je zde trochu menší než obrázek spojů, přece jen už tady takové rozlišní není potřeba a je to přehlednější na obrazovce. Konektor napájení, tedy SCD-16, jsem upravil odříznutím plastové nožičky, původně určené pro prostrčení deskou a rozplácnutí teplem. Konektor jsem na desku přilepil vteřinovým lepidlem a až poté připájel. Drží to myslím lépe než natavená nožka a navíc se nemusíte bát, že díru pro nožku netrefíte přesně a budete mít konektor křivě, nebo budete zvětšovat díru, která nesedí a pak to nedrží vůbec.

Intel HEX výpis programu pro ATMEL AT89C51 (AT89C52).

Bohužel alespoň tento jeden chip je třeba vypálit. Intel HEX si stáhněte ZDE - DOWNLOAD. Pokud Vás zajímá i zdroják, pak je k nahlédnutí ZDE - DOWNLOAD.

Program pro Win32.

Bez toho by to asi nebylo ono. Abyste nemuseli začít tím, že si jej napíšete, nabízím Vám jej z vlastní produkce.

DOWNLOAD

Popis programu pro Win32 (schizofreny.exe).

Abych mohl co nejlépe osvětlit jeho funkci, bude asi nejlepší si ukázat jak vypadá jeho okno.

Z uživatelského pohledu je to velice jednoduché. Zvolíte si COM, ma kterém máte Schizofreny pověšenou. Tedy já zvolil COM2. Pokud chcete s PC komunikovat i při provádění programu, pak je také nutné si zvolit komunikační rychlost u nápisu Terminal. Program se vždy do Schizofreny natahuje 57600 bps 8N1, ale po natažení programu a jeho spuštění může mít komunikace jinou rychlost, podle programu uživatele. Tedy po natažení programu se rychlost komunikace změní právě na zadanou. Pro komunikaci směrem z PC do Schizofreny si nezapomeňte zapojit jumper JPrx, jinak Schizofreny nemůže po spuštění programu PC slyšet, může bez něj jen do PC vysílat. Pokud chcete za běhu uživatelského programu něco do Schizofreny poslat po sériovém portu, napište to dolů, před tlačítko Send text a stiskněte toto tlačítko. Text se odešle a podle zaškrtnutí checkboxu TX EOL se doplní zankem #13, tedy ENTERem nebo se odešle bez něj. Můžete také poslat po sériovém portu soubor, jen jeho délka je omezena na 1kB (když si chcete ověřit komunikaci stačí to a takto náhodou nevyšlete x set kilo soubor, což by mohlo trvat dosti dlouho). Příjem pak ovlivňuje checkbox print as HEX, který zaškrtnutý říká, že se mají přijaté znaky tisknout jako dvoumístné hexa zobrazení. Někdy je výhodné vidět co přesně přichází. Pokud checkbox není zaškrtnut, nahrazují se netisknutelné znaky otazníky, znak #13 vyrobí nový řádek, znak #10 se ignoruje a #9 je tabelátor. Teď už je čas si něco spustit. Nejprve nezapomeneme vložit vhodný krystal do patice a zvolit jumper JPrx. Jumper JPpwr dle toho, z čeho budeme napájet, většinou tedy z našeho stabilizátoru a JPpwr bude zasunut. Zvolíme COM port, kterým budeme komunikovat. Stiskneme v programu tlačítko Load & GO ! a zvolíme si HEX soubor s uživatelským programem. Pokud je OK, jeho plná cesta se po zvolení zobrazí v políčku, kde je původně napsáno Intel Standard HEX file. Do Last address se zapíše nejvyšší využitá adresa, progress bar ukáže kolik z 32kB paměti je využito, nebo spíše kam po nejvyšší adresu programu program sahá a pak se program spustí. Pokud program vysílá sériově data a máme nastavenou správnou rychlost komunikace, budou se znaky přijaté do PC zobrazovat pod nápisem Terminal. Pokud se Vám podaří zvolit špatný port, HEX soubor adresovaný za možnosti SRAM či dojde k jiné chybě, budete o tom všem informováni i když velice stroze, myslím že docela jasně. Program lze zastavit tlačítkem STOP, nebo jej resetovat tlačítkem RESET a nebo se podívat na natažený obsah paměti pomocí List. Není to ale nic jiného, než to, co se natáhlo do SRAM programu Schizofreny. Políčko status se snaží ukazovat, jestli uživatelský program běží, nebo ne. Nepodaří se mu to správně zhodnotit v situaci, kdy jednou správně použijete port a po zastavení programu jej přehodíte na jiný. Po stisku tlačítka RESET pak bude program v omylu, že Schizofreny běží. Tomuto stavu jsem nechtěl zabraňovat stálým testováním spouštěním programu z interní paměti programu, protože to zkrátka není nutné a také bych musel neustále různě zakazovat tlačítka při přehazování portů, což se mi jevilo jako větší zlo, než tuto eventualitu zkrátka jen popsat. Nastavený port jako i pár dalších informací si program zapíše do souboru a po příštím spuštění je použije. Nemusíte tak po každém spuštění programu znovu a znovu volit port. Pokud program zavřete, Schizofreny se přepne do resetu a na interní paměť programu a tedy dále nic nedělá. Chtěl bych poprosit o trochu schovívavosti. I když jsem se snažil ošetřit co jen šlo a neudělat chyby, může se přece jen nějaká chybička vyskytnout, což zná každý programátor.

Demo aplikace.

Nabízím Vám také pár jednoduchých aplikací, aby bylo možné hotovou Schizofreny hned vyzkoušet.

blik.hex blik.asm

Ano, toto je opravdu velice jednoduché. Pouze to prochází výstupy na bráně P1 od 0 do 255 a stále dokola. Pokud na výstup P1.0 připojíte LED jak je zakresleno na obrázku, bude blikat. Pokud ji posunete do P1.1 až P1.7, bude samozřejmě blikat pomaleji, tedy vždy dalším pinem na poloviční frekvenci. Ne že by tento program byl k něčemu obzvláště užitečný, slouží hlavně k ověření, že Vám právě dohotovená konstrukce funguje a také při výměně krystalů v různých hodnotách blikající LED oznamuje, že nám oscilátor kmitá. Krystaly přehazujte ve stavu zastaveného programu. Pokud budete měnit krystal na spuštěném programu (myslím tím program v desce), nemusí po výměně krystalu všechno pracovat jak má, zkrátka může dojít k chybám. Nijak to ale hardware neohrozí, jen to uvádím, aby se začátečník nelekl, když bude měnit krystaly na spuštěném programu, že to najednou nejede - tedy tady, že to přestane blikat.


print.hex print.asm

Program vypíše do sériového portu na 2400bps pár řádků textu a pak se zacyklí. Nezapomeňte si přehodit komunikační rychlost na 2400bps. Jumper JPrx může být vložen i vytažen, komunikuje se jen směrem do PC a krystal v patici na 12 MHz.


opakuj.hex opakuj.asm

Program přijímá na 2400bps zaslané znaky a posílá je zpět. Nastavte si komunikační rychlost na 2400bps a nezapomeňte vložit JPrx, komunikuje se oběma směry. Celé je to jen jednoduché echo, ale úpravou programu se dá si docela vyhrát. Krystal v patici je 12 MHz.

Připravuji

Připojení LCD displaye a program pro ovládání a další jednoduché aplikace. Budou k dispozici hned jak čas dovolí tyto věci vytrhnout z mých jiných aplikací. Také plánuji rozšířit velice jednoduše Schizofreny o možnost programovat AT89C2051. Není to nic složitého, více práce je to zdokumentovat a napsat solidně vzhledově vypadající program. Nechci ale slibovat něco, co nemohu časově zvládnout a tak to berte jen jako předpoklad, že by to mohlo časem být. Pokud by se toho chtěl někdo ujmout, nebo si jen něco napsat a dát sem, také bych nebyl proti, rád mu zde poskytnu prostor, ale když si uvědomíte, kolik aplikací pro řadu 51 na webu najdete, není potřeba se nijak vázat na to, co se objeví zde, stačí hledat. A protože na webu najdete i věci nefunkční, či v různém stádiu funkčnosti, je Schizofreny dobrý způsob, jak jejich funkčnost testnout.

Co takhle dát si 80C31 nebo 80C32 (inspirace)?

Tyto velice levné verze 8051 neobsahují žádnou interní paměť programu a je nutné si připojit například EPROM nebo FLASH s tímto programem. Pokud Vám bude program na Schizofreny pracovat, pak bude na těchto chipech s obdobným připojením EPROM pracovat také. Vezmete-li v potaz cenu 51 s integrovanou 32kB EPROM, pak za tuto cenu leckdy pořídíte 31 + EPROM mnohokráte. Důvod proč se i tak prodávají je ten, že se nezaberou použitím interní EPROM brány P0 a P2 a také lze program chránit proti čtení, což u externí EPROM nelze. Pokud vystačíte s 20kB interní FLASH, je k dispozici AT89C55 za přijatelnou cenu, ale to už jsme trochu jinde. Nicméně jsem chtěl naznačit, že k připojené EPROM k 80C31 má Schizofreny nejblíže. Sám vlastním několik 80C31 na 40MHz (pracují na 20MHz, ale za 6 fází hodin místo 12, když se přepne příslušný bit), které stály polovinu AT89C51 na 24MHz a existují i 60MHz verze. Chci Vás vlastně na tyto chipy navést, protože je vídám používat jen zřídka a přitom je to skvělá volba za skvělou cenu. Jako externí ROM používám FLASH paměť 64kB, tedy AT29C512, která je elektricky mazatelná a tudíž stejně snadno použitelná jako ATMELy s FLASH. Když ještě doplníte 64kB externí RAM pro data, získáte moc hezký a celkem výkoný systémek, do kterého se vejde opravdu už ledacos - vzpomeňte na Sira Sinclaira. Jen pozor na vybavovací časy pamětí s ohledem na taktovací frekvenci, tedy aby Váš šíleně taktovaný systém nepadal na pomalé paměti.

Lze tím nahradit 51 v desce ?

Pokud Vám bude vyhovovat to, co jsem už konstatoval výše ohledně komparátoru, pak se dá vyvést pomocí plochého kabelu brány P1 a P3 na patici pro AT89C2051, nejlépe za pomoci připájení drátů z vrchu k soklu, který se pak zasune do skolu v desce. Nezapomeňte si také propojit země. Také se rozhodněte, jestli budete napájet obojí zvlášť, nebo propojíte napájení a odpojíte jumperem JPpwr napájení ze Schizofreny, nebo budete napájet desku do níž vyvedenou patici vkládáte ze Schizofreny. Kabel pro propojení s paticí zde zakreslen není, vždyť jsou piny zakresleny v osazení desky a tak je správně propojit s paticí s piny se stejnými jmény nebude tak velký problém. O zapojení +5V na zasouvací patici se zamyslete a nezapomeňte na GND. Taktování je vždy krystalem na desce Schizofreny a tak piny pro připojení oscilátoru ponechte volné. Ačkoli jsem nechtěl, už jsem to zase popsal.

Jen tak si pohrát.

Pokud s 51 začínáte, můžete si třeba připojit na PINy pomocí konektorů, stejných jako se v PC připojují svítíčka a speaker, LED s kusem odporu mezi +5V a I/O piny a blikat si jimi (doporučuji 2mA LED), nebo si připojit co Vás napadne, třeba piezo a pípat, nebo DAC-zesilovač-repro a hrát lépe.

Chytrý port.

Schizofreny se také může stát portem s vlastním procesorem, tedy tvářit je jako I/O koprocesor. Například napustíme Schizofreny programem, spustíme jej a budeme posílat data po sériovém portu a Schizofreny je bude s absolutní pravidelností díky bufferování posílat v úplně jiném formátu jinam, nebo jimi bude řídit krokové motory bez škubání obvyklého u OS PC, když musí najednou řešit úplně něco jiného, než zrovna Vy potřebujete. Nebo můžete poslat na port jako program vlastně jeho předpis chování a dále se už nestarat, protože to obstará onen zaslaný program.

Mohu si napsat program pro PC sám ?

Jistě. Jen budete potřebovat následující informace. Tedy v klidu je sériový port se záporným napětím na výstupech RTS a DTR. V tomto stavu je:

  • AT89C51 v resetu (reset v H) - ovládáno RTS.
  • relé v klidovém stavu - ovládáno DTR.
  • /EA v H, tedy interní paměť s loaderem - ovládáno DTR.
  • /WR připojeno k RAM /WE - ovládáno DTR.
  • P1 a P3 výstupy na pinové liště (za kontakty relé) v H.
  • TXD a RXD PC a Schizofreny propojeny.
  • Taktování z 11.0592MHz krystalu připájeného na desce.
Po nahození RTS se zruší reset AT89C51 a rozběhne se loader.
  • Stejné jako předchozí, jen jede loader.
  • Loader přijímá byte po byte a ukládá do RAM.
  • Loader natáhne max 32kB.
  • Komunikuje 57600bps 8N1, bez řízení toku, RTS a DTR používáme pro řízení systému a softwarové řízení není implementováno, schizofreny stihne přijmout i vyslat všechno vždy.
  • Po uložení do RAM je hodnota opět přečtena a vyslána zpět do PC pro kontrolu.
  • Komunikace probíhá full duplex, tedy hodnota je vyslána ihned po přečtení z paměti.
  • Nemusíte čekat na příjem zapsané hodnoty, můžete sypat data kontinuálně.
  • Pokud posloupnost odesílaných a přijatých bajtů není shodná, je někde chyba (komunikace, RAM atd.).
Po nahození DTR.
  • Odpojí /WR od /WE paměti a P3.6 se připojí na pinovou lištu.
  • Odpojí TXD PC od RXD Schizofreny, pokud není vložen jumper JPrx, s jumperem zůstává propojení zachováno.
  • P3.0 (RXD) připojí na pinovou lištu.
  • Přehodí /EA do L, tedy externí ROM (zde je to naplněná RAM).
  • Taktování se přehodí na oscilátor s krystalem v patici.
Postup.
  • Před změnou stavu DTR vždy uvést RTS do záporné úrovně, tedy 51 do resetu.
  • Po změně DTR vždy chvíli počkat, relé má určitou dobu zpoždění, než přepne.
  • RTS do vysoké úrovně - zrušit reset a rozjet systém v módu dle DTR.
Co je dobré si uvědomit.
  • Klidová úroveň TXD je v záporném napětí na RS232 a v H na CMOS.
  • Signály RTS a DTR jsou v klidu v záporném napětí na RS232.
  • Schizofreny nemůže reagovat na signály HW řízení toku, protože je jimi ovládána.

Plug and pray.

Pokud spustíte Schizofreny ještě před zapnutím počítače, budou systémy "plug and pray" (zasuň a modli se) cvakat relátkem a pokoušet se zjistit, co že jste to připojil. Nakonec nezjistí nic. Ale je dobré to vědět, mohou totiž spustit náhodný program a tak je dobré mít buď zapojení připojených věcí odolné proti chybám programu (neshoří chybou SW), nebo zprovoznit Schizofreny až na nastartovaném PC. Systémy s možností absolutní terminace chybou software nemám právě v lásce i když je mezi mými konstrukcemi můžete spatřit, věřte že když tomu tak je, je to vždycky z nějakého důvodu, ne jen tak pro legraci.

Stavebnice.

U takovýchto konstrukcí se stává, že se lidé schánějí po stavebnici. Uvažuji o tom. Pokud mi napíšete, že máte o tuto stavebnici zájem, může mi to pomoci v rozhodnutí se do toho pustit. Plošný spoj nemusí být stejný jako zde vyobrazený, pro větší počet kusů a profi výrobu je totiž zbytečně velký s příliš hrubými spoji, což je pro amatérskou výrobu zase spíše výhoda (nakreslíte to i rukou).

Seznam součástek.

  • 1x Deska plošných spojů
  • 1x ATMEL AT89C51, nejlépe 24MHz - nutno naprogramovat (vypálit)
  • 1x SRAM 32kB, viz. text
  • 1x MAX232 nebo klon
  • 1x 74HC573
  • 1x Konektor Canon 9 female do plošných spojů
  • 1x Konektor napájení SCD-16 nebo SCD-16A (liší se půměrem díry 2.1mm bez A a 2.5mm s A)
  • 2x BC547C (lze nahradit jiným tranzistorem)
  • 3x BAT42
  • 2x 1N4007
  • 1x RELE Meisei M4-5H
  • 2x Pinová lišta S1G36 (nebo jinak dlouhé s potřebným počtem pinů)
  • 4x R 47k
  • 2x R 4k7
  • 1x R 1k
  • 2x R 220R
  • 2x R 10M
  • 1x 7805
  • 4x C 1uF/63V elektrolyt mini, může být i obyčejný 1uF/50V
  • 1x XTAL 11.0592MHz nejlépe miniaturní
  • Xx XTALy pro výměnu dle aplikací dle Vaší volby
  • 1x C 100uF/25V elektrolyt
  • 5x C 100n
  • 4x C 33p
  • 2x JUMPER
  • 0.5m drátu na drátové propojky (asi stačí i méně)
  • 1x patice DIL28úzká precizní nebo normální
  • 1x patice DIL40 precizní nebo normální
  • 1x patice precizní alespoň s 12 piny, pro patice krystalů.
  • 1x 9 nebo 12V adaptér do zdi
  • 1x sériový kabel samec-samice Canon 9, nebo konektory, kabel a krytky

Proč jsem to neudělal jinak - jiné systémy.

Mám i jednodužší systémek na obdobné bázi, ale jen s 8kB SRAM. Tam je ale SRAM mapována zároveň natvrdo jako externí RAM pro data a program. Systémek pak vezme kromě celých P0 a P2 jako u Schizofreny ještě P3.7 a P3.6 pro ovládání čtení a zápisu oné externí RAM dat. Dále je propojen nastálo s PC pomocí RXD a TXD a to bere další 2 bity brány P3, tedy P3.0 a P3.1 i když to propojení TXD do PC nevadí. I to ale už začíná být dost výrazné očesání možností. Dále vektory přerušení jsou v interní paměti a do externí se odskakuje tvrdými skoky a to přináší zpoždění oproti normálnímu provádění přerušení. Aby toho nebylo úplně málo, je ještě také potřeba si program před kompilací posunout o kus výše, než bude ve výsledku, tedy do oné externí SRAM. Proto jsem navrhl Schizofreny, která ani jednu z těchto, chce se říci skoro chyb, nemá. Uvažoval jsem i o připojení 80C31 jako druhého procesoru a 89C51 by mu jen dělala datovou pumpu pro plnění SRAM. Je to jistě ještě čistější řešení než toto a chtěl jsem na něj umístit i 2x MAX232, tedy jeden pro programování SRAM a druhý pro komunikaci programu. Pokud si ale uvědomíte, že tato konstrukce by měla sloužit také začátečníkům, pak spousta spojů navíc využitím 2 CPU by jim mohla způsobit další komplikace. Cenová záležitost to jistě nebyla, cena 80C31 je velice blízká ceně použitého relé. A co se týče dvou sériových portů, vždyť Vám u Schizofreny nic nebrání si druhý MAX232 připojit jako periférii na vyvedené piny P3.0 a P3.1 a komunikovat s dalším zařízením za běhu uživatelského programu. Měl jsem i myšlenku, plnit paměť RAM za pomoci PICu, jenže mne taky došlo, že takový začátečník bude mít nejsíše problém naplnit programem i jednu AT89C51, ne tak ještě k tomu PIC navíc. Proto šla tato myšlenka také do kytek. Další možnosti, jako plnit SRAM čítačem na adresových drátech a data posílat do SRAM datovými piny paralel portu jsem zavrhl také, psát VXD se mi nezdálo zrovna flexibilní možností pro různé použití s uživatelovým vlastním programem pro PC a při použití sériového portu je stejně nutný nějaký převodník ze sériového toku dat na paralelní a tak je to zase tam kde to bylo. Tedy tak jak jsem to nakonec dal na tyto stránky se mi to jeví nejlepší co mne napadlo, možná si budu za pár týdnů říkat, že to to nejlepší nebylo. Ale funkční to je na 100% a to je myslím jediná důležitá věc. Zkrátka účel světí prostředky.

Co za to ?

Pro nekomerční použití je Schizofreny FREE, tedy naprosto volná. Využití pro jakýkoli zisk jen se souhlasem autora. Přebírání materiálů pro další publikování jen se souhlasem autora.

Autor: Jiří Bezstarosti

Autorův e-mail: jiri@bezstarosti.cz