
Dziś na tapecie znajdzie się dzwonek do drzwi o nazwie kodowej MIK64, który nabyłem dawno, dawno temu, nie wiedząc do końca nawet, co to jest. Niedawno osoba, od której go wtedy kupiłem odezwała się do mnie z prośba o zbadanie go z uwagi na całkowity brak informacji w sieci, więc postanowiłem zgłębić temat. Dodatkowo postanowiłem też stworzyć jego wierną kopię (reprodukcje) jako prezent. Miało być łatwo, szybko i przyjemnie, a jak wyszło? Przekonajcie się sami...
Wstęp
O polskim komputerku CA80 firmy MIK słyszał chyba każdy, a czy wiecie, że na koncie tej firmy było też kilka innych urządzeń (dzwonek do drzwi, pozytywka, sterownik dzwonka szkolnego, tablice diodowe, próbnik logiczny)? Zapraszam do zapoznania się z moją galerią: https://www.elektroda.pl/rtvforum/topic3205407.html.
Ten temat będzie o dzwonku do drzwi.
Z informacji znalezionych w sieci:
Źródło - magazyn "Elektronik Hobby 06.1993":





Źródło - aukcja allegro:


widać, że był on sprzedawany razem z dedykowaną obudową w specjalnie przygotowanym pudełku. Jednak moja wersja to jakaś samoróbka - płytka główna jest co prawda taka jak w oryginale, ale obudowa jest już inna (uniwersalna), głośnik jest inny (większy), dodatkowo jest też gniazdo chinch na drugi głośnik wraz z dodatkowym potencjometrem. Oraz mnóstwo artystycznego nieładu w przewodach:













Odtwarzanie schematu
Na podstawie zdjęć i z pomocą miernika ciągłości odtworzyłem układ ścieżek i pośrednio schemat.


Teraz przyszedł czas na odszyfrowanie tajemniczych elementów ze startymi oznaczeniami:
1) U1 = DIP40 - to oczywiście Z80CPU
2) U2 = DIP24 to bez wątpienia jakiś EPROM (w tej obudowie może to być: 2708 (1kB), 2716 (2kB) lub 2732 (4kB). Wszystkie one mają jednak taki sam pin-out (standard JEDEC), po prostu miejsca wyższych linii adresowych są w mniejszych pamięciach albo nieużywane albo przeznaczone na napięcie programowania. Zasadniczo zwykle wystarczy taką pamięć odczytać w programatorze jako "największy model", a potem tylko usunąć zdublowaną zawartość. Warto wyłączyć detekcję modelu (raz aby programator nie krzyczał błędami gdy model nie będzie się zgadzał, a dwa - żeby pamięci nie uszkodzić, bo detekcja modelu polega na podaniu wysokiego napięcia na jeden z pinów i odczyt przez programator sygnatury)

3) U3 = DIP14 - tu miałem małą wątpliwość.

Patrząc na piny zasilania (7=GND, 14=VCC) doszedłem do wniosku, że to musi być jakiś układ 74XX. Patrząc na wzajemne kaskadowe połączenia pinów ze sobą oraz dołączone elementy R/C było jasne, że to jakieś dwuwejściowe bramki odwracające, które generują sygnał zegarowy dla procesora. Dodatkowo kolejność wejść/wyjść zdradziła od razu, ze musi to być 74*02 (4x bramka NOT OR). Dlaczego? Wszystkie podwójne bramki mają skierowane wyjścia w dół, jedynie w 74*02 są w górę:

Późniejsze sprawdzenie w testerze oczywiście potwierdziło to.
4) U4 = DIP14 - tutaj miałem dużą wątpliwość

