PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASCII in byte



Killer
06.10.2010, 01:50
Hallo,
ich habe mir hier eine Schaltung aufgebaut: AVR mit PS2 Tastatur. Das einlesen klappt. Allerdings bekomme ich das Zeichen als String oder den ASCII-Scancode als Byte. Wenn ich jetzt aber Zahlen eingebe, kann ich mit diesen nicht weiterrechnen da ich sie ja als String geliefert bekomme. Gibt es irgendeine Möglichkeit der "Umrechnung"?
Mit freundlichen Grüssen

sast
06.10.2010, 08:43
Wenn ( ( zeichen>47 ) und ( zeichen<58 ) ) dann zifferzeichen = zeichen-48 sonst ...

Wenn du eine Programmiersprache angegeben hättest, dann könnte man sicher auch die entsprechenden Funktionen benennen. Aber mit dem Pseudocode sollte es auch verständlich sein.

sast

PicNick
06.10.2010, 08:58
Wenn dir die Tastatur den Scan-Code schickt, hat das mit dem üblichen ASCII genau nix zu tun. Der sagt nur, welche von den >100 Tasten gedrückt wurde, aber nicht, was auf der Taste draufsteht.

sast
06.10.2010, 09:31
Aha sehr interessant. Danke für den Hinweis PicNick.

Hab ich mir doch gleichmal die PS2 Codesache angesehen.
Wenn man die ganzen Make Codes für Shift Caps usw vorher abfragt, bekommt man also bei Scancode 1 einen Make Code 0=0x0B 1=0x02 bis 9=0x0A und anschließend die Break Codes mit 8B, 82 bis 8A. Bei 1 bis 9 ist es also der Make Code - 1 und bei 0 kann man direkt aus 0B eine 0 machen. Damit hat man die Ziffern erschlagen.

Bei Scancode 2 der mit den total unübersichtlichen Codes 0x45, 0x16, 0x1E, 0x26, 0x25, 0x2E, 0x36, 0x3D, 0x3E, 0x46 für 0-9 arbeitet, kann man auch gleich jeden einzeln auswerten. Hier kann man auch den Break code durch die vorgestellten F0 schön rausfiltern

sast

PicNick
06.10.2010, 09:56
Vielleicht findest du da, was du brauchst

http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc

Killer
06.10.2010, 12:23
Perfekt! Wie sast vorgeschlagen habe ih es nun realisiert, mit Erfolg. Danke!

sast
06.10.2010, 12:58
Bitte! Das freut mich.

Verrätst du uns auch welcher Vorschlag zum Ziel geführt hat. Ich hatte ja nun mehrere unterschiedliche Sachen erwähnt.

sast

Killer
06.10.2010, 17:04
Achso, natürlich. Deinen ersten Vorschlag. Die Scancodes der Zahlen 0-9 auf der Tastatur sind 48-57. Also begrenze ich das Ergebnis erstmal auf den Tastenbereich 48-57 und Subtrahiere davon 48. Dann komme ich direkt auf die Zahl mit der ich weiterrechnen kann.

sast
06.10.2010, 17:26
ok

Wie hast du denn das Problem der Umsetzung von Scancode auf ASCII gelöst?

Dazu benötigt man ja so eine Art Treiber.

sast

Killer
06.10.2010, 18:03
Man bekommt den Scancode ja als Byte. Nun habe ich ein Ein-Zeichen-String genommen und das Scancode-Byte dem String zugewisen... Bit für Bit. Gibt man diesen String nun per RS232 oder LCD aus erscheint dort Der Buchstabe/Zahl.

sast
06.10.2010, 21:02
Du hast also eine Tabelle mit dem Scancode als adresse und dem daraus resultierenden ASCII Zeichen. Verstehe ich das so richtig?

sast

Killer
06.10.2010, 22:32
Achso ja moment. Das hatte ich vergessen zu erwähnen. Das ganze mache ich mit der netten Keyboard unterstützung von Bascom.

sast
06.10.2010, 23:00
Achso Bascom. Ja da bekommt man anscheinend alles mundgerecht vorverdaut. Kann man da eigentlich in die Quellen schauen, wie die das machen?

sast

Killer
06.10.2010, 23:13
Da hast du recht!
Nunja, die benutzen eine Tabelle aus der ich aber nicht weiter schlau werde.



Data 0 , 0 , 0 , 0 , 0 , 200 , 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



'shifted keys UPPER case

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


Diese "Umrechnung" in C zu realisieren würde mich aber brennend interessieren.

sast
07.10.2010, 00:12
In der Tabelle sind genau an den Stellen, die dem Scancode2 entsprechen die ASCII Werte hinterlegt. Hab ich mir schon so gedacht. Das könnte man 1:1 in C genauso machen. Zwei 128 Byte große Arrays eins für Lowercase und eins für Uppercase also wenn Shift oder Caps gedrückt wurde.

char low_case[] = {..., '0', '9', ...};
char up_case[] = {...};

wobei '0' an der Stelle 69(0x45) und '9' bei 70(0x46) in low_case steht.

Nach der Überprüfung, ob Shift (oder ähnliches) gedrückt wurde, wird anhand des Make Codes im entsprechenden Array der Inhalt an der Make Code Stelle ausgelesen.

sast

Jaecko
07.10.2010, 07:38
Ich hab mal in C nen eigenen "Treiber" für ne Tastatur geschrieben. Anders als in Bascom werden hier auch einige "Sondertasten" erkannt, die Bascom nicht kannte. Nicht grad der perfekteste Code, aber er funktioniert.
Was auch noch fehlt ist ein Timeout; d.h. wenn bei der Übertragung irgendwann mal ein Bit verschluckt wird, gibt das ein Problem, dann wird nichts mehr erkannt. Müsste man noch nachrüsten.

Wers braucht: Einfach nochmal melden, dann setz ich den hier rein.

sast
07.10.2010, 08:08
Guten Morgen Jaecko,

ich brauchs zwar nicht, weil ich mich nur aus reiner Neugier mal mit dem Scancode beschäftigt habe. PickNik war sozusagen der Auslöser. Aber Killer hat ja bereits Interesse bekundet.
Außerdem find ich es immer ziemlich nervig, wenn ich im Internet endlich mal was passendes gefunden habe, wo dann über Code gesprochen wird und man kann ihn dann nirgends ansehen. So groß kann der Code ja nicht sein, stell ihn doch einfach ein.

Für was nimmt man denn am µC eine PS2 Tastatur? Oder gings da um die Barcodegeschichte?

sast

Jaecko
07.10.2010, 09:32
Na denn: Hier isser.
Ggf. müssten noch die Typen wie ui8_t nach uint_8 etc. geändert werden; je nach dem, was man selbst hernimmt.
(die #includes für glob_defs und glob_type brauchts nicht wirklich)
In der _cfg.h müssen noch die ganzen Pins/Ports/Interrupt-Daten eingestellt werden; dann einfach Init und man kann z.B. in kbdkey_ascii und kbdkey_func nachschauen, welche die zuletzt gedrückte "Ascii-Taste" bzw. Funktionstaste war.

Und warum PS/2 am µC?... Naja, man muss ja nicht die ganze Tastatur hinhängen. Tastaturcontroller ausbauen und an andere Taster hängen geht auch. Hat halt den Vorteil: Es ist eine Interrupt-gesteuerte Eingabe mehrerer Tasten, und das ganze auch noch schön entprellt; automatische Wiederholung, wenn man länger drückt; Signal beim loslassen.
Und wenn ich dann noch rauskrieg, wie man der Tastatur Befehle schicken kann, hat man mit den 3 LEDs sogar noch Schaltausgänge.

PicNick
07.10.2010, 10:23
Das Ps/2 Protokoll ist bidirektional definiert
z.B.
http://www.marjorie.de/ps2/ps2_protocol.htm