Programator pamięci SRAM EX-314 w starszych urządzeniach ICOM

Posiadacze i użytkownicy starszych urządzeń ICOM wiedzą, że zawartość znajdującej się w ich wnętrzu pamięci SRAM jest podtrzymywana baterią litową. Wyczerpanie baterii w układzie pokazanym na zdjęciach Fot. 1 (i wielu innych zdjęciach dostępnych w Internecie) skutkuje awarią uniemożliwiającą poprawną pracę transceivera, odbiornika itp [1].

Fot. 1. Moduł EX-314: widok od góry
widok od spodu

 

 

 

 

 

 

W ciągu kilkudziesięciu lat pojawiły się zamienniki układu EX-314 reklamowane jako wieczne tzn. niezapominające wprowadzonego do nich kodu [2 – 4]. Jednak moje wątpliwości wzbudza fakt wyposażenia każdego z tych układów w baterię litową wobec ich „nieśmiertelności”. Równolegle pojawiły się opisy procedur wymiany wlutowanej w płytkę drukowaną baterii litowej na nową [6, 7], a także wykorzystania różnego rodzaju programatorów (fabrycznych lub samodzielnie skonstruowanych) do wpisania adekwatnego kodu do układu EX-314 [8-10]. Z jednej strony cena programatorów fabrycznych [11] jest relatywnie wysoka, a współpraca z układem SRAM niepewna, a z drugiej to software do układów home made zwykle jest napisany w języku wyższego rzędu (zwykle C np. [8]) i skutkiem tego nie daje możliwości do zapewnienia odpowiedniego timingu podczas procedury programowania. Pomijam już kwestię tego, że w niektórych upublicznionych programatorach DIY część niezbędnych opcji nie działa prawidłowo.

Mimo, że w moim IC-751A bateria działa prawidłowo od 32 lat (szok!) to spodziewałem się, iż każdego dnia zupełnie nieoczekiwanie może „zasłabnąć”. Jest to podstawowy powód, dla którego najpierw zaznajomiłem się z literaturą związaną z reaktywacją układu SRAM, a skutkiem przetrawienia zdobytych informacji zabrałem się za skonstruowanie adekwatnego urządzenia. Z oczywistych powodów najpierw wykonałem kilka urządzeń opisanych w Internecie, a skutkiem niepowodzeń zabrałem się za zaprojektowanie własnego.

Z punktu widzenia użytkownika starszych urządzeń ICOM’a zawartość SRAMu może nie być interesującą, a jedyną „siłą napędową” do podjęcia jakichkolwiek działań jest chęć utrzymania sprawnego działania posiadanego sprzętu. Oznacza to, że podstawowymi cechami programatora powinny być: odczyt zawartości pamięci EX-314 i jej przechowanie na czas wymiany baterii na nową, ponowne wgranie do niej zawartości po wymianie tejże baterii, a w przypadkach awaryjnych wgranie standardowej (przeznaczonej dla danego urządzenia) zawartości z przechowywanych w programatorze schematów do zrewitalizowanego SRAMu. Natomiast dla bardziej dociekliwych powinna być dostępna owa zawartość wraz możliwością jej zapisania w komputerze.

W projekcie programatora, ze względów ekonomicznych, wykorzystałem najtańsze podukłady, które często znajdują się w zasięgu ręki radioamatora – w jego szufladzie. Z tego względu jako system mikroprocesorowy zastosowałem płytkę Arduino Uno R3 dodając do niej jedynie układ  sterowania (microswitch 6×6), kontroli (4 diody LED) i złącz, którego schemat pokazano na Rys. 1. Dla ułatwienia, na pokazanym schemacie dodałem opisy poszczególnych pinów odpowiadających pinom Arduino oraz pinom procesora ATmega328P.

Rys. 1. Układ sterowania i kontroli programatora.

