 |
Форум за електроника Български форум за електроника, ремонти, схеми, документация
|
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
Panasonic Нов потребител

Регистриран на: 06 Авг 2010 Мнения: 24 Местожителство: Plovdiv
|
Пуснато на: Пет Авг 06, 2010 17:27 Заглавие: как да сменя 24хх512 с 24хх1025 ? |
|
|
Имам готово у-во с PIC18, което записва по I2C в 24хх512. Тъй като паметта е недостатъчна искам да я заменя с 24хх1024 (Атмел) или 24хх1025 (Майкрочип) . Може ли да ми помогнете да променя програмата на ПИК-а за да използвам двойно по-голямата памет ? Прилагам сорс-а на актуалния запис на ПИК-а . Ясно ми е, че трябва да променя размера от 65536 на двойно повече, но има още 2-3 стойности, които не са ми ясни и няма да пиша глупости
Тъй като не мога да кача файла ще се наложи да го публикувам тук :
#define IDr 0xa1
#define IDw 0xa0
#define record_time 5
void init_i2c(void)
{
fl(pin_c4);fl(pin_c4);
}
int1 save_page(byte pos) // write 64 bytes
{
int i;
i2c_start();
if(i2c_write(IDw)) {error(true);}
i2c_write(e_address>> ;
i2c_write(e_address);
for(i=0;i<64;i++)
{
i2c_write(data_buf[i+pos]);
}
i2c_stop();
delay_ms(record_time);
return true;
}
void write_byte(int16 address,byte data)
{
i2c_start(); // set address
if(i2c_write(IDw)) {error(true);}
i2c_write(address>> ;
i2c_write(address);
i2c_write(data);
i2c_stop();
delay_ms(record_time);
}
int1 erase_eeprom(void)
{
for(e_address=0;e_address<(65536-128);e_address=e_address+128)
{
restart_wdt();
write_byte(e_address,0);
out(".");
}
}
byte read_byte(int16 address)
{
byte data;
i2c_start(); // set address
if(i2c_write(IDw)) {error(true);}
i2c_write(address>> ;
i2c_write(address);
i2c_start();
i2c_write(IDr);
data=i2c_read(false);
i2c_stop();
return data;
}
void find_end(void)
{
for(count=0;count<65408;count=count+128)//65408 = 0x8000*2-128
{
restart_wdt();
if(read_byte(count)==0) { e_address=count;return; }
}
e_address=merror;
}
//-------------------------------------------------------------------------
void save_to_memory(void)
{
int16 i;
find_end();
if(e_address==0xffff){error(1);}
save_page(0);
e_address+=64;
save_page(64);
}
//------------------------------------------------------------------------
void upload(void)
{
byte temp;
find_end();
out("[N");
puta_16(e_address/128);
putc(']');
delay_ms(100);
i2c_start(); // set address
if(i2c_write(IDw)) {error(true);}
i2c_write(0);
i2c_write(0);
i2c_start();
if(i2c_write(IDr)) {error(true);}
show_time(); // send current time and ID
delay_ms(100);
out("[R");
for(count=0;count<e_address;count++)
{
restart_wdt();
temp=i2c_read(true);
puta(temp);
}
i2c_read(false);
i2c_stop();
out("]");
delay_ms(100);
out("[END]");
} |
|
| Върнете се в началото |
|
 |
Panasonic Нов потребител

Регистриран на: 06 Авг 2010 Мнения: 24 Местожителство: Plovdiv
|
Пуснато на: Пон Авг 09, 2010 12:37 Заглавие: |
|
|
| Тъй като ми се струва, че не ви се занимава обявявам награда - 1 кг пържоли за този, който ми помогне ! |
|
| Върнете се в началото |
|
 |
Edesign Опитен потребител

Регистриран на: 01 Сеп 2005 Мнения: 301
|
Пуснато на: Пон Авг 09, 2010 18:36 Заглавие: |
|
|
тези вградените команди на компилатора сигурно работят с 16 битови числа, а на теб ти трябват 32 битови за адресиране.
Ако няма директива, с която указваш този еепром а компилатора, то може би най-добре е да си напишеш ръчно подпорграмите за read/write _________________ www.epd.hit.bg - хоби и професионална електроника |
|
| Върнете се в началото |
|
 |
Panasonic Нов потребител

Регистриран на: 06 Авг 2010 Мнения: 24 Местожителство: Plovdiv
|
Пуснато на: Пон Авг 09, 2010 19:00 Заглавие: |
|
|
| За съжаление дори понятия като "директива" не са ми ясни, камо ли да мога да напиша команди за четене и запис. Предполагах, че ттова, което съм показал от програмата е достатъчно , за да ориентира някой знаещ и разбиращ, но явно греша. Аз не мога да пиша, хабер си нямам от С или други подобни програмни езици. Мислех си , че корекцията ще се сведе до промяна на цифри като 65536 с двойно по-големи или нещо такова, но явно съм далеч. |
|
| Върнете се в началото |
|
 |
Edesign Опитен потребител

Регистриран на: 01 Сеп 2005 Мнения: 301
|
Пуснато на: Вто Авг 10, 2010 13:41 Заглавие: |
|
|
пробвай с тези подпрограми за достъп до паметта
#define EEPROM_ADDRESS int32
#define EEPROM_SIZE 131071
void init_ext_eeprom()
{
output_float(EEPROM_SCL);
output_float(EEPROM_SDA);
}
void write_ext_eeprom(int32 address, BYTE data)
{
int8 status;
int8 controlbyte;
//
if (address>65535)controlbyte=0xa8;
else controlbyte=0xa0;
//
i2c_start();
i2c_write(controlbyte);
i2c_write(address>> ;
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(controlbyte);
while(status==1)
{
i2c_start();
status=i2c_write(controlbyte);
}
}
int8 read_ext_eeprom(int32 address) {
int8 data;
int 8 controlbyte;
//
if (address>65535)controlbyte=0xa8;
else controlbyte=0xa0;
//
i2c_start();
i2c_write(controlbyte);
i2c_write(address>> ;
i2c_write(address);
i2c_start();
i2c_write(controlbyte+1);
data=i2c_read(0);
i2c_stop();
return(data);
} _________________ www.epd.hit.bg - хоби и професионална електроника |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|