www.mikrocontroller.net

Forum: GCC Zugriff FLASH, EEPROM -> eins geht, das andre nicht

Autor: Andreas R. (imrazor)
Datum: 14.05.2008 10:39

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: 14.05.2008 12:32

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: 14.05.2008 13:15

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: 14.05.2008 13:37

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net