Schemat i projekt płytki drukowanej wykonałem przy użyciu programu KiCad i umieściłem w załączniku w pliku „Uklad sterowania i kontroli programatora.zip” . Płytkę drukowaną można wykonać za pomocą techniki termotransferu. Natomiast podczas montażu jako złącza J4 i J5 należy zastosować listwy wielopinowe o długości pinów nie mniejszej niż 14 mm. Jest to związane z aktualnie nietypowymi złączami występującymi w fabrycznych płytkach EX-314 – ICOM.

Zdjęcie połączenia tej płytki z płytką Arduino Uno pokazano na Fot. 2 ze względu na wskazanie położenia „kolorów” diod LED. Warto zwrócić na nim uwagę na zabezpieczenie taśmą izolacyjną gniazda USB (Arduino Uno) przed ewentualnym zwarciem ze ścieżkami na płytce układu sterowania i kontroli, a także na to, że płytka ta nie wymaga żadnej hardwaerowej modyfikacji.

Fot. 2. Zdjęcie układu sterowania i kontroli programatora „wetkniętego” w płytkę Arduino Uno R3.

W kolejnym kroku przygotowałem „programowy wsad” do procesora znajdującego się na płytce Arduino Uno. W tym celu korzystałem z darmowego pakietu programowego Microchip Studio, uprzednio zainstalowanego z pliku offline dostępnego na stronie [12]. Użytkownik po otwarciu tego programu i jego skonfigurowaniu dla pracy z assemblerem i procesorem ATmega328P powinien w uruchomionym projekcie przepisać (copy & paste) zawartość załączonego pliku main.asm . Plik jest edytowalny za pomocą Notatnika. Po kompilacji programu poleceniem Build uzyskuje się wsad do procesora w formacie Intel-Hex usytuowany w katalogu Debug. Przed kompilacją możliwym jest wybranie standardowego kodu jaki odpowiada urządzeniu, w którym docelowo ma pracować płytka EX-314. Wskazówki dotyczące sposobu wyboru zostały umieszczone w nagłówku pliku main.asm. Jeśli potrzebny jest jedynie kod do transceiverów IC-751 lub IC-751A to nie ma potrzeby wykonywania powyższych operacji i można wykorzystać jako wsad załączony plik o nazwie Loader.hex .

Wpisanie pliku hex do procesora w Arduino Uno można przeprowadzić programując drugą płytkę Arduino Uno jako programator „Arduino as ISP”. Nie jest to godne polecenia bowiem ten programator nie umożliwia odczytu zawartości EEPROM programowanego procesora. Znacznie lepiej jest skorzystać z programatora zewnętrznego np. USBASP (ja używałem AVRDragon) i wprowadzić kod hex do Arduino Uno przez złącze ICSP znajdujące się na jego płytce drukowanej. Po tym należy dokonać ustawienia FUSE BITS EXTENDED na 0xFD, FUSE BITS HIGH na 0xDF i FUSE BITS LOW 0xFF. Tą informację podaję raczej pro forma bowiem właśnie takie ustawienia są stosowane standardowo na płytkach Arduino Uno.

Po zaprogramowaniu procesora na płytce Arduino Uno konstruowany programator pamięci SRAM (EX-314) jest już gotowy do pracy. Wystarczy dołączyć do niego płytkę sterowania i kontroli (Fot. 2) oraz podłączyć Arduino Uno do gniazda USB w komputerze jako źródła zasilania. Praktycznie od razu po podłączeniu zapali się niebieska dioda wskazująca gotowość do wykonywania poleceń i jednocześnie zapali się na 5 sekund dioda zielona, potem na 5 sekund dioda żółta, później na 5 sekund dioda czerwona, a następnie powtórzy się sekwencja zapalania się tych diod. Należy tutaj wyjaśnić jakiego rodzaju polecenia można wydawać programatorowi:

  1. Podczas gdy pali się dioda niebieska i zielona to naciśnięcie klawisza spowoduje odczytanie pamięci SRAM (EX-314) i umieszczenie jej zawartości w pamięci EEPROM procesora Arduino Uno.
  2. Podczas gdy pali się dioda niebieska i żółta to naciśnięcie klawisza spowoduje przepisanie zawartość pamięci EEPROM procesora Arduino Uno do pamięci SRAM (EX-314).
  3. Podczas gdy pali się dioda niebieska i dioda czerwona to naciśnięcie klawisza spowoduje przepisanie standardowego kodu urządzenia wybranego przed kompilacją programu do pamięci SRAM (EX-314).

W każdym z powyższych przypadków po naciśnięciu klawisza zgaśnie (pozornie na chwilę) niebieska dioda sygnalizując wykonywanie nakazanej operacji. Zgaszenie tej diody będzie trwało przez cały czas wykonywania tej operacji i powtórne naciskanie klawisza nie spowoduje jej przerwania. Zatem posługiwanie się programatorem wymaga rozwagi tak aby nie nadpisać zawartości SRAM niepożądanym kodem.

Nie jestem rzecznikiem skakania do basenu póki nie sprawdzę, że jest w nim woda. Oznacza to, że warto najpierw sprawdzić działanie programatora zanim wykorzysta się go do reprogramowania pamięci SRAM w działających urządzeniach. W pierwszym podejściu można kupić stare płytki EX-314 i przeprowadzić eksperyment z ich użyciem. Biorąc jednak pod uwagę wielość wersji tych płytek dostępnych na rynku wtórnym oraz ich cenę (50 – 75 USD) uważam ten eksperyment za nieuzasadniony ekonomicznie. Pozostaje zatem wykonanie duplikatów tych płytek z aktualnie dostępnych elementów.

Projekty duplikatów płytek EX-314

Rysunki ścieżek na niektórych wersjach płytek EX-314 [10, 13] oraz schematy niektórych z nich [14] są dostępne w Internecie. Charakterystycznym jest to, że zależnie od wersji stosowane są w nich pamięci SRAM o różnych czasach dostępu. Zatem zasadniczym pytaniem jest to czy owe zmiany (od wersji do wersji) powodowały również konieczność zmian timingu ich współpracy z urządzeniami, w których były one montowane, czy też pamięci SRAM zmieniano bez ingerencji w pracę obsługujących je układów. Jedynym rozwiązaniem jest eksperymentalne sprawdzenie tej hipotezy.

Pierwsze doświadczenia przeprowadziłem z pamięciami SRAM uPD444C-1 o gwarantowanym czasie dostępu poniżej 300 ns i organizacji 4×1024. Schemat układu przedstawiono na Rys. 2, a jego zdjęcie na Fot. 3. Warto zaznaczyć, że układ ścieżek na płytce był bardzo podobny do tego, który zastosowano na fabrycznej płytce EX-314. Projekt płytki drukowanej przygotowany w programie KiCad znajduje się w załączniku „Kopia EX-314_1.zip” .

Rys. 2. Schemat kopii EX-314 dla układów uPD444C.

Następne doświadczenia prowadziłem z pamięciami SRAM uPD446C-2 i uPD446C-3 o gwarantowanych czasach dostępu odpowiednio 200 ns i 150 ns i organizacji 8×1024. Schemat układu (Rys. 3) nieco różni się od oryginalnego jak również różni się układ ścieżek na płytce drukowanej. Patrząc od strony mechanicznej elementy elektroniczne umieszczono od spodu płytki, a baterię litową od góry. Takie rozwiązanie przyjąłem aby nie tworzyć nad płytką „piramidy” elementów, która mogłaby kolidować z zasilaczem PS-35 montowanym wewnątrz mojego transceivera IC-751A. Zdjęcia tego modułu pokazano na Fot. 4. Projekt płytki drukowanej znajduje się w załączniku „Kopia EX-314_2.zip” . Warto tutaj zauważyć, że zastosowane układy SRAM są tożsame z układami LH5116.

Rys. 3. Schemat kopii EX-314 dla układów uPD446C.

 

