Страница 1 из 1
Запись в 24c256
Добавлено: Пт июл 25, 2014 00:01:48
Hispanus
Здравствуйте! Прошу Вашей помощи! Мне нужно записать в 24с256 несколько числовых значений. Для этой цели в распоряжении есть программатор, но нет файла прошивки

. Написал небольшой intel hex файл вот такого содержания:
:100000002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D20
:00000001FF.
Сохранил его в bin, вставил в 24с256 в протеусе, запустил моделирование и попытался прочитать содержимое ячейки 24с256 по адресу 0х00 (там где должно храниться 45 (0х2D)). В результате чтение дало совсем другое значение, а именно 63 (0х3F). Получается протеус не понял моего корявого intel hex файла или он настолько корявый, что даже не загружается в 24с256?
P.S. МК pic 16f877, связь организуется по протоколу i2c
Re: Запись в 24c256
Добавлено: Пт июл 25, 2014 06:56:52
Smen
Hispanus писал(а):Сохранил его в bin
Если Вы просто сменили расширение, то ничего и не должно получится, ибо "Intel HEX", помимо данных, содержит ещё кучу служебной информации (погуглите спецификацию), а *.bin, это - чистый бинарник, т.е. "голые" данные.
Найдите какой-нибудь простенький HEX-редактор (полно бесплатных), создайте там дамп нужного размера (по объёму чипа памяти), и, по нужному адресу, измените содержимое ячейки.
P.S.: Вариант, что у Вас неправильно I2C организован, пока не рассматриваем.
P.P.S.: И учтите, что после того, как Вы измените содержимое дампа, необходимо, в Протеусе, удалить чип памяти, а затем вставить вновь. Иначе дамп не обновится. Наверное есть какой-нибудь и другой способ.

Re: Запись в 24c256
Добавлено: Пт июл 25, 2014 10:25:09
Hispanus
Smen, спасибо Вам огромнейшее! Во-первых за то, что откликнулись, а во-вторых за то что Ваш совет мне очень помог. Без него я бы, наверное, не справился. В общем, открыл я hex редактор, записал туда несколько цифр, сохранил, закрыл. В результате появился файл без разрешения. Далее вставил это файл в память fm24c256 (перед этим удалив старый чип) и запустил моделирование в протеусе. На экране i2c дебаггера появилась история операций, среди которых я нашел то самое число, хранящееся в памяти fm24c256. Это число благополучно передается МК. Всё работает

Re: Запись в 24c256
Добавлено: Пт июл 25, 2014 12:52:35
urry
Иначе дамп не обновится. Наверное есть какой-нибудь и другой способ.
debug->reset persistent model data
Re: Запись в 24c256
Добавлено: Чт июл 31, 2014 15:30:35
Hispanus
Оказалось не всё так благополучно...Собрал схему из реальных деталей, попытался считать содержимое ячейки по адресу 0х00 из am24с256 и ничего не получается. Память не шлет бита подтверждения (проверял программным путем). Кроме того и программироваться она тоже не хочет, появляется ошибка - нет бита подтверждения (программатор - ExtraPic, программа - icprog). В чем может быть дело? Я себе всю голову сломал.
Re: Запись в 24c256
Добавлено: Пт авг 01, 2014 06:37:51
Smen
Hispanus писал(а):проверял программным путем
Надо бы аппаратным.
Hispanus писал(а):и программироваться она тоже не хочет
А Вы там с адресами ничего не попутали?
Блокировку записи сняли?
Скорость допустимая?
Начиная с XP, IC-Prog может работать не корректно.
Re: Запись в 24c256
Добавлено: Пт авг 01, 2014 10:58:53
Hispanus
Smen, запускаю icprog в режиме совместимости с win2000, МК она программирует нормально, а вот память не хочет. Вы имеете в виду скорость i2c или скорость программирования? Скорость i2c равна 400кГц, а скорость программирования стоит с задержкой 10 (не знаю какая это скорость). Моя проверка сводится к зажигаю светодиода, если память посылает бит подтверждения и его миганию, если прочитанный байт совпадает с тем, что записал МК. Так вот светодиод не зажигается и не мигает. Блокировку снял, притянул ножку Protect Write к земле.Адрес микросхемы 1010000, его и посылаю памяти, вместе с битом направления передачи (в протеусе все моделируется нормально). Может быть что то с питанием? Или нужно емкость куда то поставить? Моя модель памяти называется am 130 24c256 pi A. Не нашел ДШ конкретно для нее, но для всей серии напряжение питание равно 1.8-5.5 В. Я питаю свою 4.7 В. На всякий случай привожу собранную схему на макетке (выводы обозначил красным цветом):
Re: Запись в 24c256
Добавлено: Пт авг 01, 2014 16:58:19
Smen
Hispanus писал(а):Адрес микросхемы 1010000, его и посылаю памяти
Имелось ввиду: адрес в IC-Prog.
А вообще, если у Вас не W98, настоятельно рекомендую сменить на что-нибудь другое.
Re: Запись в 24c256
Добавлено: Пт авг 01, 2014 19:44:04
Hispanus
Адрес в icprog задаю по вкладке i2c числом 160 (пробовал 161). Пробовал в WinPic - такой же результат, вернее его отсутствие

