PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastatur (PS2) imitieren mit einem Mega8



Douser182
03.03.2008, 15:32
Hallo Leute,

Ich will mit einem ATMega8 eine PS2 Tastatur imitieren, damit mein Mega8 zb einen Text schreiben kann. Leider finde ich nur Informationen zum Anschluss einer Tastatur am Mega aber nicht zum imitieren.
Das ganze dürfte eigentlich ja gar nicht so schwer sein, da Bascom offenstichtlich PS2 unterstützt.
Hat von euch, irgendjemand schon einmal so etwas gemacht?

Vielen Dank im voraus!
Douser

Rofo88
03.03.2008, 15:39
SENDSCANKBD heißt der Befehl der das möglich macht. Du mußt beachten das Du mit den PS2 Scanncodes arbeiten mußt. Also um eine Tastenzeichen zu Senden mußt Du 3 Bytes Senden : 1 Byte Makecode und 2 Byte Breakcode.

Douser182
03.03.2008, 15:44
In Bascome Hilfe habe ich diesen Code gefunden, aber zur Zeile "Config Atemu =..." gib es die Fehlermeldung "Library file not found"


$lib "mcsbyteint.lbx" ' use optional lib since we use only bytes


'configure PS2 AT pins

Enable Interrupts ' you need to turn on interrupts yourself since an INT is used

Config Atemu = Int1 , Data = Pind.3 , Clock = Pinb.0

' ^------------------------ used interrupt

' ^----------- pin connected to DATA

' ^-- pin connected to clock

'Note that the DATA must be connected to the used interrupt pin







Waitms 500 ' optional delay




'rcall _AT_KBD_INIT

Print "Press t for test, and set focus to the editor window"

Dim Key2 As Byte , Key As Byte

Do

Key2 = Waitkey() ' get key from terminal

Select Case Key2

Case "t" :

Waitms 1500

Sendscankbd Mark ' send a scan code

Case Else

End Select

Loop

Print Hex(key)




Mark: ' send mark

Data 12 , &H3A , &HF0 , &H3A , &H1C , &HF0 , &H1C , &H2D , &HF0 , &H2D , &H42 , &HF0 , &H42

' ^ send 12 bytes

' m a r k

Rofo88
03.03.2008, 16:14
The PS2 Keyboard and mouse emulator needs an additional commercial addon library.

Also wirds doch nicht ganz so einfach wenn man sich diese LIB nicht noch dazukauft.

http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=35&category_id=6&option=com_phpshop&Itemid=1

Douser182
03.03.2008, 16:21
Weißt du vielleicht, wo man diese Lib noch bekommen kann?

Christopher1
03.03.2008, 17:14
Kaufen, anders wohl auf legalen Wege nicht ;-)

Rofo88
03.03.2008, 17:30
Ja wenn Du das mit der Lib machen willst wirst Du die kaufen müssen.

oder

1. das Senden selber Programmieren ( das PS2-Protokoll ist nicht so schwer)
2. in C bzw. Assembler wirds so was schon frei und fertig geben
3. im Netz suchen ob es schon mal einer ohne die Lib mit Bascom geproggt hat


MfG RoFo

Douser182
03.03.2008, 18:11
Das problem beim selber schreiben ist nur, dass ich so etwas noch nie gemacht habe! Werde mich noch a bissal umsehen und versuchen, es selber zu Programmieren

Danke für eure Unterstützung

Douser182
09.03.2008, 11:02
Morgen,
Wollte mir gerade bei MCS die Lib kaufen, aber die haben irgendwelche Probleme mit ihrem Server. Da kommt immer die Meldung "Server ist im daugenblick zu beschäftigt!" und das ganze seit gestern Abend.
Jatzt muss ich das Protokoll doch selber schereiben, habe aber keine Ahnung davon. Meine Suche im Netz war auch nicht wirklich erfolgreich.
Hoffe einer von euch kann mir dabei helfen.
Ich will eigenlich nur dem PC die Standart Tasten sagen, die auf jeder Tastatur vorkommen.

Rofo88
09.03.2008, 11:12
http://de.wikipedia.org/wiki/PS/2-Schnittstelle

Die weiterführenden Links sind auch nicht schlecht


EDIT:

ich habe a mal schnell was zusammengeschrieben


$regfile = "m32def.dat"
$crystal = 16000000

Declare Sub Senden
Declare Sub Senden0
Declare Sub Senden1

Dim X As Byte
Dim Y As Byte
Dim Z As Byte
Dim Send As Byte
Dim Parity As Byte

Daten Alias Pina.0
Datenport Alias Ddra.0
Clock Alias Pina.1
Clockport Alias Ddra.1

For Y = 0 To 29 ' sendet "hallo AVR"
Send = Lookup(y , Dat)
Call Senden
Next

Do : Loop 'endlosschleife

'######################### Unterprogramme #################################
Senden:
Do : Loop Until Clock = 1 And Daten = 1 'warte bis PC empfangsbereit
'Startbit (immer 0)
Call Senden0
'8 Datenbists
For X = 0 To 7
If Send.x = 0 Then '0 Senden
Call Senden0
Else '1 Senden
Call Senden1
End If
Next
'parity
If Parity.0 = 0 Then
Call Senden0
Else '1 Senden
Call Senden1
End If
'Stopbit (immer 1)
Call Senden1
Parity = 0
Return


Senden0: 'Sendet eine 0 über PS2
Datenport = 1 'Daten auf Output
Daten = 0 'Daten auf low
Clockport = 1 'Clock auf Output
Clock = 0 'Clock auf 0
Waitus 30 '30µS warten
Clockport = 0 'Clock auf Input
Waitus 5 '5 µS warten
Datenport = 0 'Daten auf Input
Return

Senden1: 'Sendet eine 1 über PS2
Clockport = 1 'Clock auf Output
Clock = 0 'Clock auf 0
Waitus 30 '30µS warten
Clockport = 0 'Clock auf Input
Incr Parity
Return

Dat:
Data &H33 , &HF0 , &H33 , &H1C , &HF0 , &H1C , &H4B , &HF0
Data &H4B , &H4B , &HF0 , &H4B , &H44 , &HF0 , &H44 , &H29
Data &HF0 , &H29 , &H12 , &H1C , &HF0 , &H1C , &H2A , &HF0
Data &H2A , &H2D , &HF0 , &H2D , &HF0 , &H12

oscar10
12.03.2008, 22:35
Hi Rofo88!

Der Beispielcode sieht im Grunde gut aus, allerdings ergibt die Syntax Prüfung in BASCOM bei mir einen Fehler in den drei Zeilen wo folgendes versucht wird:

Im Senden 0 Unterprogramm:
Daten = 0 'Daten auf low
Clock = 0 'Clock auf 0

Im Senden1 Unterprogramm:
Clock = 0

Da kommt dann immer der folgende Fehler in BASCOM:

Error 230: You can not write to a PIN register [PINA.0], etc.

Irgendeine Erklärung, bzw. Modifikation des Codes um es zum Laufen zu bringen ?

Gruß,

Oscar10

zerush
12.03.2008, 23:54
Mach aus

Daten Alias Pina.0
Clock Alias Pina.1

einfach:

Daten Alias Porta.0
Clock Alias Porta.1

Rofo88
13.03.2008, 17:44
@zerush

Das wird leider nicht funktionieren da Daten und Clock auch als Input abgefrag werden.

@oscar10

Also ich habe Bascom 1.11.9 da läufts! Welche Version hast Du?

oscar10
13.03.2008, 20:14
Rofo88:

Ich habe leider noch die 1.11.8.7....

Rofo88
28.03.2008, 11:50
@oscar10

So, das sollte auch mit der älteren Version laufen



$regfile = "m32def.dat"
$crystal = 16000000

Declare Sub Senden
Declare Sub Senden0
Declare Sub Senden1

Dim X As Byte
Dim Y As Byte
Dim Send As Byte
Dim Parity As Byte

'Hier bitte die Portdaten eintragen
Daten Alias Pina.0
Datenport1 Alias Porta.0
Datenport Alias Ddra.0
Clock Alias Pina.1
Clockport Alias Ddra.1
Clockport1 Alias Porta.1


For Y = 0 To 29 ' sendet "hallo AVR"
Send = Lookup(y , Dat)
Call Senden
Next

Do : Loop 'endlosschleife

'######################### Unterprogramme #################################
Senden:
Do : Loop Until Clock = 1 And Daten = 1 'warte bis PC empfangsbereit
'Startbit (immer 0)
Call Senden0
'8 Datenbists
For X = 0 To 7
If Send.x = 0 Then '0 Senden
Call Senden0
Else '1 Senden
Call Senden1
End If
Next
'parity
If Parity.0 = 0 Then
Call Senden0
Else '1 Senden
Call Senden1
End If
'Stopbit (immer 1)
Call Senden1
Parity = 0
Return


Senden0: 'Sendet eine 0 über PS2
Datenport = 1 'Daten auf Output
Datenport1 = 0 'Daten auf low
Clockport = 1 'Clock auf Output
Clockport1 = 0 'Clock auf 0
Waitus 30 '30µS warten
Clockport = 0 'Clock auf Input
Waitus 5 '5 µS warten
Datenport = 0 'Daten auf Input
Return

Senden1: 'Sendet eine 1 über PS2
Clockport = 1 'Clock auf Output
Clockport1 = 0 'Clock auf 0
Waitus 30 '30µS warten
Clockport = 0 'Clock auf Input
Incr Parity
Return

Dat:
Data &H33 , &HF0 , &H33 , &H1C , &HF0 , &H1C , &H4B , &HF0
Data &H4B , &H4B , &HF0 , &H4B , &H44 , &HF0 , &H44 , &H29
Data &HF0 , &H29 , &H12 , &H1C , &HF0 , &H1C , &H2A , &HF0
Data &H2A , &H2D , &H

Papsi
28.03.2008, 16:25
Hallo,

was muss ich bei Dat als DATA eingeben, damit er mir nur ein "m" an den PC sendet?

Gruß
Papsi

Rofo88
28.03.2008, 17:07
http://www.marjorie.de/ps2/scancode-set2.htm

Schaue Dir die Tabelle mal an.
MakeCode : 3A BrakeCode : F0,3A

also
Data &H3A , &HF0 , &H3A

Papsi
28.03.2008, 23:02
Aha - das mit den Daten im HexFormat ist jetzt klar...

ABER

Wenn ich dein letztes Programm probiere und es starte, dann piept mein PC nur sooft, wie die HEx Sachen gesendet werden.
Also pro &Hxx einmal

Anschluss und Portbelegung sollte nicht das Problem sein.

???

:EDIT
Muß ich evtl. noch was zw. PC und µC hängen.
Habe jetzt die beiden Ausgangspins A.0 und A.1 direkt an die PS2 Buchse geklemmt.(altes Tastaturkabel)

Rofo88
29.03.2008, 07:38
Nein, da muß nichts mehr dazwichen. Aber die Masse darfst Du nicht vergessen!

Papsi
29.03.2008, 07:49
GND und +5V habe ich natürlich auch verbunden...

Rofo88
29.03.2008, 08:03
Ich habe bei mir mal die Clock- und Datenleitung verdreht dann fängt er auch an zu piepen. Kann also sein das es vertaucht is. Die +5V-Leitung brauchst Du nicht zu verbinden wenn die die nicht zur Spannungsversorgung des µC brauchst.

da_miez3
19.02.2013, 20:19
Wo genau müssen denn Clock und Data ran? Sind in dem Code doch auf dem selben Pin,oder? Hats schon jemand zum laufen gebracht?

Grüße