Forum: Compiler & IDEs Zugriff FLASH, EEPROM -> eins geht, das andre nicht


von Andreas R. (imrazor)


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

von Andreas R. (imrazor)


Lesenswert?

Hmm, hab grad gesehen, dass ich vergessen hab die eeprom.h einzubinden. 
Frag mich nur, wieso ich keine Fehlermeldung erhalten habe beim 
Kompilieren...

Funktionieren tut der Code aber nach wie vor nicht ;-)

von Andreas R. (imrazor)


Lesenswert?

Da man hier ja irgendwie die Beiträge nur manchmal editieren kann, muss 
ich nochmal was nachreichen:

Programmiert hab ich den Controller mit dfu-programmer, wobei ich zuerst 
die *.eep und dann die *.hex geflasht hab...

von Andreas R. (imrazor)


Lesenswert?

Hm, ich glaub, dass man mit dem dfu-programmer den EEPROM nicht brennen 
kann... Das wäre dann allerdings etwas schlechter, weil ich keinen 
Programmer zur Hand habe...

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.