. Но почему память не отвечает, когда я обращаюсь к ней через МК по протоколу i2c? Ведь схема же собрана правильно? И программа тоже, если в протеусе все работает...
P.S. Или адрес памяти не 160 (0b10100000), а 80 (0b01010000)?
Re: Запись в 24c256
Добавлено: Пн авг 04, 2014 07:14:40
Smen
Hispanus писал(а):Адрес в icprog задаю по вкладке i2c числом 160
Как можно тремя двоичными разрядами задать число 160?
Вы даташит-то на м/сх смотрели?
Re: Запись в 24c256
Добавлено: Пн авг 04, 2014 10:52:19
Hispanus
Тогда как нужно задавать адрес в icprog? Не понимаю о каких трех двоичных разрядах Вы говорите.

Re: Запись в 24c256
Добавлено: Вт авг 05, 2014 07:47:20
Smen
Hispanus писал(а):о каких трех двоичных разрядах Вы говорите
Ну, Вы даёте.

Говорю же, даташит гляньте.


Кстати, уточнение-поправка к предыдущему сообщению:
В адресации у 256-й участвуют только два пина. Третий не задействован.
И Вы в курсе, что у данной памяти страничная организация записи?
Re: Запись в 24c256
Добавлено: Вт авг 05, 2014 22:59:29
Hispanus
Так Вы про эти три двоичных разряда

Я Вас просто не понял. Они у меня притянуты к земле, поэтому адрес м/cх - 0b1010000. Про то, что у этой памяти страничная организация памяти знаю, но ничего не мешает обращаться к каждому байту индивидуально:
AT24C128/256, 128K/256K SERIAL EEPROM: The 128K/256K is internally organized as256/512 pages of 64-bytes each. Random word addressing requires a 14/15-bit data wordaddress.
Я пока оставил попытки запрограммировать данную м/cх программатором, а пытаюсь получить от нее бит подтверждения при посылке ей её адреса. Но в ответ память предательски молчит. Может быть я что то напутал в программе? Если память формирует бит подтверждения вывод PORTB.0=1. Дальше я читаю содержимое ячейки по адресу 0х0000, где по идеи должно находится число 0хFF. Но программа доходит до ожидания бита подтверждения и зависает...
Код: Выделить всё
#include <16f877.h>
#use delay(clock=16000000)
#fuses HS,NOWDT
int8 data=0x00;
//Переменная для данных
int8 adr_byte1=0;
//Младший байт внутреннего регистра памяти
int8 adr_byte2=0;
//Старший байт внутреннего регистра памяти
int8 adr_write=0b10100000;
//Адрес м/cх с запросом на запись
int8 adr_read=0b10100001;
//Адрес м/cх с запросом на чтение
void init_ports()
//Настройка портов
{
TRISA=0b00000000;
PORTA=0b00000000;
PORTB=0b00000000;
TRISB=0b00000000;
TRISC3=1;
TRISC4=1;
PORTC3=1;
PORTC4=1;
//Выводы модуля MSSP настроены на вход
}
void int_on()
//Настройка прерываний
{
GIE=1;
//Глобальное разрешение прерываний
PEIE=1;
//Разрешение прерываний от периферийных устройств
}
void init_i2c()
{
SSPSTAT=0b00000000;
SSPCON2=0b00000000;
SSPADD=0x09;
//400 кГц
SSPCON=0b00101000;
//SSPEN=1;
//Включить модуль MSSP
//SSPM3=1;
//SSPM2=0;
//SSPM1=0;
//SSPM0=0;
//Ведущий режим
}
void start_i2c()
{
SEN=1;
//Сформировать старт
while (!SSPIF)
//Ждать пока не сформирутся старт (флаг прерывания от модуля MSSP)
{
}
SSPIF=0;
//Сброс флага прерывания от модуля MSSP
}
void send_i2c(int8 data)
{
SSPBUF=data;
//Запись в буфер
while (!SSPIF)
//Ожидание окончания передачи (флаг прерывания от модуля MSSP)
{
}
SSPIF=0;
//Сброс флага прерывания от модуля MSSP
while (ACKSTAT)
//Ожидание бита подтверждения от приемника
{
}
PORTB=0b00000001;
}
void stop_i2c()
{
PEN=1;
//Сформировать бит стоп
while (!SSPIF)
//Ждать пока бит стоп не сформируется ((флаг прерывания от модуля MSSP))
{
}
SSPIF=0;
//Сброс флага прерывания от модуля MSSP
}
void restart_i2c()
{
RSEN=1;
//Сформировать бит повторный старт
while (!SSPIF)
//Ждать пока повторный бит старта не сформируется (прерывание от модуля MSSP)
{
}
SSPIF=0;
//Сброс флага прерывания от модуля MSSP
}
int8 receive_i2c()
{
int8 receive_data=0b00000000;
RCEN=1;
//Разрешить прием от приемника
while (!SSPIF)
//Ждать пока приемник передаст байт (прерывание от модуля MSSP)
{
}
SSPIF=0;
//Сброс флага прерывания от модуля MSSP
receive_data=SSPBUF;
//Записать полученный байт
ACKDT=1;
ACKEN=1;
//Сформировать бит подтверждения ACKDT
while (!SSPIF)
//Ждать пока подтвержение не сформируется
{
}
SSPIF=0;
return (receive_data);
}
void main (void)
{
init_ports();
//Настройка портов
int_on();
//Настройка прерываний
init_i2c();
//Инициализация i2c
start_i2c();
//Старт
send_i2c(adr_write);
//Отправка памяти ее адреса с запросом на запись
send_i2c(adr_byte2);
//Отправка старшего регистра внутренней памяти
send_i2c(adr_byte1);
//Отправка младшего регистра внутренней памяти
restart_i2c();
//Рестарт
send_i2c(adr_read);
//Отправка памяти ее адреса с запросом на чтение
data=receive_i2c();
//Прием байта от памяти
stop_i2c();
//Стоп
PORTB=data;
}
Re: Запись в 24c256
Добавлено: Вт авг 19, 2014 21:21:12
Hispanus
Все дело было в самом чипе памяти. Купил другой (микрочиповский) и все заработало. Всем спасибо за помощь.
Re: Запись в 24c256
Добавлено: Ср авг 20, 2014 01:18:22
nirq
И чем конкретно отличаются чипы?
Магия. Лотерея. Несерьёзно.
viewtopic.php?p=2077632#p2077632"State machine" на всякий случай.
Или это слово ещё неизвестно в принципе, или просто не было настроения над ним задуматься. Потому что пока не нужно было задумываться.
Если нет логического анализатора известной китайской фирмы - никто не мешает отлаживаться даже светодиодами, тоже на всякий случай.
Ну день потратишь, ну два дня... ну изрисуешь карандашиком четыре листа бумаги или даже двенадцать листов... зато будешь понимать собственное изделие, а не угадывать... а так уже сколько дней потратил на "эксперименты" и с каким результатом?
Общение - смысл.
icprog... WinPic... в протеусе...
Это как чинить один неисправный осциллограф с помощью другого неисправного осциллографа (но если верить калькулятору, то оба осциллографа уже и так исправны).
Re: Запись в 24c256
Добавлено: Ср авг 20, 2014 20:56:41
wangine
Проблема с воспоминаниями, в основном, подтянуть. На практике scema резисторов на ПДД, SCL соответственно 2K2, 4k7, 10k, в зависимости от каждого производителя отсутствует в вашей схеме. многие компании также используют разные времена написания и определенную задержку между датой и часами. Для каждого должны найти библиотеки были найдены согласиться с этим IC.например, библиотеки для 24C08 / 24C16 / 24C64 24C32 идентичны, но даже если его предшественник 24C16 имеет отдельная библиотека немного поздно, чтобы начать с 2uS и остальным 4US. Это различие делает невозможным для записи все лучшее