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

 
 
 
Reply to this topicStart new topic
> Есть потребность в использование 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
defunct
сообщение Jun 4 2006, 23:37
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



kertis
Уважаемый, почему нельзя было сообщить все то же самое только без упоминаний о курсе?
У вас какая-то нездоровая мания ...(величия?).

Неужели вы так и не поняли, что курс ваш уже просто "достал".

Если у вас цель помогать, а не раскручивать свой сайт, почему бы представляющие интерес "задачи" не разместить в специально созданной ветке "исходники программ и библиотек" прямо в этом форуме в самом верху, всегда у всех на виду.
Go to the top of the page
 
+Quote Post
TamTam
сообщение Jun 5 2006, 01:03
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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 о и опять не пашет.


Что-же делать ????
Go to the top of the page
 
+Quote Post
TamTam
сообщение Jun 5 2006, 01:50
Сообщение #4


Местный
***

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



Цитата(kertis @ Jun 5 2006, 05:45) *
вы сначала мой откомпилируйте ничего не меняя и проверьте, у меня он работал не в симуляторе а "в живую".

Если все будет ОК. тогда начнете править под себя, и постоянно тестите, чтоб сразу отловить когда баг появится.

Адрес микрухи правильно поставили ? у меня 0 - т.е. все ноги адреса на землю.


Ваш проджект компилил, сразу после разпоковки из архива, живаго 8535 у меня нет, поэтому могу тока в Протеусе тестить, под рукой тока тинька 2313 и 90s2313. адрес конечно 0xa0

ноги SDA и SCL подтянуты к +5 а остальные на минус .
Go to the top of the page
 
+Quote Post
sseett
сообщение Jun 5 2006, 02:00
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 165
Регистрация: 14-01-05
Из: РФ Приморский край (рег.25)
Пользователь №: 1 939



А подтяжку (4к7) на дату и клок поставили?
Удачи!
Go to the top of the page
 
+Quote Post
TamTam
сообщение Jun 5 2006, 02:05
Сообщение #6


Местный
***

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



[/quote]

Ваш проджект компилил, сразу после разпоковки из архива, живаго 8535 у меня нет, поэтому могу тока в Протеусе тестить, под рукой тока тинька 2313 и 90s2313. адрес конечно 0xa0

ноги SDA и SCL подтянуты к +5 а остальные на минус .
[/quote]


Цитата(sseett @ Jun 5 2006, 06:00) *
А подтяжку (4к7) на дату и клок поставили?
Удачи!


дык яж в предыдущем сообщение написал что подтянул
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 5 2006, 02:10
Сообщение #7


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 5 2006, 02:31
Сообщение #8


.
******

Группа: Участник
Сообщений: 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 стали равны?

Зря я тебя защищал недавно.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
TamTam
сообщение Jun 5 2006, 03:40
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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
WHALE
сообщение Jun 5 2006, 05:29
Сообщение #10


Знающий
****

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



kertis или как вас там.Опять пример того,как не надо писать программы.Задержки,реализуемые
тупо через delay-вы о системных таймерах слышали?Структура программы,сделанная через одно место-
блин,посмотрите на апликухи атмела,как люди делают.Ваш- же файл надо переделывать процентов на
80.Должен быть прикладной файл,где реализованы все фукции девайса,который практически не трогая или с минимальными переделками подключается к своему проекту,и пример применения в main,где показывается,как с ним работать.Никто-же не работает с одной памятью,обычно еще куча всего. Вы-же выкладываете его не как учебный проект,а как рабочий.Вам самому еще учиться и учиться,а не примеры писать.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Nixon
сообщение Jun 5 2006, 07:24
Сообщение #11


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



2 getsmart, kertis и остальные - оскорбления это не лучший способ понять друг друга.


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
Hmm
сообщение Jun 5 2006, 17:54
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 329
Регистрация: 22-06-04
Пользователь №: 124



Имхо, использование аппаратных ресурсов (таймер), в данном случае, не оправдано.


--------------------
Талант не пропить ...
Go to the top of the page
 
+Quote Post
pan_oleg
сообщение Nov 16 2007, 15:26
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 16-11-07
Пользователь №: 32 387



Вечер добрый.
Нужен совет по работе АТmega88 и 24LC256
загвоздка с записью в память.
после формирования стопа виснет в цикле
i2cSendStop();//
while( !(inb(TWCR) & BV(TWSTO)) );//
чо за лажа, мож кто знает,
резисторы на + 5 В по 5кОм
Go to the top of the page
 
+Quote Post

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

 


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


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