Господа, окажите помощь новичку. нужно обратиться из микроконтроллера к внешней EEPROM памяти...типа 24С16...осуществить в ней поиск и редактирование. На С исходник если бы увидел был бы благодарен.
Вот код исходника для работы с внешней памятью at24c16 (по ссылке: http://nav2.livejournal.com/130205.html ):
// Модуль работы с EEPROM AT24c16 (2Kb)
// -----------------------------------------------
#include <89c51rd2.h>
#define SDA P5_4
#define SCL P5_3
static void set_sda(void)
{
SDA = 1;
}
static void clr_sda(void)
{
SDA = 0;
}
static void set_scl(void)
{
SCL = 1;
}
static void clr_scl(void)
{
SCL = 0;
}
static void ee_del(void)
{
int i;
for(i=0;i<20;i++) {};
}
static void ee_start(void)
{
set_sda();
ee_del();
set_scl();
ee_del();
clr_sda();
ee_del();
clr_scl();
ee_del();
}
static void ee_stop(void)
{
clr_sda();
ee_del();
set_scl();
ee_del();
set_sda();
ee_del();
}
static void ee_ack(void)
{
ee_del();
set_sda();
ee_del();
set_scl();
ee_del();
ee_del();
ee_del();
ee_del();
clr_scl();
ee_del();
ee_del();
}
static void ee_ack_w(void)
{
ee_del();
set_sda();
ee_del();
set_scl();
ee_del();
ee_del();
ee_del();
ee_del();
while(SDA != 0 ) {}; // SDA
clr_scl();
ee_del();
ee_del();
}
static void ee_wb(unsigned char wb)
{
unsigned char i;
unsigned char wwb;
wwb = wb;
for(i=0;i<8;i++)
{
if((wwb & (0x80>>i)) == 0 )
{
clr_sda();
}
else
{
set_sda();
}
ee_del();
set_scl();
ee_del();
clr_scl();
ee_del();
}
}
static unsigned char ee_rb(void)
{
unsigned char i;
unsigned char ee_data;
ee_data = 0;
set_sda();
for(i=0;i<8;i++)
{
set_scl();
ee_del();
ee_data = (ee_data << 1) | SDA; //| tmp_p8; /* 254 */
clr_scl();
ee_del();
set_sda();
ee_del();
};
return(ee_data);
}
/*-----------------------------------------------------------*/
void ee_write(unsigned int adr, unsigned char wb)
{
unsigned char adrL;
unsigned char adrH;
unsigned int i;
ee_start();
adrL = adr & 0xff;
adrH = (((adr >> 8) << 1) & 0x0E) | 0xA0;
ee_wb(adrH);
ee_ack();
ee_wb(adrL);
ee_ack();
ee_wb(wb);
ee_ack();
ee_stop();
for(i=0;i<5000;i++){}
}
/* ------------------------------------------------ */
unsigned char ee_read(unsigned int adr)
{
unsigned char adrL;
unsigned char adrH;
unsigned char rb;
ee_start();
adrL = adr & 0xff;
adrH = (((adr >> 8) << 1) & 0x0E) | 0xA0;
ee_wb(adrH);
ee_ack();
ee_wb(adrL);
ee_ack();
ee_del();
ee_stop();
ee_del();
ee_start();
adrH = (((adr >> 8) << 1) & 0x0E) | 0xA1;
ee_wb(adrH);
ee_ack();
ee_del();
rb = ee_rb();
ee_ack();
ee_stop();
return(rb);
}
Спасибо!!!! Оперативно ответили :D Буду разбираться.
Сейчас глянул книжку, на полке стояла "Конструирование устройств на микроконтроллерах", автор Белов А.В.
В ней описана работа с внешней EEPROM памятью с интерфейсом I2C. Есть исходники, но правда на ассемблере. Я думаю, данная книга (особенно стр. 113-160) может очень помочь в освоении EEPROM памяти типа 24С***. ;)
нашел книгу белова...спасибо за подсказку...асма так асма :) расскажу если что получится
Здравствуйте, коллеги!! с кодом вроде разобрался с вашей помощью...помогли книги Белова в том числе. Дошла очередь до сборки. в общем надо соединить attiny2313 (остановился на нем, потому что программатор готовый есть) и eeprom 24C16. понимаю что надо соединить соответсвующие выводы SDA и SCL друг с другом и подать питание.... может посоветуете как сделать правильно
Ножки микросхемы памяти 24C16 надо подключать к микроконтроллеру ATtiny2313 следующим образом:
SDA к 17 ножке микроконтроллера (PB5),
SCL к 19 ноге (PB7).
Вот и все, начинайте писать исходник. Если будут вопросы - задавайте.
Понятно....к 4 и 8 ножке eeprom подаю питание, а ножки 1,2,3 и 7 остаются неподключенными. к микроконтроллеру подаю питание к 20 и 10 ножке,а остальные не подключенные. так? кварц наверно можно использовать встроенный?
Да, кварц проще использовать встроенный (точнее RC-цепочку).
Судя по даташиту на память от фирмы ATMEL - AT24C16.
Ножки A0, A1, A2 (1-3 ноги микросхемы) лучше подтянуть к напряжению питания или к земле (насколько я помню они позволяют адресовать несколько микросхем памяти на одной шине I2C).
Ножка WP (седьмая нога) должна быть подключена к земле, для разрешения записи в память.
Всё это по даташиту: http://www.datasheetcatalog.org/datasheets/208/160469_DS.pdf
(смотрел на сайте http://www.datasheetcatalog.com/datasheets_pdf/2/4/C/1/24C16.shtml )
при программировании возникла одна проблемка. в PonyProge изменил значение фьюза CKSEL...он используется для настройки источника тактового сигнала. после этого программатор совсем перестал видеть микроконтроллер. пришлось заливать hex с установленными по умолчанию значениями. У Белова написано что при работе с eeprom частоту надо использовать небольшую. Как мне все таки установить фьюзы (и какие) и не допустить чтобы микроконтроллер перестал "пропадать" для программатора? Заранее спасибо за консультации
Заработало!!!!!!!!!!!!!!!!!!! :D :D :D