Здравствуйте! Прошу Вашей помощи! Мне нужно записать в 24с256 несколько числовых значений. Для этой цели в распоряжении есть программатор, но нет файла прошивки . Написал небольшой intel hex файл вот такого содержания:
Сохранил его в bin, вставил в 24с256 в протеусе, запустил моделирование и попытался прочитать содержимое ячейки 24с256 по адресу 0х00 (там где должно храниться 45 (0х2D)). В результате чтение дало совсем другое значение, а именно 63 (0х3F). Получается протеус не понял моего корявого intel hex файла или он настолько корявый, что даже не загружается в 24с256?
P.S. МК pic 16f877, связь организуется по протоколу i2c
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.
Если Вы просто сменили расширение, то ничего и не должно получится, ибо "Intel HEX", помимо данных, содержит ещё кучу служебной информации (погуглите спецификацию), а *.bin, это - чистый бинарник, т.е. "голые" данные.
Найдите какой-нибудь простенький HEX-редактор (полно бесплатных), создайте там дамп нужного размера (по объёму чипа памяти), и, по нужному адресу, измените содержимое ячейки.
P.S.: Вариант, что у Вас неправильно I2C организован, пока не рассматриваем.
P.P.S.: И учтите, что после того, как Вы измените содержимое дампа, необходимо, в Протеусе, удалить чип памяти, а затем вставить вновь. Иначе дамп не обновится. Наверное есть какой-нибудь и другой способ.
Smen, спасибо Вам огромнейшее! Во-первых за то, что откликнулись, а во-вторых за то что Ваш совет мне очень помог. Без него я бы, наверное, не справился. В общем, открыл я hex редактор, записал туда несколько цифр, сохранил, закрыл. В результате появился файл без разрешения. Далее вставил это файл в память fm24c256 (перед этим удалив старый чип) и запустил моделирование в протеусе. На экране i2c дебаггера появилась история операций, среди которых я нашел то самое число, хранящееся в памяти fm24c256. Это число благополучно передается МК. Всё работает
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.
Оказалось не всё так благополучно...Собрал схему из реальных деталей, попытался считать содержимое ячейки по адресу 0х00 из am24с256 и ничего не получается. Память не шлет бита подтверждения (проверял программным путем). Кроме того и программироваться она тоже не хочет, появляется ошибка - нет бита подтверждения (программатор - ExtraPic, программа - icprog). В чем может быть дело? Я себе всю голову сломал.
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.
Smen, запускаю icprog в режиме совместимости с win2000, МК она программирует нормально, а вот память не хочет. Вы имеете в виду скорость i2c или скорость программирования? Скорость i2c равна 400кГц, а скорость программирования стоит с задержкой 10 (не знаю какая это скорость). Моя проверка сводится к зажигаю светодиода, если память посылает бит подтверждения и его миганию, если прочитанный байт совпадает с тем, что записал МК. Так вот светодиод не зажигается и не мигает. Блокировку снял, притянул ножку Protect Write к земле.Адрес микросхемы 1010000, его и посылаю памяти, вместе с битом направления передачи (в протеусе все моделируется нормально). Может быть что то с питанием? Или нужно емкость куда то поставить? Моя модель памяти называется am 130 24c256 pi A. Не нашел ДШ конкретно для нее, но для всей серии напряжение питание равно 1.8-5.5 В. Я питаю свою 4.7 В. На всякий случай привожу собранную схему на макетке (выводы обозначил красным цветом):
Адрес в icprog задаю по вкладке i2c числом 160 (пробовал 161). Пробовал в WinPic - такой же результат, вернее его отсутствие . Но почему память не отвечает, когда я обращаюсь к ней через МК по протоколу i2c? Ведь схема же собрана правильно? И программа тоже, если в протеусе все работает...
P.S. Или адрес памяти не 160 (0b10100000), а 80 (0b01010000)?
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.
Так Вы про эти три двоичных разряда Я Вас просто не понял. Они у меня притянуты к земле, поэтому адрес м/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;
}
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.
"State machine" на всякий случай.
Или это слово ещё неизвестно в принципе, или просто не было настроения над ним задуматься. Потому что пока не нужно было задумываться.
Если нет логического анализатора известной китайской фирмы - никто не мешает отлаживаться даже светодиодами, тоже на всякий случай.
Ну день потратишь, ну два дня... ну изрисуешь карандашиком четыре листа бумаги или даже двенадцать листов... зато будешь понимать собственное изделие, а не угадывать... а так уже сколько дней потратил на "эксперименты" и с каким результатом?
Общение - смысл.
icprog... WinPic... в протеусе...
Это как чинить один неисправный осциллограф с помощью другого неисправного осциллографа (но если верить калькулятору, то оба осциллографа уже и так исправны).
Проблема с воспоминаниями, в основном, подтянуть. На практике scema резисторов на ПДД, SCL соответственно 2K2, 4k7, 10k, в зависимости от каждого производителя отсутствует в вашей схеме. многие компании также используют разные времена написания и определенную задержку между датой и часами. Для каждого должны найти библиотеки были найдены согласиться с этим IC.например, библиотеки для 24C08 / 24C16 / 24C64 24C32 идентичны, но даже если его предшественник 24C16 имеет отдельная библиотека немного поздно, чтобы начать с 2uS и остальным 4US. Это различие делает невозможным для записи все лучшее