čtení a zápis do eeprom u Atmegy128

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

čtení a zápis do eeprom u Atmegy128

#1 Příspěvek od Toby »

ahoj,
potřeboval bych poradit s eeprom pamětí u atmegy128.
Pro zápis do eeprom a čtení z eeprom používám tyto funkce, které jsou napsaná v datasheetu atmegy128.

//cteni z eeprom
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}

// zapis do eeprom
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

funkce pro čtení funguje, ale funkce pro zápis nee.
V datasheetu jsem vyčetl že by se mělo při zápisu vypnout globální přerušení, ale i o vypnutí GIE se do eeprom nic nezapíše.
Programuji to v prostředí CodeVisionAVR a přes Presto UP, jestli by někdo neporadil, kde by mohl být problém.

Uživatelský avatar
bohumilfulin
Příspěvky: 109
Registrován: 12 led 2010, 01:00

#2 Příspěvek od bohumilfulin »

ty to mas v C ja v assembleru ale jako voditko by to mohlo poslouzit

;********************************************************************************
;INTERNI EEPROM
;********************************************************************************
;********************************************************************************
intEEPROM_write:
;in xh:xl; Set up address in address register
;in temp data k zapisu
;out: -
; Wait for completion of previous write
sbic EECR,EEWE
rjmp intEEPROM_write
; Set up address (xh:xl) in address register
out EEARH,xh
out EEARL,xl
; Write data (temp) to data register
out EEDR,temp
push temp
in temp, SREG ; store SREG value
cli ; disable interrupts during timed sequence
sbi EECR, EEMWE ; start EEPROM write
sbi EECR, EEWE
out SREG, temp ; restore SREG value (I-bit)
pop temp
ret
;********************************************************************************
intEEPROM_read:
;in ; Set up address (xh:xl) in address register
;out:temp data na adrese

; Wait for completion of previous write
sbic EECR,EEWE
rjmp intEEPROM_read
; Set up address (xh:xl) in address register
out EEARH, xh
out EEARL, xl
; Start eeprom read by writing EERE
sbi EECR,EERE
; Read data from data register
in temp,EEDR
ret
;********************************************************************************

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#3 Příspěvek od Toby »

assembler moc nepobírám :(
jak mám ty funkce v tom assembleru zavolat?

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

Re: re

#4 Příspěvek od Andrea »

Toby píše:assembler moc nepobírám :(
jak mám ty funkce v tom assembleru zavolat?
Z Cčka těžko.
Podle čeho usuzuješ, že čtení funguje a zápis ne? Ty funkce vypadají v pořádku, překladač nic nehlásí?

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#5 Příspěvek od Toby »

Když manuálně zapíšu do eeprom tak mi to funkce pro čtení přečte správně.
Jakmile chci zapsat do eeprom v programu pomoci fce pro zápis tak mi pak fce pro čtení přečte hodnotu, která je deafaultně nastavená v eeprom, čili špatnou hodnotu.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

Re: re

#6 Příspěvek od Andrea »

Toby píše:Jakmile chci zapsat do eeprom v programu pomoci fce pro zápis tak mi pak fce pro čtení přečte hodnotu, která je deafaultně nastavená v eeprom, čili špatnou hodnotu.
Přečte to co tam bylo ručně zapsáno nebo 0xFF?

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#7 Příspěvek od Toby »

přečte co tam bylo defaultně nastaveno takže FF
je mi právě divný, že ta funkce pro čtenífunguje a zápis nefunguje
nemáš možnost tu funkci vyzkoušet?

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

Re: re

#8 Příspěvek od Andrea »

Toby píše:přečte co tam bylo defaultně nastaveno takže FF
je mi právě divný, že ta funkce pro čtenífunguje a zápis nefunguje
nemáš možnost tu funkci vyzkoušet?
Nemám, ale totéž napsané v assembleru fuguje bez problémů. Zkus zapsat na adresu, kam předtím ručně zapíšeš něco jiného než 0xFF a pak to přečti.

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

#9 Příspěvek od Toby »

jj to jsem zkoušel viz.

#asm("cli") // zakaz GIE
EEPROM_write(0x0001,0x01); // zapis na pozici 1 hodnotu 1
delay_ms(500); // cekej
EEPROM_read(0x0001); // precti data na pozici 1
#asm("sei") // povol GIE


ale pořád to čte FF

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#10 Příspěvek od AB1 »

Původní kód by měl fungovat.
Kde a jak jsou definované bity EEWE, EEMWE atd?

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#11 Příspěvek od Toby »

to mám nadefinováno takto
/* ***** EEPROM *********************** */
/* EEDR - EEPROM Data Register */
#define EEDR0 0 // EEPROM Data Register bit 0
#define EEDR1 1 // EEPROM Data Register bit 1
#define EEDR2 2 // EEPROM Data Register bit 2
#define EEDR3 3 // EEPROM Data Register bit 3
#define EEDR4 4 // EEPROM Data Register bit 4
#define EEDR5 5 // EEPROM Data Register bit 5
#define EEDR6 6 // EEPROM Data Register bit 6
#define EEDR7 7 // EEPROM Data Register bit 7

/* EECR - EEPROM Control Register */
#define EERE 0 // EEPROM Read Enable
#define EEWE 1 // EEPROM Write Enable
#define EEMWE 2 // EEPROM Master Write Enable
#define EERIE 3 // EEPROM Ready Interrupt Enable


přičmež toto nastavení je v h souboru, který volám rovněž s dalšími knihovnami .h

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#12 Příspěvek od AB1 »

Tento kód v simulátoru chodí.

Kód: Vybrat vše

#include <mega128.h>

#define EERIE 3 
#define EEMWE 2
#define EEWE  1
#define EERE  0

//------------------------------------------------------------------

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
    while(EECR & (1<<EEWE));     
    EEAR = uiAddress;
    EEDR = ucData;
    EECR |= (1<<EEMWE);         
    EECR |= (1<<EEWE);          
} 

//------------------------------------------------------------------

void main(void)
{
unsigned char i;
    
    for (i=0;i<20;i++)
    EEPROM_write(i,i);

    while (1)
    {
    }

}

Nemám M128 ale zkoušel jsem v reálu s M88 (po přejmenování některých bitů) a zapisuje dobře.
Kontroloval jsem tak, že jsem v programátoru načetl eeprom.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#13 Příspěvek od Andrea »

Tak kouknout, jak to překladač přeložil, jestli to nějak nezoptimalizoval.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#14 Příspěvek od Andrea »

Toby píše:#asm("cli") // zakaz GIE
EEPROM_write(0x0001,0x01); // zapis na pozici 1 hodnotu 1
delay_ms(500); // cekej
EEPROM_read(0x0001); // precti data na pozici 1
#asm("sei") // povol GIE
A jak zjišťuješ, co jsi přečetl, když přečtenou hodnotu nikam neukládáš?

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#15 Příspěvek od Toby »

tak možná u tebe to funguje, ale u mě ne
ten tvůj program jsem zkopíroval přeložil zapnul programátor a přečetl z paměti eeprom samý FF :(

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“