Fot.  4. Zdjęcie kopii EX-314 dla układów uPD446C: widok od góry (po lewej), widok od spodu (po prawej).

Chociaż wszystkie powyżej pokazane kopie EX-314 działają prawidłowo w moim transceiverze IC-751A to warto podzielić się kilkoma spostrzeżeniami poczynionymi podczas ich konstruowania. Pierwszy wniosek sprowadza się do stwierdzenia, że działanie tego układu nie zależy od czasu dostępu do zastosowanych pamięci SRAM. Najbardziej „wrażliwym” jest układ załączania zapisu gdy pojawią się stany wysokie na liniach adresowych A8 i A9 (vide Rys. 1). O ile działanie samych bramek OR jest bez zarzutu to zastosowany dalej układ złożony z elementów R3, R4, C2, D3 i Q1 wymagał sporej dozy cierpliwości. Układ ten jest „wrażliwy” na sterujący go prąd tzn. jeśli jest on zbyt mały to zapis do pamięci SRAM ulega zaburzeniu. Skutkiem tego spostrzeżenia zastosowanie układów OR SN74LS32 kończyło się „niepewnością” działania zapisu. Cóż, parametr oznaczany jako  (prąd wyjściowy bramki w stanie wysokim) jest według danych katalogowych dla takich układów dwukrotnie mniejszy niż dla SN7432N. Drugim „wrażliwym” elementem jest tranzystor Q1, a właściwie jego charakterystyka związana z nieliniową zależnością prądu kolektora od prądu bazy, szczególnie dla małych wartości prądu bazy. Jego charakterystyka jest bardzo podobna do 2N3904, aczkolwiek łatwa dostępność tranzystorów C945 (2SC945) w kraju nie wymaga poszukiwania zamienników. Dioda D3 powinna być diodą przełączającą o możliwie jak najmniejszej pojemności złącza, warunek ten spełnia 1N4151 i nie ma konieczności sprowadzania diod 1S953 stosowanych w oryginalnym układzie. Reasumując to opisany układ można byłoby przeliczyć i „dopasować” do innych bramek OR tym niemniej wysiłek ten jest aktualnie niepotrzebny.

Warto jeszcze rozważyć propozycje układów EX-314, w których zamiast pamięci SRAM zamiennie można byłoby zastosować pamięci FRAM [15]. W układach takich bateria litowa byłaby zbędna. Zatem układ pozostawałby rzeczywiście „długowiecznym”.

Zastosowanie pamięci FRAM

Bardzo dobrym reprezentantem pamięci FRAM jest układ FM1608. Jeśli przejrzy się jego notę techniczną to bardzo łatwo zauważy się różnice w sekwencjach sterujących odczytem i zapisem w porównaniu do pamięci SRAM. O ile sekwencja sterująca odczytem różni się jedynie interwałami niektórych impulsów (lub ich opóźnień w stosunku do siebie) jest bardzo (ale to bardzo) podobna, o tyle sekwencja impulsów sterująca zapisem do pamięci różni się znacznie bardziej, szczególnie jeśli owe różnice uwzględnimy w narzuconym nam „schemacie” EX-314. Skoro jednak nieznany jest protokół komunikacji pomiędzy starszym urządzeniem ICOM i wbudowaną weń pamięcią SRAM to warto było przeprowadzić eksperyment tworząc układ EX-314 z taką pamięcią (vide Fot. 5).

Fot. 5. Płytka układu EX-314 z pamięcią FRAM FM1608.

Już na etapie wprowadzania kodu do pamięci EX-314 z pamięcią FRAM okazało się, że stosując sekwencje dla SRAM wpisywane nibble (4 bity) były wpisywane do komórek pamięci, których adres był o 1 większy od wskazanego. Nie jest wielkim problemem w tym programatorze jego zmuszenie do wpisywania nibble’i, w tych miejscach w których sobie życzymy. Jednak tak zaprogramowana pamięć EX-314 wprowadzona do urządzenia ICOM działała wadliwie. Po wyjęciu płytki i jej odczytaniu okazało się, że urządzenie wpisywało dane również pod adresem przesuniętym w górę o 1. Oznacza to, że tak skonstruowany układ nie ma szans na prawidłowe działanie. Szkoda, bo byłoby to znakomite rozwiązanie.

Podsumowanie

W programie wprowadzanym do procesora Arduino Uno umieściłem kilka (znalezionych w Internecie) kodów SRAM dla kilku różnych urządzeń ICOMa. Jednakże testy mogłem przeprowadzić jedynie z tymi, które odpowiadały mojemu IC-751A. Zatem, sprawdziłem, że kod oznaczony liczbą 1 (Adres zawartości RAM w IC-751 i 751A) po zapisaniu w EX-314 uruchamia transceiver na częstotliwości 14,047 MHz i pozwala używać go w pełnej zgodzie ze wszystkimi funkcjami zapisanymi w Manualu. Kod oznaczony numerem 13 (Adres zawartości RAM w IC-751 używanego w Polsce (mojego)) stanowi „zrzut” kodu zapisanego w moim transceiverze i po włączeniu transceivera uruchamia go na częstotliwości 3,715 MHz. Przy czym wszystkie pozostałe funkcje tego urządzenia działają bez zarzutu. Poprawność działania sprawdziłem korzystając z fabrycznego układu EX-314 jak również z jego kopii z Rys. 1 i 2. Pozostałych kodów, wobec ich znaczącej różnicy z powyższymi, nie sprawdzałem.

Kod oznaczony numerem 1 został pobrany z programu opisanego na stronie internetowej [8] i nie był on testowany przez autorów. Natomiast z sukcesem był testowany kod przeznaczony dla bliżej niesprecyzowanego odbiornika IC-R71. Podobnie z sukcesem został zaprogramowany SRAM w IC-751 za pomocą kodu dostępnego w programie ze strony [16]. Jak widać mamy stosunkowo duży wybór „wsadów” do różnych starszych urządzeń ICOMa, a to oznacza, że nawet wobec całkowitego rozładowania się baterii litowej istnieje bardzo wysokie prawdopodobieństwo reanimacji „zdechłego” urządzenia.  Jednak aby to uczynić potrzebny jest programator taki jak wyżej opisany.

Literatura

  1. https://www.youtube.com/watch?v=ZnG_oaUn5K0
  2. https://www.piexx.com/index.php?main_page=product_info&cPath=8&products_id=26
  3. https://www.qsl.net/ah6rh/am-radio/ik2rnd-icom-ramboard.html
  4. https://www.youtube.com/watch?v=XiqG6cXv1H0
  5. https://sp5qwj.blogspot.com/2017/08/ham-radio-shack.html
  6. https://www.ab4oj.com/icom/w9gb.html
  7. https://www.scribd.com/document/362094351/ICOM-EX-314-Memory-Board-Battery-Replacement-Instuctions
  8. https://github.com/bkbbk/ex314-programmer
  9. https://www.reddit.com/r/amateurradio/comments/7nyruf/bringing_the_icom_ex314_ram_boards_back_to_life/
  10. https://www.qrz.ru/schemes/contribute/technology/icom751/english.shtml
  11. https://www.eevblog.com/forum/rf-microwave/programming-volatile-memory-boards-in-older-icom-rigs/25/
  12. https://www.microchip.com/en-us/tools-resources/develop/microchip-studio#Downloads
  13. https://www.rigpix.com/accessories/icom_ex314_battery-replacement.pdf
  14. https://www.eevblog.com/forum/rf-microwave/programming-volatile-memory-boards-in-older-icom-rigs/50/
  15. https://www.eevblog.com/forum/rf-microwave/programming-volatile-memory-boards-in-older-icom-rigs/200/
  16. https://github.com/b-staton/Arduino_Icom_Ram_programmer

Jacek Michalski, SP5IMO & ex WX3V

Skomentuj

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *