mikrocontroller.net

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


Autor: Andreas R. (imrazor)
Datum:

Bewertung
0 lesenswert
nicht 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:
const uint8_t KeyCodeArray[] PROGMEM={0x09, 0x0A, 0x0B, 0x0C, 0x0D};


EEPROM:
uint8_t KeyCodeArray2[] EEMEM={0x04,0x05,0x06,0x07,0x08};

Später im Code definiere ich
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:
  if (KeyMatrix_GetKeypress(1<<7)){
            taste ^= (1<<7);      /// Note button 7
      KeyByte = pgm_read_byte(&KeyCodeArray[1]);
  }

KeyByte übermitteln:
  if (taste & (1<<7)){
  _delay_ms(5);
    KeyboardReportData.KeyCode = KeyByte; /// Key g
  }


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:
  if (KeyMatrix_GetKeypress(1<<7)){
            taste ^= (1<<7);      /// Note button 7
      KeyByte = eeprom_read_byte(&KeyCodeArray2[0]);
  }

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.
  if (KeyMatrix_GetKeypress(1<<7)){
            taste ^= (1<<7);      /// Note button 7
      if ((sizeof(KeyCodeArray2)/sizeof(uint8_t)) > 0){
      KeyByte = eeprom_read_byte(&KeyCodeArray2[0]);
      }
            else {
      KeyByte = pgm_read_byte(&KeyCodeArray[0]);
      }
  }

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

Autor: Andreas R. (imrazor)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Andreas R. (imrazor)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas R. (imrazor)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.