C64Power Forum
Hardware => Hardware => Wątek zaczęty przez: Term w 21 Maja 2017, 00:12
-
Witam Ponownie.
Jak wspomniałem w tym temacie (http://c64power.com/forumng/index.php?topic=7648.0) próbuje "dorobić" przejściówkę: klawiatura AT PS/2 podłączana do złącza klawiatury w C64 na Attiny2313.
No cóż... Lipa wyszła. Dlatego proszę o pomoc. :)
Do autora tematu poleconego przez kolegę @StaryMarabut http://c64power.com/forumng/index.php?topic=7027.0 napisałem PM, lecz zdaję sobie sprawę, że "rzecz" raczej już nieaktualna od ponad roku.
Mój niechlujny i lamerski kod (BASCOM) wygląda tak:
'opis patrz nizej...
' przejsciowka PS/2 AT do C64 keyboard interface
'1. prawdopodobnie 6526 trzyma normalnie na pa7 low (chyba ze przalacza pot z gniazd joy lub stan niski na ktoryms z"rzedow")
'wiec jezeli na zadnej pa0 do pa6 nie ma low to znaczy ze "skanowana" jest pa7
'
'!!! W finalnej wersji zmienic Fuse BIta od RESET !!!
'
'Problemy do rozwiazania:
'1. wiadomo jaki :/
'2. Klawisze z shiftem
'3. wcisniecie kilku klawiszy na raz (pp. GetAtKbdRaw pomoze)
$regfile = "attiny2313a.dat"
$crystal = 8000000
$baud = 9600
'$prog &HFF , &HE4 , &HDF , &HFF ' generated. Take care that the chip supports all fuse bytes.
Config Portb = Output 'rzędy od 0 do 7 np. rząd0 pinb.0 czyli rzad1 pinb.1 (pb0-pb7) | pin12(złącze klawiatury) row0 > pin5 row7
'rzedy w tabeli keydata wpisywane sa +1 czyli rzad 2 wpisany jest jako 3
Config Porta.0 = Input 'kolumna h7 pin(zlacze klawiatury) 13
Config Porta.1 = Input 'kolumna g6 pin(zlacze klawiatury) 14
Config Porta.2 = Input 'kolumna f5.pin(zlacze klawiatury) 15
'.
Config Portd.0 = Input 'kolumn e4 pin(zlacze klawiatury) 16
Config Portd.1 = Output 'Odkomentowac W Finalnej Wersji Bedzie To Restore
Config Portd.2 = Input 'kolumna d3 pin(zlacze klawiatury) 17
Config Portd.5 = Input 'kolumna c2 pin(zlacze klawiatury) 18
Config Portd.6 = Input 'kolumna b1 pin(zlacze klawiatury) 19
'kolumny podobnie jak rzedy + 1 czyli kolumna c2 to kolumna 3 pind.5
'kolumna a0 pin(zlacze klawiatury) 20 jezeli na ktorymkolwiek z powyzszych stan 1 to kolumna H aktywna
Rzedy Alias Portb
'Kol.0 Alias 0 'to kolumna zadna z powyzszych
K1 Alias Portd.6
K2 Alias Portd.5
K3 Alias Portd.2
K4 Alias Portd.0
K5 Alias Porta.2
K6 Alias Porta.1
K7 Alias Porta.0
Rest Alias Portd.1
Config Keyboard = Pind.3 , Data = Pind.4 , Keydata = Keydata
Rzedy = 255
'Portb.0 = 1 'ustaw 1 na wyjściach rzędów
'Portb.1 = 1
'Portb.2 = 1
'Portb.3 = 1
'Portb.4 = 1
'Portb.5 = 1
'Portb.6 = 1
'Portb.7 = 1
'Porta.0 = 1 'ustaw 1 na kolumnach A, B, C
'Porta.1 = 1
'Porta.2 = 1
'Portd.0 = 1 ' ustaw 1 na kolumnach D-H
'Portd.1 = 1 ' odkomentowac w finalnej wersji bedzie to RESTORE
'Portd.2 = 1
'Portd.5 = 1
'Portd.6 = 1
Dim A As Word , B As Byte 'pomocnicze
Dim Klawisz As Byte , Nr As Byte , Nk As Byte , Rzad As Byte '"Nr" - numer rzedu, "Nk" - numer kolumny, "Rzad" - bajt ustawiany na porcie rzedow
Dim Cps As Bit 'Cps - stan caps lock (shift lock)
Cps = 0
Do
Do 'odczyt klawiatury + czeka na zwrocenie wartosci z taklicy keydata <>0
Klawisz = Getatkbd()
' If Klawisz = 0 Then
' Rzedy = 255
' End If
Loop Until Klawisz <> 0
' Klawisz = 56 ' zakomentowac w pelnej wersji - linia do testowania
If Klawisz = 42 Then Toggle Cps
Nr = Klawisz / 10 'rozbicie na rzedy
Nr = Nr - 1 '-1 patrz dlacego w opisie
Nk = Klawisz Mod 10 'rozbicie na kolumny
Nk = Nk - 1 '-1 patrz opis ponizej
Rzad = Lookup(nr , Dr) ' odczytaj wartosc z pozycji "rzad" tabeli "dr"
'Print Bin(klawisz) ; " wartosc " ; Rzad ; " " ; Nr ; " " ; Nk ; "" ' zakomentowac w pelnej wersji - linia do testowania zmiennych
If Cps = 0 Then
Gosub Lowerkeys 'problem caps locka do rozwiazania moze nie trza 2 subów robic...
Else
Gosub Upperkeys
End If
Waitms 5 ' czas przytrzymania stanu na rzedach
Rzedy = 255 ' ustaw 1 na wszystkich rzedach
Loop
Lowerkeys:
Select Case Nk
Case 0
'Do : Loop Until K1 = 1 And K2 = 1 And K3 = 1 And K4 = 1 And K5 = 1 And K6 = 1 And K7 = 1
Rzedy = Rzad
Case 1
Do : Loop Until K1 = 0
'Waitus 10
Rzedy = Rzad
Case 2
Do : Loop Until K2 = 0
'Waitus 10
Rzedy = Rzad
Case 3
Do : Loop Until K3 = 0
'Waitus 10
Rzedy = Rzad
Case 4
Do : Loop Until K4 = 0
'Waitus 10
Rzedy = Rzad
Case 5
Do : Loop Until K5 = 0
'Waitus 10
Rzedy = Rzad
Case 6
Do : Loop Until K6 = 0
'Waitus 10
Rzedy = Rzad
Case 7
Do : Loop Until K7 = 0
'Waitus 10
Rzedy = Rzad
Case 255 And Nr = 0
Rest = 0
Waitus 50
Rest = 1
End Select
'A = 0
'Do 'pewnie bedzie wygladala inaczej raczej dojda wait....
'A = A + 2
' If Nk = 1 Then
' Do ; Until K1 = 0
' Rzedy = Rzad
' Return
' End If
' If K2 = 0 And Nk = 2 Then
' Rzedy = Rzad
' Return
' End If
' If K3 = 0 And Nk = 3 Then
' Rzedy = Rzad
' Return
' End If
' If K4 = 0 And Nk = 4 Then
' Rzedy = Rzad
' Return
' End If
' If K5 = 0 And Nk = 5 Then
' Rzedy = Rzad
' Return
' End If
' If K6 = 0 And Nk = 6 Then
' Rzedy = Rzad
' Return
' End If
' If K7 = 0 And Nk = 7 Then
' Rzedy = Rzad
' Return
' End If
' If Nk = 0 Then : Rzedy = Rzad
' 'A = 1
' End If
' If Nk = 255 And Nr = 0 Then 'RESTORE - poprawic i odkomentowac
' Rest = 0
' Waitus 50
' Rest = 1
' Else
' Rest = 1
' End If
'Waitus 20
'Loop Until A = 1 Or A = 42 'zakoncz petle po wykryciu kolumny lub 20 powtorzeniach
Return
Upperkeys:
'A = 0
'Do 'pewnie bedzie wygladala inaczej raczej dojda wait....
'A = A + 2
'If K1 = 0 Then : Rzedy = 239 : End If 'problem caps locka do rozwiazania
A = 0
Do
If K7 = 0 And Nk = 7 Then
Rzedy = Rzad
'A = 1
End If
If K6 = 0 And Nk = 6 Then
Rzedy = Rzad
'A = 1
End If
If K5 = 0 And Nk = 5 Then
Rzedy = Rzad
'A = 1
End If
If K4 = 0 And Nk = 4 Then
Rzedy = Rzad
'A = 1
End If
If K3 = 0 And Nk = 3 Then
Rzedy = Rzad
'A = 1
End If
If K2 = 0 And Nk = 2 Then
Rzedy = Rzad
'A = 1
End If
If K1 = 0 And Nk = 1 Then
Rzedy = Rzad
'A = 1
End If
A = A + 1
Loop Until A = 10
If Nk = 0 Then : Rzedy = Rzad
'A = 1
End If
If Nk = 255 And Nr = 0 Then 'RESTORE - poprawic i odkomentowac
Rest = 0
Waitus 50
Rest = 1
Else
Rest = 1
End If
'Waitus 20
'Loop Until A = 1 Or A = 42 'zakoncz petle po wykryciu kolumny lub 20 powtorzeniach
Return
'------------------------------------------------------------------------------------------------
'Dane rzedow - rzedy od 0 do 7 np. dec127 = byte0111 1111
Dr:
'Data 127 , 191 , 223 , 239 , 247 , 251 , 253 , 254
Data 254 , 253 , 251 , 247 , 239 , 223 , 191 , 127
'mapa klawiatury rzedami - wybrana pozycja 0111 1111, 1011 1111
'------------------------------------------------------------------------------------------------
'Dane kolumn t.j. poukladane porty od 0 do 7
'Dk:
'Data 0 , "K1" , "K2" , "K3" , "K4" , "K5" , "K6" , "K7"
'------------------------------------------------------------------------------------------------
'talica znakow zapisana rzad kolumna np. 34 rzad 2 kolumna a3
Keydata:
'normal keys lower case
Data 0 , 58 , 0 , 0 , 0 , 0 , 0 , 88 , 0 , 68 , 0 , 0 , 0 , 31 , 21 , 0
Data 0 , 41 , 42 , 0 , 61 , 71 , 11 , 0 , 0 , 0 , 52 , 62 , 32 , 22 , 81 , 0
Data 0 , 53 , 43 , 33 , 72 , 82 , 12 , 0 , 0 , 51 , 44 , 63 , 73 , 23 , 13 , 0
Data 0 , 45 , 54 , 64 , 34 , 24 , 83 , 0 , 0 , 0 , 55 , 35 , 74 , 14 , 84 , 0
Data 0 , 46 , 65 , 25 , 75 , 85 , 15 , 0 , 0 , 56 , 47 , 36 , 66 , 26 , 16 , 0
Data 0 , 0 , 37 , 0 , 76 , 86 , 0 , 0 , 42 , 57 , 28 , 27 , 0 , 67 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 17 , 0 , 0 , 10 , 0 , 0 , 18 , 0 , 0 , 0
Data 87 , 77 , 48 , 0 , 38 , 0 , 0 , 0 , 78 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'shifted keys UPPER case
Data 0 , 58 , 0 , 0 , 0 , 0 , 0 , 88 , 0 , 68 , 0 , 0 , 0 , 31 , 21 , 0 '16
Data 0 , 41 , 42 , 0 , 61 , 71 , 11 , 0 , 0 , 0 , 52 , 62 , 32 , 22 , 81 , 0 '32
Data 0 , 53 , 43 , 33 , 72 , 82 , 12 , 0 , 0 , 51 , 44 , 63 , 73 , 23 , 13 , 0 '48
Data 0 , 45 , 54 , 64 , 34 , 24 , 83 , 0 , 0 , 0 , 55 , 35 , 74 , 14 , 84 , 0 '64
Data 0 , 46 , 65 , 25 , 75 , 85 , 15 , 0 , 0 , 56 , 47 , 36 , 66 , 26 , 16 , 0 '80
Data 0 , 0 , 37 , 0 , 76 , 86 , 0 , 0 , 42 , 57 , 28 , 27 , 0 , 67 , 0 , 0 '96
Data 0 , 0 , 0 , 0 , 0 , 0 , 17 , 0 , 0 , 10 , 0 , 0 , 18 , 0 , 0 , 0 '112
Data 87 , 77 , 48 , 0 , 38 , 0 , 0 , 0 , 78 , 0 , 0 , 0 , 0 , 0 , 0 , 0 '128
'przypisanie klawiszy c64 - atkeyb - kod getatkbd (hex) - rzad kolumna C64
'c64 key AT key scancode table position Keydata (rzad/kolumna)+1
'left arrow - "`" - 0e - 15 - 21
'1 - "1" - 16 - 23 - 11
'2 - "2" - 1e - 31 - 81
'3 - "3" - 26 - 39 - 12
'4 - "4" - 25 - 38 - 82
'5 - "5" - 2E - 47 - 13
'6 - "6" - 36 - 55 - 83
'7 - "7" - 3D - 62 - 14
'8 - "8" - 3E - 63 - 84
'9 - "9" - 46 - 71 - 15
'0 - "0" - 45 - 70 - 85
'+ - "-" - 4E - 79 - 16
'- - "=" - 55 - 86 - 86
'Funt - "BkSp" - 66 - 103 - 17
'crl/home - "Insert" - 70 - 113 - 87
'inst/del - "Home" - 6C - 109 - 18
'control - "Tab" - 0D - 14 - 31
'Q - "Q" - 15 - 22 - 71
'W - "W" - 1D - 30 - 22
'E - "E" - 24 - 37 - 72
'R - "R" - 2D - 46 - 23
'T - "T" - 2C - 45 - 73
'Y - "Y" - 35 - 54 - 24
'U - "U" - 3C - 61 - 74
'I - "I" - 43 - 68 - 25
'O - "O" - 44 - 69 - 75
'P - "P" - 4D - 78 - 26
'@ - "[" - 54 - 85 - 76
'* - "]" - 5B - 92 - 27
'arrow up - "Del" - 71 - 114 - 77
'RESTORE - "End" - 69 - 106 - 10 osobne wyjście attiny
'run/stop - "L Alt" - 11 - 18 - 41
'shift lock - "CpsLck" - 58 - 89 - 42
'A - "A" - 1C - 29 - 32
'S - "S" - 1B - 28 - 62
'D - "D" - 23 - 36 - 33
'F - "F" - 2B - 44 - 63
'G - "G" - 34 - 53 - 34
'H - "H" - 33 - 52 - 64
'J - "J" - 3B - 60 - 35
'K - "K" - 42 - 67 - 65
'L - "L" - 4B - 76 - 36
': - ";" - 4C - 77 - 66
'; - "'" - 52 - 83 - 37
'= - "\" - 5D - 94 - 67
'RETURN - "Enter" - 5A - 91 - 28
'COMMODORE - "L Ctr" - 14 - 21 - 61
'shift LEFT - "L Shift" - 12 - 19 - 42
'Z - "Z" - 1A - 27 - 52
'X - "X" - 22 - 35 - 43
'C - "C" - 21 - 34 - 53
'V - "V" - 2A - 43 - 44
'B - "B" - 32 - 51 - 54
'N - "N" - 31 - 50 - 45
'M - "M" - 3A - 59 - 55
', - "," - 41 - 66 - 46
'. - "." - 49 - 74 - 56
'/ - "/" - 4A - 75 - 47
'shift RIGHT - "R Shift" - 59 - 90 - 57
'crs UP/DWN - "D Arrow" - 72 - 115 - 48
'crs LFT/RIGHT - "R Arrow" - 74 - 117 - 38
'SPACE - "SPACE" - 29 - 42 - 51
'F1/F2 - "F9" - 01 - 02 - 58
'F3/F4 - "F10" - 09 - 10 - 68
'F5/F6 - "F11" - 78 - 121 - 78
'F7/F8 - "F12" - 07 - 08 - 88
Schemat: (https://naforum.zapodaj.net/thumbs/624b50382628.png) (https://naforum.zapodaj.net/624b50382628.png.html)
Schemat klawiatury C64: (https://naforum.zapodaj.net/thumbs/e87020d2487e.png) (https://naforum.zapodaj.net/e87020d2487e.png.html)
Działanie programu w skrócie:
1. czekaj na wciśnięcie klawisza i pobierz jego kod;
2. zdekoduj Nr rzędu i kolumny z tabeli;
3. czekaj aż na zdekodowanej kolumnie będzie stan 0 i w tym momencie ustaw 0 na zdekodowanym rzędzie
4. odczekaj określony czas
5. ustaw stan jeden na wszystkich rzędach
6. wróć do pk.1
Jak widać powyżej nie mam prawie żadnego doświadczenia z uC.
Jest to oczywiście wersja bardzo testowa, stąd np. rozbicie Lowerkeys - "CASE" i Upperkeys - "IF" (pozwala sprawdzić 2 możliwości za 1 zamachem ;p).
Przepraszam, ale kod musiałem wstawić inaczej pisałbym o niczym.... Oczywiście nie ponoszę żadnej odpowiedzialności za wykorzystanie... :P :D
Trochę to działa t.j. zależnie od ustawienia "WAITMS" (czas przytrzymania stanu na rzedach) - przy długim czasie mamy zapis wierszy głównie do kolumny A, przy krótkim i przytrzymaniu klawisza czasami "trafiamy" w inną kolumnę... Innymi słowy - najlepiej działa spacja :D
We wspomnianym wyżej temacie kolega @Kisiel napisał:
Witam
Zastanawia mnie kwestia emulowania klawiatury dla C64/128. O ile dobrze pamiętam, to były tam jakieś numery ze stanami logicznymi (to jest zwykła klawiatura multipleksowana), i nawet w którymś projekcie zastosowano matrycę łączników CMOS aby to ominąć. A ATMega jak to emuluje? Wykrywa kiedy linia jest wybierana i generuje wtedy sygnał wiersza?
A to akurat proste, masz bodaj siedem cykli procesora 6502 na odpowiedź , w tym czasie na przerwaniu wystawiasz wartość odpowiedzi.
Ja to zrobiłem na MSP430 plus level. Kolejny niedokończony projekt :)
- rozumiem, że "wykładam" się na "...w przerwaniu...", choć nie do końca wiem o co chodzi.
W przypadku "Lowerkeys" (CASE) na pewno wykrywany jest stan niski na lini danej kolumny gdyż program kontynuuje działanie - pobiera kolejny wciśnięty klawisz.
Bardzo proszę o pomoc, bo poległem:
- nie jestem leniem - start projektu praktycznie od 0 i ok. 200 przetestowanych wersji tegoż programiku;
- wiem, że niewiele wiem - dlatego proszę o pomoc;
- wiem, że próbuje zrobić "coś" z "niczego" - wydaje mi się, że nie ma sensu strzelanie do komarów z armaty (analog switch + "duży" procek);
- bardzo przepraszam za ortografy i inne błędy - nie mam wytłumaczenia, moja wina.
Na czym mi zależy (wymieniłem w komentarzu do programu, ale powtórzę):
1. możliwość zmiany keymapy + rozszerzenia np.: osobno traktowane klawisze F1 do F7 (czyli po wciśnięciu na klawiaturze F7 C64 dostaje Shift+F6);
2. wykrywanie wciśnięcia więcej niż 1 klawisza;
3. obsługa CapsLocka jako ShiftLocka (również dioda LED na klawiaturze).
Może jednak uśmiechnąć się do Atmegi88P (więcej pinków) - wyłączanie Reset jest jednak uciążliwe pomimo Fuse Bit Doctora - przy testach nie podłączam tej linii.
Tak czy inaczej, jeszcze raz prosząc o pomoc pozdrawiam. :)
-
Jak bedzie nieaktulne to sam napisze, jak najbardziej jest aktualna, nie mam czasu na publikacje w chwili obecnej, ponadto projekt był przygotowany dla gosci z forum .de i z uwagi na pewne ustalenia zbytnio nie rozchwalam tego cuda (zrobi sie konkurencja) i pewne osoby moga sie zagotować na czym mi nie zależy.
Ponadto moje pytanie, po co podłaczac klawiat z PC do C64 ? akurat klawiatru do C64 nie brakuje zatem jaki sens ma takie szycie ?
-
Jak bedzie nieaktulne to sam napisze, jak najbardziej jest aktualna, nie mam czasu na publikacje w chwili obecnej, ponadto projekt był przygotowany dla gosci z forum .de i z uwagi na pewne ustalenia zbytnio nie rozchwalam tego cuda (zrobi sie konkurencja) i pewne osoby moga sie zagotować na czym mi nie zależy.
Ponadto moje pytanie, po co podłaczac klawiat z PC do C64 ? akurat klawiatru do C64 nie brakuje zatem jaki sens ma takie szycie ?
Takie szycie może mieć zatosowanie w jakimś c64 upchanym w inną obudowę niż oryginalna. Po upchaniu mobo odpada konieczność przedłużania kabla i kombinowania obudowy do klawy. Wygoda panie, wygoda. No i klawa at/ps2 jest dużo tańsza i łatwiej dostępna
-
No nie wiem, klawiat do c64 kupisz za 20 - 30zł, jak pakujsz plyte z C64 np. do obudowy AT/ATX PC to i tak zostaje do wykorzystania obudowa po C64 z klawiatura i nie trzeba nic robić poza przewodem, widziałem wiele takich projektów np. vanessa i zawsze tak to robili nikt sie nie bawił w klawiatury od PC ale jak ktoś lubi to czemu nie, ponadto dla klawiatry z PC potrzeba jeszcze chyba naklejki na klawisze co sie dodatkowo komplikuje - chyba ze to ma udawac PC :p
-
Sam przedłużałem upychając 64 w bude od blaszaka. Do dziś pamiętam ten gruby i sztywny kabel. Mam nawet skróconą obudowę klawiatury po tej herezji. W każdym razie każdy nowy dodatek do c64 może okazać sie przydatny do jakichś celów. Wszystko zależy od tego co autor miał na myśli :)
-
... i pewne osoby moga sie zagotować ....
Heh przecież to tylko interfejs do klawiatury, a nie patent na Nagre, ;D ale nie wnikam, powody mnie nie interesują ważne, że aktualne. 8)
...jaki sens ma takie szycie ?
Takie szycie może mieć zatosowanie w jakimś c64 upchanym w inną obudowę niż oryginalna. Po upchaniu mobo odpada konieczność przedłużania kabla i kombinowania obudowy do klawy. Wygoda panie, wygoda.
Dokładnie tak w 99%. :)
No nie wiem, klawiat do c64 kupisz za 20 - 30zł, jak pakujsz plyte z C64 np. do obudowy AT/ATX PC to i tak zostaje do wykorzystania obudowa po C64 z klawiatura i nie trzeba nic robić poza przewodem, widziałem wiele takich projektów np. vanessa i zawsze tak to robili nikt sie nie bawił w klawiatury od PC ale jak ktoś lubi to czemu nie, ponadto dla klawiatry z PC potrzeba jeszcze chyba naklejki na klawisze co sie dodatkowo komplikuje - chyba ze to ma udawac PC :p
Nie zostanie obudowa, bo jej nie ma - Commodorek, a właściwie płyta, odratowany ze shrotu. Chciałbym go wstawić do obudowy al'a tower niekoniecznie od PC raczej coś z drewna - wyprowadzone złącza, wbudowany PSU i SD2IEC i co tam się zmieści, ale w taki sposób by całość była "rozbieralna".
Mam klawiatury od kas fiskalnych (mechaniczne) i można by z tego zrobić dość fajną klawiaturkę do 64, ale nadal pozostaje w/w kwestia 18 żyłowego druta...
Btw. W przerobionej obudowie od blaszaka (CD zamontowane na górze) mam Amigę CD32 + SX1 i też jakieś problemy z klawiaturą AT występowały. Bodajże obszedłem opóźnieniem startu lub Reset na 555 - dokładnie nie pamiętam, ale działa do dziś i nadal cieszy. :)
-
Ja gdybym cos takiego robił to bezprzewodowa klawiature bym dodał, co za roznica czy przewód bedzie miał 20 zył czy 4 zyly, lepiej jak by go nie bylo wcale :) po co sie ograniczac.
-
Ja gdybym cos takiego robił to bezprzewodowa klawiature bym dodał, co za roznica czy przewód bedzie miał 20 zył czy 4 zyly, lepiej jak by go nie bylo wcale :) po co sie ograniczac.
W sumie..
Nrf24l01 z odpowiednim wsadem + konwerter napięć + arduino promini i można sobie klawke na 2.4GHz podpinać :)
-
Ja gdybym cos takiego robił to bezprzewodowa klawiature bym dodał, co za roznica czy przewód bedzie miał 20 zył czy 4 zyly, lepiej jak by go nie bylo wcale :) po co sie ograniczac.
W sumie..
Nrf24l01 z odpowiednim wsadem + konwerter napięć + arduino promini i można sobie klawke na 2.4GHz podpinać :)
No super, ale i tak trza CIA najpierw umieć obsłużyć. :D
Wydaje mi się, że CIA działa tak:
kolumna 7 ________________________
kolumna 6 -_------------------------------------
kolumna 5 ---_----------------------------------
kolumna 4 -----_--------------------------------
itd.
ale jak widać źle mi się wydaje...
bo to:
Case 1
Do : Loop Until K1 = 0
Rzedy = Rzad
przy wykryciu 0 na określonej kolumnie ustawia 0 na odpowiednim rzędzie.
Jeżeli następnie wstawimy odpowiednio długi wait zanim przywrócimy stan 1 na tym rzędzie to uzyskujemy reakcję ze strony C64 (z reguły niepożądaną(niewłaściwa kolumna)), przy zbyt krótkim nie.
Tak wiem że używanie waitów jest niehigieniczne (uczę się). ;p
Może zrobić inaczej (tylko nie bardzo wiem jak to w programie zapisać).
Mój pierwotny zamysł był taki:
1. w przerwaniu skanuje tylko kol6;
2. w momencie gdy 0 na kol6 startuje licznik (maks. stan licznika to czas do kolejnego 0 na kol6-1);
2. po odczycie klawiatury At czekam gdy wartość na liczniku pokryje się z numerem kolumny dla określonego znaku;
3. ustawiam 0 na określonym rzędzie przez czas skanowania określonej kolumny -1 (zanim zacznie być skanowana następna kolumna).
No chyba, że Tinka się czasowo nie wyrabia (wew. 8MHz) i nic z tym nie zrobię... No i kwestja tego co interpreter robi z tym co napisałem np. szybsze jest IF czy CASE? I wiele innych takich niewiadomych. ;p
-
Na wstępie:
1. Wiem, że piszę posta pod postem, ale nie chciałem żeby post monstrum wyszedł, więc jeżeli Mod/Admin uzna że trza połączyć proszę łączyć. :)
2. Jeżeli to jakaś tajemnica jest jak obsługa klawiatury realizowana jest przez CIA i jak to zrobić przy pomocy AVRka to proszę napisać, że "Wiemy, ale nie powiemy. Nie bo nie i już!" - zrozumiem (kol. @rs2322 nie ciągnę za język, bo napisał że ktoś tam by się ugotował i to rozumiem). :P Nie próbuję jakiegoś cuda na miarę UK1541 czy HxC tylko zwykły emulator klawiatury, a ponieważ brak mi wiedzy/doświadczenia (głupi jestem) pytam osoby, jak mniemam, nią dysponujące. Bardzo proszę się nie obrażać na to co napisałem, nie chcę żeby zostało to odebrane jako postawa roszczeniowa - po prostu chcę wiedzieć na czym stoję.
3. English is not fun for me, so on the english board i feel like a sinking man, a google tłumacz wcale nie pomaga (ergo - organ nie używany zanika i to jest prawda). ;P
4. Mam Arduino Uno, ale C za bardzo nie ogarniam oprócz podstaw w wersji dla Arduino, ale Tinka ma 2kb + EEPROM - co powinno w zupełności wystarczyć (pisałem już o tym), a to co dotychczas napisałem i jest niezoptymalizowane zajmuje ok 60% ROM.
Dobra, ale do rzeczy:
Może zrobić inaczej (tylko nie bardzo wiem jak to w programie zapisać).
Mój pierwotny zamysł był taki:
1. w przerwaniu skanuje tylko kol6;
2. w momencie gdy 0 na kol6 startuje licznik (maks. stan licznika to czas do kolejnego 0 na kol6-1);
1. dalej zakładam że CIA działa jak napisałem powyżej;
1a. wciąż nie jestem przekonany co do użycia przerwań - procek musi zrzucić stos wykonać przerwanie przywrócić stos itd. a to zżera czas, ale
2. dopisałem coś co pozwala mniej/więcej zmierzyć czas od impulsu 0 to impulsu 0 na wybranej kolumnie (konkretnie zbocze opadające) (wklejam całość żeby było czytelniej).
2a. przypominam że kompilator Bascoma ignoruje linie ze znakiem " ' " - komentarz lub nieużywana linia:
'opis patrz niżej...
' przejsciowka PS/2 AT do C64 keyboard interface
'1. prawdopodobnie 6526 trzyma normalnie na pa7 low (chyba ze przalacza pot z gniazd joy lub stan niski na ktoryms z"rzedow")
'wiec jezeli na zadnej pa0 do pa6 nie ma low to znaczy ze "skanowana" jest pa7
'
' TEST - CZAS - OD KOLUMNY DO KOLUMNY!!!! + UART
'
'!!! W finalnej wersji zmienic Fuse BIta od RESET !!!
'
'Problemy do rozwiazania:
'1. wiadomo jaki :/
'2. Klawisze z shiftem
'3. wcisniecie kilku klawiszy na raz (pp. GetAtKbdRaw pomoze)
$regfile = "attiny2313a.dat"
$crystal = 8000000
$baud = 9600
'$prog &HFF , &HE4 , &HDF , &HFF ' generated. Take care that the chip supports all fuse bytes.
Config Portb = Output 'rzędy od 0 do 7 np. rząd0 pinb.0 czyli rzad1 pinb.1 (pb0-pb7) | pin12(złącze klawiatury) row0 > pin5 row7
'rzedy w tabeli keydata wpisywane sa +1 czyli rzad 2 wpisany jest jako 3
' Config Porta.0 = Input 'kolumna h7 pin(zlacze klawiatury) 13
' Config Porta.1 = Input 'kolumna g6 pin(zlacze klawiatury) 14
' Config Porta.2 = Input 'kolumna f5.pin(zlacze klawiatury) 15
'.
' Config Portd.0 = Input 'kolumn e4 pin(zlacze klawiatury) 16
Config Portd.1 = Output 'Odkomentowac W Finalnej Wersji Bedzie To Restore
Config Portd.2 = Input 'kolumna d3 pin(zlacze klawiatury) 17
Config Portd.5 = Input 'kolumna c2 pin(zlacze klawiatury) 18
' Config Portd.6 = Input 'kolumna b1 pin(zlacze klawiatury) 19
'kolumny podobnie jak rzedy + 1 czyli kolumna c2 to kolumna 3 pind.5
'kolumna a0 pin(zlacze klawiatury) 20 jezeli na ktorymkolwiek z powyzszych stan 1 to kolumna H aktywna
Rzedy Alias Portb
'Kol.0 Alias 0 'to kolumna zadna z powyzszych
'K1 Alias Portd.6
K2 Alias Portd.5
K3 Alias Portd.2
'K4 Alias Portd.0
'K5 Alias Porta.2
'K6 Alias Porta.1
'K7 Alias Porta.0
Rest Alias Portd.1
Config Keyboard = Pind.3 , Data = Pind.4 , Keydata = Keydata
Rzedy = 255
Dim A As Word , B As Byte , C As Word , D As Word 'pomocnicze
Dim Klawisz As Byte , Nr As Byte , Nk As Byte , Rzad As Byte '"Nr" - numer rzedu, "Nk" - numer kolumny, "Rzad" - bajt ustawiany na porcie rzedow
Dim Cps As Bit 'Cps - stan caps lock (shift lock)
Cps = 0
Config Timer1 = Timer , Prescale = 8
Config Int0 = Falling
On Int0 Kol6
On Ovf1 Przep
Enable Interrupts
Enable Timer1
Enable Int0
Stop Timer1
Timer1 = 0
A = 0
B = 0
C = 0
D = 20000
Waitms 2500
Do
Print "hello"
Do
If C < A Then : C = A : End If
If D > A And A > 1000 Then : D = A : End If
'If A > 0 Then
Print B ; " " ; A ; " " ; C ; " " ; D ; " " ; Chr(13);
'Print " "
'End If
Loop
Do 'odczyt klawiatury + czeka na zwrocenie wartosci z taklicy keydata <>0
Klawisz = Getatkbd()
' If Klawisz = 0 Then
' Rzedy = 255
' End If
Loop Until Klawisz <> 0
' Klawisz = 56 ' zakomentowac w pelnej wersji - linia do testowania
If Klawisz = 42 Then Toggle Cps
Nr = Klawisz / 10 'rozbicie na rzedy
Nr = Nr - 1 '-1 patrz dlacego w opisie
Nk = Klawisz Mod 10 'rozbicie na kolumny
Nk = Nk - 1 '-1 patrz opis ponizej
Rzad = Lookup(nr , Dr) ' odczytaj wartosc z pozycji "rzad" tabeli "dr"
Loop
Kol6:
If Timer1 = 0 Then
Start Timer1
'B = B + 1
Else
Stop Timer1
A = Timer1
Timer1 = 0
'B = 0
End If
Return
Przep:
B = B + 1
Return
'------------------------------------------------------------------------------------------------
'Dane rzedow - rzedy od 0 do 7 np. dec127 = byte0111 1111
Dr:
'Data 127 , 191 , 223 , 239 , 247 , 251 , 253 , 254
Data 254 , 253 , 251 , 247 , 239 , 223 , 191 , 127
'mapa klawiatury rzedami - wybrana pozycja 0111 1111, 1011 1111
'------------------------------------------------------------------------------------------------
'Dane kolumn t.j. poukladane porty od 0 do 7
'Dk:
'Data 0 , "K1" , "K2" , "K3" , "K4" , "K5" , "K6" , "K7"
'------------------------------------------------------------------------------------------------
'talica znakow zapisana rzad kolumna np. 34 rzad 2 kolumna a3
Keydata:
'normal keys lower case
Data 0 , 58 , 0 , 0 , 0 , 0 , 0 , 88 , 0 , 68 , 0 , 0 , 0 , 31 , 21 , 0
Data 0 , 41 , 42 , 0 , 61 , 71 , 11 , 0 , 0 , 0 , 52 , 62 , 32 , 22 , 81 , 0
Data 0 , 53 , 43 , 33 , 72 , 82 , 12 , 0 , 0 , 51 , 44 , 63 , 73 , 23 , 13 , 0
Data 0 , 45 , 54 , 64 , 34 , 24 , 83 , 0 , 0 , 0 , 55 , 35 , 74 , 14 , 84 , 0
Data 0 , 46 , 65 , 25 , 75 , 85 , 15 , 0 , 0 , 56 , 47 , 36 , 66 , 26 , 16 , 0
Data 0 , 0 , 37 , 0 , 76 , 86 , 0 , 0 , 42 , 57 , 28 , 27 , 0 , 67 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 17 , 0 , 0 , 10 , 0 , 0 , 18 , 0 , 0 , 0
Data 87 , 77 , 48 , 0 , 38 , 0 , 0 , 0 , 78 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'shifted keys UPPER case
Data 0 , 58 , 0 , 0 , 0 , 0 , 0 , 88 , 0 , 68 , 0 , 0 , 0 , 31 , 21 , 0 '16
Data 0 , 41 , 42 , 0 , 61 , 71 , 11 , 0 , 0 , 0 , 52 , 62 , 32 , 22 , 81 , 0 '32
Data 0 , 53 , 43 , 33 , 72 , 82 , 12 , 0 , 0 , 51 , 44 , 63 , 73 , 23 , 13 , 0 '48
Data 0 , 45 , 54 , 64 , 34 , 24 , 83 , 0 , 0 , 0 , 55 , 35 , 74 , 14 , 84 , 0 '64
Data 0 , 46 , 65 , 25 , 75 , 85 , 15 , 0 , 0 , 56 , 47 , 36 , 66 , 26 , 16 , 0 '80
Data 0 , 0 , 37 , 0 , 76 , 86 , 0 , 0 , 42 , 57 , 28 , 27 , 0 , 67 , 0 , 0 '96
Data 0 , 0 , 0 , 0 , 0 , 0 , 17 , 0 , 0 , 10 , 0 , 0 , 18 , 0 , 0 , 0 '112
Data 87 , 77 , 48 , 0 , 38 , 0 , 0 , 0 , 78 , 0 , 0 , 0 , 0 , 0 , 0 , 0 '128
'przypisanie klawiszy c64 - atkeyb - kod getatkbd (hex) - rzad kolumna C64
'c64 key AT key scancode table position Keydata (rzad/kolumna)+1
'left arrow - "`" - 0e - 15 - 21
'1 - "1" - 16 - 23 - 11
'2 - "2" - 1e - 31 - 81
'3 - "3" - 26 - 39 - 12
'4 - "4" - 25 - 38 - 82
'5 - "5" - 2E - 47 - 13
'6 - "6" - 36 - 55 - 83
'7 - "7" - 3D - 62 - 14
'8 - "8" - 3E - 63 - 84
'9 - "9" - 46 - 71 - 15
'0 - "0" - 45 - 70 - 85
'+ - "-" - 4E - 79 - 16
'- - "=" - 55 - 86 - 86
'Funt - "BkSp" - 66 - 103 - 17
'crl/home - "Insert" - 70 - 113 - 87
'inst/del - "Home" - 6C - 109 - 18
'control - "Tab" - 0D - 14 - 31
'Q - "Q" - 15 - 22 - 71
'W - "W" - 1D - 30 - 22
'E - "E" - 24 - 37 - 72
'R - "R" - 2D - 46 - 23
'T - "T" - 2C - 45 - 73
'Y - "Y" - 35 - 54 - 24
'U - "U" - 3C - 61 - 74
'I - "I" - 43 - 68 - 25
'O - "O" - 44 - 69 - 75
'P - "P" - 4D - 78 - 26
'@ - "[" - 54 - 85 - 76
'* - "]" - 5B - 92 - 27
'arrow up - "Del" - 71 - 114 - 77
'RESTORE - "End" - 69 - 106 - 10 osobne wyjście attiny
'run/stop - "L Alt" - 11 - 18 - 41
'shift lock - "CpsLck" - 58 - 89 - 42
'A - "A" - 1C - 29 - 32
'S - "S" - 1B - 28 - 62
'D - "D" - 23 - 36 - 33
'F - "F" - 2B - 44 - 63
'G - "G" - 34 - 53 - 34
'H - "H" - 33 - 52 - 64
'J - "J" - 3B - 60 - 35
'K - "K" - 42 - 67 - 65
'L - "L" - 4B - 76 - 36
': - ";" - 4C - 77 - 66
'; - "'" - 52 - 83 - 37
'= - "\" - 5D - 94 - 67
'RETURN - "Enter" - 5A - 91 - 28
'COMMODORE - "L Ctr" - 14 - 21 - 61
'shift LEFT - "L Shift" - 12 - 19 - 42
'Z - "Z" - 1A - 27 - 52
'X - "X" - 22 - 35 - 43
'C - "C" - 21 - 34 - 53
'V - "V" - 2A - 43 - 44
'B - "B" - 32 - 51 - 54
'N - "N" - 31 - 50 - 45
'M - "M" - 3A - 59 - 55
', - "," - 41 - 66 - 46
'. - "." - 49 - 74 - 56
'/ - "/" - 4A - 75 - 47
'shift RIGHT - "R Shift" - 59 - 90 - 57
'crs UP/DWN - "D Arrow" - 72 - 115 - 48
'crs LFT/RIGHT - "R Arrow" - 74 - 117 - 38
'SPACE - "SPACE" - 29 - 42 - 51
'F1/F2 - "F9" - 01 - 02 - 58
'F3/F4 - "F10" - 09 - 10 - 68
'F5/F6 - "F11" - 78 - 121 - 78
'F7/F8 - "F12" - 07 - 08 - 88
Czyli w skrócie:
1.Poczekaj aż Commodorek wystartuje;
2. napisz "Hello" - UART;
3. Wyślij do UART zmienne: B - przepełnienie; A - odczyt z Timera; C - najdłuższy czas ; D - Najkrótszy czas (od przerwania do przerwania czyli od 0 do 0 na badanej kolumnie)
- przerwanie1:
A. jeżeli zbocze opadające na PD2;
B. jeżeli timer stoi - wystartuj Timer;
C. jeżeli Timer pracuje przypisz jego wartość do zmiennej A i zatrzymaj Timer.
- przerwanie2: (Overflow)
A. dodaj 1 do B (sprawdzanie przepełnień).
Uzyskany wynik to: od ok. 16900 do ok. 17300 czyli przy preskale=8 (Fuse Bit divide mam wyłączony) od 0.0169sek. do 0.0173sek. (przetestowane na 3 kolumnach)
Wynik oczywiście +- bo dochodzi czas na wywołanie przerwania, UART i inne pierdoły i to, że używam wewnętrznego oscylatora.
Dzielimy na 8 i od zbocza opadającego do kolejnego opadającego zbocza następnego pinka (kolumny) mamy ok. 2137 czyli 0.002137sek, ok. 2ms (strasznie dużo czasu).
Więc dalej nie wiem czemu pierwotna wersja nie chce działać... :-\ Jeśli ktoś, coś to wciąż proszę o pomoc. :)
-
podlacz sobie oscyloskop, nacisnij jakis klawisz, zobacz jak zmienian sie stan na linii (reakcja na zbocze), zrób to samo za pomocą AVR, tyle
po pierwsze wywal wszystkie "wait" bo to będzie kiepsko działało lub prawie wcale
ponadto z pradawnych czasów, dla Bascoma była istotna wersja kompilatora jak i komentarze (miejsce ich stawienia), nie wiem czy to poprawili ale lepej wywal komenatarze
i moze przeskocz na Arduino lub C bo ten jezyk jest raczej wymarły,
wedlug mnie to raczej temat na elektrode, tutaj predzej znajdziesz pomoc jak byś to pisał w asemblerze :) wtedy mozesz liczyc na gotowca nawet w mojej strony
-
podlacz sobie oscyloskop, nacisnij jakis klawisz, zobacz jak zmienian sie stan na linii (reakcja na zbocze)...
W momencie wciśnięcia klawisza "zwalnia" odczyt kolumn - zauważyłem.
...ponadto z pradawnych czasów, dla Bascoma była istotna wersja kompilatora jak i komentarze (miejsce ich stawienia), nie wiem czy to poprawili ale lepej wywal komenatarze...
Spróbuje.
...i moze przeskocz na Arduino lub C bo ten jezyk jest raczej wymarły,
wedlug mnie to raczej temat na elektrode, tutaj predzej znajdziesz pomoc jak byś to pisał w asemblerze :) wtedy mozesz liczyc na gotowca nawet w mojej strony
Za wiele wymagasz. Jakieś 26 lat temu pisałem w ASM na C64 - proste, bo proste ale pisałem - nic karwa nie pamiętam! :D
(C nigdy wcześniej nie używałem, raczej Pascal - ale też nic/niewiele nie pamiętam)
P.S.
Ciebie za język nie ciągnę j.w. - tym bardziej dzięki za info. :)
-
Działanie programu w skrócie:
1. czekaj na wciśnięcie klawisza i pobierz jego kod;
2. zdekoduj Nr rzędu i kolumny z tabeli;
3. czekaj aż na zdekodowanej kolumnie będzie stan 0 i w tym momencie ustaw 0 na zdekodowanym rzędzie
4. odczekaj określony czas
5. ustaw stan jeden na wszystkich rzędach
6. wróć do pk.1
Wyglada na to ze twoj algorytm jest bledny.
Punkty 1-3 OK
punkt 4. powinien byc czekaj az zniknie stan 0 na kolumnie i wowczas ustaw stan jeden na wszystkich rzędach.
6. wroc do pk.1
oczywiscie mozesz rozbuowac program o kilka klawiszy jednoczesnie co nieco skomplikuje algorytm.
Dodatkowo mozesz miec problem z predkoscia programu w BCASCOM i lepij zrobic te czesc programu w asemblerze.
-
Działanie programu w skrócie:
1. czekaj na wciśnięcie klawisza i pobierz jego kod;
2. zdekoduj Nr rzędu i kolumny z tabeli;
3. czekaj aż na zdekodowanej kolumnie będzie stan 0 i w tym momencie ustaw 0 na zdekodowanym rzędzie
4. odczekaj określony czas
5. ustaw stan jeden na wszystkich rzędach
6. wróć do pk.1
Wyglada na to ze twoj algorytm jest bledny.
Punkty 1-3 OK
punkt 4. powinien byc czekaj az zniknie stan 0 na kolumnie i wowczas ustaw stan jeden na wszystkich rzędach.
6. wroc do pk.1
oczywiscie mozesz rozbuowac program o kilka klawiszy jednoczesnie co nieco skomplikuje algorytm.
Dodatkowo mozesz miec problem z predkoscia programu w BCASCOM i lepij zrobic te czesc programu w asemblerze.
z takim algorytmem życzę powodzenia.
-
Bascom jest powolny, kompilator ma skopany, kod wynikowy typowego "blink" potrafi ważyc kilka kb. Przeskocz na arduino ide, masa przykładów, bibliotek, i ogolnie przyjemnie sie w tym rzeźbi. Mówie to jako zatracony pascalowiec. Łatwiej mi było ogarnąć arduino ide niż bascom avr. W dodatku jest support dla większości procków avr nie tylko tych upchanych na plytki *ino.
-
podlacz sobie oscyloskop, nacisnij jakis klawisz, zobacz jak zmienian sie stan na linii (reakcja na zbocze)...
W momencie wciśnięcia klawisza "zwalnia" odczyt kolumn - zauważyłem.
Ha! Już wiem co miałem zobaczyć. Ja stary, mój oscyloskop stary (ZDZtu Mini5a) i raczej do audio. Pokombinowałem, pokręciłem gałami i wyszło:
- "wolna" kolumna ------------_--------------
- połączona z rzędem ------------_--___--------
Ciężko to uchwycić więc jak wcześniej sprawdzałem to widziałem (stary i ślepy;p) -----------_____----------- po wciśnięciu guzika i to miałem na myśli pisząc "zwalnia".
Ok 1 problem rozwiązany! :D
punkt 4. powinien byc czekaj az zniknie stan 0 na kolumnie i wowczas ustaw stan jeden na wszystkich rzędach.
tak też kombinowałem czyli:
Do : Loop until Kx=0
Rzedy=rzad
Do : loop until Kx=1
Rzedy = 255
Choć waity raczej "szybciej chodzą" i tylko wystarczy "wyregulować" długość.
Dodatkowo mozesz miec problem z predkoscia programu w BCASCOM i lepij zrobic te czesc programu w asemblerze.
Bascom jest powolny, kompilator ma skopany, kod wynikowy typowego "blink" potrafi ważyc kilka kb. Przeskocz na arduino ide, masa przykładów, bibliotek, i ogolnie przyjemnie sie w tym rzeźbi. Mówie to jako zatracony pascalowiec. Łatwiej mi było ogarnąć arduino ide niż bascom avr. W dodatku jest support dla większości procków avr nie tylko tych upchanych na plytki *ino.
I tak będę musiał zrobić, czyli zakończyć przygodę z Bascom'em - przynajmniej do takich rzeczy i pomordować Arduino. Choć nawet fajnie się w tym pisze t.j. prosto. Czego się nauczyłem to moje, dopóki nie zapomnę. :D
Btw. napisałem prosty programik dla znajomego typu: ustaw czas1 ustaw czas2 i w zależności od tego co pojawi się na wejściach i w którym momencie załącz/wyłącz przekaźnik. Zrobiony na waitach w "forach" bez przerwań i co ciekawe jest dość punktualny nawet przy kilkudziesięciu minutach.
z takim algorytmem życzę powodzenia.
Dzięki. ;D
P.S.
Może ktoś podrzuci linka do jakiegoś sensownego/sprawdzonego kursu Arduino?
Najlepiej dla "opornych". ;D
-
Do : Loop until Kx=0
Rzedy=rzad
Do : loop until Kx=1
Rzedy = 255
Choć waity raczej "szybciej chodzą" i tylko wystarczy "wyregulować" długość.
Regulacja dlugosci nie wystarczy.
A czy ten kod nie powinien wygladac tak:
Do Rzedy=rzad Loop until Kx=0
Rzedy = 255
-
Do Rzedy=rzad Loop until Kx=0
Rzedy = 255
Wtedy będzie ustawiał 0 na wybranym rzędzie do momentu, gdy na Kx nie będzie 0 (wybrana kolumna). Czyli pozostałe skanowane przez CIA kolumny też dostaną 0 na danym rzędzie - mylę się?
Btw. Jednorazowa zmiana stanu wystarczy, na zapętleniu z ciągłym wpisywaniem stanu procek raczej będzie wykonywał więcej rozkazów. Chyba, że interpreter inaczej interpretuje niż myślę i będzie odwrotnie. :D
-
Dzięki @hobocti77x - dałeś mi do myślenia! Rzeczywiście kod powinien wyglądać inaczej, choć nie we wskazanej przez Ciebie części. :D
Zrobiłem głupiego babola na samym początku i tak go woziłem do dziś: stan pinka odczytujemy z rejestru PINX.Y nie PORTX.Y. :facepalm:
Czyli powinno być:
'Kol.0 Alias 0 'to kolumna zadna z powyzszych
K1 Alias Pind.6
K2 Alias Pind.5
K3 Alias Pind.2
K4 Alias Pind.0
K5 Alias Pind.1
K6 Alias Pina.1
K7 Alias Pina.0
(przy okazji przeniosłem RESET)
Waity jednak nie mają znaczenia, bo:
Select Case Nk
Case 0
Do : Loop Until K7 = 0
' Do : Loop Until K7 = 1
Waitus 300
Rzedy = Rzad
Waitms 19 '!thats it! :D
Rzedy = 255
Case 1
Do : Loop Until K1 = 0
'Waitus 10
Rzedy = Rzad
Waitus 270 '!thats it! :D
Rzedy = 255
Case 2
Do : Loop Until K2 = 0
Rzedy = Rzad
Do : Loop Until K2 = 1
Do : Loop Until K2 = 0
Do : Loop Until K2 = 1
Case 3
Do : Loop Until K3 = 0
Rzedy = Rzad
Do : Loop Until K3 = 1
Do : Loop Until K3 = 0
Do : Loop Until K3 = 1
Case 4
Do : Loop Until K4 = 0
Rzedy = Rzad
Do : Loop Until K4 = 1
Do : Loop Until K4 = 0
Do : Loop Until K4 = 1
Case 5
Do : Loop Until K5 = 0
Rzedy = Rzad
Do : Loop Until K5 = 1
Do : Loop Until K5 = 0
Do : Loop Until K5 = 1
Case 6
Do : Loop Until K6 = 0
Rzedy = Rzad
Do : Loop Until K6 = 1
Do : Loop Until K6 = 0
Do : Loop Until K6 = 1
Case 7
Do : Loop Until K7 = 0
Rzedy = Rzad
Do : Loop Until K7 = 1
Do : Loop Until K7 = 0
Do : Loop Until K7 = 1
Case 255 And Nr = 0
Rest = 0
Waitus 50
Rest = 1
End Select
'Waitms 2
Rzedy = 255
Loop
Case 1 - działa na waicie, a Case 2 ... 7 na odczycie stanu kolumnyX (dzięki kol.@rs2322) - wszystko trybi.
Case 0 (kolumna A) zrobiona dziwnie (ale działa) - bo czy CIA czyta kolumny od A do H, czy H do A, czy B do H, A wybierając w momencie gdy dłużej "wisi" stan 0 na którymś wierszu?
P.S.
Została jeszcze przynajmniej obsługa SHIFTA do zrobienia. Raczej ciężko będzie zrobić wybieranie kilku znaków (po kompilatorze bascoma braknie miejsca w Tince;P) - muszę nad tym pomyśleć.
-
E93A: 8D 00 DC STA $DC00
E93D: AD 01 DC LDA $DC01
proponuje jeszcze tak z 3 strony napisać ale bardziej na elektrodzie bo brednie to są dobre dla moderatorów.
-
E93A: 8D 00 DC STA $DC00
E93D: AD 01 DC LDA $DC01
proponuje jeszcze tak z 3 strony napisać ale bardziej na elektrodzie bo brednie to są dobre dla moderatorów.
W sumie racja.
Do zamknięcia, więcej raczej się nie dowiem.
Dzięki za pomoc i pozdrawiam. :)