www.mikrocontroller.net

Forum: Projekte & Code PC Tastatur Bibliothek


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Stefan

Autor: Kay I. (imperator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bakunin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
Oh gott oh gott! ;-)

Autor: Herr Mueller (herrmueller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwann muss ich doch einmal C lernen, das scheint wirklich einfacher 
zu sein als Assembler.

Autor: Juppo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten dank .

Werde morgen testen
Gruss
Juppo

Autor: Stefan Marquardt (joker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.