Forum: Mikrocontroller und Digitale Elektronik EEPROM Write and Read im AVR16DD14 Problem


von Jannik S. (jannik_s)


Lesenswert?

Hi zusammen.

Ich hatte bereits schon im Microchip Forum vor einiger Zeit die geliche 
Frage gestellt, aber ohne Antwort. Daher versuche ich es nochmal bei 
euch direkt.

Habe die MPLAX X IDE und den "neueren" AVR16DD14 MCU zum ersten mal im 
Einsatz.

Habe mir ein paar Basisroutinen mit dem eingebauten Codegenerator 
generiert.
U.a. auch EEPROM Write and Read Funktionen.

Ich bekomme keine Daten ins EEPROM geschrieben. Auch wenn ich mich an 
den Beispielcode aus der Doku halte 
(https://onlinedocs.microchip.com/oxy/GUID-41EA2496-1EE8-4319-A387-9EC9318EF178-en-US-23/GUID-FAB7D938-8223-479A-9238-5949CF35E9BD.html#GUID-2636BA3B-149A-49C1-869A-4FA48C874937)

Hat von euch einer Idee woran das liegen könnte?

Hier die generieten EEPROM Funktionen und mein Beispiel, wie ich eine 
Speicherstelle (die Erste Adresse im EEPROM) beschreiben möchte. 
Speicher bleibt immer auf 0xff :/
1
#define EEPROM_ADDRESS 0x1400U
2
void EEPROM_Write_Test(void)
3
{
4
5
    eeprom_data_t eepromWriteData = 0x55;
6
 
7
    //Write EEPROM byte
8
    EEPROM_Write(EEPROM_ADDRESS, eepromWriteData);
9
    while (EEPROM_IsBusy());
10
    if (NVM_StatusGet() == NVM_OK)
11
    {
12
        //printf("EEPROM_Write passed \r\n");
13
    }
14
    else
15
    {
16
        //printf("EEPROM_Write failed \r\n");
17
        NVM_StatusClear();
18
    }
19
20
}

Die (generierten) Routinen sind:
1
eeprom_data_t EEPROM_Read(eeprom_address_t address)
2
{
3
    return *(eeprom_data_t *) address;
4
}
5
6
void EEPROM_Write(eeprom_address_t address, eeprom_data_t data)
7
{
8
    //Program the EEPROM with desired value(s)
9
    ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_EEERWR_gc);
10
    
11
    
12
    //Write byte to EEPROM
13
    *(uint8_t *) address = data; //Hier habe ich auch schon uint16_t probiert - da die Adresse ja 16 bit hat?!) - ging aber auch nicht.
14
    
15
    //Clear the current command
16
    ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc);
17
}
18
19
bool EEPROM_IsBusy(void)
20
{
21
    return (NVMCTRL.STATUS & NVMCTRL_EEBUSY_bm);
22
}

Bin über jeden Hinweis dankbar

von Wastl (hartundweichware)


Lesenswert?

Jannik S. schrieb:
> #define EEPROM_ADDRESS 0x1400U

Habe mir nicht das Datenblatt angeschaut, aber: Soll das die
erste Adresse des EEPROMs sein? Ich dachte die Adressen werden
ab 0x0000 gezählt ..... ich kann mich täuschen.

von Jannik S. (jannik_s)


Lesenswert?

Ich meine auch, dass das so bei den alten AVRs war. Da gab es ja extra 
Adressregister wo man schreiben möchte.

Hier müsste es aber 0x1400 sein.
Original ist lt. Bibliothek folgendes definiert:
1
#define EEPROM_ADDRESS (EEPROM_START)  //EEPROM address at which data is to be written

mit folgendem aus der ioavr16dd14.h
1
#  define EEPROM_START     (0x1400U)
2
#  define EEPROM_SIZE      (256U)
3
#  define EEPROM_PAGE_SIZE (1U)

Soltle also passen.

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> Bin über jeden Hinweis dankbar

Wirklich jeden?
  Dann vergleichen Sie einmal mit dem Assembler-Programm (sollte lesbar 
sein), vielleicht hilft das.

von Wastl (hartundweichware)


Lesenswert?

Jannik S. schrieb:
> Hat von euch einer Idee woran das liegen könnte?

Vorher NVM_Initialize () aufgerufen?

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

"Zu Fuß" in C sieht es wohl so aus - wobei der Einsatz von 
ccp_write_spm natürlich sicherer ist.

von Jannik S. (jannik_s)


Angehängte Dateien:

Lesenswert?

NV_Initialize() ist zuvor aufgerufen. Hier wird passiert aber "nur" 
folgendes:
1
void NVM_Initialize(void)
2
{    
3
    NVM_StatusClear();  
4
}
5
void NVM_StatusClear(void)
6
{
7
    NVMCTRL.STATUS &= ~NVMCTRL_ERROR_gm;
8
}

Auch der Versuch mit dem C-Code zu Fuß bringt keine Veränderung im 
EEPROM?

Ich gucke aber an der richtigen Stelle im Memory View, oder? Ich frag 
mal so blöd, da ich die IDE noch nie genutzt habe zuvor. Siehe 
Screenshot.

von S. L. (sldt)


Lesenswert?

Zu der Microchip-IDE kann ich rein gar nichts sagen. Die beiden von mir 
vorgestellten Programme (asm und C) funktionieren hier bei mir.

von Jannik S. (jannik_s)


Lesenswert?

Okay. vielen Dank für den Hinweis und natürlich auch den Code. Ich gucke 
mal, ob ich das gleiche nochmal im Microchip Studio / AVR-Studio 
teste...

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Müsste funktionieren.

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.