Zdravim programátoři,
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);
}
no a když pak v hlavní smyčce napíšu
EEPROM_write(0x00,0x01); // skoc na zacatek pameti a zapis 0x01
delay_ms(100);
x = EEPROM_read(0x00); // uloz do x hodnotu dat pameti na pozici 0x00
a pak chci vytisknout x na display ale porad mi to vypisuje hodnotu 255
jako by nefungoval vubec ten zapis do eeprom
nevedel by nekdo kde je problem?
diky za rady
Zasilam priklad ktery funguje pro ATMega8, nevidim duvod, proc by nemel fungovat pro tvoje AVR.
Bohuzel je tam implementovana knihovna pro 2-radkove LCD, ktera se mi nechce vykopavat.
Knihovna je stazena ze stranek od Petera Fleuryho.
Principem je pouziti knihovny eeprom.h, ktera je obsazena v AVR studiu.
#define F_CPU 8000000UL
#include <avr/eeprom.h>;
#include <util/delay.h>
#include "lcd.h"
unsigned char i;
//store initial byte to eeprom
uint8_t EEMEM eeprombyte=0x10;
//store initial word to eeprom
uint16_t EEMEM eepromword=0x5555;
//store string to eeprom
uint8_t EEMEM eepromstring[5]={"Test\0"};
int main(void)
{
//RAM byte variable
uint8_t RAMbyte;
//RAM word variable
uint16_t RAMword;
//RAM array of bytes
uint8_t RAMstring[5];
//read byte from EEPROm and store to RAM
RAMbyte = eeprom_read_byte(&eeprombyte);
//read word from EEPROM and store to RAM
RAMword = eeprom_read_word(&eepromword);
//copy string fro mEEPROM to RAM
eeprom_read_block ((void *)&RAMstring, (const void *)&eepromstring,5);
char buffer[8];
lcd_init(LCD_DISP_ON); /* initialize display, cursor off */
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("RoBoProG");
lcd_gotoxy(0,1);
lcd_puts("Run:");
for (i=3;i>0;i--)
{
sprintf(buffer,"%2i",i);
lcd_gotoxy(4,1);
lcd_puts(buffer);
_delay_ms(1000);
}
lcd_clrscr();
lcd_puts(RAMstring);
sprintf(buffer,"%i",RAMbyte);
lcd_gotoxy(5,0);
lcd_puts(buffer);
sprintf(buffer,"%i",RAMword);
lcd_gotoxy(0,1);
lcd_puts(buffer);
return (0);
}
Toby:
unsigned int je 16bit neznaménkové číslo. Zkoušel jsi adresu 0x0000? Případně si tam můžeš zkusit něco zapsat programátorem a v programu to jen přečíst nebo obráceně na vyzkoušení funkcí. DS jsem zatím nezkoumal…
Zkusil jsem ručně zapsat do eeprom paměti a následně přečíst hodnotu a podařilo se.
Bohužel když to zadám v programu tak to vypíše hodnotu , která je nastavená v eeprom při programování součástky.