PINTOOL

Projekty użytkowników forum zarówno sprzętowe, jak i związane z programowaniem w dowolnym języku.
Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

PINTOOL

Postautor: gaweł » poniedziałek 20 maja 2019, 02:30

PINTOOL
koncepcja i geneza


pint01_ilu00.jpg


Kiedyś układy mikroprocesorowe były „bardziej zdefragmentowane”, dzisiaj wszystko znajduje się w jednym układzie scalonym. Uruchamiając cokolwiek, zawsze zachodziła potrzeba jakiegoś wysterowania sygnałów. Ot choćby by sprawdzić, czy działa poprawnie dekoder adresowy, czy coś podobnego. Sprowadzało się to do tego, że było dużo „drutów glebowych” (przyłączonych do masy), które były wtykane w podstawkę, z której został wyjęty procesor. Realizując logikę na układach cyfrowych w technologii TTL LS można założyć, że wejścia nie wysterowane mają domyślnie stan logicznej jedynki, które można było „drutem glebowym” zmienić na logiczne zero. Takie „udawanie” procka pozwalało w jakiś elementarny sposób sprawdzić poprawność konstrukcji, montażu itp. Ta dość prosta metoda ma jedną zasadniczą wadę, nie ma możliwości powtórzenia jakiejś sekwencji sygnałów sterujących, tzn ma, trzeba wszystko wytknąć i powtykać w określonej kolejności ponownie. Dodatkowo występuje tu odwieczne niekorzystne zjawisko „dzwonienia styków”. No więc może trzeba coś na to zaradzić. Ileś przemyśleń w końcu doprowadziło do urodzenia się w głowie koncepcji urządzenia wspomagającego tego typu prace.
Całość w sumie pochodzi z ubiegłego wieku, na dokumentacji technologicznej jest data: marzec 2000 roku. Wstępnie zmontowana z jakichś powodów (już nie pamiętam jakich) całość powędrowała do pudełka i odleżała prawie 20 lat. Teraz ponownie pudełko wypłynęło na wierzch i sądzę, że może warto dokończyć budowy. Z racji pewnego stopnia „starożytności” zastosowane rozwiązania są jakie są. Cóż w tamtych czasach nie bardzo były dostępne inne rozwiązania. Czasy Z80 przeszły do historii, poza tym coś takiego na Z80 zajęło by kilka razy większą powierzchnię PCB. Wybór padł na procek z rodziny C51. Wybór... jak wybór mógł być lepszy, mógł być gorszy.
Schemat to:
pint01_ilu01.png
W tym wszystkim mamy jednostkę centralną, czyli proca w przyległościami pamięciowymi:
pint01_ilu02.png
Jest tu klasyczne rozwiązanie środowiska procka C51 z zewnętrzna pamięcią EPROM na program oraz pamięcią RAM jako pamięć operacyjna. W przestrzeni adresowej procka C51 znajduje się jeszcze dodatkowo kilka rejestrów (na kolejnych stronach schematu). Do obsługi tego wszystkiego, w sensie generowania sygnałów typu chip select, zastosowany został układ GAL. W jakimś stopniu rozwiązanie z drugim prockiem (U108, AT89C2051) jest obecnie pewną zagadką, bo nie pamiętam do czego to miało służyć. Ten mały procek komunikuje się z dużym w taki sposób, że wystawia na porcie 8-bitowe dane (równolegle) i generuje na swoim P3.7 sygnał przerwania dla dużego procka, który odczytuje dane jako lokację w pamięci operacyjnej (łącznik trójstanowy U109 z sygnałem wyboru generowanym przez GAL a „druga strona” łącznika jest wpięta w szynę danych dużego procka). To pozwala utworzyć kanał komunikacyjny w jedną stronę. Do czegoś to miało służyć, tylko do czego: dużo zagadek. Duży procek miał jeszcze złącze do typowego wyświetlacza LCD na bazie HD44780 (złącze P104 z obsługą modułu LCD na magistrali 4-bitowej), tylko co miało być wyświetlane? Kolejna zagadka. Pamięć EEPROM na I2C (U106) zapewne miała przechowywać jakieś nastawy i dane konfiguracyjne. Mały DIPSWITCH jest w przestrzeni małego procka. Też zapewne miał jakieś sensowne zastosowanie.
Układ wejściowy to możliwość manipulowania ośmioma pinami.
pint01_ilu03.png
Każdy pin może zostać skonfigurowany do roli wejścia lub wyjścia. Powielony osiem razy zespół może być wejściem (wtedy łącznik trójstanowy 74LS125 jest w trzecim stanie) lub wyjściem (wtedy łącznik trójstanowy 74LS125 jest wysterowany do transmisji sygnałów). Bramka wejściowa (74LS08) może być odcięta do wejścia (sygnałem ENx).
pint01_ilu04.png
Sposób wysterowania elementów wejściowych (tych z poprzedniego kawałka schematu) jest uzależniony od stanu rejestrów U701 .. U703, które są określonymi komórkami w przestrzeni adresowej dużego proca. Sygnały strobu zapisu pochodzą z układu GAL (czyli rejesty są w przestrzeni adresowej pamięci RAM dużego procka)..
Sygnały z bloku wejściowego trafiają na poniższy zespół (dwa przetwarzacze po 4 bity):
pint01_ilu05.png
pint01_ilu06.png
Jest to hawrdwarowy układ „różniczkujący”: wykrywający jakiekolwiek zmiany stanów. Dwa przerzutniki typu D zapamiętują aktualny stan sygnału wejściowego oraz poprzedni (ostatni) stan. Wyjścia przerzutników są komparowane przez bramkę EXOR i finalnie przy jakiejkolwiek zmianie stanu zerują rejestr przesuwający (74LS165). Rejestr ten, taktowany powolnym sygnałem zegarowym po wyzerowaniu będzie „wsuwał” sobie jedynki. Finalnie wygeneruje impuls w logice ujemnej, który finalnie dalej wysteruje diodą LED. Taki sygnalizator dowolnej zmiany stanu na określonym wejściu.
Układ wykrywający zmiany stanów jest taktowany odpowiednim sygnałem zegarowym.
pint01_ilu07.png
Jest klasyczny generator fali prostokątnej o częstotliwości 20MHz (U502), który steruje zejściami zegarowymi w całem bandzie przerzutników typu D. 20MHz to wystarczająca częstotliwość do „obserwacji” sygnałów cyfrowych generowanych lub monitorowanych przez PINTOOL. Szybsze przebiegi niż 50ns mogą być niezauważone. Na układzie U501 (NE555) zrealizowany jest generator do sterowania rejestrami 74LS165 do sygnalizacji o akceptowalnym czasie świecenia diodą LED.
Diody LED są sterowane poprzez układ ULN2803. Nie ma tu żadnej wielkiej filozofii. Dochodzi jedynie sprzętowa sygnalizacja trwania transmisji szeregowej od dużego proca.
pint01_ilu08.png
Front panel to płytka z samymi diodami LED.
pint01_ilu09.png
PCB pokazują następujące rysunki: strona TOP
pint01_ilu10.png
strona BOTTOM:
pint01_ilu11.png
Rozmieszczenie elementów:
pint01_ilu12.png
Zmontowałem (w jakimś stopniu, żaden ezgemplarz nie jest w pełni kompletny) 3 sztuki i jeden front panel.
pint01_ilu13.jpg
pint01_ilu14.jpg
Tak się zastanawiam nad funkcją małego procka. Do głowy mi przychodzi zdalna klawiatura. To ma sens. Generalnie całość miała być przyłączona do PC-ta, gdzie za pomocą nieistniejącego programu (jeszcze), generowane byłyby sekwencje sterujące, czyli co ma być wystawione jako 8-bitowe dane na zewnątrz. Można by to puścić z określonymi parametrami czasowymi lub „puszczać krokowo”. Do tego potrzebne są jakieś klawisze sterujące. Takich nie ma na front panelu. Zapewne via RS232 do małego procka byłby przyłączany jakiś inny mały procek z obsługą lokalnej klawiatury. Duży procek zaś jest przyłączony do kompa, skąd zaciąga sekwencje sterujące. Dlatego transmisja jest w jedną stronę: z małego C51 do dużego C51. Dlatego są dwa kanały szeregowe RS232. To ma sens.
Swoją drogą jak zmienia się świadomość. Dzisiaj zrobiłbym to całkowicie inaczej. 20 lat temu zrobiłem to jak na powyższych obrazkach. Cóż inne czasy → inne możliwości. Dziś mam większą praktykę i wprawę. No cóż, świat się zmienia.
Obecnie są wszystkie niezbędne elementy by dokończyć budowy: jest hardware, jest SDCC, które potrafi tworzyć soft w C na procki C51 (między innymi), jest emulator EPROM, który pozwoli na ćwiczenie softu. No to zabawę czas zacząć...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: PINTOOL

Postautor: tasza » poniedziałek 20 maja 2019, 12:17

Ciekawe archeo, faktycznie czuje się ubiegły wiek, oczywiście w pozytywnym znaczeniu wspomnienia starych dobrych czasów…

Mały procesor U108 wespół z buforem szyny U109 to rzeczywiście realizują upośledzony UART, tylko podający dużemu CPU dane w przerwaniach, no ale malec ma dwustronną, pełną komunikację, to pewnie celowy zabieg. No i tak sobie wymyśliłam, że to mogłoby dać funkcjonalność jakby klastrowania takich przyrządów. To znaczy konfigurujemy do pracy pojedyncze moduły na boku, przez główny UART dużego procesora, potem operacyjnie gdzieś np. na stanowisku laboratoryjnym jest to składane w szafce w łańcuch. RS232 z PC idzie do P102 (główny sprzęg) pierwszego modułu. Z P103 tegoż idziemy kabelkiem do P102 kolejnego modułu. I tak dalej. Z punktu widzenia PC, przy odrobinie sprytu można uzyskać efekt, że to będzie zupełnie transparentne – będzie widać jedno, wirtualne 8xN bitowe urządzenie. No i wtenczas można uzasadnić potrzebę tego prztyczka SW101 – określa adres danego stopnia w kaskadzie, czy pozycję lub funkcję (master albo forwarder-przekazywacz)– jak zwał tak zwał.

Odnośnie samego styku badany/pobudzany układ i to fajne urządzonko, to może warto zerknąć na schematy Analog Discovery 2, na część digital i/o :arrow: analog-discovery-2/reference-manual#digital_io. Rozchodzi mi się głównie o te termistorki PTC na każdej linii cyfrowej. No, ja mam wrażenie, że gdyby nie one to mojego AD2 już by dawno nie było :? . Daleko nie szukając, choćby w staruszku CA80 są przypadki zapinania linii CPU do VCC ( /BUSRQ, /WAIT ), ot taka uroda tej elektroniki, na swoje potrzeby zrobiłam modyfikację z rezystorem podciągającym. Ale bez niej podłączenie takiego sterownika pinów i wymuszenie na np. /BUSRQ stanu L byłoby dla niego (wymuszacza) zgubne, a zgadzamy się że w robionych dawno temu urządzeniach zasilacze 5V swoją moc miały….
Oczywiście można pierwej programowo sprawdzić stan na linii, zanim poda się wymuszenie – ale czym dla będzie różnić się wysoki stan logiczny od twardego VCC? Stąd takie zabezpieczenie chyba wskazane, ot przemyślenia takie.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
piotrek
User
User
Posty: 155
Rejestracja: niedziela 05 lis 2017, 02:46

Re: PINTOOL

Postautor: piotrek » poniedziałek 20 maja 2019, 12:17

Projekt wygląda jak z innej epoki, a to przecież tylko 20 lat. Okazała płytka świadczy o tym jak dużo pracy włożyłeś w ten projekt. Samo wyobrażenie jak zaprojektować, przetestować i uruchomić układ bez większych modyfikacji PCB przywołuje na myśl dlugie godziny monotonnych czynności.
Dzisiaj pewnie wystarczyłaby jakaś plytka developerska rodzaju Maximatora z ewentualnymi prostymi peryferiami.

Zastanawia mnie jak wówczas wyglądała sprawa zamawiania plytek o takiej jakości? Jakiego programu do ich projektowania używałeś?
Dlaczego generator kwarcowy jest przymocowany "trytytką"?

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: PINTOOL

Postautor: tasza » poniedziałek 20 maja 2019, 12:23

piotrek pisze:Dlaczego generator kwarcowy jest przymocowany "trytytką"?

W naszej hutniczej elektronice heavy-duty się tego naoglądałam i ma to uzasadnienie, ponieważ taki generator ma relatywnie sporą masę i na skutek drgań może zwyczajnie wyjść z podstawki. Cienka trytka skutecznie go trzyma (widywałam i grube nici na supełek), a jednocześnie da rade element wymienić, przecinając starą i potem zabezpieczając nową.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: PINTOOL

Postautor: gaweł » poniedziałek 20 maja 2019, 15:07

tasza pisze:
piotrek pisze:Dlaczego generator kwarcowy jest przymocowany "trytytką"?

W naszej hutniczej elektronice heavy-duty się tego naoglądałam i ma to uzasadnienie, ponieważ taki generator ma relatywnie sporą masę i na skutek drgań może zwyczajnie wyjść z podstawki. Cienka trytka skutecznie go trzyma (widywałam i grube nici na supełek), a jednocześnie da rade element wymienić, przecinając starą i potem zabezpieczając nową.

Zgadza się, nic dodać, nic ująć.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: PINTOOL

Postautor: gaweł » poniedziałek 20 maja 2019, 15:53

piotrek pisze:Projekt wygląda jak z innej epoki, a to przecież tylko 20 lat. Okazała płytka świadczy o tym jak dużo pracy włożyłeś w ten projekt. Samo wyobrażenie jak zaprojektować, przetestować i uruchomić układ bez większych modyfikacji PCB przywołuje na myśl dlugie godziny monotonnych czynności.
Dzisiaj pewnie wystarczyłaby jakaś plytka developerska rodzaju Maximatora z ewentualnymi prostymi peryferiami.

Zastanawia mnie jak wówczas wyglądała sprawa zamawiania plytek o takiej jakości? Jakiego programu do ich projektowania używałeś?
Dlaczego generator kwarcowy jest przymocowany "trytytką"?

Sama prawda, coś takiego wymaga wielu godzin przemyśleń. Czy one są monotonne? Jest to kwestia punktu widzenia. Widzisz, jeżeli robi się coś, co jest twoją "filozofią istnienia", coś co sprawia ci frajdę, to nie ma tu żadnej monotonii. Monotonia i efekt znużenia pojawia się w przypadku gdy robisz, bo musisz (a nie dlatego, że chcesz), bo termin, bo ... tysiące innych powodów. Popatrz, niewiele brakowało, bym o tym zapomniał, i tylko przypadek zadecydował, że powróciło. Po prostu czegoś szukałem i musiałem zajrzeć do każdego pudełka i ... odkrycie. Mogłoby się tak zdarzyć, że ileś set godzin zostałoby zmarnowanych plus jakieś koszty na komponenty. Mogłoby, ale się nie zdarzyło.
Doskonale rozumiem, że dzisiaj użyta by została jakaś płytka developerska. Napisałem, jakie czasy, takie możliwości. "Starożytna" elektronika wymagała jednego: myślenia. Wszystko da się zrobić, trzeba tylko odpowiednio pomyśleć.
W tamtych czasach serie prototypowe wykonywał Instytut Tele-Radiotechniczny w Warszawie. Dane dostarczało się na dyskietce. Znasz taki program jak TANGO?

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: PINTOOL

Postautor: gaweł » poniedziałek 20 maja 2019, 16:17

tasza pisze:Odnośnie samego styku badany/pobudzany układ i to fajne urządzonko, to może warto zerknąć na schematy Analog Discovery 2, na część digital i/o :arrow: analog-discovery-2/reference-manual#digital_io. Rozchodzi mi się głównie o te termistorki PTC na każdej linii cyfrowej. No, ja mam wrażenie, że gdyby nie one to mojego AD2 już by dawno nie było :? . Daleko nie szukając, choćby w staruszku CA80 są przypadki zapinania linii CPU do VCC ( /BUSRQ, /WAIT ), ot taka uroda tej elektroniki, na swoje potrzeby zrobiłam modyfikację z rezystorem podciągającym. Ale bez niej podłączenie takiego sterownika pinów i wymuszenie na np. /BUSRQ stanu L byłoby dla niego (wymuszacza) zgubne, a zgadzamy się że w robionych dawno temu urządzeniach zasilacze 5V swoją moc miały….

Tak się składa, że mam w swojej historii podobne zdarzenia. Tak mi się przypomniało, jeszcze w latach 80-tych niechcący scalak TTL dostał na wejście -5V. Rzecz jasna w wyniku zdarzenia umarł. To rodzi pewne problemy: weź teraz załatw na przykładowo 74LS245 (wtedy taki właśnie ucierpiał). Dzisiaj to żaden problem, a dawno, dawno temu to był spory problem: trzeba było udać się na giełdę do wawy, pójść na pociąg o 1 w nocy, by o 5 rano być na giełdzie, później już nie było po co, elementy "rzadkie" były wykupione. Mając to na uwadze, wejście zostało w podobny sposób zabezpieczone.
pint01r_ilu01.png
Podobnie jak w AD2, mam diody, które wezmą na siebie napięcia ujemne i powyżej 5V. No termistorków w szeregu nie przewidziałem :( , cóż człowiek uczy się przez całe życie :) .
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: PINTOOL

