Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Z9001 neue Tastatur Problem mit SHIFT und SHLOC » Themenansicht

Autor Thread - Seiten: -1-
000
01.01.2022, 20:20 Uhr
albireo



Hallo,

zunächst einmal ein Gesundes neues Jahr!

Ich habe die freie Zeit zwischen den Jahren genutzt, um meiner KC87 Platine, welche schon seit Jahren im Keller lag, wieder neues leben einzuhauchen. Die Rechnerplatine läuft nun endlich wieder. Da ich kein Originalgehäuse oder Tastatur besitze, habe ich eine alte Tastur über einen Arduino Mega an den Tastaturport das Z9001 bzw. KC87 adaptiert. Es funktioniert inzwischen auch alles ganz gut. Einzig Shift und Shift Lock funktioniert auf der Spalte 0, also den Tasten 0,8,@,H,P,X nicht. Auf allen anderen Spalten der 8x8 Matrix funtioniert das wunderbar.
Wie wertet das Betriebssytem die Shift Taste genau aus?

Viele Grüße
Daniel

Dieser Beitrag wurde am 01.01.2022 um 20:21 Uhr von albireo editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
01.01.2022, 21:20 Uhr
felge1966
Default Group and Edit


Kannst du deine Lösung hier mal vorstellen?

Gruss Jörg
--
http://felgentreu.spdns.org/bilder/jacob120.gif
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
02.01.2022, 12:33 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Die Ansteuerung der Tastatur ist relativ ungewöhnlich. Die Sondertasten Shift und Ctrl werden gesondert abgefragt.

Die Tastaturabfrage wird folgendermaßen realisiert:

PIO ist auf BIT Ein-/Ausgabe initialisiert,
Kanal A auf Ausgabe, Kanal B auf Eingabe.
Auf Kanal A wird 0 ausgegeben, d.h., alle Leitungen
sind "LOW". Ist keine Taste gedrückt, so sind alle Leitungen
von Kanal B auf Grund der Ziehwiderstände "HIGH". Wird eine
Taste gedrückt, so ist eine Leitung von A mit einer Leitung
von B verbunden, und es wird ein Interrupt ausgelöst, da eine
Leitung von B LOW-Pegel führt. Jetzt werden die Kanäle uminitialisiert,
auf B wird 0 ausgegeben und auf Kanal A führt jetzt nur die der gedrückten
Taste entsprechende Leitung LOW-Pegel.

Routine GPIOD:

Quellcode:

;
;TASTATUR - PIO ABFRAGEN
;ret     D - neg. Matrixzeile
;    E - neg. Matrixspalte
;    H - Matrixzeile zu Control
;    L - Matrixzeile zu Shift
;zusaetzlich Auswertung Spielhebel
GPIOD:    DI
    IN    A, DPIOB    ;Zeilen auswerten
    CPL
    LD    D,A        ;NEGIERTE MATRIXZEILE
    ;Ctrl+Shift
    LD    A,3        ;Interrupt aus
    OUT    SPIOB, A
    LD    A,11111011B    ;PRUEFEN CONTROL-TASTE
    OUT    DPIOA, A    ;nur Spalte A2 auf low
    IN    A, DPIOB
    LD    H,A        ;Zeilen nach H
    LD    A,11111110B    ;PRUEFEN SHIFT-TASTE
    OUT    DPIOA, A    ;nur Spalte A0 auf low
    IN    A, DPIOB
    LD    L,A        ;Zeilen nach L
    ;Umprogrammieren PIO
    LD    A,0CFH        ;BIT E/A
    OUT    SPIOA, A
    LD    A,0FFH        ;ALLES EINGAENGE
    OUT    SPIOA, A
    LD    A,0CFH        ;BIT E/A
    OUT    SPIOB, A
    XOR    A
    OUT    SPIOB, A    ;ALLES AUSGAENGE
    OUT    DPIOB, A    ;PIOB alle Leitungen auf 0
    IN    A, DPIOA    ;Spalten einlesen
    CPL
    LD    E,A        ;NEGIERTE MATRIXSPALTE
    ;Spielhebel abfragen
    LD    A,80H        ;SPIELHEBEL 1 ABFRAGEN
    OUT    DPIOB, A    ;Zeile B6 low (B0..B6)
    IN    A, DPIOA    ;Spalten nach A
    CPL
    LD    (JOYR),A
    LD    A,40H        ;SPIELHEBEL 2 ABFRAGEN
    OUT    DPIOB, A    ;Zeile B7 low (B0..B5,B7)
    IN    A, DPIOA    ;Spalten nach A
    CPL
    LD    (JOYL),A
    ;Umprogrammieren PIO
    CALL    INITT        ;TATSTATUR INIT.
    XOR    A        ;A=0
    OUT    DPIOA, A    ;PIOA alle Leitungen auf 0
    RET