Rozkład pinów zasilania tez sugerował układ 74XX. Podłączenie linii adresowych od procesora oraz tranzystora sterującego głośnikiem sugerowałoby jakiś dekoder (te jednak są w obudowach DIP16) lub zatrzask (przerzutnik). Dobrze mi znany przerzutnik RS (7474) nie pasował wyjściami i wejściami do powyższego połączenia. Przeglądając noty katalogowe innych układów doszedłem do wniosku, że przerzutnik JK jedynkująco-kasujący (74107) by odpowiadał. Jakoś nigdy nie miałem z nim wcześniej do czynienia, a jedyny mój kontakt z tym układem był ok. 9 lat temu na studiach na wstępie do układów logicznych (i to tylko w teorii).

Niestety programator (TL866) ne ma w opcjach testu możliwośći sprawdzenia tego układu.


Ale jako, że miałem w swojej kolekcji akurat dwa układy 74107 (i oba polskiej produkcji CEMI) to postanowiłem do swojego testera dodać definicję tego układu, potem sprawdzić jej poprawność na posiadanych układach a w końcu zweryfikować, czy układ ze startym oznaczeniem to 74707 (było to bardzo prawdopodobne, że to nawet też scalak spod szyldu CEMI - kształt wgłębienia i obecne napisy od dołu obudowy były podobne)
Niestety, tester nie chciał potwierdzić działania posiadanych układów mimo, że funkcja testu była zgodna z oczekiwanym zachowaniem układów na podstawie specyfikacji. Próbowałem spowolnić test, ale niczego to nie zmieniło. Po długim czasie szukania możliwych przyczyn i badaniu miernikiem poziomów napięć okazało się, że coś się nie zgadza. Albo oba posiadane układy byłyby uszkodzone (mało prawdopodobne), albo.. problemem były rezystory zabezpieczające (1k) w szeregu na każdej linii testera. Okazuje się, ze te układy od CEMI są tak marne, że swoimi wejściami pobierają gigantyczny prąd:
Prąd 1.6 mA przy rezystorze 1 k to już 1.6 V spadku z 5 V, jeszcze do zniesienia. Ale 17mA? Dramat..

Ja rozumiem, że TTLe muszą wejściami pobierać prąd (wszakże to nie CMOSy), no ale taki pierwszy z brzegu 74LS107 od National Instruments to pobiera max 0.4 mA

Może to i dobrze, że CEMI upadła? Łezka się w oku kręci sentymentalistom, że mieliśmy własną wytwórnie półprzewodników. Ale z technologią to jednak byliśmy za murzynami.
Wykładowca kiedyś żartował, że piekli te wafle krzemowe w piecu po kiełbaskach i to w nocy, bo raz że w dzień piec był używany do kiełbasek, a dwa że w dzień jeździły tramwaje i od drgań by im nie wychodziły te wafle. Chyba miał rację (kto robi fabrykę półprzewodników w środku miasta??)
Schemat
Po tych przemyśleniach dzwonek został rozpracowany. Jest tu:
* transformator 230V-12V z mostkiem prostowniczym zasilającym całość
* procesor Z80 ze swoją pamięcią taktowany zegarem 2.9 MHz
* pojedynczy tranzystor sterujący głośnikiem (na zasadzie włącz/wyłącz - PWM; bez odcinania składowej stałej)
* transoptor odbierający sygnał z zewnętrznego przycisku, zasilanego z 12V
* przyciski zwierające reset i dwie linie przerwań procesora
* przerzutnik JK, podłączony w ten sposób, że cykl zapisu przez procesor pod adres:
$40 - powoduje włączenie głośnika (podanie na niego zasilania 5V)
$80 - powoduje wyłączenie głośnika (odłączenie go od zasilania)
Czyli klasyczny 1 bitowy PCM.
* dziwny wihajster z przodu (wtyczka mini-jack), która po wsadzeniu zwiera drugą stronę przycisków R/T/D do masy (bez niej przyciski nie są do niczego podłączone) - zabezpieczenie przed zmianą nastawień np przez dzieci?

Reprodukcja
Przyszedł krok na zaprojektowanie własnej płytki. Poprawiłem w stosunku do oryginału kilka rzeczy
* umieszczenie wszystkich elementów (potencjometrów, kostki do przewodów) bezpośrednio na PCB (uniknięcie plątaniny przewodów),
* zasilanie bezpośrednio z 9V (kto w dzisiejszych czasach stosuje transformatory)
* dodanie mostka prostowniczego z diod za wejściem zasilania DC (aby zarówno zasilacz z PLUSEM jak i MINUSEM w środku działał)
* dodanie rezystorów podciągających linii /NMI, /INT, /RESET (może wersja TTL procesora Z80 ich nie wymagała, ale w CMOSowych to obowiązkowe)
* dodanie kondensatorów eliminujących drgania styków przycisków
* podłączenie wejść drugiej nieużywanej bramki 74107 do +5V. W oryginale była ona podłączona jak niżej, czyli nic nie robiła. W sumie nie wiem jaki miał być zamysł tego niedokończonego czegoś (jakiś dzielnik?).

Odpowiednie umiejscowienie elementów sprawiło, że płytka wyszła praktycznie jednostronna (na górze tyle ścieżek, co kot napłakał). Wg mnie bardziej estetyczna niż oryginał, ha:



Uruchamianie
Jak to w życiu bywa, projekt (prawie) nigdy nie działa od pierwszego uruchomienia. Albo błąd w schemacie, albo błąd w wykonaniu (podtrawienie/zwarcie), albo lutowaniu (zwarcie/odwrotnie wlutowanie). I tu było nie inaczej - układ po włączeniu nie dawał jakichkolwiek oznak życia. Ale jak się okazało po 2 dniach debugowania - mimo poprawnego odtworzenia schematów i poprawnego wykonania, przyczyny problemów były zupełnie nietypowe.
Sygnał zegarowy
Pierwszy kłopot to brak sygnału zegarowego na wejściu procesora. Czyżby coś nie tak z generatorem zbudowanym z bramek? Przecież jest identyczny jak w oryginale, sprawdziłem 10 razy, nawet wylutowałem elementy R/C z oryginału, aby poprawnie zmierzyć ich wartość (to C5 to nie wiem co to miało być - na płytce było miejsce na przylutowanie tam jakiegoś elementu SMD - ale czy kondensator, rezystor, dioda, kto wie.. ja tam nic nie dawałem)

Przeglądając schematy generatorów na bramkach w sieci, spotykałem identyczne jak tu, więc układ jest poprawny (w sieci dominują na bramkach NAND lub negatorach ale to bez różnicy, bo ten NOR jest przecież tak połączony, że działa właśnie jak negator). No ale nie działa. Może ten układ bez oznaczeń to jednak nie 7402? No ale przechodził test.. No ale może to jest jakiś z wejściami Schmitta? Zbudowałem na szybko taki generator na płytce drukowanej, nieobciążony procesorem, aby wykluczyć wpływ innych elementów, tez nie działa. Może mój układ 74LS02 jest uszkodzony? Dałem inny 74LS02, tez nie działa.. Przecież to jest proste jak drut. Nawet sobie rozpisałem mechanizm generacji:

Ale okazuje się, że ten opis działa do układów idealnych (i CMOSów, bo one są bliskie ideałom). TTLe, która w środku zbudowane są jak poniżej mają inne własności i łączenie ich z analogowym światem nie jest takie różowe.

robiłem sobie nawet prosty eksperyment - wziąłem dwa scalaki: 74HC00 (CMOS) i 74LS00 (TTL) i połączyłem wejście z wyjściem jednej bramki w każdym z nich:

Zgodnie z oczekiwaniem, w przypadku 74HC00 na wyjściu otrzymałem generator o dużej częstotliwości (ograniczonej przez szybkość bramki), a dla 74LS00 otrzymałem na wyjściu jakieś 1.2V napięcia stałego.. Dramat. Ale dlaczego? Problem jest z łączeniem wejścia z wyjściem tej samej bramki. W TTLach to nie będzie generować, bo nawet pojedynczy tranzystor przecież można rozpatrywać jako inwerter (klucz nasycony) Ale przecież łącząc jego wejście z wyjściem nie będzie generował:

Aby rozwiązać problem, należy zlikwidować sprzężenia wejścia z wyjściem tej samej bramki. W tym celu wykorzystam trochę inny układ. Ma dwie zalety - pierwsza jest taka, że działa z TTLem, a druga - różni się minimalnie w stosunku do pierwszej - dlatego wystarczy wylutować R2 i przelutować go w inne miejsce, obędzie się nawet bez cięcia ścieżek.

Po tej zmianie sygnał zegarowy już się pojawił ale, układ nadal nie działał..
Dziwna pamięć EPROM
Okazuje się, że pamięć EPROM, która siedziała w oryginalnym dzwonku nie została przeze mnie prawidłowo sczytana. W programatorze TL866 każdy odczyt dawał różniące się między sobą kilkoma bajtami wyniki. Sugerowałoby to:
* uszkodzenie pamięci (ulotnienie się danych) - jednak oryginalny dzwonek przecież działał
* brudne styki (te przeczyściłem, bez efektu).
Nie mogąc zmusić TL866, wykorzystałem swój drugi, autorski programator (używałem go zanim kupiłem TL866, a obecnie tylko sporadycznie do odczytu pamięci, których TL nie obsługuje)


Dopiero dodanie ok. 500 us przerwy pomiędzy wystawieniem adresu, a odczytem magistrali danych pozwoliło na osiągnięcie powtarzalnych wyników (wniosek: ta pamięć jest straszliwie wolna). Przy okazji z 4 kB odczytanych danych, druga połowa była identyczna z pierwszą, co oznacza, że to pamięć 2716.
Przeprogramowałem więc pamięć w mojej kopii dzwonka ("EPROM-KOPIA1") świeżo odczytaną zawartością (mam nadzieje że już teraz poprawną). Tym razem dzwonek ożył, jakoś działał, ale.. Niektóre (większość) melodii miałem wrażenie, że nie jest odgrywana prawidłowo (pojawiały się losowe tony). Może jakiś błąd na płytce? Przełożyłem pamięć z oryginalnego dzwonka ("EPROM-ORYGINAŁ") do mojej kopii no i działa prawidłowo. Czyli płytka jest OK, z pamięcią coś nie tak. Odczytałem EPROM-KOPIA1 - ta jest bit w bit identyczna z "EPROM-ORYGINAŁ".
To może EPROM-KOPIA1 jest za wolna? (450 ns). Wziąłem drugą (200 ns) i zaprogramowałem. Efekt identyczny. Wziąłem trzecią i zaprogramowałem - też identyczne losowe tony.
To może w końcu źle odczytałem pierwowzór? Wyciągnąłem z szafy komputerek przenośny 386, do którego kiedyś zrobiłem obudowę z paneli podłogowych, podłączyłem do niego archaiczny programator Piccolo na port szeregowy, odczytałem nim "EPROM-ORYGINAŁ". Wynik identyczny jak za pomocą wcześniejszego programatora. Czary jakieś? Może jakimś cudem Z80 wie, że to kopia a nie oryginał i dlatego odmawia współpracy? (np. odczytując sygnaturę pamięci czy wykorzystując jakieś inne nieznane własciwości)? Raczej niemożliwe






Postanowiłem przyjrzeć się jeszcze raz na schemat połączeń tej pamięci. To, co przykuło moją uwagę to linia Z80-A11 podłączona do pinu 18, który w pamięciach 2716/2732 jest pinem /CE.