Postautor: tasza » poniedziałek 20 maja 2019, 17:58

gaweł pisze:W tamtych czasach serie prototypowe wykonywał Instytut Tele-Radiotechniczny w Warszawie.

Zdjęcie z sobotniego włóczęgostwa naszego po Warszawie, 9 marca tego roku.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
piotrek
User
User
Posty: 155
Rejestracja: niedziela 05 lis 2017, 02:46

Re: PINTOOL

Postautor: piotrek » poniedziałek 20 maja 2019, 23:09

tasza pisze:
piotrek pisze:Dlaczego generator kwarcowy jest przymocowany "trytytką"?

W naszej hutniczej elektronice heavy-duty się tego naoglądałam i ma to uzasadnienie, ponieważ taki generator ma relatywnie sporą masę i na skutek drgań może zwyczajnie wyjść z podstawki.

Dlaczego po prostu nie przylutują do PCB? Cztery nóżki to już solidne podparcie i do tego dobry kontakt elektryczny :)

gaweł pisze:Znasz taki program jak TANGO?

Nie znam, nigdy się z nim nie spotkałem. Używałem tylko Protela i KiCADa.

gaweł pisze:Popatrz, niewiele brakowało, bym o tym zapomniał, i tylko przypadek zadecydował, że powróciło. Po prostu czegoś szukałem i musiałem zajrzeć do każdego pudełka i ... odkrycie.

Taki projekt to swego rodzaju kapsuła czasu. Przynajmniej ja tak mam, że biorąc płytkę projektu sprzed lat wracają myśli i wspomnienia z czasu kiedy nad nim pracowałem. Bo gdy człowiek jest zaangażowany w sprawę zawsze coś zostaje w pamięci mimo upływu czasu :)

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: PINTOOL

Postautor: gaweł » poniedziałek 20 maja 2019, 23:48

piotrek pisze:Dlaczego po prostu nie przylutują do PCB? Cztery nóżki to już solidne podparcie i do tego dobry kontakt elektryczny :)

Niby tak, ale pierwszy egzemplarz, taki pilotażowy często realizuję w 100% w podstawkach. Przywiązałem generator, bo zapewne ciągle mi wypadał. W innym egzemplarzu, jak widać, generator jest niewlutowany, bo ... zabrakło podstawki. Generalnie zawsze staram się układy "wychodzące na zewnątrz" również umieszczać w podstawkach.

piotrek pisze:Nie znam, nigdy się z nim nie spotkałem. Używałem tylko Protela i KiCADa.

Bo też "starożytny program". Był popularny na przełomie 80/90 XX wieku, ja go używałem dosyć długo. Później dorobiłem się własnego softu, który "podpinał się" pod standardy, co zwalniało mnie z niektórych funkcji programów inżynierskich, jak przykładowo generowanie GERBERÓW.

piotrek pisze:Taki projekt to swego rodzaju kapsuła czasu. Przynajmniej ja tak mam, że biorąc płytkę projektu sprzed lat wracają myśli i wspomnienia z czasu kiedy nad nim pracowałem. Bo gdy człowiek jest zaangażowany w sprawę zawsze coś zostaje w pamięci mimo upływu czasu :)

No coś w tym jest.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: PINTOOL

Postautor: gaweł » wtorek 21 maja 2019, 00:54

tasza pisze:Mały procesor U108 wespół z buforem szyny U109 to rzeczywiście realizują upośledzony UART, tylko podający dużemu CPU dane w przerwaniach, no ale malec ma dwustronną, pełną komunikację, to pewnie celowy zabieg. No i tak sobie wymyśliłam, że to mogłoby dać funkcjonalność jakby klastrowania takich przyrządów. To znaczy konfigurujemy do pracy pojedyncze moduły na boku, przez główny UART dużego procesora, potem operacyjnie gdzieś np. na stanowisku laboratoryjnym jest to składane w szafce w łańcuch. RS232 z PC idzie do P102 (główny sprzęg) pierwszego modułu. Z P103 tegoż idziemy kabelkiem do P102 kolejnego modułu. I tak dalej. Z punktu widzenia PC, przy odrobinie sprytu można uzyskać efekt, że to będzie zupełnie transparentne – będzie widać jedno, wirtualne 8xN bitowe urządzenie. No i wtenczas można uzasadnić potrzebę tego prztyczka SW101 – określa adres danego stopnia w kaskadzie, czy pozycję lub funkcję (master albo forwarder-przekazywacz)– jak zwał tak zwał.

Normalnie w głowę zachodzę i nie mogę zrozumieć: skąd wiedziałaś, że miałem taką koncepcję :o . Siedziałaś w mojej głowie?
Generalnie to się zgadza, była koncepcja takiego klastra. Możemy się różnić w samych szczegółach. O ile cię dobrze zrozumiałem, to twoja koncepcja jest podobna do filozofii Daisy-Chain. W tym co ja wymyśliłem przed laty, to była architektura typu gwiazdy. Wiadomo, że w kompie kiedyś było tylko dwa kanały RS232, więc albo trzeba było wtykać i wytykać kabelki (złącza były z tyłu kompa więc jakiś tam niewielki problem manipulacyjny). Rozwiązaniem mogło być rozdzielenie kanału szeregowego na kilka, szczególnie jeżeli nie istnieje potrzeba jednoczesnego dostępu do każdego "podkanału".
To rozwiązanie samo w sobie może stanowić oddzielny wątek, więc pozwoliłem sobie na wyodrębnienie gałęzi do Rozdzielacz RS232. W sumie powstało kilka rozwiązań. Niektóre swój żywot zakończyły jedynie na papierze, inne doczekały się fizycznej realizacji. Ta moja prywatna koncepcja nawet znalazła zastosowanie w firmie, w której wtedy pracowałem i powstało kilka innych mutacji.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: PINTOOL

Postautor: gaweł » poniedziałek 27 maja 2019, 22:12

