čtení a zápis do eeprom u Atmegy128
Moderátor: Moderátoři
čtení a zápis do eeprom u Atmegy128
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.
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.
- bohumilfulin
- Příspěvky: 109
- Registrován: 12 led 2010, 01:00
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
;********************************************************************************
;********************************************************************************
;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
;********************************************************************************
Re: re
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.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?
re
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
/* ***** 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
Tento kód v simulátoru chodí.
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.
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)
{
}
}
Kontroloval jsem tak, že jsem v programátoru načetl eeprom.