..:: Serious Magazine ::..
wydanie 13

  Wstępniak
  Serious...
  Konkurs - rozwiązanie
  Wspomnienie
  Wiedza
  Koronkowa robota
  Tester EPROM
  Prog. równoległy AT89C2051
  ATMEL - obsługa programu
  EPROM - programator...
  Oporniki, oporniki...
  Blokada komputera
  Archiver
  Wizyta kosmitów...
  Kompresja arytmetyczna
  Analizator stanów logicznych
  ASL - obsługa
  Moja miłość
  Powroty z przeszłości
  Porady
  Pracownia elektronika
  Parowanie tranzystorów
  Pętla induktofoniczna
  Super, extra, cacy cartridge
  Makroassembler ATMAS II

  Wyjście
EPROM - programator równoległy

      Programator szeregowy to taki, w którym kolejne adresy komórek EPROM podaje się jeden za drugim. Aby wybrać jakąś komórkę, należy "przelecieć" przez wszystkie adresy od 0 do n-1. Trwa to wieki. Nie ma możliwości wybrania dowolnej komórki w sposób szybki i prosty.

      Wady tej pozbawiony jest programator równoległy. Podajesz adres komórki i już masz do niej dostęp. Do odczytu, programowania, sprawdzenia (weryfikacji) itd.

      Marzeniem moim (zawsze) było, by mieć programator mały, minimalnie nieskomplikowany i prosty w obsłudze. Pierwszy programator który wykonałem ma gabaryty: 280x150x120 (mm). Potęga! Ledwo mieści się na stole. To programator szeregowy. Teraz mam całkiem maciupeńki. To jest po prostu najzwyklejszy kartridż. Tak!, Tak! Programator wielkości kartridża, na dodatek wkłada się go w gniazdo kartridża. Jak to możliwe? Posłuchajcie. Chyba poczytajcie ;)

Potrzebne scalaki to:

  • 74574 - 3szt (LS)
  • 74245 - 1szt (LS)
  • 74138 - 1szt (LS)
  • 74157 - 1szt (LS)
  • 7474 - 1szt (LS)
drobnica...
  • BC557 1szt
  • BC547 1szt
  • 2kohm 3szt
  • 3kohm 1szt
  • 560ohm 1szt
  • 4k7 3szt
  • 10uF 1szt elektrolit
  • 100uF 1szt elektrolit
  • 100nF 4szt blokujące zasilanie
  • przycisk Reset
  • podstawki pod US
  • goldpiny
  • zasilacz (+12.5V, +21V, +26V)
      Programator programuje wszystkie typy pamięci EPROM (2732-27512). Aby działał, posiada kilka rejestrów sprzętowych w przestrzeni $D5...

      $D500 - LSB adresu komórki EPROM
      $D501 - MSB adresu komórki EPROM
      $D502 - rejestr danej do zaprogramownia (zapis do EPROM)
      $D503 - rejestr danej zaprogramowanej (odczyt z EPROM)
      $D505 - rejestr impulsu programującego
      $D506 - rejestr sterujący

By całość była uniwersalna, sam programator nie posiada podstawki pod pamieć EPROM ??? (Dziwne?) Bo jak każdy wie, różne EPROM'ki muszą mieć różne okablowanie. Więc z programatora wyprowadzone jest gniazdo do którego dołącza się coś w rodzaju dodatkowego kartridża. Tenże kartridż ma na swoim pokładzie odpowiednią podstawkę do konkretnej EPROM'ki. Np. SPARTA DOS X wymaga by linie adresowe i danych były pokrzyżowane. Ale TTP nie. Więc montujesz szybko kartridż z podstawką jaki chcesz, wkładasz do gniazda i gotowe. Zniknął problem przełaczników itp... O tym jeszcze będzie.

Temat główny c.d.

Rejestr sterujący jak wskazuje nazwa steruje całością. Jego adres $D506 i jest to rejestr tylko do zapisu. Po włączeniu zasilania jest automatycznie ustawiany (1) i blokuje rejestr impulsu programującego $D505. Ważny tylko bit D0, pozostałe bez znaczenia.

      $D506 = 00000001

Programator jest w stanie ODCZYT - blokada rejestru $D505. Dostęp do pozostałych rejestrów.

      $D506 = 00000000

Programator w stanie PROGRAMOWANIE - dostęp do rejestru $D505 Dostęp do pozostałych rejestrów.