Jak to się dziwnie składa. W wypowiedzi powyżej trochę minąłem się z prawdą. No cóż, bywa, przepraszam (za powyższe błędy). Okazuje się, że soft to i owszem do tego urządzenia powstał. Namierzyłem, ponad 3,5 tys wierszy w asm. Nie będę go przytaczał, co to chyba nie ma sensu (jak ktoś jest zainteresowany udostępnię ZIP'a, wystarczy tylko poprosić). Lektura własnych wypocin trochę mnie zaskoczyła. Otóż w tym urządzonku była implementowana dosyć niecodzienna komunikacja. Rzecz jasna oparta na transmisji asynchronicznej ale koncepcyjnie wzorowana na SDLC. W takim przypadku, znaczenie DISPSWITCH'a staje się jasne: pozwala ustawić jakiś identyfikator dla urządzenia. Popatrzmy na fragment:

Kod: Zaznacz cały

;
;
;       Komunikacja :
;         Format pakietu :
;             <frame><address><address><command><crc><frame>
;             gdzie:
;               <frame>   - 7EH
;               <address> - 1 bajt (FFH - general pool)
;               <crc>     - 2 bajty
;               <command> - patrz ponizej polecenia i odpowiedzi.
;
;
                NAME    PINTOOL
;       *****************************
;
Format pakietu komunikacyjnego odpowiada idei protokołu komunikacyjnego SDLC. Dlatego musiała powstać do tego softu sprzętowa warstwa komunikacyjna, a tą funkcję spełniał właśnie odgałęziony temat Rozdzielacza RS232. Soft w sumie jest w sporych powijakach, więc nie jestem przekonany, czy warto go dalej ciągnąć w tej wersji. Prawdą jest, że mały C51 spełniał rolę zdalnej klawiatury. Jej obsługa zawarta jest w

Kod: Zaznacz cały

;
                NAME    PINT_KEYB
;       *******************************
;
;                LSTXRF
;
;-----------------------------------------------------------------------------;
$PINTEQUI.S03
;-----------------------------------------------------------------------------;
                RSEG    CODE
;-----------------------------------------------------------------------------
                EXTERN  KBDBuff                 ; PTXRAM.S03
                EXTERN  KBDCycTo                ; PTXRAM.S03
                EXTERN  KBDCycFr                ; PTXRAM.S03
;-----------------------------------------------------------------------------
                PUBLIC  KeybPresent             ; PTKEYB.S03
                PUBLIC  GetKbdCh                ; PTKEYB.S03
                PUBLIC  InputChar               ; PTKEYB.S03
;-----------------------------------------------------------------------------;
KeybPresent     :                               ;PROCEDURE KeybPresent ( ) : BOOLEAN ;
;***************                                 BEGIN (* KeybPresent *)
                CLR     EA                      ; DI ( ) ;
                MOV     DPTR , # KBDCycFr       ; IF KBDCycTo = KBDCycFr THEN
                MOVX    A , @ DPTR              ;
                MOV     B , A                   ;
                MOV     DPTR , # KBDCycTo       ;
                MOVX    A , @ DPTR              ;
                CJNE    A , B , KBPre_0         ;
                SETB    EA                      ;  EI ( ) ;
                CLR     C                       ;  RETURN FALSE ;
                RET                             ; ELSE
 KBPre_0        :                               ;
                SETB    EA                      ;  EI ( ) ;
                SETB    C                       ;  RETURN TRUE ;
                                                ; END (* IF .. ELSE *) ;
                RET                             ;END KeybPresent ;
;-----------------------------------------------------------------------------
GetKbdCh        :                               ;PROCEDURE GetKbdCh ( ) : BYTE ;
;****************                                BEGIN (* GetKbdCh *)
                PUSH    REG1                    ;
                CLR     EA                      ; DI ( ) ;
                MOV     DPTR , # KBDCycFr       ; A := KBDBuff [ KBDCycFr ] ;
                MOVX    A , @ DPTR              ;
                ADD     A , # LOW ( KBDBuff )   ;
                MOV     DPL , A                 ;
                CLR     A                       ;
                ADDC    A , # HIGH ( KBDBuff )  ;
                MOV     DPH , A                 ;
                MOVX    A , @ DPTR              ;
                PUSH    ACC                     ;
                MOV     DPTR , # KBDCycFr       ; KBDCycFr := ( KBDCycFr + 1 ) MOD KBDBuffSize ;
                MOVX    A , @ DPTR              ;
                INC     A                       ;
                ANL     A , # KBDBuffSize - 1   ;
                MOVX    @ DPTR , A              ;
                SETB    EA                      ; EI ( ) ;
                POP     ACC                     ; RETURN A ;
                POP     REG1                    ;
                RET                             ;END GetKbdCh ;
;-----------------------------------------------------------------------------
InputChar       :                               ;PROCEDURE InputChar ( ) : BYTE ;
;****************                                BEGIN (* InputChar *)
 InpC_0         :                               ; REPEAT
                LCALL   KeybPresent             ;
                JNC     InpC_0                  ; UNTIL KeybPresent ( ) ;
                LCALL   GetKbdCh                ; RETURN GetKbdCh ( ) ;
                RET                             ;END InputChar ;
;-----------------------------------------------------------------------------
                END
Powyższy soft to typowa kolejka FIFO związana ze zmienną KBDBuff (bufor cykliczny). W istniejącym sofcie

Kod: Zaznacz cały

                ASEG
;
;  *******************************************************************
;  *******************************************************************
;  ****                                                           ****
;  ****            TECHNICAL PROCESSOR SERVICES                   ****
;  ****                                                           ****
;  *******************************************************************
;  *******************************************************************
;
                ORG     RESET                   ;
                LJMP    Main                    ;
;-----------------------------------------------------------------------------;
                ORG     EXTI0                   ;
                RETI                            ;
;-----------------------------------------------------------------------------;
                ORG     TIMER0                  ;
                LJMP    Tim0IRQ                 ;
;-----------------------------------------------------------------------------;
                ORG     EXTI1                   ;
                RETI                            ;
;-----------------------------------------------------------------------------;
                ORG     TIMER1                  ;
                RETI                            ;
;-----------------------------------------------------------------------------;
                ORG     SINT                    ;
                JMP     SerialIRQ               ;
;
;-----------------------------------------------------------------------------;
nie ma jeszcze implementacji obsługi przerwań zewnętrznych (wektor przerwań zawiera RETI). Natomiast widać "tymczasową" realizację strumienia klawiatury opartej na UART dużego C51.

Kod: Zaznacz cały

SerialIRQ       :                               ;PROCEDURE SerialIRQ ;
;****************                                BEGIN (* SerialIRQ *)
                PUSH    ACC                     ;
                PUSH    PSW                     ;
                PUSH    DPL                     ;
                PUSH    DPH                     ;
                PUSH    REG5                    ;
 SERS_8         :                               ; LOOP
                JB      RI , SERS_1             ;  IF NOT ( TXD_IRQ OR RXD_IRQ ) THEN
                JB      TI , SERS_5             ;
                LJMP    SERS_2                  ;   EXIT ;
 SERS_5         :                               ;  END (* IF *) ;
                CLR     TI                      ;  IF TXD_IRQ THEN
                MOV     DPTR , # TXDCycFr       ;   IF TXDCycTo = TXDCycFr THEN
                MOVX    A , @ DPTR              ;
                MOV     R5 , A                  ;
                MOV     DPTR , # TXDCycTo       ;
                MOVX    A , @ DPTR              ;
                CJNE    A , REG5 , SERS_3       ;
                CLR     A                       ;    TXDWork := 0 ;
                MOV     DPTR , # TXDWork        ;
                MOVX    @ DPTR , A              ;
                LJMP    SERS_8                  ;    RETURN ;
 SERS_3         :                               ;   END (* IF *) ;
                MOV     DPTR , # TXDCycFr       ;   [SBUF] := TXDBuff [ TXDCycFr ] ;
                MOVX    A ,  @ DPTR             ;
                ADD     A , # LOW ( TXDBuff )   ;
                MOV     DPL , A                 ;
                CLR     A                       ;
                ADDC    A , # HIGH ( TXDBuff )  ;
                MOV     DPH , A                 ;
                MOVX    A , @ DPTR              ;
                MOV     SBUF , A                ;
                MOV     DPTR , # TXDCycFr       ;   TXDCycFr := ( TXDCycFr + 1 ) MOD 256 ;
                MOVX    A , @ DPTR              ;
                INC     A                       ;
                MOVX    @ DPTR , A              ;
                MOV     A , # 1                 ;   TXDWork := 1 ;
                MOV     DPTR , # TXDWork        ;
                MOVX    @ DPTR , A              ;
                LJMP    SERS_8                  ;   RETURN ;
                                                ;  END (* IF *) ;
 SERS_1         :                               ;  IF RXD_IRQ THEN
;                MOV     DPTR , # RXDCycTo       ;   RXDBuff [ RXDCycTo ] := [SBUF] ;
                MOV     DPTR , # KBDCycTo       ;   KBDBuff [ KBDCycTo ] := [SBUF] ;
                MOVX    A , @ DPTR              ;
;                ADD     A , # LOW ( RXDBuff )   ;
                ADD     A , # LOW ( KBDBuff )   ;
                MOV     DPL , A                 ;
                CLR     A                       ;
;                ADDC    A , # HIGH ( RXDBuff )  ;
                ADDC    A , # HIGH ( KBDBuff )  ;
                MOV     DPH , A                 ;
                MOV     A , SBUF                ;
                MOVX    @ DPTR , A              ;
;                MOV     DPTR , # RXDCycTo       ;   RXDCycTo := ( RXDCycTo + 1 ) MOD 256 ;
                MOV     DPTR , # KBDCycTo       ;   KBDCycTo := ( KBDCycTo + 1 ) MOD KBDBuffSize ;
                MOVX    A , @ DPTR              ;
                INC     A                       ;
ANL A,#KBDBuffSize-1
                MOVX    @ DPTR , A              ;
                                                ;   INCL ( Stream , RSStream ) ;
;                ORL     LOW ( Stream ) , # RSStream
                MOV     A , # TRUE              ;   HelloExitFlag := TRUE ;
                MOV     LOW (HelloExitFlag) , A ;
                CLR     RI                      ;  END (* IF *) ;
 SERS_2         :                               ; END (* LOOP *) ;
                POP     REG5                    ;
                POP     DPH                     ;
                POP     DPL                     ;
                POP     PSW                     ;
                POP     ACC                     ;
                RETI                            ;END SerialIRQ ;
;-----------------------------------------------------------------------------
gdzie chwilowo przerwania od UART nagarniają dane do kolejki FIFO klawiatury zamiast FIFO UART'a. Drugą nietypową cechą tego softu jest to, że można go zaliczyć do softu sterowanego zdarzeniami wraz z bardzo prymitywną realizacją idei mutlitaskingu.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „DIY”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości