Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.05.2011, 15:32
|
|
Прописка
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 48
Сказали Спасибо 38 раз(а) в 32 сообщении(ях)
|
Копировщик ЕЕПРОМ
Делаю программатор для картриджей для 24с04, написал на микросях (ПИК), есть пара вопросиков
1 вопрос - при отключении I2C дебаггера перестает шиться читаться ЕЕПРОМ
2 вопрос - при записи в пустые кавычки, там где case, текста для вывода на ЛСД перестает работать еепром,
Проверял в протеусе.
Вот проэктик
Последний раз редактировалось russo_turisto; 28.05.2011 в 07:14.
|
|
|
|
28.05.2011, 08:21
|
|
Прописка
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 48
Сказали Спасибо 38 раз(а) в 32 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
____________________
Код:
|
char uart_rd;
unsigned short BUFfrom[64];
//char txt1[] = "";
unsigned short ByteRS; //âõîäíîé áàéò äëÿ ïðèåìà ñ com-ïîðòà
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections
//----------------------------Ôóíêöèè-------------------------------------------
void ReadEEPROM(char adr_h, char adr_l) //×ÒÅÍÈÅ ÄÀÍÍÛÕ ÈÇ 24Ñ512 0-256 áàéò
{
unsigned short k;
for (k=0; k‹64; k++)
{
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(adr_h); // âûáîð íóëåâîãî áàíêà
I2C1_Wr(k + adr_l); // send byte (data address)
I2C1_Repeated_Start(); // issue I2C signal repeated start
I2C1_Wr(0xA3); // send byte (device address + R)
BUFfrom[k] = I2C1_Rd(0u); //
I2C1_Stop(); // issue I2C stop signal
}
ByteRS=0; //Î÷èñòêà áàéòà
}
void WriteEEPROM_0_bank(char adr) //ÇÀÏÈÑÜ ÄÀÍÍÛÕ Â 24Ñ04 0-256 áàéò
{
unsigned short k;
for (k=0; k‹64; k++)
{
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA0); // send byte via I2C (device address + 0_áàíê + W)
I2C1_Wr(k + adr); // send byte (address of EEPROM location)
I2C1_Wr(BUFfrom[k]); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
Delay_ms(1);
} // issue I2C stop signal
ByteRS=0;
}
void WriteEEPROM_1_bank(char adr) //ÇÀÏÈÑÜ ÄÀÍÍÛÕ Â 24Ñ04 257-512 áàéò
{
unsigned short k;
for (k=0; k‹64; k++)
{
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + 1_áàíê + W)
I2C1_Wr(k + adr); // send byte (address of EEPROM location)
I2C1_Wr(BUFfrom[k]); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
Delay_ms(1);
} // issue I2C stop signal
ByteRS=0;
}
void CopyEEPROM(char adr_h, char adr_l, char txt1[16]) // êîïèðîàíèå ååïðîì èç 24ñ512 â 24ñ04 512áàéò èíôû
{
unsigned short j;
ReadEEPROM(adr_h, adr_l); //0-64 ïåðâûé áàíê ïàìÿòè 24c04
WriteEEPROM_0_bank(0x00);
ReadEEPROM(adr_h, adr_l + 64); //65-128
WriteEEPROM_0_bank(64);
ReadEEPROM(adr_h, adr_l + 128); //129-192
WriteEEPROM_0_bank(128);
ReadEEPROM(adr_h, adr_l + 192); //193-256
WriteEEPROM_0_bank(192);
ReadEEPROM(adr_h + 1, adr_l); // âòîðîé áàíê ïàìÿòè 24c04
WriteEEPROM_1_bank(0x00);
ReadEEPROM(adr_h + 1, adr_l + 64);
WriteEEPROM_1_bank(64);
ReadEEPROM(adr_h + 1, adr_l + 128);
WriteEEPROM_1_bank(128);
ReadEEPROM(adr_h + 1, adr_l + 192);
WriteEEPROM_1_bank(192);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,4,txt1);
Lcd_Out(2,2,"PROGRAMMED OK");
}
void FormatEEPROM(void) // Ïîëíîå ñòèðàíèå 24ñ04
{
unsigned int i;
for (i=0; i‹=255; i++)
{
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA0); // send byte via I2C (device address + 0_bank + W)
I2C1_Wr(i); // send byte (address of EEPROM location)
I2C1_Wr(0xFF); // çàòèðàíèå âñåõ ÿ÷ååê ÅÅÏÐÎÌ
I2C1_Stop(); // issue I2C stop signal
Delay_ms(1);
}
for (i=0; i‹=255; i++)
{
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + 1_bank + W)
I2C1_Wr(i); // send byte (address of EEPROM location)
I2C1_Wr(0xFF); // çàòèðàíèå âñåõ ÿ÷ååê ÅÅÏÐÎÌ 0õ00
I2C1_Stop(); // issue I2C stop signal
Delay_ms(1);
} // issue I2C stop signal
ByteRS=0;
UART1_Write_Text("FORMAT EEPROM OK");
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1,1,"FORMAT EEPROM OK"); // Write text in first row
}
//----------------------------Ïðåðûâàíèÿ----------------------------------------
void interrupt() {
unsigned short k;
if (PIR1.F5) {
ByteRS=RCREG;
PIR1.F5 = 0;
}
}//~
//---------------------------Ãëàâíàÿ ôóíêöèÿ------------------------------------
void main()
{
unsigned short i; //áàéò äëÿ ñ÷åò÷êè öèêëà, äëÿ áóôåðíîãî ìàññèâà áàéò
TRISB=0b00000011; //0 è 1 ïèí ïîðòÀ íà âõîä, îñòàëüíîå íà âûõîä
OPTION_REG.F7 = 0; //ïîäêëþ÷åíèå ïîäòÿãèâàþùèõ ðåçèñòîðîâ íà ïîðòÂ
//PORTB.B1=1;
TRISC=0b11111111; //
INTCON.F6 = 1; //ðàçðåøåíèå ïðåðûâàíèé îò ïåðèôåðèéíûõ ìîäóëåé
OPTION_REG.F6 = 1; //ïðåðûâàíèå ïî ïåðåäíåìó ôðîíòó ñèãíàëà íà INT
INTCON.F4 = 0; //çàïðåùåíèå âíåøíåãî ïðåðûâàíèÿ íà INT __________________
PIE1.F5 = 1; //ðàçðåøåíèå ïðåðûâàíèÿ îò ïðèåìíèêà USART
INTCON.F7 = 1; //ðàçðåøåíèå âñåõ ïðåðûâàíèé
UART1_Init(9600); //Èíèöèàëèçàöèÿ UART module íà 9600 bps
Delay_ms(100); //Îæèäàèå ïîêà UART module ñòàáèëèçèðóåòñÿ
UART1_Write_Text("Start\n"); //Èíäèêàöèÿ ðàáîòû Usart
ADCON1 = 0x06; //âûâîäû PORTA öèôðîâûå
I2C1_Init(100000); // initialize I2C communication
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,"RUSSO_TURISTO"); // Write text in first row
Lcd_Out(2,4,"COPY EEPROM"); // Write text in second row
Delay_ms(2000);
while (1)
{
switch (ByteRS)
{
case '1': CopyEEPROM(0x00,0x00,""); break; //
case '2': CopyEEPROM(0x02,0x00,""); break; //
case '3': CopyEEPROM(0x04,0x00,""); break; //
case '4': CopyEEPROM(0x06,0x00,""); break; //
case '5': CopyEEPROM(0x08,0x00,""); break; //
case '6': CopyEEPROM(0x0A,0x00,""); break; //
case '7': CopyEEPROM(0x0C,0x00,""); break; //
case '8': CopyEEPROM(0x0E,0x00,""); break; //
case '9': CopyEEPROM(0x10,0x00,""); break; //
case 'A': CopyEEPROM(0x12,0x00,""); break; //
case 'B': CopyEEPROM(0x14,0x00,""); break; //
case 'F': FormatEEPROM(); break; //ñòèðàíèå ååïðîì
default : break; //îáðàáîòêà äðóãèé êîìàíä
}
} //êîíåö îñíîâíîãî áåñêîíå÷íîãî öèêëà
} |
|
|
|
|
29.05.2011, 08:30
|
|
Частый гость
Регистрация: 01.06.2010
Сообщений: 34
Сказал спасибо: 1
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
Подтяжки по 4.7К с обеих линий на +5V не забыл?
|
|
|
|
29.05.2011, 21:37
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
Сообщение от russo_turisto
|
unsigned short ByteRS;
|
Попробуйте добавить volatile
Код:
|
volatile unsigned short ByteRS; |
В протеусе тип резисторов замените на Digital.
|
|
|
|
30.05.2011, 11:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 16.02.2010
Сообщений: 1,409
Сказал спасибо: 0
Сказали Спасибо 128 раз(а) в 114 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
А зачем мучиться, есть же готовые устройства!
Поищите в Гугле READER 24xx - это автономный копировщик.
Или просто возмите PonyProg.
|
|
|
|
30.05.2011, 13:13
|
|
Прописка
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 48
Сказали Спасибо 38 раз(а) в 32 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
Сообщение от petr5555
|
А зачем мучиться, есть же готовые устройства!
Поищите в Гугле READER 24xx - это автономный копировщик.
Или просто возмите PonyProg.
|
C I2C хочу разобраться,
с выводом на ЛСД вроде сделал, с переменными намудрил,
Вопрос по подпрограмме чтения и записи ЕЕПРОМа, у меня для чтения и записи каждого байта выполняется инициализация, старт передача адреса, стоп и повторяется для следующего байта, очень долготекущий процесс.
Как оптимизировать код, ведь по даташиту процедура чтения-записи намного проще, где намудрил?
Код:
|
void ReadEEPROM(char adr_h, char adr_l) //×ÒÅÍÈÅ ÄÀÍÍÛÕ ÈÇ 24Ñ512 0-256 áàéò
{
unsigned short k;
for (k=0; k‹64; k++)
{
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(adr_h); // âûáîð íóëåâîãî áàíêà
I2C1_Wr(k + adr_l); // send byte (data address)
I2C1_Repeated_Start(); // issue I2C signal repeated start
I2C1_Wr(0xA3); // send byte (device address + R)
BUFfrom[k] = I2C1_Rd(0u); //
I2C1_Stop(); // issue I2C stop signal
}
ByteRS=0; //Î÷èñòêà áàéòà
}
void WriteEEPROM_0_bank(char adr) //ÇÀÏÈÑÜ ÄÀÍÍÛÕ Â 24Ñ04 0-256 áàéò
{
unsigned short k;
for (k=0; k‹64; k++)
{
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA0); // send byte via I2C (device address + 0_áàíê + W)
I2C1_Wr(k + adr); // send byte (address of EEPROM location)
I2C1_Wr(BUFfrom[k]); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
Delay_ms(1);
} // issue I2C stop signal
ByteRS=0;
} |
|
|
|
|
30.05.2011, 15:25
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
Сообщение от russo_turisto
|
Вопрос по подпрограмме чтения и записи ЕЕПРОМа, у меня для чтения и записи каждого байта выполняется инициализация, старт передача адреса, стоп и повторяется для следующего байта, очень долготекущий процесс.
|
Можно писать в SEEPROM по страницам.Насколько я помню размер страницы для 24c04 равен 16 байт. Для записи: старт условие,адрес устройства с режимом write,субадрес,16 байт данных,стоп_условие,задержка 10mS на запись. Нюанс: адрес записываемых данных должен совпадать с началом страницы,иначе запишутся только данные до конца текущей страницы.
Для чтения: старт,адрес устройства с режимом write,субадрес,старт,адрес устройства с режимом read,сколько хочеш данных(не забывай про ACK),последний байт безACK(хотя на это можно и забить),стоп
Последний раз редактировалось heady69; 30.05.2011 в 15:37.
|
|
|
Сказали "Спасибо" heady69
|
|
|
30.05.2011, 17:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 16.02.2010
Сообщений: 1,409
Сказал спасибо: 0
Сказали Спасибо 128 раз(а) в 114 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
Дело в том, что запись в 24Схх - это действительно долгий процесс.
Пишется память побайтно с задержкой 10 миллисек.
При чтении отсутствует обязательная задержка и оно происходит намного
быстрее.
|
|
|
|
31.05.2011, 09:44
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
Сообщение от petr5555
|
Пишется память побайтно с задержкой 10 миллисек
|
Читайте даташит. Для 24с32-64 (которыми в основном я пользуюсь) размер страницы 32 байта. Т.е. на запись 32-х байт одна задержка на 10mS. С.м. Page Write Mode.
Последний раз редактировалось heady69; 31.05.2011 в 09:50.
|
|
|
|
31.05.2011, 16:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 16.02.2010
Сообщений: 1,409
Сказал спасибо: 0
Сказали Спасибо 128 раз(а) в 114 сообщении(ях)
|
Re: Копировщик ЕЕПРОМ
Сообщение от heady69
|
Читайте даташит. Для 24с32-64 (которыми в основном я пользуюсь) размер страницы 32 байта. Т.е. на запись 32-х байт одна задержка на 10mS. С.м. Page Write Mode.
|
Человек спрашивал про память 24С04.
А у памяти 24С32-64 задержка кстати 5 mS.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:53.
|
|