www.mikrocontroller.net

Forum: Codesammlung PC Tastatur Bibliothek

Autor: Stefan Seegel (Gast)
Datum:
Angehängte Dateien:

Hallo,

hier mal eine Lib um eine PC-Tastatur an einen AVR anzuschließen.
Kurzdoku ist in der Header-Datei.

Stefan
Autor: Kay Imperator (imperator)
Datum:
Angehängte Dateien:

Hi Stefan,

ich fand den AVR-Code so praktisch, dass ich ihn für meinen MSP430
portiert habe. Dabei wird ein deutsches Tastatur-Layout unterstützt und
alle mit [ALT Gr] erreichbaren Zeichen.
Wer lust und Zeit hat, kann sich ja noch etwas für den Nummernblock und
die Sondertasten einfallen lassen.
konstruktive Kritik ist immer willkommen,

Gruß,

Kay
Autor: Gregor (Gast)
Datum:
Angehängte Dateien:

Moin,

ich habe mal die Tastaturroutine von Stefan Seegel überarbeitet. Jetzt
funktionieren auch "Alt Gr"-Zeichen (z.B. €,@,\,}, etc…).
Siehe "scancodes.h"
Des weiteren kann man nun auch Befehle an die Tastatur schicken und
somit die LEDs steuern oder die Anschlaggeschwindigkeit verändern.

Ein kleines Demoprogramm ist in der main.c Datei:
Das Demoprogramm gibt die aktuell gedrückte Taste über den UART
(Baudrate: 19200) aus und reagiert auf die Funktionstasten (F1-F4 siehe
main.c). Wenn man die "Break"-Taste drückt, wechselt die Routine in den
Bytemodus:
atkeyb.c Line 94:
else if(data==0xE1)
  {
    flag.ascii=0;
    return;
  }

Über die Zahlen 0-7 steuert das Demoprogramm die LEDs der Tastatur an.

Sondertasten können einfach in "scancodes.h" ergänzt bzw. unnötige
Tasten gelöscht werden.
Siehe: http://www.marjorie.de/ps2/scancode-set1.htm

Gruß
Gregor
Autor: Guenter B. (gbl)
Datum:

Hallo Gregor,

könnte man mit deinem Code auch Zeichen an einen PC senden ?
Eine Senderoutine hattest du ja schon eingebaut, allerdings in Richtung
Tastatur. Ich suche eine solche Routine. Bei Google und Co habe ich
nicht das Richtige gefunden. Immer nur PS2 <-> AVR.

Gruß

Günter
Autor: g00gl3 (Gast)
Datum:

Autor: Bakunin (Gast)
Datum:

Tag zusammen, ich bin so langsam am verzweifeln...

ich versuche schon seit ner halben ewigkeit ne ps/2 tastatur an meinen
atmega8 anzuschliesen aber auch fremde codes(mehrere) die als
funktionsfähig beschrieben wurden laufen nicht...

Mein schluss daraus war dass es sich wohl um ein hardwareproblem handeln
muss. Eigendlich sollte das ja aber kein prob. sein- ist ja open
collector alles...
das einzige was mir noch einfällt ist dass ich den internen takt des
mega8 nutze statt externem quarz  ...ist das in diesem zusammenhang
(interrupts werden hier mit 10-16 kHz ausgelöst) kritisch?
Autor: Juppo Nini (juppo)
Datum:

hallo Gregor

ich arbeite gerade mit deinen source für keyboard auslesen.

ich schaffe es nicht die tastatur anzusprechen.
Led's einschalten reseten .
Ansonsten läuft alles prima.

Hast due eine Revision

Gruß Juppo
Autor: Paul Baumann (Gast)
Datum:

Ich weiß nicht, ob Dir das hilft, aber in Bascom gibt es den Befehl
"GETATKBD" Damit kann man ohne große Mühe einen Tastaturcode einlesen.

MfG Paul
Autor: Juppo Nini (juppo)
Datum:

Hi Paul

Das auslesen geht wunderbar ,nur das senden zu Tastatur geht nicht.

Led's werden nicht angesteuert ,naja .evt. ein Timing Problem.

Wenn noch jemmnad einen Source hat zum ansprechen einer at Tastatur
,immer her damit.

Wünsche alle Mitlesern FROHE WEIHNACHTEN.

Gruß Juppo
Autor: Gee_Tee (Gast)
Datum:

Mit dem hier läufts bei mir:
#include <util/parity.h>

void Write_ps2data(unsigned char data)
{
  cli();                            // disable interrupts . . . . .

  PORTD     = (1<<PD2) | (1<<PD3);              // Set pull-up resistor data and clock, if output then high

  DDRD     |= (1<<DDD2);                    // Pin D2 output clock
  DDRD     |= (1<<DDD3);                    // Pin D3 output data


  _delay_ms(0.25);
  
  PORTD    &= ~(1<<PD2);                    // Pin D2 low, start clock bit

  _delay_ms(0.25);

  PORTD    &= ~(1<<PD3);                    // Pin D3 low, start data bit


  PORTD    |=  (1<<PD2);                    // Set pull-up resistor clock
  DDRD     &= ~(1<<DDD2);                  // Pin D2 input clock
  

  do {asm volatile ("nop"::);} while (PIND & _BV(2));    // wait until clock bit is clear


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 1'st data bit if clock bit is set
  
  if ((data&0x01)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 2'nd data bit
  
  if ((data&0x02)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 3'rd data bit
  
  if ((data&0x04)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 4'th data bit
  
  if ((data&0x08)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 5'th data bit
  
  if ((data&0x10)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 6'th data bit
  
  if ((data&0x20)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 7'th data bit
  
  if ((data&0x40)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send 8'th data bit
  
  if ((data&0x80)==0) { PORTD &= ~(1<<PD3);}        // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   


  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));  // Send parity data bit
  
  if (parity_even_bit(data)==1){ PORTD &= ~(1<<PD3);}    // Pin D3 output data 0
  else PORTD |= (1<<PD3);                  // Pin D3 output data 1
  
  do {asm volatile ("nop"::);} while (PIND & _BV(2));    //   
  

  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));

  DDRD     &= ~(1<<DDD3);                  // Pin D3 input data
  PORTD    |=  (1<<PD3);                    // Set pull-up resistor data


  do {asm volatile ("nop"::);} while (PIND & _BV(2));    // Ignore acknowledge bit
  do {asm volatile ("nop"::);} while (!(PIND & _BV(2)));
  
  sei();                            // enable interrupts . . . . .
  
}

Frohe Weihnachten, Gruß

Gerrit
Autor: Simon K. (simon) Benutzerseite
Datum:

Oh gott oh gott! ;-)
Autor: Herr Mueller (herrmueller)
Datum:

Irgendwann muss ich doch einmal C lernen, das scheint wirklich einfacher
zu sein als Assembler.
Autor: Juppo (Gast)
Datum:

Besten dank .

Werde morgen testen
Gruss
Juppo
Autor: Stefan Marquardt (joker)
Datum:

Hallo zusammen,

ich bin auf der Suche nach einer möglichkeit einen Magnetkartenleser mit
PS/2 Emulation mit einem Atmega (welcher steht noch offen) auszulesen
und auszuwerten.

Kurz zum Sinn:

Wir benötigen ein Türöffnersystem. Etwas fertiges kostet sehr horrende
Preise. Das Ding muss sich anlernen lassen an einen Inhalt der 2. Spur
einer LOCO Magnetkarte und anschließend ein Relais schalten für einen
Türöffner.

Ich habe im Internet Magnetkartenleser gefunden die mit RS232
funktionieren. Programmiertechnisch weniger aufwand, aber dafür hohe
Preise für die Leser und schelcht zu bekommen (also immer den gleichen).

Ich habe mich also entschlossen einen magnetkartenleser zu nehmen, der
eine PS/2 tastaturemulation vorweisen kann. Jetzt ist die Frage, ob es
eine fertige lib gibt, die sowas auslesen kann.
Überträgt eine Tastatur ASCII-Daten über den Bus oder nur Binärdaten?

Ziel ist es das Ding einmalig anzulernen (Sprich den Inhalt der Karte in
den EEPROM des µC schreiben) und diesen dann vergleichen mit dem Code
auf der Karte und die Tür zu öffnen.


Ich wäre über Hilfe sehr sehr Dankbar!

Gruss Stefan
Autor: Juppo Nini (juppo)
Datum:

Moin

Dann teste den Leser erst mal an einem normalen PC.

Wenn das geht könnt eman einen Mikrocontroller "Atmega32" nehmen und die
ScanCode von dem Leser einlesen.

Das sollte dann mit den normalen Sourcen gehen.

Gruß Juppo
Autor: Juppo Nini (juppo)
Datum:

Moin

Ich hab da immer noch Probleme
Das auslesen klappt wunder bar.

Reseten geht auch.

Aber die einzelen LED ansteuern klappt überhaupt nicht.

Hardware Schaltung ist bei mir eine direkte Verbindind von CLK und Data
zu den Port Pin PIND 2/3.
Ist das richtig?

Der Befehl besteht aus 2 Byte senden ?? kann es sein das ein Delay
dazwischen muss ?

Gruß Juppo (Frohes neues Jahr)
Beitrag #2482925 wurde vom Autor gelöscht.
Autor: Juppo Nini (juppo)
Datum:

Hurra

Es läuft.

kann es sein das _delay_ms _delay_us aus der AVR Lib nicht vernünftg
laufen ?

Eigene funktionen für wait geschrieben und zwischen

0xed und 0x01 ein wait non 100 ms gesetzt.
Autor: eteg (Gast)
Datum:

Juppo Nini schrieb:
> kann es sein das _delay_ms _delay_us aus der AVR Lib nicht vernünftg
> laufen ?

Nur bei eingeschalteter Optimierung und bei Aufruf mit einer
Konstante!!! als Argument.
Autor: Juppo Nini (juppo)
Datum:

Stefan Seegel schrieb:
> Hallo,
>
> hier mal eine Lib um eine PC-Tastatur an einen AVR anzuschließen.
> Kurzdoku ist in der Header-Datei.
>
> Stefan

Hallo Stefan

Für welchen Controller ist das geschrieben ?
Gruß Juppo
Autor: Gee_Tee (Gast)
Datum:

Hallo Juppo,

Auch bei mir eine direkte Verbindung von CLK und Data zu den Port Pin
PIND 2/3. Ich benütze allerdings nur der Caps Lock LED, mit folgendes
Programmteil:
case 0x58 :                // Caps Lock
            
  if (capslock == 0)
  {
    capslock = 1;
    Write_ps2data(0xed);     // send Cap Lock LED on
    Write_ps2data(0x04);
  }
  else
  {
    capslock = 0;
    Write_ps2data(0xed);     // send Cap Lock LED off
    Write_ps2data(0x00);
  }
  break;

Also ohne Verzögerung. Ich habe allerdings gemerkt die Tastatur sendet
einen Byte mehr zurück als ich laut im Internet gefundene Daten erwartet
habe. Offenbar sind nicht alle Tastaturen gleich . . .

Es freut mich dass es letztendlich geklappt hat, Gruß

Gerrit
Autor: Juppo Nini (juppo)
Datum:

Moin Gerrit

Das klappt wenn ich ohne Timer arbeite.

zB. get_ack()

Dort wird bei meinem ATMEGA32 der Timer nicht gestartet.

Welchen Prozessor hast du benutzt ?

Möchte das alles auf einen ATTINY 2313 zum laufen bringen.

Gruß
Juppo
Autor: Gee_Tee (Gast)
Datum:

Hallo Juppi,

Ich benütze einen Atmega8. Ich vermute dein Problem hat zu tun mit
deinem Beitrag im Forum: PC Hard- und Software, "PC-Keyboard im XT
Modus". Da steht in dein Makefile dass du einen Attiny2313 benützt, der
Timer0 von denen unterscheidet sich aber von denen des Atmega32 den du
jetzt nennst.

Du benützt den Timer um einen Fehlzustand zu testen, aber dass macht die
Sache kompliziert, außerdem benützt du der Fehlerrückmeldung (noch)
nicht. Ich würde diesen Test auslassen, schick nur den Code zu der
Tastatur raus und gut ist !

Gruß
Gerrit
Autor: Juppo Nini (juppo)
Datum:

Hallo
Danke

Klappt soweit ganz gut.

Ich bin mit dem Umsetzen von scancode2 aud scancode1 zugange.

Passe daszu deine Tabelle an.

Besten Dank.
Juppo
Autor: Juppo Nini (juppo)
Datum:

Halt noch eins ,da droht Gefahr.


Wenn die "NUM LOCK" Taste betätigt wird dann verändert sich der Ausgabe
Code der PC2 Tastatur.

Mal wieder lange drann verzweifelt.

Gruß Juppo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net