Matrix schakelaar in IC


Met een eprom (met de juiste inhoud ;) ) heel simpel:

Moeten wel pull-ups aan de KB2 pinnen

[Bericht gewijzigd door Arco op 5 juni 2022 14:43:30 (22%)]

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
EricP

mét CE

Die pull-ups lijken al aanwezig te zijn (ze staan in het schema).
Verder zou ik een EPROM nemen met een input meer. Je hebt - als ik het goed heb - 39 toetsen en een shift. Voor 39 toetsen zit je op 6 bit. Allemaal ook nog een keer met een shift erbij maakt 7.
Maar inderdaad, dat idee dus...

Klopt, was de shift vergeten... ;)

Die pull-ups zitten trouwens aan de (voor deze specifieke toepassing) verkeerde poort: aan KB1 i.p.v. KB2 (daar hebben de adreslijnen van de eprom weinig aan...)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
EricP

mét CE

Nee, ze zitten op beiden. In het schema van de spectrum ongeveer in het midden die op de address lijnen en links boven voor de 'data' lijnen. Of praten we nou langs elkaar heen??

Op bovenstaande tekening ( https://www.1000bit.it/support/manuali/sinclair/zxspectrum/sm/topmem.g… ) zie ik geen pull-ups achter de diodes...

Met een processor als de 18F26Q10 is alles waarschijnlijk zelfs in 1 chip te proppen.
Die heeft CLC's. (Configurable Logic Cells, daar kun je hardwarematige gates en flipflops programmeren)
Kun je dan een standaard PS/2 toetsenbord op aansluiten.

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
EricP

mét CE

Die dioden heb je niet meer nodig... Op het schema lijken ze bij het keyboard te horen, aangezien ze niet op het schema van het 'mainboard' staan.
Maar goed... als de inderdaad op het 'mainboard' zitten, dan hebben pull-ups voordelen.

Als je inderdaad genoeg 'glue logic' met CLC manier kunt maken... 8 inputs, 5 outputs. In losse gates is dat wel ff een klusje (alhoewel het vooral copy-paste is als je de basis eenmaal hebt).

De RP2040 is een grappige processor: Er zitten een aantal PIO modules in. Die kan je programmeren om bepaalde dingen te doen op hoge snelheid en hoge nauwkeurigheid.

Als je dan toets 4-8 wil emuleren (kolom 4, rij 8), dan hang je zo'n PIO aan de kolom 4 input en rij 8 output en vertel je hem: Output volgt input! Dan reageert ie in een stuk of 8 ns. Opendrain ouput? Sure. Dat kan. En als je gesimuleerde keystroke weer voorbij is dan zet je de pio module gewoon uit. Andere toets? Gewoon in de config registers voor de PIO zetten dat ie een andere input pin/output pin combinatie heeft. Wil je twee toetsen tegelijk kunnen bedienen? Gewoon 2 PIO modules aanzetten (b.v. Shift-A).

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Dus het gaat om een ZX-Spectrum.

Die werkt met een minimum aan hardware en alles heeft meerdere functies. Dus ook de aansturing van het toetsenbord. De aansturende 8 adres lijnen zijn direct gekoppeld aan de adres bus van de processor en lopen dus op 3.5 MHz.

Dat wordt nog een uitdaging om dat met een micro te volgen.

Met eerder genoemde eprom of CLC's zit de vertraging in de nS...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Het was toch zo als je een (rubber) toets van dat toetsenbordje indrukte dat het beeld wegviel omdat dan de CPU blokte op het loslaten van de toets? Omdat de CPU zelf ook de beeldopbouw deed.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.

Op 5 juni 2022 21:47:36 schreef henri62:
Het was toch zo als je een (rubber) toets van dat toetsenbordje indrukte dat het beeld wegviel omdat dan de CPU blokte op het loslaten van de toets? Omdat de CPU zelf ook de beeldopbouw deed.

Dat was de ZX80. De "truc" is, om op onderdelen te sparen, dat de processor meen ik ergens even wordt onderbroken door de ULA, de ULA geeft meen ik de clock aan de CPU, om andere communicatie te laten plaatsvinden.

Veel hangt af van hoe het keyboard uitgelezen wordt.
Als men eerst het adres selecteerd en een paar cycles later pas de lijn inklokt om te zien of er een toets is ingedrukt dan kan dat alles mee vallen.

De Teensy 4 die in andere topics wel voorbij komt loopt overigens default op 600 MHz, en heeft i/o tot 200 MHz. Geen idee hoe snel hij in deze toepassing is, maar het is een andere orde van grootte dan een 328.

Probeer het eerst simpel, en kijk pas verder als dat noodzakelijk blijkt. Als men de programmer en handigheid van programmeren heeft kan een EPROM natuurlijk ook simpel zijn, en zeker snel genoeg.
Maar dan had ik dit topic niet verwacht.

EricP

mét CE

Veel hangt af van hoe het keyboard uitgelezen wordt.
Als men eerst het adres selecteerd en een paar cycles later pas de lijn inklokt om te zien of er een toets is ingedrukt dan kan dat alles mee vallen.

Dat kun je gevoegelijk vergeten. Het heeft geen meerwaarde om de hele bus (!) meerdere cycles stil te gaan leggen om een toets uit te lezen. De meest voor de hand liggende is op de ene edge address setten en op de andere edge lezen.

De Teensy 4 die in andere topics wel voorbij komt loopt overigens default op 600 MHz, en heeft i/o tot 200 MHz. Geen idee hoe snel hij in deze toepassing is, maar het is een andere orde van grootte dan een 328.

Eens.

Probeer het eerst simpel, en kijk pas verder als dat noodzakelijk blijkt. Als men de programmer en handigheid van programmeren heeft kan een EPROM natuurlijk ook simpel zijn, en zeker snel genoeg.
Maar dan had ik dit topic niet verwacht.

Maar eigenlijk doet het wel min of meer wat TS wilde: single chip 40 schakelaars emuleren :) .

Ik vind die RP2040 die rew voorstelde wel een goeie. De PIO module van dat ding kan waarschijnlijk binnnen 1 klok reageren (en die interne klok is als ik me goed herrinner 133MHz, dus 7,5ns).

Bovendien heeft het iets moois een ZX spectrum een keyboard op basis van een dual-core,32 bit processor met 4x meer ram dan het hele adresbereik van de Spectrum te geven.

Of die PIO module makkelijker is dan een EEPROM betwijfel ik. Maar een PICO (RP2040 bordje) is makkelijker en goedkoper te krijgen (en te programmeren) dan een EEPROM.

(en die PICO heeft ongeveer dezelfde form-factor als een EEPROM!)

Met een eprom heb je trouwens nog een extra input nodig: de ZX blijkt twee verschillende shifts te hebben. (CAPS SHIFT en SYMBOL SHIFT)
Wordt dus een 27C512...

Deze eprominhoud zou moeten werken...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
EricP

mét CE

Je kunt het ook ranzig oplossen...
Met 38 toetsen en 2 shifts, heb je uiteindelijk 3x38 mogelijkheden (even aangenomen dat je niet beide shifts tegelijk gebruikt). Dat is bij mijn weten iets van 114. Dat past in 7 bits.

Wat ik heb gelezen is dat je die shifts ook beide tegelijk moet kunnen gebruiken voor sommige functionaliteit...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 6 juni 2022 20:32:11 schreef Arco:
Met een eprom heb je trouwens nog een extra input nodig: de ZX blijkt twee verschillende shifts te hebben. (CAPS SHIFT en SYMBOL SHIFT)
Wordt dus een 27C512...

[bijlage]

Deze eprominhoud zou moeten werken...

Wow!

Op 6 juni 2022 22:05:51 schreef Arco:
Wat ik heb gelezen is dat je die shifts ook beide tegelijk moet kunnen gebruiken voor sommige functionaliteit...

Ja, klopt, heel handig met die rubbertoetsjes! Shift, Caps Shift, Extended Mode, Graphic Mode, you name it ;-)

Hoe zou je de in te drukken toetsen willen "aanleveren"? Serieel? USB? anders?

Ik overweeg om het "schakel input X door naar output Y" toch voor een ander project te gebruiken. Misschien maak ik iets.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Op 6 juni 2022 20:32:11 schreef Arco:
Met een eprom heb je trouwens nog een extra input nodig: de ZX blijkt twee verschillende shifts te hebben. (CAPS SHIFT en SYMBOL SHIFT)
Wordt dus een 27C512...

[bijlage]

Deze eprominhoud zou moeten werken...

Ik ben bang dat de werking me toch niet geheel duidelijk is... Het keyboard is nu als een matrix van 8 (KB1) x 5 (KB2) (membraan) 'schakelaars' ingericht. Ik begrijp dat een bepaalde binary input, een combinatie van adreslijnen selecteert, maar maak je nu met deze opzet een schakelaar die KB1-lijnen met KB2-lijnen verbindt? De output van de EPROM zijn de datalijnen (verbonden met KB2); 5V out.

Daarnaast is me toch niet geheel duidelijk waarom Symbol Shift en Caps Shift aparte ingangen zijn, dat zijn het in de 8x5-matrix toch ook niet? En er zijn meer situaties waarbij er meer dan 1 toets tegelijkertijd wordt ingedrukt, bijv. al bij "Shift-e" voor de "E"...

