PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PS/2 Tastatur an ATMEGA 8



SMB-Soft
22.12.2008, 11:23
Hallo zusammen,
ich bin am verzweifeln.
Ich habe im Buch von Claus Kühnel (AVR mit Bascom programmieren) das mit der PS/2 Tastatur versucht. Hat nicht funktioniert, es wurden keinerlei Daten über die Ser.Schnittstelle ausgegeben. Nur der Text wurde angezeigt. Ich habe mich dann durch Internet gesucht und die versch. Dinge versucht, aber ich hatte keinen Erfolg. Ich habe eine neue PS/2 Tastatur. Mit dem Oszi sehe ich auch den Takt und die Daten auf den Pins.

Kann mir bitte jemand ein funktionierendes .hex File mit Pin belegung zukommen lassen damit ich weis ob es an mir ligt oder an der Tastatur.
Habt ihr sonst irgendwelche Ideen an was es liegen kann.

Kann es auch an den Fuse Bits liegen?

Gruss
Stefan

Hier mal den letzten Code

$regfile = "m16def.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 40
Config Keyboard = Pinc.1 , Data = Pinc.0 , Keydata = Keydata

Dim B As Byte

Print "Eingabetest von PC-AT-Tastatur"

'Portd.7 = 1

Do
B = Getatkbd() ' Abfrage der Tastatur
If B > 0 Then
Print Chr(b)
End If

Loop
End


Keydata:
' Shift-Taste nicht gedrückt
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

' Shift-Taste gedrückt
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

guenter1604
22.12.2008, 11:40
Hallo Stefan,

für dieses Projekt:

http://www.gerold-online.de/cms/index.php?id=136

hab ich die Datenleitung auf den externen Interrupt 0 gelegt und dann Taste = Getatkbd() in diesem Interrupt erledigt. Ohne Interrupt hab ichs auch nicht hinbekommen

Gruß Günter

SMB-Soft
22.12.2008, 11:49
Hallo Günter,
Danke, oweh Interupt hört sich schon wieder kompliziert an.

Gruss
stefan

Jaecko
22.12.2008, 12:06
Ich habs mal ganz ohne den Befehl gemacht.
Also Datenleitung auf irgend nen Pin, Clock auf nen Interrupt. Und dann einfach die Bits zu Fuss abfragen. Hat den Vorteil, dass eben das Programm selbst nicht blockiert und man auch "freier" ist, da dort auch Sondertasten erkannt werden können, die der Bascom-Befehl z.B. nicht kennt.

guenter1604
22.12.2008, 12:26
Hallo Stefan,

wichtig ist, daß die Leitung Data an Pin D6 kommt. An diesem Pin ist der Interrupt 0 herausgeführt. Sobald der ATMega an dem Pin eine fallende Flanke sieht, wird ISR0 ausgeführt:

Dim Taste As Word
On Int0 Isr0
Config Keyboard = Pind.2 , Data = Pind.6 , Keydata = Keydata
Enable Int0
Config Int0 = Falling
Enable Interrupts

do
'dein genialer Code
if taste > 0 then print chr(Taste)
loop

Isr0: 'interrupt routine
Taste = Getatkbd()
return

Code ist ungeprüft, hoffentlich habe ich auf die Schnelle nix übersehen...

P.S. schau dir mal Keydata aus meinem Beispiel an, da sind auch äöü und ß richtiggestellt...

Günter

SMB-Soft
22.12.2008, 13:20
Hallo Günter,
irgendwo ist da der Wurm drin. Ich bekomme keine Daten von der Tastatur.

Gruss
Stefan

guenter1604
22.12.2008, 13:31
Hallo Stefan,

schreib mal ein:

print "test" in die Interruptroutine um festzustellen:

-wird der Interrupt überhaupt ausgelöst,
-werden überhaupt Daten zur ser. Schnittstelle gesandt.

Günter

SMB-Soft
22.12.2008, 14:39
Hallo Günter,
wenn ich den print "test" in die Int rotut. eintrage und eine Tase auf der Tastatur drücke kommen massen an Test an de ser Schnittstelle an aber sonst nichts.

Das geht schon mal.

Gruss
Stefan

guenter1604
22.12.2008, 15:04
Hallo Stefan,

das ist doch schonmal was!
Es kommen Pulse an, diese werden auch im Inetrrupt behandelt und ausgegeben.
Dann würde ich mal auf vertauschte Data und Clockleitung tippen, oder auf ne defekte Tastatur. Jedenfalls wird der Fehler außerhalb des ATMega liegen.

Günter

Jaecko
22.12.2008, 15:08
Idee: Mal die Interrupts zählen und im Sekundentakt ausgeben lassen.
Ist die Zahl nach bei jedem Tastendruck gleich, hängt die Clock-Leitung dran. Variiert die, dann isses Data.

SMB-Soft
22.12.2008, 15:33
Hallo Günter ich habe jetzt mal Data und Clock getauscht ich verstehe es nicht jetzt kommt bei fast jeden Tastendruck Test. aber kein Wert.

Ich werde jetzt mal die Tastatur an einen PC hängen


Gruss
Stefan

SMB-Soft
22.12.2008, 15:49
Hallo Günter,
die Tastatur ist am PC ok

Aktueller Code

$regfile = "m16def.dat" 'definieren des verwendeten Chips
$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)

Dim Taste As Word

On Int0 Isr0
Config Keyboard = Pind.2 , Data = Pind.6 , Keydata = Keydata
Enable Int0
Config Int0 = Falling
Enable Interrupts

Print "PS/2 Test"

Do
'dein genialer Code
If Taste > 0 Then Print Chr(taste)
Loop

Isr0: 'interrupt routine
Print "test"
Taste = Getatkbd()
Return


Keydata:
' Shift-Taste nicht gedrückt
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

' Shift-Taste gedrückt
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0



Gruss
Stefan

SMB-Soft
26.12.2008, 11:11
Hallo zusammen,
ich bekomms nicht hin, ich werds jetzt erstmal wieder auf Eis legen.

Danke erstmal.

Gruss
Stefan

guenter1604
26.12.2008, 18:14
Hallo Stefan,

so gehts ja nicht!

also ich werde das Dingens jetzt mal an einem Experimentierboard zusammenstecken und das Programm ausprobieren.
Dann melde ich mich nochmal.

Achja etwas ist mir noch eingefallen:

Hast du eventuell das setzen der Fusebits vergessen?
Ein fabrikneuer ATMega8 läuft mit dem internen RC-Oszillator mit 1MHz.

Wenn du dir nicht sicher bist, ändere mal:

$crystal = 8000000
in
$crystal= 1000000

Günter

AndyTrendy
25.01.2009, 13:18
Hallo

Hat jemand das Problem gelöst ??


Mfg#

Demian
19.02.2009, 21:56
Dem möchte ich mich auch mal anschließen. Ich verwende folgenden Code:


$regfile = "m8def.dat"
$crystal = 3686400
$baud = 19200

$hwstack = 40
$swstack = 16
$framesize = 32

Config Keyboard = Pind.2 , Data = Pind.6 , Keydata = Keydata

'Dim some used variables
Dim B As Byte

On Int0 Readkey
Enable Int0
Config Int0 = Falling

Enable Interrupts

Do

Loop


Readkey:
B = Getatkbd()
If B > 0 Then Print B ; " " ; Chr(b)
Return

End
'This is the key translation table

Keydata:
'Kleinbuchstaben
Data 0 , 179 , 0 , 175 , 173 , 171 , 172 , 0 , 0 , 180 , 178 , 176 , 174 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 4 , 4 , 4 , 121 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 4 , 4 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 122 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 4 , 4 , 46 , 45 , 108 , 148 , 112 , 225 , 0
Data 0 , 0 , 132 , 228 , 129 , 92 , 4 , 4 , 4 , 4 , 13 , 4 , 4 , 35 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 177 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 190 , 0

'Grossbuchstaben
Data 0 , 189 , 0 , 185 , 183 , 181 , 182 , 0 , 0 , 0 , 188 , 186 , 184 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 89 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 90 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 153 , 80 , 63 , 0
Data 0 , 0 , 142 , 0 , 154 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 187 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 191 , 0

Als erstes macht mich stutzig, dass der Interrupt auch permanent ausgeführt wird, wenn keine Taste gedrückt wird. Clock und Data sind aber nicht vertauscht, ich habe es vorher durchgepiepst.

Dann kriege ich als Ergebnis im MyAvr QuickProg (externer Quarz ist aktiviert) die im Anhang gezeigten Tasten. Innerhalb des roten Kastens habe ich nur die Taste a (97) gedrückt. Innerhalb des blauen Kasten nur die Taste u (85). Beide erscheinen auch mehrfach, wobei u hier als U dargestellt wird.


Die Tastatur selbst funktioniert unter Windows einwandfrei. Hat da jemand ne Idee? Ärger mich da jetzt schon ein paar Tage mit rum. Der Chip selbst ist was Int0 betrifft auch in Ordnung, da ich inzwischen testweise nen Programm zum Ein- und Auschalten einer LED mit Interrupt erstellt hab.

Gruß
Demian