Tak hrozné to zase není, navíc to najdeš v každé knížce o 8051. Tady je podobné schéma dost zjednodušeně:
http://www.maxim-ic.com/images/appnotes/89/550Fig01.gifHorní byte adresy se vysílá z portu P2, dolní byte se vysílá po portu P0, a musíš ho uložit do latche, protože na tom samém portu se budou také vysílat nebo číst i data. Zápis do latche (obvod 74373 nebo podobný, myslím že to byl 74573 se stejnou funkcí ale jinak zapojenými vývody) obstarává signál ALE (Address Latch Enable). Probíhá to takhle:
1. ALE=0 - na porty se zapíše adresa v paměti.
2. ALE=1 - otevře se latch a ten načte spodní byte adresy.
3. ALE=0 - latch drží zadanou hodnotu a posílá jí druhou stranou na adresní vodiče paměti/pamětí.
Dál se může stát několik různých věcí. Pokud chceš číst instrukci programu z externí ROM, mikrokontrolér to provede stažením vývodu /PSEN (Program Store ENable) na nulu. Ten je připojený na řídící vstup paměti /OE (Output Enable), který povoluje výstup dat z ROMky. Takže:
4. /PSEN=1 - doteď se nedělo nic, v čipu paměti multiplexery vybraly správnou buňku kterou jsi adresoval.
5. /PSEN=0 - paměť posílá obsah buňky na datovou sběrnici a mikrokontrolér čte přicházející data.
6. /PSEN=1 - paměť se zavírá a sběrnice uvolňuje.
Pokud chceš použít výhradně programovou externí paměť už od adresy 0000H, musíš to mikrokontroléru oznámit připojením vývodu /EA na opačnou polaritu než je běžné, ale nepamatuji si jestli je to +5V nebo 0V. V opačném případě se používá vestavěná paměť a z externí se čte až při překročení velikosti té vnitřní.
Harwardská architektura má prostor pro program a data oddělené paměti, takže pro datovou paměť máme dva další signály, /RD a /WR. To lomítko (nebo čára nad ve schématech) naznačuje že jsou invertované, to znamená že stejně jako /PSEN něco provádějí když je na nich nula, a naopak nečinné jsou při jedničce.
Takže budeme číst z RAM:
4. /RD=1 - stejně jako u ROM.
5. /RD=0 - RAM posílá na datovou sběrnici obsah vybrané buňky a mikrokontrolér ho čte na P0.
6. /RD=1 - sběrnice se uvolňuje.
A teď si do RAM něco zapíšeme:
4. /WR=1 - mikrokontrolér posílá z P0 na datovou sběrnici nějaký byte zatímco paměť si nastavuje adresu buňky.
5. /WR=0 - pamět otevírá vstup a do zvolené buňky zapisuje data.
6. /WR=1 - sběrnice se uvolňuje, mikrokontrolér přestává vysílat data a chystá se načíst další instrukci.
Přesné časování najdeš v diagramech ve datasheetu výrobce, ale pro základní zapojení ti stačí vědět tohle.
Pro paměť programu máš čip 8KB, ze kterého využiješ jen první 2KB, takže budeš adresovat 11 vodiči (A0 až A10). Zbylé dva - A11 a A12 musíš zapojit na nulu, aby nechytaly falešné signály a neadresovaly náhodou jinou část paměti, než tu ve které je program.
Takže A0 až A7 zapojíš na vývod z latche, a A8 až A10 na P2.0 až P2.2.
Podobně to bude s pamětí dat, tam máš sice 4K, ale potřebuješ jen prvních půl kila, takže si vystačíš s devíti vodiči z dvanácti. Takže A0 až A7 z obou čtyřbitových pamětí zapojíš na latch stejně jako u té ROMky (jestli si dobře vzpomínám, tak by měl výkonově utáhnout čtyři vstupy, ty vystačíš se třemi), a A8 na P0.0.
A protože ty paměti jsou jen čtyřbitové, tak musíš pro osm bitů použít dva, a zapojit jeden třeba na vývody P2.0 až P2.3 a druhý na P2.4 až P2.7, ale na konkrétním přiřazení zrovna tady vůbec nesejde, protože co si kam zapíšeš to odtamtud zase přečteš, takže si ty dráty můžeš natahat úplně libovolně napřeskáčku, jak se ti hodí. To se dá velmi výhodně použít při návrhu tištěného spoje, kde se dá velmi zjednodušit!
Jestli si dobře vzpomínám, tak pro použití externích pamětí musíš ty dva porty nastavit programově na jedničky, ale přesně už to nevím, je to deset let co jsem si s tímhle hrál, takže se omlouvám za případné chyby či nepřesnosti. Na závěr zapojení vývodů 8051:
http://www.computer-solutions.co.uk/inf ... P%2040.PNG