Mikrokomputer CA80

zdalne sterowanie klawiaturą


charakterystyka i informacje ogólne
książki / dokumentacja (literatura)
ulotki i broszurki MIK (literatura)
skany artykułów z prasy (literatura)
programator EPROM (aplikacje)
dwupunktowy termometr (aplikacje)
licznik-timer Z80-CTC i dioda RGB (aplikacje)
Direct Memory Loader - ładowarka do pamięci (akcesoria)
próbnik stanów logicznych MIK03C (akcesoria)
zdalnie sterowana klawiatura (akcesoria)
przegląd procedur systemowych (programowanie)

☘☘☘☘☘☘☘☘

Temat zdalnego sterowania panelem operatorskim pewnego `starego, smutnego urządzenia` wpadł mi w pracy kilka tygodni temu, w ramach eksperymentów jakby tu z zadania się wykaraskać wykorzystałam także systemik CA80. Potem zbudowanie sterowanej klawiaturki do CA stało się celem samym w sobie i zaowocowało materiałem jak poniżej, no i jak bożkowie celtyccy dadzą - wypracowaniem w którymś z wiosennych numerów EdW.

podglądanie klawiatury CA80

Oczywiście niezawodne pudełeczko AD2 w roli analizatora stanów logicznych, należy zaznajomić się z przebiegami czasowymi na liniach klawiatury starego CA80 (dziesięć kolumn /7442/ x trzy rzędy /PA6,5,4/ kostki 8255).



Praca dekodera 4/10 zgodna z oczekiwaniem, smutkiem napawa czas trwania wyboru jednej kolumny klawiatury - około 100us.

 

wparcie sprzętowe

Cała zabawa w zdalną klawiaturę wymaga pewnych zabiegów układowych, a pryncypia w tym są dwa:
  • zakaz "grzebania" w układach CA80 bo i tak już od życia dostał, dopuszczalne są tylko nieinwazyjne metody pobierania danych
  • minimalizacja zajętości linii I/O Arduino - najlepiej byłoby, aby wszystko zmieściło się w jednym arduinowym porcie.

    I stąd właśnie obecność układu 74147 - enkodera priorytetowego 10/4, którego dokumentację znajdziemy tu: ➮ 10-line to 4-line priority enkoders. Kostka przytrafiła mi się w SMD stąd płytka-adapter (btw, dwukrotnie droższa od samego układu, no taki life).



    dygresja o łączeniu płytek w starym CA80

    Tu uważam za wielce zasadną wtrącinę o łączeniu płytek CA80, bo szczerze mówiąc słabo mi się robi na widok pokracznie i niestety na stałe polutowanych wiązek przewodów pomiędzy płytkami systemu. Listwy goldpin są przecież ogólnie dostępne, jednopinowe, łamane z listwy nasadki także - jaki problem pospinać to elastycznymi przewodami? Na upartego można by wykorzystać choćby tanie jak ryż, chińskie kabelki do płytek stykowych. Daje to super komfort pracy z tak połączonymi płytkami, jak się kabelek wyrobi - wymiana na inny to dosłownie chwila. No i mamy tym sposobem drugi komplet styków do wykorzystania do własnych celów, od podpinania analizatora logicznego (jak AD2) po własne fanaberie (jak moje 74147).







    interfejs - cześć Arduino

    Schemat części elektronicznej finalnie wypada taki i zasada działania w dwóch zdaniach: binarna pozycja logicznego zera ustawianego podczas skanowania klawiatury jest odtwarzana w enkoderze 74147 i wprowadzana do Ardu, takoż z Ardu wychodzą trzy bity sterujące rzędami klawiatury (8255.PA6,5,4) systemu CA80. Program w Ardu mapuje znak z łącza szeregowego na odpowiedni element tabeli lookup indeksowanej numerem kolumny, wartość tego elementu stanowi o wciśnięciu lub zwolnieniu wybranego klawisza, ot co.




    Oczywiście program na Arduino (UNO):➮ ca80typer_ardu.ino

     



    Program w Pascal na komputer PC:➮ ca80typer.pas

    Skrócona instrukcja obsługi:
    ca80typer --port=nazwa_portu --speed=szybkosc_klikania --file=scieżka_do_pliku_HEX [ --address=adres_startu_programu ]
    ca80typer --port=nazwa_portu --speed=szybkosc_klikania --command="klawisze_CA80"
    
    Pierwsze wywołanie załaduje i wklika nam do pamięci CA80 kod maszynowy w formacie Intel HEX, jest też możliwy automatyczny start programu, zaraz po wpisaniu, użycie opcji --address odpowiada klawiszom [G][nnnn][=]. Co do zasady nowy rekord HEX jest wklikiwany osobna sekwencją systemowego polecenia [D], daje to możliwość porozkładania sobie testowych danych i procedurek pod `ładnymi` adresami, np. 8000, c000, c100, etc/itd.
    Drugie wywołanie daje możliwość wydawania luźnych komend CA80, tak, jakbyśmy pisali po jego klawiaturce. Dobrze jest rozpoczynać sekwencję co najmniej dwoma "mm", to wywołanie Monitora. No niestety, ale interfejsik mój się czasem gubi i trzeba go przywołać do porządku i znanego a priori stanu wejściowego.
    W obu przypadkach parametr --speed określa opóźnienie pomiędzy kliknięciami, zbyt mały może doprowadzić do błędów (Err CA80), zbyt wielka wartość spowoduje, że zanudzimy się na śmierć, 250...400 to jest tak akurat do kręcenia filmików czy robienia pokazów na żywo. Przykłady - wpisanie i uruchomienie demo_com_1.hex oraz ustawienie i wywołanie zegarka zleceniami [1] oraz [0].
    ./ca80typer --port=/dev/ttyACM0 --speed=300 --file=demo_com_1.hex --address=c000
    
    ./ca80typer --port=/dev/ttyACM0 --speed=300 --command="mmm120.24.00=0"
    

    pierwsze próby sterowania

    Testy reakcji na klawisze:



    Prymitywny programik testowy z MIK05: ➮ demo_com_1.asm
    .cr Z80
            .tf demo_com_1.hex,INT
            .lf demo_com_1.lst
            .in ca80.inc        
            .sm     CODE            
            .or     $C000       
    demo1:  
            ld      C, $73
            call    SYS_COM
            .db     $17
            jp      $
    

    Wydane kolejno polecenia:
    [E][c000][.][c010][.][0][=] - wyzerowanie RAM c000-c010
    [D][c000][=][=][=]...[=] - przegląd zleceniem D czy są zera
    [D][c000][=][0e][=][73][=]... - wpisanie kodu maszynowego



    Następnie, testowe 'hello': ➮ hello1.asm
    .cr Z80
            .tf hello1.hex,INT
            .lf hello1.lst
            .in     ca80.inc        
            .sm     CODE    
            .or     $C000       
    main:   
            ld      SP,$ff66        
            ld      HL, message
            call    SYS_PRINT
            .db     $50     
    .loop:
            jp      .loop
            ; 
    message
            .db $76, $79, $38, $38, $3f, $ff    
    



    praca z terminalem PuTTY, można radośnie klikać po klawiaturce CA80:



    wszystko samo za mnie sie dzieje

    Program demonstracyjny 'hello.edw': ➮ hello_edw.asm
    .cr Z80
            .tf hello_edw.hex,INT
            .lf hello_edw.lst
            .in     ca80.inc    ; deklaracje systemowe  
            .sm     CODE        ; kod w RAM od C000
            .or     $C000       
    main:   ld      SP,$ff66    ; ustaw stos        
            ld      HL, msg1    ; adres komunikatu
            call    SYS_PRINT   ; pokaz
            .db     $80         ; na caly wyswietlacz
    .loop:  jp      .loop       ; while(1)
            ; hello.edw
    msg1:   .db     $74, $79, $38, $38
            .db     $dc, $79, $5e, $1c 
            .db     EOM
    
    Skrypt powłoki do wklikiwania kolejnych poleceń: ➮ demo_edw.sh
    #!/bin/bash
    serialPort="--port=/dev/ttyACM0"
    slow="--speed=400"
    fast="--speed=200"
    CA80TP="./ca80typer_pc/ca80typer"
    echo "# wykasowanie pamięci, zlecenie E, zakres c000-c020"
    echo "# klawisze: [M][E][c000][.][c020][.][00][=]"
    echo "./ca80typer ${serialPort} ${slow} --command=\"mmmmme.c000.c020.00=\""
    ${CA80TP} ${serialPort} ${slow} --command="mmmmme.c000.c020.00="
    echo " szybkie sprawdzenie zleceniem D czy są zera"
    echo "# klawisze: [M][D][c000][=][=][=][=][=]"
    echo "./ca80typer ${serialPort} ${slow} --command=\"mmmmmd.c000======mm\""
    ${CA80TP} ${serialPort} ${slow} --command="mmmmmd.c000======mm"
    echo " wpisanie programiku hello_edw.hex od adresu c000 i uruchomienie"
    echo "# klawisze: [M][D][c000][=][31][=][66][=][ff][=]..."
    echo "# klawisze: [M][G][c000][=]"
    echo "./ca80typer ${serialPort} ${fast} --file=hello_edw.hex --address=c000" 
    ${CA80TP} ${serialPort} ${fast} --file=hello_edw.hex --address=c000 
    

    Zrzut terminala, wersja statyczna



    Finalne zdjęcia CA80 z klawiaturą zarządzaną przez chińskie Arduino



    A na żywo wygląda to następująco:




    #slowanawiatr, marzec 2019

  • Natasza Biecek 2004-2019/~, e-mail