Het zal vast werken, maar ik weet even niet hoe... :-(

EricP

mét CE

Je denkt nog steeds in schakelaars. Waarom?
De ULA set een address en kijkt wat er terug komt op z'n inputs. Dat kan door de address lijn ermee te verbinden, maar het kan ook prima uit de EPROM komen. Die ULA gaat het verschil echt niet door hebben. Schakelaars is moeilijk, onbetrouwbaar en bestaat gewoon niet (om die reden waarschijnlijk).

Die 2 inputs zijn voor combinaties. Anders kun je geen 2 toetsen tegelijk emuleren. De enige combinaties die voor lijken te komen, zijn de 2 shifts.

De binaire input is 1...0, A...Z, Space, Enter (totaal dus 1 t/m 38), en de twee losse shift key ingangen.
(hoe precies staat boven de onderstaande sourcecode waar de epromfile mee gemaakt is)

pic basic code:


'========================================================================================
' PowerBasic - Generating ZX spectrum keyboard encoder
' Bit A8...A15 is addressbus input, D0...D4 is KB0/4 output, A0...A5 is character input
' Bit A6 is Caps shift, A7 is Symbol shift
' Character input (bits A0...A5):
'                  1  = '1', 2  = '2', 3  = '3',..., 10 = '0'
'                  11 = 'A', 12 = 'B', 13 = 'C',..., 36 = 'Z'
'                  37 = 'Space', 38 = 'Enter'
'========================================================================================
#Compile Exe

%D0 =&hFE : %D1 =&hFD : %D2= &hFB : %D3 =&hF7                    'Data masks
%D4 =&hEF : %D5 =&hDF : %D6= &hBF : %D7 =&h7F                    '
%A8 =&hFE : %A9 =&hFD : %A10=&hFB : %A11=&hF7                   'Address masks
%A12=&hEF : %A13=&hDF : %A14=&hBF : %A15=&h7F                   '
%SYMBOLSHIFT = 7                                                'Symbol shuft = A7
%CAPSSHIFT   = 6                                                'Caps shift = A6

'========================================================================================
Function PBMain () As Long
'========================================================================================
  Local Cnt, lVal As dWord, dat As Byte, hFile As Long, Buff As String
  '--------------------------------------------------------------------------------------
  Buff = String$(&h10000,&hFF)                                  'Prefill buffer with 0xFF
  hFile = FreeFile                                              '
  Open "ZXcode.bin" For Binary As #hFile                        'Open .bin file
  For Cnt = 0 To &h0FFFF                                        '65536 bytes: 512k eprom
    Dat = &hFF                                                  '
    lVal = Cnt And &h0000003F                                   '
    If (lVal > 0) And (lVal < 39) Then                          '
      If Hi(Byte,Cnt) = Choose(lVal,%A11,%A11,%A11,%A11,%A11, _ 'Choose address mask
                                    %A12,%A12,%A12,%A12,%A12, _ '
                                    %A9 ,%A15,%A8 ,%A9 ,%A10, _ '
                                    %A9 ,%A9 ,%A14,%A13,%A14, _ '
                                    %A14,%A14,%A15,%A15,%A13, _ '
                                    %A13,%A10,%A10,%A9 ,%A10, _ '
                                    %A13,%A8 ,%A10,%A8 ,%A13, _ '
                                    %A8 ,%A15,%A14) Then        '
                                                                '
        Dat = Choose(lVal, %D0,%D1,%D2,%D3,%D4, _               'Choose data mask
                           %D4,%D3,%D2,%D1,%D0, _               '
                           %D0,%D4,%D3,%D2,%D2, _               '
                           %D3,%D4,%D4,%D2,%D3, _               '
                           %D2,%D1,%D2,%D3,%D1, _               '
                           %D0,%D0,%D3,%D1,%D4, _               '
                           %D3,%D4,%D1,%D2,%D4, _               '
                           %D1,%D0,%D0)                         '
      End If                                                    '
    End If                                                      '           
    If (Bit(Cnt,%CAPSSHIFT)=1) And (Hi(Byte,Cnt) = %A8 ) Then   'Add caps shift if
      Bit Reset Dat,0                                           'needed.
    End If                                                      '
    If (Bit(Cnt,%SYMBOLSHIFT)=1) And (Hi(Byte,Cnt) = %A15) Then 'Add symbol shift if
      Bit Reset Dat,1                                           'needed.
    End If                                                      '
    Mid$(Buff,Cnt+1,1) = Chr$(Dat)                              'Write byte to buffer
  Next Cnt                                                         '
  Put #hFile,, Buff                                             'Write file to disk
  Close #hFile                                                  '
End Function                                                    '

'==================================================================================================
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
bprosman

Golden Member

Elektuur heeft ooit zo iets gemaakt voor een elektronische typemachine.
Met een modernere (Grotere) EPROM kan zo iets een stuk compacter, met een microcontroller nog meer.
Overigens kun je een toetsenbord matrix prima maken met een handvol 4066's.

interface voor elektronische typemachine.pdf

De jongere generatie loopt veel te vaak zijn PIC achterna.

Met een modernere (Grotere) EPROM kan zo iets een stuk compacter

Een 27512 lijkt me al groot genoeg... :) (is voor 99.77% nog leeg...)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com