Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Prosty symulator pamięci EPROM

maciej_333 04 Kwi 2018 23:49 4236 20
  • Prosty symulator pamięci EPROM
    Obecnie mikrokontrolery posiadają wbudowane pamięci FLASH, które można programować za pomocą interfejsu ISP. Jest to zarówno szybkie, jak i wygodne rozwiązanie. Programowanie okładu odbywa się bowiem bez jego wyciągania z podstawki. Zresztą w tej chwili układów DIP jest coraz mniej, więc interfejs ten jest tym bardziej przydatny. Ponadto współczesny mikrokontroler zawiera oprócz znacznej ilości pamięci programu i RAM również masę interfejsów komunikacyjnych, timerów, przerwań zewnętrznych i innych konfigurowalnych peryferiów.
    Dawniej jednak system mikroprocesorowy był znacznie bardziej złożony. Procesor sam w sobie nie wiele potrafił, konieczne było dołączenie pamięci programu i danych, układów I/O, timerów, kontrolera przerwań itd. Intel 8080 potrzebował jeszcze do pracy kontrolera systemu 8228 i układu zegara 8224. Jednak mimo to potrzebne były jeszcze dekodery adresów.
    Jako pamięć programu stosowano wówczas powszechnie pamięci EPROM. Jednak praca z takimi pamięciami nie należała do zbyt przyjemnych. Każda zmiana zawartości wiązała się z wyjęciem pamięci z podstawki i kasowaniem za pomocą kasownika UV. Potem następował ponowny zapis za pomocą programatora. Kasowanie trwało zwykle ok. 15 min. Zapis dla dużych pamięci nawet kilka minut. Wyobraźmy sobie jak utrudniało to rozwój oprogramowania a w szczególności znalezienie błędów w danym kodzie. Właśnie z tego powodu powstały symulatory EPROM. Urządzenie takie dołącza się do systemu mikroprocesorowego zamiast pamięci EPROM. Kwestia symulacji związana jest z dołączeniem do danego systemu przez symulator zapisanej pamięci RAM. Jednak wymagany jest tu odpowiedni układ sterujący, który odłącza pamięć RAM od danego systemu na czas jej zapisu. Typowo realizowało się to za pomocą buforów trójstanowych i garści elementów TTL. Całość sterowana byłą poprzez port LPT. W sieci znaleźć można masę opisów układów tego rodzaju.
    Ponieważ zacząłem obecnie wykonywać komputer oparty o Intel 8080 symulator taki stał się niezbędny. Postanowiłem jednak iść nieco z duchem czasu i zrealizować symulator w oparciu o jakiś mikrokontroler. Komunikację pomiędzy PC a symulatorem postanowiłem zrealizować już za pomocą RS232C. Samym mikrokontrolerem został w tym przypadku dosyć stary AT89C51 rodziny 8051. Nie posiada on interfejsu ISP, więc program rozwijałem wyciągając mikrokontroler z podstawki. Oprogramowanie dla AT89C51 powstało w asemblerze. Program wyszedł niestety trochę zbyt rozbudowany.
    Poniżej znajduje się schemat symulatora.
    Prosty symulator pamięci EPROM




    Nie ma tu żadnych kosmicznych rozwiązań. Mikrokontroler taktowany jest nietypowym, jak na 8051 kwarcem o częstotliwości 14,31818 MHz. Pozwala to uzyskać przepływność bitową 230400 b/s w trybie 2. Prosty konwerter poziomów napięć wykonany został w oparciu o tranzystory Q1 i Q2. Port P0 został podciągnięty drabinką RN1, ponieważ port ten nie posiada wewnętrznych rezystorów podciągających. Zdecydowałem się tu zastosować bufory 74LS245 mimo, że nie wykonywałem szyn dwukierunkowych. Zwyczajnie rozkład wyprowadzeń 74LS245 bardzo ułatwił wykonanie połączeń na płytce uniwersalnej. W przypadku 74LS244 nie byłoby już tak prosto. U3 stanowi bufor szyny danych, zaś U4 i U5 bufory szyny adresowej. Ponieważ od strony mikrokontrolera U3 to wejście nie ma konieczności sterowania tego układu przez 8051. Ponieważ układ musi udawać pamięć EPROM, to konieczna jest dodatkowa logika na bramkach. Pozwala to odczytywać dane tylko wtedy, gdy sygnały OE_EPROM i CE_EPROM będą miały poziomy niskie. W innych przypadkach wyjścia U3 przejdą w stan wysokiej impedancji. W chwili odebrania stosownego polecenia przez USART mikrokontroler wystawia poziom wysoki na linii EN. Dzięki temu możliwe jest zapisywanie do pamięci 62256, lub z niej odczytywanie. Linie CE, WE i OE 62256 nie są buforowane. W chwili, gdy operacje związane z 62256 zostaną zakończone linie CE i OE mają na stałe stan niski, WE wysoki. Zatem układ pozostaje cały czas wybrany. Upraszcza to układ, ale zwiększa pobór prądu. Stan pracy układu sygnalizuje dioda LED D1. Pewną ciekawostką jest obecność pamięci EEPROM z interfejsem I2C typu 24C256. Jest to dodatkowym, nieulotny bufor danych. Z poziomu PC można zapisywać również do tej pamięci. Natomiast, po załączeniu zasilania dane z 24C256 kopiowane są do 62256. Można też wywołać taki stan również zdalnie. Interfejs I2C jest oczywiście całkowicie programowy. Sondę EPROM stanowi złącze goldpin od strony PCB, zaś z drugiej mamy dedykowane złącze pasujące w podstawkę DIP. Jak widać coś takiego było też produkowane. Zasilanie symulatora pobierane jest z podstawki EPROM. Pobór prądu wynosi ok. 220 mA. Symulator wykonałem na płytce uniwersalnej, realizując wszystkie połączenia kynarem. Oprogramowanie od strony PC zrobiłem w bardzo przyjaznym graficznym języku programowania, jakim jest LabVIEW. Wykonałem też plik EXE, więc można to uruchomić bez instalacji LabVIEW. Wystarczy zatem sam Runtime dla wersji 2015.

    Napiszę też jeszcze kilka słów o komputerze, jaki aktualnie wykonuję. Jak dotąd na wielkiej płytce uniwersalnej mam:
    -8080 (CPU),
    -8224 (zegar),
    -8228 (sterownik systemu i bufor szyny danych)
    -dwie sztuki 8212 jako bufory trójstanowe dla szyny adresowej - buduję rozbudowany system w dodatku z układami TTL dołączonymi do szyny adresowej, zatem potrzebne jest dodatkowe buforowanie, celem zwiększenia obciążalności,
    -kolejny 8212 jako wyjście w przestrzeni adresowej I/O - aktualnie steruje on migającą diodą i daje sygnał sterujący "przełączaniem" linii adresowych A15 i A14 - chodzi o start systemu od konkretnego adresu, docelowo będę nim przełączał też banki pamięci,
    -pamięć EPROM 27C256, jednak są tylko dwa banki po 16 kB - przełączane zworką,
    -dekodery adresów dla przestrzeni I/O i RAM są zrobione typowo na TTL.

    Docelowo dodam:
    -8255 (programowalne I/O)
    -8275 (CRT)
    -8257 (DMA - potrzebne też do 8275)
    -8253 (Timer)
    -8251 (USART)
    -8279 (klawiatura)
    -8259 (sterownik przerwań)
    -8271 (sterownik dysku miękkiego - zamierzam podjąć próbę uruchomienia stacji dyskietek 5,25" / 3,5")
    -jakieś 512 kB pamięci RAM - układy współczesne.

    Aktualnie mam uruchomioną migającą diodę. Jednak im więcej układów CEMI się stosuje, tym więcej kłopotu w uruchomieniu. Nowe MCY7880, jakie mam nie chciały działać. Podobnie było z rodzimym 8228. Na 10 nowych układów 1 nie działał. W końcu na jakiejś płycie znalazłem MCY7880, który chciał działać w moim układzie. Nadmienię, że z oryginałem Intela, odpowiednikiem radzieckim, czy AMD nie było problemów. Pobór prądu jest ogromny. Tak prosty system pobiera jakieś 0,6 A ze źródła +5 V.
    Odnośnie oprogramowania, to najpierw napiszę pewnie własny system typu MONITOR. Chcę się też pobawić z odczytem i zapisem na taśmę magnetofonową. Później jednak poczynię prace nad napisaniem BIOS'u dla CPM w wersji 2.2 i jego uruchomieniem. Jednak CPM będzie na stałe w EPROM, bez bootowania z dyskietki. Potem będę próbował uruchomić CPM 3.0, ponieważ obsługuje on banki pamięci.

    Na koniec mojego zbyt długiego wywodu pozostaje wstawić kilka zdjęć.
    Płyta z modułem CPU dla 8080, jaki opisałem wyżej:
    Prosty symulator pamięci EPROM

    Zbliżenie na zmontowaną część:
    Prosty symulator pamięci EPROM

    Zbliżenie na MCY7880, polski klon Intel 8080. Układ ten teoretycznie był produkowany w Polsce.
    Prosty symulator pamięci EPROM

    Moduł CPU wraz z dołączonym symulatorem pamięci EPROM:
    Prosty symulator pamięci EPROM

    W załączniku znajduje się archiwum z schematem w programie Kicad, kod źródłowy programu dla AT89C51 i program w LabVIEW. Ponadto znaleźć można opis protokołu komunikacyjnego, jaki wymyśliłem. Może ktoś będzie miał ochotę napisać własne oprogramowanie.

    Załączniki:

    Fajne!
  • Arrow Multisolution Day
  • #2 05 Kwi 2018 11:53
    acctr
    Poziom 13  

    A nie myślałeś nad wykonaniem gotowego projektu np tego z Elektora 01/2001? Tam użyto 89C2051 i też emuluje pamięci 27C256. Planuje właśnie zrobić sobie jakiś emulator, upatrzyłem ten projekt, ale myślę jak go rozszerzyć na inne rozmiary pamięci.

  • #3 05 Kwi 2018 11:55
    jousto
    Poziom 16  

    Jakie są czasy stabilizacji stanów na szynie danych od momentu ustawienia stanu niskiego na wejściu OE?

  • #4 05 Kwi 2018 12:22
    maciej_333
    Poziom 34  

    acctr napisał:
    A nie myślałeś nad wykonaniem gotowego projektu np tego z Elektora 01/2001? Tam użyto 89C2051 i też emuluje pamięci 27C256. Planuje właśnie zrobić sobie jakiś emulator, upatrzyłem ten projekt, ale myślę jak go rozszerzyć na inne rozmiary pamięci.

    Widziałem podobny układ w EP, ale jest on bardziej złożony od mojego rozwiązania. Nie da się ukryć, że byłoby jednak znacznie więcej lutowania na płytce uniwersalnej niż w moim przypadku. Inna sprawa to brak takiego gadżetu jak bufor EEPROM. Dzięki temu układ może w pewnym sensie stanowić zamiennik pracujący niezależnie. Mogłem rozszerzyć układ na większe pamięci, ale uznałem, że mi to wystarczy. Nie da rady rozszerzyć takiego symulatora na większe pamięci bez zmiany oprogramowania. Jakimś rozwiązaniem są przełączalne banki, ale nikomu raczej nie chciałoby się w to bawić. Napisać 32 kB w asemblerze to i tak dostateczne wyzwanie. Zresztą pamięci mniejsze od 27C256 można emulować z odpowiednią sondą, która będzie zwierać starsze linie adresowe do masy.

    jousto napisał:
    Jakie są czasy stabilizacji stanów na szynie danych od momentu ustawienia stanu niskiego na wejściu OE?

    Myślę, że układ nie jest wolniejszy od 27C256. W wolnej chwili postaram się ten czas zmierzyć. Moim zdaniem spokojnie można liczyć na jakieś 200 ns.

  • #5 05 Kwi 2018 12:41
    acctr
    Poziom 13  

    Chodziło mi o ten układ: https://www.elektormagazine.com/magazine/elektor-200101/16948
    Użycie lokalnego eeproma to faktycznie zaleta.
    Jakiego kompilatora używasz dla 51? Do tworzenia oprogramowania na emulator użyłeś jakiegoś środowiska czy notatnik?

  • Arrow Multisolution Day
  • #6 05 Kwi 2018 13:07
    maciej_333
    Poziom 34  

    Nie da się ukryć, że mój układ na płytce uniwersalnej jest jednak łatwiej polutować. Jest też podobny układ z EP: Emulator pamięci EPROM.

    Używam pewnego całkiem wygodnego w użyciu środowiska na DOS. Oczywiście trzeba ten program uruchomić przez DOSBOX. Mogę raczej wstawić tutaj ten program ponieważ i tak jest to wersja demo z kodem ograniczonym chyba do 2 kB. Jednak programu większego od 1,5 kB jeszcze w asemblerze 8051 nie napisałem. Program najlepiej umieścić na dysku C, tak by wszystkie pliki były w katalogu C:\8051\. Można też skonfigurować jakiś edytor tekstu w stylu Notepad++, tak by kolorował odpowiednio składnię.

  • #7 06 Kwi 2018 10:08
    3149400
    Użytkownik usunął konto  
  • #8 06 Kwi 2018 10:24
    maciej_333
    Poziom 34  

    nowyARM napisał:
    Konwerter TTL RS232C jest zły i nie spełnia normy RS232C. Nie z każdym komputerem zadziała poprawnie. MAX232 nie jest tak drogi aby go nie używać ale jeśli już to emiter tranzystora Q2 należy podłączyć do linii np RTS. Po otworzeniu portu wystarczy ustawić na linii napięcie ujemne (przeważnie robi to system). Takie rozwiązanie będzie zgodne ze standardem RS232C.

    Zgadza się kolego. Można tak zrobić, ale z uwagi na wartość rezystora R8 okaże się, że wyjście linii RTS nie ma dostatecznej wydajności prądowej. W końcu konwertery USB/RS223C mają tylko pompę ładunku. Tak niska wartość R8 jest zastosowana z powodu znacznego prądu pobieranego przez linię RxD niektórych konwerterów.

  • #9 06 Kwi 2018 10:52
    3149400
    Użytkownik usunął konto  
  • #10 06 Kwi 2018 11:05
    maciej_333
    Poziom 34  

    Projekt retro, więc rozwiązania są z czasów, kiedy pamięci EPROM były jeszcze powszechnie stosowane mimo dostępnych już pamięci FLASH. Z ARM będzie dodatkowy problem z poziomami napięć. STM32F4xx może dałoby radę samodzielnie emulować pamięć EPROM, ale znowu kwestia poziomów napięć. Ponadto chciałem wykorzystać złom elektroniczny. Wszystkie podzespoły z wyjątkiem 24C256 i podstawki DIP40 są wylutowane z jakichś płyt.

    Mam kilka konwerterów i niektóre mają rezystancję wejściową linii RxD nawet mniejszą od 1 kΩ. Wydajność prądowa wyjść na poziome 20 mA jest nierealna dla konwertera z uwagi na obecność jedynie pompy ładunku. Jednak myszka na RS232 jakoś działa.

  • #11 06 Kwi 2018 11:20
    3149400
    Użytkownik usunął konto  
  • #12 06 Kwi 2018 11:27
    maciej_333
    Poziom 34  

    Dla AT89C51 i innych 8051 stosuję właśnie narzędzia programistyczne retro. Wstawiłem powyżej wykorzystywane środowisko. Jasne, że w ARM sporo linii I/O jest "+5 V I/O respective", ale to nie oznacza zgodności dwukierunkowej z układami o poziomach +5 V.

  • #13 06 Kwi 2018 11:33
    3149400
    Użytkownik usunął konto  
  • #14 06 Kwi 2018 12:03
    maciej_333
    Poziom 34  

    W dokumentacji INTEL 8080 można znaleźć informację, że minimalny poziom wysoki to 3,3 V. Przy zasilaniu ARM napięciem 3 V nie ma zatem zgodności. Stosując 3,3 V wszystko pracuje na granicy wartości dopuszczalnych. Maksymalne napięcie dla ARM to 3,6 V. Jednak ARM będzie przesyłał dane do 8228, który ma próg rozpoznawania 0 i 1 maksymalnie 2 V, więc akurat tu by się jeszcze udało to zrobić.

    Nie dołączałem tego układu do fizycznego portu komputera, ale z konwerterami takie podejście wystarcza. Sprawdzałem napięcie na kolektorze tego tranzystora z dołączonym konwerterem i mogę z tego wnioskować o niskiej rezystancji wejściowej. Takie kłopoty były z podróbką PL2303. Wydajność prądowa linii tego konwertera nie jest tak duża. Owszem 5-10 mA da się nawet pobrać, ale nie 20 mA. Konwerter oparty o FT232 spisuje się lepiej i bardziej niezawodnie. Zatem nie jest to problem braku napięcia ujemnego - przynajmniej w odniesieniu do konwertera.

    Zresztą w układach retro spotyka się nieco inny układ konwertera:
    Prosty symulator pamięci EPROM
    Zwróć uwagę na wartości rezystorów.

  • #15 06 Kwi 2018 13:13
    3149400
    Użytkownik usunął konto  
  • #16 06 Kwi 2018 13:30
    3029369
    Użytkownik usunął konto  
  • #17 06 Kwi 2018 13:30
    maciej_333
    Poziom 34  

    Wyraźnie Ci udokumentowałem, pewne kwestie. Widać, że można to połączyć, nawet jeśli ktoś wpadnie na pomysł, by 8228 przenieść do programu w ARM. Wielkiego zapasu jednak nie ma. Wspomniałem o napięciu zasilania 3 V, bo tak jest np. w płytce STM32F4DISCOVERY.
    Stosuję tu RS232, bo jest to rozwiązanie jednak tańsze. Konwertery już mam, zaś moduł z FTDI musiałbym kupić i zamontować na mojej płytce. Kwoty może nie są kosmiczne, ale układ miał powstać możliwie najbardziej ze złomu.

    Pong.Chu napisał:
    Czy to jest projekt wykonany 20 lat temu czy współczesny? Jeśli współczesny to chyba wstyd pokazywać takie coś .

    Przeczytaj datę na schemacie. Prezentować podobnie zmontowany komputer COBRA też było wstyd pokazywać ? Stosuje się jeszcze w nowych urządzeniach pamięci EPROM ? Projekt jest retro, co przecież już zostało wskazane.

  • #18 06 Kwi 2018 13:55
    3149400
    Użytkownik usunął konto  
  • #19 06 Kwi 2018 14:13
    maciej_333
    Poziom 34  

    nowyARM napisał:
    Jak ze złomu to co innego ale PCB nie jest ze złomu

    Kto powiedział, że PCB nie jest ze złomu ? Znalazłem płytkę uniwersalną ze zmontowanym na niej układem i ją rozlutowałem. Większość konwerterów jest w stylu USB/UART/RS232, bo są jednak łatwiejsze do programowania od strony PC. Można się odwoływać do nich przez zwykłe Win API, jak do fizycznego portu. W przypadku USB/I2C/SPI trzeba się odnieść do DLL danego układu i wykorzystywać zawarte tam API. Układy różnych producentów (FTDI, CH341) mimo, że robią w sumie to samo będą miały inne API.

  • #20 06 Kwi 2018 14:41
    3149400
    Użytkownik usunął konto  
  • #21 29 Kwi 2018 10:54
    Michal2002
    Poziom 21  

    Plus Kolego za udostępnienie kodu źródłowego co dla niektórych jest sporą ciekawostką w tym dla mnie :)

    Kolego Pong.Chu wstyd dodawać taki komentarz.
    Ja rozumiem ,że praca może się nie podobać , sam możesz zaprezentować lepszą ale takie komentarze są nie na miejscu.