реклама на сайте
подробности

 
 
> Есть потребность в использование 24с256, Порылся по форуму нашол следующее
TamTam
сообщение Jun 4 2006, 22:39
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Код
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;
}


но твориться какаято ерунда, то пише то непишет, траблы с клдом этих процедур, или я что то не так делаю.

для пробы делаю так

[code]
while (1)
{
int i;
for (i=0;i<1000;i++)
{
write_byte_eeprom (i,0x88) ;
delay_ms(80);
};
};
[code]
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
TamTam
сообщение Jun 5 2006, 03:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Цитата(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; // переключить светодиод

}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 10:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016