Rejestr impulsu programującego $D505 Ważny tylko bit D0, pozostałe bez znaczenia. Po włączeniu zasilania, ten rejestr jest zerowany (0) i jednocześnie blokowany jest do niego dostęp.

Ogólnie: gdy programator jest w stanie ODCZYT, blokowany jest dostęp do rejestru $D505

      $D505 = 00000001

Generuje impusl programujący

      $D505 = 00000000

Koniec impulsu programującego

      Rejestr danej do zaprogramowania $D502. Gdy programator jest w stanie ODCZYT, dostęp do tego rejestru jest blokowany, tzn. możliwy jest do niego wpis danej, ale nie oddziaływuje ona na dalsze układy, bo wyjścia tego rejestru są w stanie wysokiej impendancji. Gdy programator jest w stanie PROGRAMOWANIE, wpisanie danej do tego rejestru spowoduje, po pojawieniu się impulsu programującego, zaprogramowanie jej w EPROM. Rejestr $D502 jest rejestrem tylko do zapisu. Choć możliwy jest też jego odczyt, to jest to efekt uboczny. Na upartego kto chce może odczytu dokonywać, np, dla sprawdzenia co zostanie zaprogramowane.

      Drugi rejestr $D503 jest rejestrem odczytu danej z EPROM. Mówiąc po ludzku. Do rejestru $D502 wpisujemy daną do zaprogramowania, a z rejestru $D503 można odczytać daną zaprogamowaną. To na pozór dziwaczne rozwiązanie ma swoje uzasadnienie. Po prostu, na przemian, należy uaktywniać rejestr danej do zaprogramowania i EPROM z której można odczytać zaprogramowaną daną. Aby na szynie danych nie dochodziło do zwarć, stąd to rozwiązanie (choć, można to inaczej robić, ale nie będę tu więcej truć). Rejestr $D503 jest tylko do odczytu.

Być może ktoś zauważył błąd w opisie, lub coś się nie zgadza. To złudzenie. Proszę popatrzeć na schemat. Sygnały pobierane są z wyjść Q i Q (zanegowane) więc gdy piszę że rejestr jest wyzerowany to znaczy JEST WYZEROWANY, ale sygnałem aktywnym jest "1" bo w działaniu jest wyjście Q (zanegowane). Proszę o tym pamiętać!!!

      Rejestry adresowe $D500 i $D501 pozwalają zaadresować dowolną komórkę EPROM Są to rejestry tylko do zapisu. Co wpisać do tych rejestrów. Adres komórki EPROM do której ma być dostęp to np. $01FA. Więc do rejestru $D500 należy wpisać $FA, a do rejestru $D501 - $01. Proste? Kto chce oprogramować programator z poziomu BASIC'a posłuży się znanym wzorem np. adres komórki = 1000

  MSB = INT(1000/256)
  LSB = 1000-MSB*256

  POKE 54528,LSB   ($D500)
  POKE 54529,MSB   ($D501)

Jasne?

Jak programować.

  * ustaw programator w stan PROGRAMOWANIE
           lda #0
           sta $d506

  * wpisz adres komórki EPROM

           lda <adres
           sta $D500
           lda >adres
           sta $D501

  * wpisz daną do zaprogramowania

           lda #dana
           sta $d502

  * wygeneruj impuls programujący

           lda #1
           sta $d505
           (...)       pusta pętla
           (...)       pusta pętla
           lda #0
           sta $d505

(...) tu wstawić należy pętlę która spowoduje, że impuls programujący TPW będzie trwał wymagany czas. Ważne!

  * ustaw programator w stan ODCZYT

          lda #1
          sta $d506

  * odczytaj daną z EPROM, np. celem weryfikacji

          lda $d503
          cmp ....  porównaj z daną programowaną.

Gdy równe, programowanie OK. Gdy różne, programowanie komórki należy powtórzyć, ale tylko w przypadku gdy dana do zaprogramowania jest mniejsza od danej odczytanej z EPROM. Jeżeli jest odwrotnie, nastąpiło przeprogramowanie (bit który miał być jedynką, jest już zerem). W takim wypadku pamięć należy wykasować i ponownie programować.

Jeszcze...

Z uwagi na minimalne wymiary programatora, zasilacz dostarczający napięć: 12V, 21, 26V jest podłączany dodatkowym kabelkiem. Takie rozwiązanie wydaje mi się praktyczne, bo istnieje przez to mniejsze prawdopodobieństwo pomylenia napięć Vpp co praktycznie zawsze prowadzi do uszkodzenia EPROM. Tak więc zasilacz ma trzy gniazda na których dostępne jest jedno z wymienionych napięć. Sam programator jest zasilany napięciem +5V wprost z komputera poprzez gniazdo kartridża.

Na wszelki wypadek przycisk RESET w programatorze powoduje ustawienie programatora w stan ODCZYT, co automatycznie blokuje generację impulsu programującego. To dla lubiących eksperymenty. Łatwiej nacisnąć przycisk niż wpisać sekwencję programową odłączającą zasialnie Vpp.

BASIC pokazuje pazury.

 10 REM Odczyt 64kB EPROM 27512
 15 POKE 54534,1
 20 OPEN #1,4,0,"D:DANE.EPR"
 25 FOR J=0 TO 255
 30 POKE 54529,J
 35 FOR I=0 TO 255
 40 POKE 54528,I
 45 PUT #1,PEEK(54531)
 50 NEXT I
 55 NEXT J
 60 CLOSE #1

Jeszcze BASIC...

 10 REM Programowanie 64kB EPROM 27512
 15 POKE 54534,0
 20 OPEN #1,8,0,"D:DANE.EPR"
 25 FOR J=0 TO 255
 30 POKE 54529,J
 35 FOR I=0 TO 255
 40 POKE 54528,I
 45 GET #1,A:POKE 54530,A
 50 POKE 54533,1
 55 POKE 54533,0
 60 NEXT I
 65 NEXT J
 70 POKE 54534,1
 75 CLOSE #1

W/g potrzeb, pomiędzy linie 50,55 można wstawić pętlę opóźniającą która spowoduje wygenerowanie odpowiednio długiego impulsu programującego. Czy to jest zrozumiałe?

Zasilacz

      Wykonany jest jako osobna maszyneria. Dostarcza napięć: +12.5V +21V +26V. Dwa ostatnie napięcia to ukłon w stronę starszych EPROM'ek wymagających tak wysokiego napięcia. Obciążenie prądowe zasilacza jest minimalne (kilka miliamperów), więc trafo do niego to miniaturka. W roli zasilacza wystąpić może przetwornica. Odpada zasilacz Rozumiem że użytkownik programatora wie co robi, i w zależności od programowanej EPROM doprowadza do programatora odpowiednie napięcie!!! WAŻNE!!! Pieniądze nie swędzą!

Przebiegi w czasie programowania

Przebiegi w czasie programowania


TPW=0.1us - 10us (patrz katalog EPROM)

Dobre rady

      Czy wszyscy pamiętają że BASIC jest wolny! Może się zdarzyć że pomimo różnych zabiegów impuls programujący będzie i tak za długi, co nieuchronnie prowadzić może do przeprogramowania EPROM lub jej uszkodzenia. Dlatego doradzam użycie TURBO BASIC'a. Jest wystarczająco szybki. Zawsze można dodatkowo wyłączyć ekran (POKE 559,0).

      Warto pomyśleć o zasilaczu który ma regulowane napięcie w zakresie 10-14V. Nowoczesne EPROM'ki wymagają by napięcie programujące wynosiło 12.75V Jednak egzemplarze stare z demobilu czasami wymagają nieco większego napięcia. Regulowany zasilacz doskonale załatwia sprawę.

      Niektóre EPROM'ki wymagają by w czasie programowania zasilać je napięciem +6V lub nieco wyższym. Prezentowany tu programator jest zasilany wprost z komputera napięciem +5V W razie potrzeby elektronicy mający głowę na karku potrafią to rozwiązać. Napięcie +6V doprowadzić należy TYLKO do EPROM'ki a nie do całego programatora bo całość eksploduje!!!

SCHEMATY
"Kliknij" aby powiększyć
Schemat 1 - "kliknij" aby powiększyć
Schemat 2 - "kliknij" aby powiększyć

Zenon/DIAL

PS. Namiastka ukazała się w ATARYNCE 2 (5)

    PREPROM.TBA - przykładowy program w Turbo Basic'u
    READ64KB.TBA - procedura odczytu 64kB EPROM z zapisem danych na dysk

Następny artykuł Do góry Poprzedni artykuł