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
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
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
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
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?
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
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
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
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
Datum:
Irgendwann muss ich doch einmal C lernen, das scheint wirklich einfacher zu sein als Assembler.
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
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
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.
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.
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.
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
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
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
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
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
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



