Hallo Leute!
Folgende Ausgangslage:
Ich möchte per USB von einer Host-Anwendung Keycodes an meinen
AT90USB1287 senden, um die darauf laufende HID-Keyboardanwendung
"umzuprogrammieren".
Wird vom PC aus nichts gesendet, soll auf eine Standardkonfiguration
zurückgegriffen werden, die im Flash liegt.
Zum Testen habe ich also ein festes EEPROM Array angelegt, da die
Datenübermittlung noch nicht implementiert ist.
Hier also die zwei Arrays:
Flash:
1 | const uint8_t KeyCodeArray[] PROGMEM={0x09, 0x0A, 0x0B, 0x0C, 0x0D};
|
EEPROM:
1 | uint8_t KeyCodeArray2[] EEMEM={0x04,0x05,0x06,0x07,0x08};
|
Später im Code definiere ich
Bei einem Tastendruck auf der Matrix wird dann die Taste gemerkt und der
Variable KeyByte der entsprechende Wert aus dem Array zugewiesen. Danach
wird KeyByte an den Rechner gesendet, der den enthaltenen KeyCode z.B.
als Buchstaben erkennt.
Dies Funktioniert mit dem Flashspeicher einwandfrei:
Bei Tastendruck 7, den KeyCode 1 aus dem Array zuweisen:
1 | if (KeyMatrix_GetKeypress(1<<7)){
|
2 | taste ^= (1<<7); /// Note button 7
|
3 | KeyByte = pgm_read_byte(&KeyCodeArray[1]);
|
4 | }
|
KeyByte übermitteln:
1 | if (taste & (1<<7)){
|
2 | _delay_ms(5);
|
3 | KeyboardReportData.KeyCode = KeyByte; /// Key g
|
4 | }
|
Im nächsten Schritt habe ich das ganze mit Lesen aus dem EEPROM
versucht, jedoch tut sich hier rein gar nichts. Kein KeyCode wurde
übermittelt:
1 | if (KeyMatrix_GetKeypress(1<<7)){
|
2 | taste ^= (1<<7); /// Note button 7
|
3 | KeyByte = eeprom_read_byte(&KeyCodeArray2[0]);
|
4 | }
|
Die Verzögerung von 5ms musste ich bereits bei fester Zuweisung ohne
Arrays wählen, da sonst nichts über den USB übermittelt wurde bei
Tastendruck.
Kann es sein, dass der Zugriff auf den EEPROM soviel langsamer ist, dass
es für den USB nicht schnell genug ist? Selbst mit Erhöhung auf bis zu
50ms erreichte ich kein positives Ergebnis.
Eigentlich hatte ich vor das EEPROM Array auf seine Größe zu prüfen,
wenn dieses nicht leer ist, werden die Elemente darin benutzt, wurde der
EEPROM nicht beschrieben, wird das Flasharray benutzt. Das
USB-"Keyboard" soll also ohne weitere Konfiguration dem Benutzer eine
Standardkonfiguration der Tastenbelegung liefern. Will er diese ändern,
belegt er die Tasten mit der PC-Anwendung selbst und schickt die
KeyCodes an den µC, der diese im EEPROM speichern soll, damit sie auch
in Zukunft auf dem Controller vorhanden sind.
1 | if (KeyMatrix_GetKeypress(1<<7)){
|
2 | taste ^= (1<<7); /// Note button 7
|
3 | if ((sizeof(KeyCodeArray2)/sizeof(uint8_t)) > 0){
|
4 | KeyByte = eeprom_read_byte(&KeyCodeArray2[0]);
|
5 | }
|
6 | else {
|
7 | KeyByte = pgm_read_byte(&KeyCodeArray[0]);
|
8 | }
|
9 | }
|
Wäre echt super, wenn jemand eine Tipp hätte, wieso die Anwendung des
EEPROMS in meinem Fall nicht funktioniert. Ich selbst kann nämlich
keinen Fehler finden...