Quellcode:

; TASTATURMATRIX
;
; PIO2A, Port 90H
;
;   A0    A1    A2    A3    A4    A5    A6    A7
;   |     |     |     |     |     |     |     |
;  TI0   TI1   TI2   TI3   TI4   TI5   TI6   TI7
;   |     |     |     |     |     |     |     |
; +-----+-----+-----+-----+-----+-----+-----+-----+      PIO2B, Port 91H
; | S11 | S12 | S13 | S14 | S15 | S16 | S17 | S18 |--TO0-B0
; |   0 |   1 |   2 |   3 |   4 |   5 |   6 |   7 |
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | S21 | S22 | S23 | S24 | S25 | S26 | S27 | S28 |--TO1-B1
; |   8 |   9 |   : |   ; |   , |   = |   . |   ? |
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | S31 | S32 | S33 | S34 | S35 | S36 | S37 | S38 |--TO2-B2
; |   @ |   A |   B |   C |   D |   E |   F |   G |
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | S41 | S42 | S43 | S44 | S45 | S46 | S47 | S48 |--TO3-B3
; |   H |   I |   J |   K |   L |   M |   N |   O |
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | S51 | S52 | S53 | S54 | S55 | S56 | S57 | S58 |--TO4-B4
; |   P |   Q |   R |   S |   T |   U |   V |   W |
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | S61 | S62 | S63 | S64 | S65 | S66 | S67 |(S68)|--TO5-B5
; |   X |   Y |   Z | tab |pause| ins |   ^ |     |
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | S71 | S72 | S73 | S74 | S75 | S76 | S77 | S78 |--TO6-B6
; |left |right| down|  up | esc |enter|stop |space|
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | S81 | S82 | S83 | S84 | S85 | S86 | S87 |(S88)|--TO7-B7
; |shift|color|contr|graph|list | run |shlck|     |
; +-----+-----+-----+-----+-----+-----+-----+-----+


--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 02.01.2022 um 12:35 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
02.01.2022, 16:34 Uhr
albireo



Hallo Volker,

ich mache das aktuell so, dass ich erst auf KanalB also der Zeile für die entsprechende Taste ein LOW Signal ausgebe und damit die IRQ Routine im Monitor Programm des KC starte. Danach gebe ich dann entsprechend auf der Spalte ein LOW Signal aus. Dann warte ich 20 mS und gebe beide Ports wieder frei. Die Shift Taste ist parallel zu TI0 und TI7 geschaltet.
Für die Spalten TI1 bis TI7 funktrioniert das auch, ich komme an die Kleinbuchstaben bzw. Sonderzeichen über Shift heran. Wenn ich jedoch die Spalte TI0 anspreche und dann die Shift Taste gedrückt halte passiert bis zum loslassen der Shift Taste nicht mehr. Das Monitorprogramm schint da in einer Schleife zu hängen. Mein Z80 Assembler ist etwas eingestaubt aber ich muss mich da wohl mal durchwühlen.

Viele Grüße
Daniel

Dieser Beitrag wurde am 02.01.2022 um 19:52 Uhr von albireo editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
02.01.2022, 17:55 Uhr
albireo



@Jörg

wenn ich die Probleme gelöst habe, stelle ich das hier gern mal vor.

VG Daniel
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
02.01.2022, 19:50 Uhr
albireo



Hallo Leute,

nach vielen rumprobieren bin ich zu dem Schluss gekommen, dass ich um die Lösung mit dem Analog Switch HCT4051 nicht herum komme. Die bidirektionale Verbindung zwischen Zeile und Spalte erfordert, dass die Signale genau zum richtigen Zeitpunkt in der richtigen Geschwindigkeit gesendet und empfangen werden. Das könnte man zwar auch auf dem Arduino hinbekommen, aber das ist aufwendig und wohl in C++ nicht ohne weiteres umsetzbar. Hier müsste man auf Assembler ausweichen und mit Interrupts arbeiten. Da ist die Analog Switch Variante einfacher denke ich.

Viele Grüße
Daniel

Dieser Beitrag wurde am 02.01.2022 um 19:51 Uhr von albireo editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
02.01.2022, 20:12 Uhr
schlaub_01



Ja, so was ist immer sehr schwierig in reinem C. Ich hatte das mal am Z1013 analysiert und da muß man innerhalb weniger Takte den richtigen Wert anlegen. Mit Interrupts schaffst Du das schon mal nicht, da in C das Stack speichern usw. viele Takte beim Atmel baucht. Die Assembler Routine vom Original Tastaturadapter der Z1013 schafft das gerade so. Mit dem Atmel brauchst Du ja schon bis zu 3 CPU Takte, bis das Eingangssignal synchron intern registriert ist.
Optimal Lösung für Dich wäre aber ein kleiner CPLD mit einem kleinen Atmel gekoppelt, da kannst Du mit dem Mikrocontroller die andere Tastatur auslesen und an den CPLD das so übergeben, daß die richtigen Signale in wenigen Nanosekunden dann passend anliegen. Dann läuft die Sache auch sehr sauber...

Viele Grüße,
Sven.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
02.01.2022, 21:20 Uhr
Hobi




Zitat:
Die Assembler Routine vom Original Tastaturadapter der Z1013 schafft das gerade so (bei 2 MHz)

.
Es geht aber auch schneller. Ich komme mit 2 µs aus.
--
-------------------------------------------
Corontäne
-------------------------------------------

Dieser Beitrag wurde am 02.01.2022 um 21:21 Uhr von Hobi editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
03.01.2022, 08:48 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Bei kingstener gibt es auch zwei funktionierende Lösungen:

http://www.kingsteners.homepage.t-online.de -> Projekte -> Cloud -> KeyboardAdapter -> PS2 -> ps2@kc87.zip und KeyboardAdapter -> USB -> USB@kc87.pdf
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
03.01.2022, 10:18 Uhr
albireo



Danke Volker für den Link. Die Lösung arbeitet auch mit dem HCT4051, ist wohl die beste Lösung.

Was ich aktuell aber noch nicht verstehe ist, warum ich nicht mal mit Shift Lock an die zweite Ebene der Spalte 0 herankomme. Bei Shift verstehe ich das ja, da hängt der Tastatur-Interrupt wohl in einer Schleife fest. Aber bei Shift Lock sollte das nicht passieren, sehr merkwürdig. So richtig lässt mir das doch keine Ruhe ;-)

Viele Grüße
Daniel
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
03.01.2022, 17:11 Uhr
albireo



So Problem ist gelöst, nachdem ich mir den Quellcode des Monitorprogramm des Z9001 angesehen habe war mir klar wo der Fehler lag :-) Also reicht jetzt ein Arduino Mega ohne Zusatzschaltung zur Adaption jeder anderen Tastatur an den Z9001. Das ist dann glaube ich eine sehr nachbaufreundliche Variante.

Viele Grüße
Daniel
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek