Zugriff FLASH, EEPROM -> eins geht, das andre nicht

OP #866593
Lesenswert?

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
1
uint8_t KeyByte=0;

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren