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

Местный
  
Группа: Свой
Сообщений: 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]
|
|
|
|
|
Jun 5 2006, 01:03
|

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

|
Цитата(kertis @ Jun 5 2006, 03:22)  Если вы не побрезгуете - пример для CVAVR at24c256 из запрещенного курса по AVR в прицепе.
Но советую вам использовать SPI память типа at45db161 - это 2 Мб за туже цену! как её использовать - в задаче 7 запрещенного курса и в АпНоуте AVR335 (но там с 1 ошибкой - я атмелам писал но они не реагируют). Начну по порядку 1. я не побрезговал :-))) 2. Копирую у вас из сурца 2 процедуры чтения и записи байта 3. заменяю свои и пипец. вообще нечего никуда не пишет. ниже отличия наших процедур Код //ваша i2c_write(EEPROM_BUS_ADDRESS | ((unsigned char)(address>>8)<<1)); i2c_write((unsigned char)address);
// с форума i2c_write(EEPROM_BUS_ADDRESS); i2c_write((unsigned char)address>>7); i2c_write((unsigned char)address); 4. опять эксперимены, читаю ваш сурц(возможно невнимательно) + скопировал процедуру записи страницы делаю так Код int i; long int adr=0x0001; write_page_eeprom (10); for (i=0;i<1000;i++) { adr=adr+0x0001; write_byte_eeprom (adr,0x54); delay_ms(80); }; Протеус вообще начинает говоритьб что мол нет дивайса с таким адресом есть только с адресом 0 потом так Код int i; long int adr=0x0001; /// write_page_eeprom (10); for (i=0;i<1000;i++) { adr=adr+0x0001; write_byte_eeprom (adr,0x54); delay_ms(80); }; и опять тишина. в чемже засада ???? 5. Компилирую ваш проджект в протеусе ставлю 8535 соединяю ноги с 24с256 о и опять не пашет. Что-же делать ????
|
|
|
|
|
Jun 5 2006, 01:50
|

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

|
Цитата(kertis @ Jun 5 2006, 05:45)  вы сначала мой откомпилируйте ничего не меняя и проверьте, у меня он работал не в симуляторе а "в живую".
Если все будет ОК. тогда начнете править под себя, и постоянно тестите, чтоб сразу отловить когда баг появится.
Адрес микрухи правильно поставили ? у меня 0 - т.е. все ноги адреса на землю. Ваш проджект компилил, сразу после разпоковки из архива, живаго 8535 у меня нет, поэтому могу тока в Протеусе тестить, под рукой тока тинька 2313 и 90s2313. адрес конечно 0xa0 ноги SDA и SCL подтянуты к +5 а остальные на минус .
|
|
|
|
|
Jun 5 2006, 02:05
|

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

|
[/quote] Ваш проджект компилил, сразу после разпоковки из архива, живаго 8535 у меня нет, поэтому могу тока в Протеусе тестить, под рукой тока тинька 2313 и 90s2313. адрес конечно 0xa0 ноги SDA и SCL подтянуты к +5 а остальные на минус . [/quote] Цитата(sseett @ Jun 5 2006, 06:00)  А подтяжку (4к7) на дату и клок поставили? Удачи! дык яж в предыдущем сообщение написал что подтянул
|
|
|
|
|
Jun 5 2006, 02:10
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
kertis Я так монял, что ваша прога не для AT24C256. Судя по вырезке автора топика она для другой микрухи (возможно для 24C01). TamTam Цитата i2c_write((unsigned char)address>>7); В обоих процедурах замените на: i2c_write((unsigned char)address>>8); Ещё проверьте процедуру задержки (возможно косячит). Если задержка неправильная (мала) то могут происходить аномалии.
Сообщение отредактировал GetSmart - Jun 5 2006, 02:13
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 5 2006, 02:31
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
kertis Цитата i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | ((unsigned char)(page_number>>2)<<1)); i2c_write((unsigned char)(page_number<<6)); // записываем первый байт из data_buffer i2c_write(data_buffer[0]);
// записываем остальные 63 байта:
for (i=1;i<64;i++) { // для значений i от 1 до 63 делать:
i2c_write(data_buffer[0]);
} // скобка для for
i2c_stop(); Что это за хрень? Она не может работать! Тем более работать на 24C256. В цикле указывать индекс кто будет? Зачем первый байт данных записывать отдельно, а не в цикле? Вместо вот этого: Цитата i2c_write(EEPROM_BUS_ADDRESS | ((unsigned char)(page_number>>2)<<1)); i2c_write((unsigned char)(page_number<<6)); нужно писать: i2c_write(EEPROM_BUS_ADDRESS); i2c_write((unsigned char)(page_number>>2)); i2c_write((unsigned char)(page_number<<6)); С каких пор 35 руб за 24C256 и 75 руб за 45DB161 стали равны? Зря я тебя защищал недавно.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 5 2006, 03:40
|

Местный
  
Группа: Свой
Сообщений: 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; // переключить светодиод
}
|
|
|
|
|
Jun 5 2006, 05:29
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
kertis или как вас там.Опять пример того,как не надо писать программы.Задержки,реализуемые тупо через delay-вы о системных таймерах слышали?Структура программы,сделанная через одно место- блин,посмотрите на апликухи атмела,как люди делают.Ваш- же файл надо переделывать процентов на 80.Должен быть прикладной файл,где реализованы все фукции девайса,который практически не трогая или с минимальными переделками подключается к своему проекту,и пример применения в main,где показывается,как с ним работать.Никто-же не работает с одной памятью,обычно еще куча всего. Вы-же выкладываете его не как учебный проект,а как рабочий.Вам самому еще учиться и учиться,а не примеры писать.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|