Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Есть потребность в использование 24с256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
TamTam
Код
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]
defunct
kertis
Уважаемый, почему нельзя было сообщить все то же самое только без упоминаний о курсе?
У вас какая-то нездоровая мания ...(величия?).

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

Если у вас цель помогать, а не раскручивать свой сайт, почему бы представляющие интерес "задачи" не разместить в специально созданной ветке "исходники программ и библиотек" прямо в этом форуме в самом верху, всегда у всех на виду.
TamTam
Цитата(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 о и опять не пашет.


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

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

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


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

ноги SDA и SCL подтянуты к +5 а остальные на минус .
sseett
А подтяжку (4к7) на дату и клок поставили?
Удачи!
TamTam
[/quote]

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

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


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


дык яж в предыдущем сообщение написал что подтянул
GetSmart
kertis
Я так монял, что ваша прога не для AT24C256. Судя по вырезке автора топика она для другой микрухи (возможно для 24C01).

TamTam
Цитата
i2c_write((unsigned char)address>>7);

В обоих процедурах замените на:
i2c_write((unsigned char)address>>8);

Ещё проверьте процедуру задержки (возможно косячит). Если задержка неправильная (мала) то могут происходить аномалии.
GetSmart
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 стали равны?

Зря я тебя защищал недавно.
TamTam
Цитата(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; // переключить светодиод

}
WHALE
kertis или как вас там.Опять пример того,как не надо писать программы.Задержки,реализуемые
тупо через delay-вы о системных таймерах слышали?Структура программы,сделанная через одно место-
блин,посмотрите на апликухи атмела,как люди делают.Ваш- же файл надо переделывать процентов на
80.Должен быть прикладной файл,где реализованы все фукции девайса,который практически не трогая или с минимальными переделками подключается к своему проекту,и пример применения в main,где показывается,как с ним работать.Никто-же не работает с одной памятью,обычно еще куча всего. Вы-же выкладываете его не как учебный проект,а как рабочий.Вам самому еще учиться и учиться,а не примеры писать.
Nixon
2 getsmart, kertis и остальные - оскорбления это не лучший способ понять друг друга.
Hmm
Имхо, использование аппаратных ресурсов (таймер), в данном случае, не оправдано.
pan_oleg
Вечер добрый.
Нужен совет по работе АТmega88 и 24LC256
загвоздка с записью в память.
после формирования стопа виснет в цикле
i2cSendStop();//
while( !(inb(TWCR) & BV(TWSTO)) );//
чо за лажа, мож кто знает,
резисторы на + 5 В по 5кОм
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.