Zaslal: čt únor 18 2010, 13:34 Předmět: č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.
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
;********************************************************************************
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.
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.
#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
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
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.
#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áš?
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2, 3Další
Strana 1 z 3
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.