Nie znam dokładnie architektury Z80 ale takie połączenie spowodowałoby, że pamięć byłaby jedynie aktywna w sytuacji, gdy Z80-A11 byłoby zerem, czyli gdy CPU odwołuje się jedynie do zakresu $000-$7ff. Byłoby to logiczne, gdyby na płytce były tez inne układy wejścia/wyjścia (np. pamięć RAM), wtedy można byłoby w ten sposób dodać do przestrzeni adresowej kilka układów bez konieczności użycia zewnętrznego dekodera. Np łącząc dodatkowo Z80-A12 z /CE pamięci RAM można byłoby spowodować, że:
Code:
A80-A12 | Z80-A11 |
=RAM/CE | =ROM/CE |
0 | 0 | $0000-$07ff - dostęp zabroniony (wtedy obie pamięci są aktywne)
0 | 1 | $0800-$0fff - dostęp do pamięci RAM
1 | 0 | $1000-$17ff- dostęp do pamięci ROM
Tutaj jednak była pojedyncza pamięć, więc takie kombinacje byłyby bezcelowe. Teraz dopiero przypomniałem sobie, że w pamięciach MASK-ROM z kartridży od Atari 2600, podobnie jak tutaj, pin 18 nie pełnił funkcji /CE ale pod nim była jedenasta linia adresowa. Zmodyfikowałem oprogramowanie swojego programatora tak, aby też sterował ta linią jako jedenastą no i bomba - otrzymałem 4 kB danych, z których pierwsza połówka (A11=0) oraz druga połówka (A11=1) są RÓŻNE. To wyjaśniło, dlaczego z moim zaprogramowanym EPROMEM to nie działało: w momencie gdy procesor ustawiał A11=1, pamięć się dezaktywowała podczas gdy powinna wystawiać swoją druga połowę danych. Po ponownym przeprogramowaniu "EPROM-KOPIA" oraz drobnej modyfikacji PCB, moja kopia dzwonka wreszcie zaczęła działać!
Zgranie melodii
Na zakończenie chciałem zgrać wszystkie melodie z dzwonka do komputera. Mogłem albo zdekompilować kod, próbować go analizować i wyciągnąć z niego tony, które są grane albo zgrać wyjście głośnika za pomocą wejścia karty dźwiękowej i poddać następnie otrzymany plik analizie, aby wyciągnąć z niego nuty (wysokości tonów + czas trwania).
Zapoznałem się wreszcie dokładnie z instrukcją dzwonka - musiałem ją czytać z 15 razy aby zrozumieć o co chodzi.
Code:
Skrócona instrukcja obsługi:
Objaśnienia:
R - klawisz lewy,
T - klawisz środkowy,
D - klawisz prawy
[D] oznacza potwierdzenie klawiszem D
- kreska oznacza stan po naciśnięciu T i odegraniu długiego sygnału
Naciśnięcie klawisza:
R - w dowolnej chwili, to wybór firmowych parametrów
T - w czasie grania to, wybór firmowych parametrów (jak R)
D - w czasie gdy pozytywka nie gra to odegranie kolejnej melodii
T[D] - wybór zestawu
T - blokowanie ostatnio odegranej melodii
T-T[D] - wybór barwy tonu
T-T - melodie długie na krótkie i odwrotnie
T-D[D] - wybór szybkości grania
T-D - wyzwalanie przerywane na ciągłe i odwrotnie
Wybór zestawu: .1.2.3.4.5.6.7.8.9
Kropka oznacza krótki sygnał po naciśnięciu klawisza T
Spis melodii zawartych w poszczególnych zestawach: (C) - oznacza melodię zakodowaną w całości lub obszernym fragmencie.
Kolędy
01. Dzisiaj w Betlejem (C)
02. Gdy się Chrystus rodzi (C)
03. Gdy śliczna Panna Syna kołysała (C)
04. Wśród nocnej ciszy (C)
05. Przybieżeli do Betlejem (C)
06. Ach ubogi żłobie (C)
07. Pójdźmy wszyscy do stajenki (C)
08. Jezus malusieńki (C)
Ludowe i popularne
09. Szła dzieweczka (C) Śląsk
10. Czerwone jabłuszko (C) Kujawy
11. Prząśniczka (C) Łódź
12. Kukułeczka (C) Mazowsze
13. Jeszcze jeden mazur dzisiaj (C) Tymulski
14. Upływa szybko życie (C) F. Leśniak
15. Płonie ognisko J. Braun
16. Głęboka studzienka Krakowskie
17. Poszła Karolinka Śląsk
18. Hej, idem w las Podhale
19. Hej, bystra woda Podhale
20. Nie chcę cię (C) Śląsk
21. Płynie Wisła płynie (C) Krakowskie
22. Krakowiaczek ci ja (C) Krakowskie
23. Zasiali górale (C) Śląsk
24. W murowanej piwnicy Podhale
25. Umówiłem się z nią na dziewiątą
26. A jak będzie słońce i pogoda Kujawy
27. Tylko we Lwowie H. Wars
28. Płonie ognisko w lesie Harcerska
29. Kurdesz (C)
30. Sto lat (C)
Żołnierskie
31. Rozkwitają pąki białych róż (C)
32. Dziś do ciebie przyjść nie mogę (C)
33. Rozszumiały się wierzby płaczące (C)
34. O mój rozmarynie (C)
35. Wojenko wojenko (C)
36. Przybyli ułani pod okienko (C)
37. Raduje się serce (C)
38. Maszerują strzelcy maszerują
39. Serce w plecaku
Rock i inne
40. When I'm sixty four (C) The Beatles
41. Yellow submarine The Beatles
42. Ob-la-di, Ob-la-da The beatles
43. Alouette (C)
44. My Bonnie (C)
45. When the Saints (C)
46. Happy birthday to you (C)
47. The entertainer
48. Ojciec chrzestny
49. La Cumparsita
Klasyka
50. Dla Elizy (C) L.V. Beethoven
51. Kankan (C) J. Offenbach
52. Marsz tryumfalmy G. Verdi
53. Marsz torreadora G. Bizet
54. Jezioro łabędzie P. Czajkowski
55. Bolero M. Ravel
56. Fale Dunaju J. Ivanovich
57. Marsz weselny F. Mendelssohn
58. Kalinka (C)
Patriotyczne
59. Pierwsza brygada (C)
60. Jeszcze Polska nie zginęła
61. Warszawianka K. Kurpiński
62. Rota (C) F. Nowowiejski
63. Jak długo w sercu naszym (O)
64. Wszystko co nasze
Jakieś magiczne sekwencje klawiszy; niektóre takie same sekwencje robią inne rzeczy - masakra; autor dzwonka jest zdolnym dydaktykiem, elektronikiem, ale niestety na projektowaniu interfejsu użytkownika się nie zna.
Próbowałem ustawić wyzwalanie ciągłe (czyli aby trzymanie przycisku dzwonka powodowało odgrywanie wszystkie melodie po kolei + ustawienie zestawu wszystkich melodii).
Wg instrukcji T-D. Ale ta kombinacja też powoduje możliwość wyboru szybkości grania (zaczynają się odtwarzać melodia z różnych tempach). Kompletnie nieintuicyjne.
Finalnie się udało. Wszystkie melodie trwają 17 minut. Jest to oczywiście sygnał prostokątny o 2 wartościach (1 bitowy PWM). Początkowo zastanawiałem się, czemu jest tyle częstotliwości na spektrogramie, potem przypomniałem sobie ze studiów, że przecież sygnał prostokątny ma nieskończone widmo


Ostatnie szlify
Zwieńczeniem całości było zapakowanie całej płytki do obudowy, przykręcenie jej, wycięcie otworów na gniazda oraz przymocowanie głośniczka.


Cool? Ranking DIY