Цитата(TamTam @ Jun 5 2006, 02:39)

Код
void write_byte_eeprom (unsigned int address, unsigned char data)
{
unsigned char sSREG;
sSREG = SREG; // регистр Статуса МК
#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>7);
i2c_write((unsigned char)address);
i2c_write(data);
i2c_stop();
SREG = sSREG;
delay_ms(11);
}
unsigned char read_byte_eeprom (unsigned int address)
{
unsigned char data;
unsigned char sSREG;
sSREG = SREG;
#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>7);
i2c_write((unsigned char)address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data = i2c_read(0);
i2c_stop();
SREG = sSREG;
return data;
}
Вот он единственно верный код, только в нем одна ошибка 7 нужно исправить на 8
за что огромное спасибо GetSmart, и Kertis, которому еще из за меня и досталось,
Цитата(kertis @ Jun 5 2006, 07:15)

в исходники
http://electronix.ru/forum/index.php?showt...0&gopid=120487&положил пример 24c256 i2c Си код для CVAVR c примером симуляции в PROTEUS от запрещенного барабанщика...
Короче трабл с протеусом если писать в память и делать выдержки длинной 150мс то все ок.
а так он пишет что время мене 4 мс и сохранять не буду.
ТЕМА ЗАКРЫТА, ВОПРОС РЕШОН.
Код
/******************ЕДИНСТВЕННО ВЕРНЫЙ И РАБОЧИЙ***************************/
void write_byte_eeprom (unsigned int address, unsigned char data)
{
unsigned char sSREG;
sSREG = SREG; // регистр Статуса МК
#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>8);
i2c_write((unsigned char)address);
i2c_write(data);
i2c_stop();
SREG = sSREG;
delay_ms(11);
}
unsigned char read_byte_eeprom (unsigned int address)
{
unsigned char data;
unsigned char sSREG;
sSREG = SREG;
#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>8);
i2c_write((unsigned char)address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data = i2c_read(0);
i2c_stop();
SREG = sSREG;
return data;
}
на всякие пожарные код от " kertis " + бонус запись буфера или страницы
Код
void eeprom_write(unsigned int address, unsigned char data) {
PORTB^=0x04;
// метка_врем_002 прим. 3.7 мС с начала программы
// метка_врем_006 пршло 4.7 мкС с метки_005
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)(address>>8)); // MSB
i2c_write((unsigned char)(address)); // LSB
i2c_write(data);
i2c_stop();
// метка_врем_003 пршло 883 мкС от метка_врем_002
PORTB^=0x04; // переключить светодиод
// светодиод для работы с памятью конечно не нужен
// я применил его для проверки в эмуляторе VMLAB
// точности отсчета пауз
/* 10ms - пауза необходима для гарантированого
выполнения записи. (по ДШ at24c256)
Поэтому выгодней писать страницами по 64 байта -
тогда за 10 мс будет записываться не 1 а 64 байта */
delay_ms(10);
PORTB^=0x04; // переключить светодиод
// метка_врем_004 по симуляции в VMLAB пршло РОВНО 10 мС с метки _003
delay_ms(5);
PORTB^=0x04; // переключить светодиод
// метка_врем_005 по симуляции в VMLAB пршло РОВНО 5 мС с метки _004
}
void eeprom_page_write(unsigned int page_number) {
//unsigned char data;
// Вначале запишем Байт в позицию 0 на страничке с номером page_number
// если page_number сместить в лево на 6 бит то получим адрес 0-го
// байта на этой странице, значит для MSB смещение будет 8-6 = 2 в право
//
// метка_врем_007
PORTB^=0x04; // переключить светодиод
// светодиод для проверки в эмуляторе VMLAB
// времени пересылки в память 64 байт
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)(page_number>>2)); // MSB
i2c_write((unsigned char)(page_number<<6)); // LSB
//data = data_buffer[0];
for (i=0;i<64;i++)
i2c_write(data_buffer[i]);
i2c_stop();
PORTB^=0x04; // переключить светодиод
// метка_врем_008 прошло 14.1 мС с метки_007
// это время потраченое на пересылку 64 байт в память
/* 10ms - Пауза на запись 64 байт сразу */
delay_ms(10);
PORTB^=0x04; // переключить светодиод
delay_ms(5);
PORTB^=0x04; // переключить светодиод
}