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; }
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.
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.
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?
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?
Carl D. schrieb: > Das kann sogar mit Software-UART klappen, wenn der Takt stabil ist. Vielleicht besser ein USART, also mit Takt-Leitung?
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 ;)
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.