-         

Ergebnis 1 bis 5 von 5

Thema: EEPROM beschreiben und auslesen....

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101

    EEPROM beschreiben und auslesen....

    Anzeige

    Hi Leutz !

    Versuch hier grad was ins EEPROM vom Mega88 zu schreiben und dieses dann wieder auszulesen. Die ausgelesenen Werte werden dann einfach ans Terminal geschickt.
    Die Funktionen EEPROM_write und EEPROM_read hab ich aus dem Datenblatt.
    Leider erscheint nichts am Terminal...
    Hab auch schonmal das EEPROM Hexfile mit AVR Studio ausgelesen, welches aber dann nicht wirklich so aussieht wie ichs eigntlich erwarten würde.
    Könnt ihr ma drüberschauen ??



    Code:
    #include <iom88.h>
    #include <ina90.h>
    #include "sw_uart.h"
    
    
    void EEPROM_write(unsigned int adress, char data);
    char EEPROM_read(unsigned int adress);
    
    
    __task void main(void)
    {
      unsigned int adresse=0;
      char datenbyte=0;
    
    
      char byte1=0;
      char byte2=0;
      char byte3=0;
      char byte4=0;
    
    
      __enable_interrupt();
    
    
      /* AFFE ins EEPROM schreiben */
      adresse = 0x0000;
      datenbyte = 0x0A;
      EEPROM_write(adresse, datenbyte);
    
    
      adresse = 0x0008;
      datenbyte = 0x0F;
      EEPROM_write(adresse, datenbyte);
    
    
      adresse = 0x0010;
      datenbyte = 0x0F;
      EEPROM_write(adresse, datenbyte);
    
    
      adresse = 0x0018;
      datenbyte = 0x0E;
      EEPROM_write(adresse, datenbyte);
    
    
    
      /* AFFE wieder auslesen */
      byte1 = EEPROM_read(0x0000);
    
      byte2 = EEPROM_read(0x0008);
    
      byte3 = EEPROM_read(0x0010);
    
      byte4 = EEPROM_read(0x0018);
    
    
      /* und ans Terminal senden */
      while(1)
      {
        send_one_byte(byte1);
        send_one_byte(byte2);
        send_one_byte(byte3);
        send_one_byte(byte4);
        send_one_byte('\r');
        send_one_byte('\n');
      }
    }
    
    
    void EEPROM_write(unsigned int adress, char data)
    {
      /* Warten bis vorheriger Schreibvorgang beendet */
      while(EECR & (1<<EEPE));
    
      EEAR = adress; // Adresse an der das Byte im EEPROM geschrieben werden soll
    
      EEDR = data;   // Datenbyte, welches im EEPROM gespeichert werden soll
    
      EECR |= (1<<EEMPE);
    
      EECR |= (1<<EEPE); // Starte EEPROM Write
    }
    
    
    
    char EEPROM_read(unsigned int adress)
    {
      while(EECR & (1<<EEPE));
    
      EEAR = adress; // Adresse an der Byte im EEPROM ausgelesen werden soll
    
      EECR |= (1<<EERE); // Auslesen starten
    
      return EEDR;
    }
    Gruß schamp

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,
    ich hab jetzt grad mal den unterschied zwischen Mega8 und Mege 88 EEprom gesucht, und beim M88 muss man anscheinend noch zwei weitere Bits setzen, bzw. löschen, obwohl das PRG-beispiel das gleiche ist !
    Schau mal die Beschreibung vom EECR die Bits EEPMx die gibts beim Mega 8 gar nicht.
    Und nicht vergessen den IRQ deaktivieren in dieser Zeit, nicht das da auch noch was dazwischen funkt.
    mfG
    HK
    /* Linux user #98697 */

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Thx für die Tipps !!

    Hab jetzt funktionierenden Code:

    Code:
    #include <iom88.h>
    #include <ina90.h>
    #include "sw_uart.h"
    
    
    void EEPROM_write(unsigned int adress, char data);
    char EEPROM_read(unsigned int adress);
    
    
    __task void main(void)
    {
      unsigned int adresse=0;
      char datenbyte=0;
    
    
      char byte1=0;
      char byte2=0;
      char byte3=0;
      char byte4=0;
    
    
      /* ins EEPROM schreiben */
      adresse = 0x0000;
      datenbyte = 0x41; // 'A'
      EEPROM_write(adresse, datenbyte);
    
    
      adresse = 0x0008;
      datenbyte = 0x46; // 'F'
      EEPROM_write(adresse, datenbyte);
    
    
      adresse = 0x0010;
      datenbyte = 0x46; // 'F'
      EEPROM_write(adresse, datenbyte);
    
    
      adresse = 0x0018;
      datenbyte = 0x45; // 'E'
      EEPROM_write(adresse, datenbyte);
    
    
    
      /* AFFE wieder auslesen */
      byte1 = EEPROM_read(0x0000);
    
      byte2 = EEPROM_read(0x0008);
    
      byte3 = EEPROM_read(0x0010);
    
      byte4 = EEPROM_read(0x0018);
    
    
      sw_uart_init();
    
      __enable_interrupt();     // Interrupts erst zulassen, wenn EEPROM beschrieben ist !!
    
    
      /* und ans Terminal senden */
      while(1)
      {
        send_one_byte(byte1);
        send_one_byte(byte2);
        send_one_byte(byte3);
        send_one_byte(byte4);
        send_one_byte('\r');
        send_one_byte('\n');
      }
    }
    
    
    void EEPROM_write(unsigned int adress, char data)
    {
      /* Warten bis vorheriger Schreibvorgang beendet */
      while(EECR & (1<<EEPE));
    
      EEAR = adress; // Adresse an der das Byte im EEPROM geschrieben werden soll
    
      EEDR = data;   // Datenbyte, welches im EEPROM gespeichert werden soll
    
      EECR &=~ (1<<EEPM0); // Erase and Write in one Operation (siehe Datenblatt Programming Mode)
    
      EECR &=~ (1<<EEPM1);
    
      EECR |= (1<<EEMPE);
    
      EECR |= (1<<EEPE); // Starte EEPROM Write
    }
    
    
    
    char EEPROM_read(unsigned int adress)
    {
      while(EECR & (1<<EEPE));
    
      EEAR = adress; // Adresse an der Byte im EEPROM ausgelesen werden soll
    
      EECR |= (1<<EERE); // Auslesen starten
    
      return EEDR;
    }
    Hab jetzt zusätzlich noch die EEPMx in der eeprom_write Funktion eingestellt. Entsprechende Hexcodes für ASCII verwendet (damit wirklich AFFE im Terminal angezeigt wird). Enable Interrupts erst wenn EEPROM beschrieben wurde.
    Und zu guter letzt noch vergessen Software UART zu initialisieren

    Gruß schamp

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Das mit dem IRQ deaktivieren und aktivieren würde ich aber in die EEprom_write verlegen, jedesmal wenn geschrieben wird, sonst funktinoert evtl. etwas andres nicht, wenn Du das PRG später mal woanders verwendest.

    Beim lesen vom EEprom ist es nicht so kritisch, aber sicherheitshalber könnte man ums lesen auch den IRQ deaktivieren, nicht das genau in diesem Moment in einem IRQ jemand die Adresse tauscht !
    mfG
    HK
    /* Linux user #98697 */

  5. #5
    hallo,

    wäre möglich die oben genannte Datei "sw_uart.h" zu bekommen.
    Danke

    Benites

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •