Forum: Mikrocontroller und Digitale Elektronik USB-Tastatur an ATMEGA32u4


von Florian M. (error404)


Angehängte Dateien:

Lesenswert?

Lieber Leser!

Ich glaube, dass meine Frage sehr umfangreich ist.

Aufgabenstellung:
3 Leute. Jeder hat einen µC(ATMEGA32u4). Jeder braucht ein Ein- und 
Ausgabegerät. Mithilfe der Manchester-Codierung müssen wir uns 
gegenseitig Daten schicken und diese ausgeben.
Meine Ausgabe: 6 7-Segment-Anzeigen. (funktioniert schon)
Meine Eingabe: Tastermatrix
Dadurch, dass ich die Tastermatrix in 10 Minuten herunterprogrammiert 
hatte, wollte ich mich einer größeren Herausforderung stellen...Einer 
USB-Tastatur.

Grundidee: Mit dem Oszilloskop herauslesen, wie die Daten gesendet 
werden.
(Selbstgezeichnete Skizze im Anhang)
Zum USB: Es gibt VCC und GND. Diese sind mit VCC und GND vom µC 
verbunden.
Außerdem gibt es eine Data+ und eine Data- Leitung.
Data-:Clock Leitung...am µC auf PD0(externer Interrupt INT0)
Data+:Daten Leitung...am µC auf PB1

Lösung: Bei der 2. bis 9. fallenden Flanke auf PD0(Data-) wird 
PB1(Data+) abgetastet. Die erhaltenen Bits werden gespiegelt und in ein 
unsigned char geschrieben. Sobald alle 8 Bits geschrieben wurden, wird 
der Wert im unsigned char umgewandelt(Tabelle im Internet gefunden). Der 
umgewandelte Wert wird in ein Feld an die 0. Stelle geschrieben. Davor 
wird alles im Feld um eine Stelle verschoben.  Also 1. Element an die 2. 
Stelle, 2. an die 3. usw...
Das 0. bis 5. Element werden auf den 6 7-Segment-Anzeigen angezeigt.

Was wirklich passiert: Wenn eine Taste kurz gedrückt wird, dann wird 
das, was vorher an der Stelle 0 im Feld war wieder an die Stelle 0 
eingeschoben.
zB: Feld= 5,4,3,2,1,0 ... danach: 4,3,2,1,0,0
Wenn man jedoch länger auf der Taste oben bleibt wird nach einer 
gewissen Zeit der richtige Wert eingeschoben und das immer wieder, bis 
ich die Taste loslasse.

Ich habe keine Ahnung, ob ich mit meiner Idee komplett falsch liege, 
oder ob ich einfach etwas wichtiges übersehen habe. Ich glaube, dass der 
1., 10. und 11. abgetastete Wert auch einen Sinn hat, nur komme ich von 
allein nicht drauf...Ich weiß nichtmal, ob alle USB-Tastaturen so 
funktionieren, aber das ist mir im Prinzip egal, soll nur mit der einen 
klappen.

Ich hoffe, dass sich irgendwer in der Richtung besser auskennt und mir 
freundlicherweise helfen kann.
Im Anhang befindet sich noch die Skizze der Funktionsweise, so wie ich 
sie mir denke, und das gesamte Programm!

Vielen Dank,
Error404



Hier noch die relevanten Teile des Programmes:

unsigned char speicher[6];   //Ausgabefeld
unsigned char pc1=1;         //'Laufvariable'
unsigned char eingangtast=0; //kodierter Wert

1. Initialisierung des externen Interrupts:
void ext0_init(void)
{
  EICRA|=(1<<ISC01); //fallende Flanke
  EIMSK|=(1<<INT0); //PD0
}

2. Fallende Flanke:
ISR(INT0_vect) //PD0 //USB-Tastatur Clock
{
  if(pc1==1||pc1==10) pc1++;
  else if(pc1>=2&&pc1<=9)
  {
    if(PINB&(1<<1)) //USB-Tastatur Daten=1
    {
      eingangtast|=(1<<(pc1-2));
    }
    else if(!(PINB&(1<<1))) //USB-Tastatur Daten=0
    {
      eingangtast&=~(1<<(pc1-2));
    }
    pc1++;
    if(pc1==10)
    {
      for(int j=5;j>0;j--) speicher[j]=speicher[j-1];
 //auf 7 Segment-Anzeigen nach links verschieben

      if(eingangtast==0x16) speicher[0]=1; //Kodierungen
      if(eingangtast==0x1E) speicher[0]=2;
      if(eingangtast==0x26) speicher[0]=3;
      if(eingangtast==0x25) speicher[0]=4;
      if(eingangtast==0x2E) speicher[0]=5;
      if(eingangtast==0x36) speicher[0]=6;
      if(eingangtast==0x3D) speicher[0]=7;
      if(eingangtast==0x3E) speicher[0]=8;
      if(eingangtast==0x46) speicher[0]=9;
    }
  }
  else if(pc1>=10) pc1=1;
}

von Carl D. (jcw2)


Lesenswert?

Das ist zu deinem Glück kein USB, sondern PS/2, synchron 8bit mit 
Startbit, die erste 0, und 2 Stoppbits, die letzten beiden 1.

Das erklärt die Einfachheit der USB->PS/2-Adapter. Wenn kein USB erkannt 
wird, dann sendet das Dinge einfach OS/2.

Das kann sogar mit Software-UART klappen, wenn der Takt stabil ist.
12,5kbit sind kein Hexenwerk.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was Du da mit dem Oszilloskop gemessen hast, ist die Kommunikation 
zwischen dem die Tastatur ansteuernden PC und der Tastatur. Von sich aus 
sendet eine USB-Tastatur überhaupt nichts. Die braucht dafür einen 
USB-Host, der sie zyklisch abfragt.

Du wirst erheblich größere Erfolgschancen haben, wenn Du Dir statt der 
USB-Schnittstelle die PS/2-Schnittstelle ansiehst.

Um eine USB-Tastatur anzusteuern, brauchst Du einen USB-Host-Controller. 
Den kann man zwar auch irgendwie durch Software-Bitbanging nachbilden 
(irgendein wahnsinniger hat das mal mit 'ner USB-Maus vorexerziert), 
aber das ist ein paar Nummern komplizierter als per Bitbanging ein 
USB-Device nachzubilden (was mit 
https://www.obdev.at/products/vusb/index.html erfolgreich umgesetzt 
wurde).

Viele Tastaturen, die zur Zeit verkauft werden, sind bilingual, d.h. sie 
sind in der Lage, über die gleichen Anschlussdrähte sowohl das 
USB-Protokoll als auch das PS/2-Protokoll zu unterstützen. Man erkennt 
das daran, daß diese Tastaturen mit einem kleinen Adaptersteckerchen 
ausgeliefert werden, mit dem man ihr USB-Kabel in einen PS/2-Anschluss 
stecken kann.

von Florian M. (error404)


Lesenswert?

Danke für die rasche Antwort!

Das bringt ganzschön viel Licht ins Dunkle.
Die Idee mit UART hatte ich auch...aber wollte das ganze doch selber 
lösen.
Bin zurzeit in der 4. Klasse HTL und will alles von Grund auf verstehen.

Irgendeine Idee zum Code selber? Irgendwelche peinlichen Fehler?
Im Prinzip sind auf die Art und Weise, wie ich es löse, keine Start- und 
Stopbits nötig oder? Kann man miteinbeziehen, aber ich glaub, dass das 
nicht relevant ist oder?

von Florian M. (error404)


Lesenswert?

Ok, die Funktionsweise versteh ich jetzt denk ich.
Ganz blöd gesagt:
Meine Tastatur spricht PS/2, sofern sie nichts USB-artiges bekommt.

Kann man das so sagen?

Neue Aufgabe wäre demnach PS/2 einzulesen. Kann man das so machen, wie 
ich mir das vorstelle?

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Carl D. schrieb:
> Das kann sogar mit Software-UART klappen, wenn der Takt stabil ist.

Vielleicht besser ein USART, also mit Takt-Leitung?

von Florian M. (error404)


Lesenswert?

Torsten C. schrieb:
> Vielleicht besser ein USART, also mit Takt-Leitung?

Die Sache ist die, dass ich es auf meine eigene Art uns Weise lösen 
will. USART ist aufgelegt, aber eben fast keine Denkarbeit.
Ist ein Projekt für die Schule und Mühe wird belohnt ;)

von Jim M. (turboj)


Lesenswert?

Florian M. schrieb:
>> Vielleicht besser ein USART, also mit Takt-Leitung?
>
> Die Sache ist die, dass ich es auf meine eigene Art uns Weise lösen
> will. USART ist aufgelegt, aber eben fast keine Denkarbeit.
> Ist ein Projekt für die Schule und Mühe wird belohnt ;)

Das PS/2 Protokoll dürfte für schulische Zwecke ausreichend Mühe machen.

Übrigens unterstützen moderne Tastaturen PS/2 AFAIK nicht mehr. Du 
müsstest also immer erstmal an einem entsprechend ausgestattetem alten 
PC ausprobieren ob PS/2 überhaupt tut.

von Florian M. (error404)


Lesenswert?

Jim M. schrieb:
> Das PS/2 Protokoll dürfte für schulische Zwecke ausreichend Mühe machen.
>
> Übrigens unterstützen moderne Tastaturen PS/2 AFAIK nicht mehr. Du
> müsstest also immer erstmal an einem entsprechend ausgestattetem alten
> PC ausprobieren ob PS/2 überhaupt tut.

Ja, das hoff ich doch!

Es ist eine alte Tastatur. Sie hat zwar einen USB-Stecker, aber 
funktioniert auch mit PS/2 Adapter am PC. Außerdem hab ichs ja mitm Oszi 
rausgemessen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jim M. schrieb:
> Übrigens unterstützen moderne Tastaturen PS/2 AFAIK nicht mehr.

Wenn sie zusammen mit einem entsprechenden Adapter verkauft werden, 
ist von Bilingualität auszugehen.

Einfach so irgendeine Tastatur mit einem zufällig herumliegenden Adapter 
zu kombinieren ist hingegen wirklich keine gute Idee.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.