Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Копировщик ЕЕПРОМ

Непрочитано 27.05.2011, 15:32  
russo_turisto
Прописка
 
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 45
Сказали Спасибо 38 раз(а) в 32 сообщении(ях)
russo_turisto на пути к лучшему
По умолчанию Копировщик ЕЕПРОМ

Делаю программатор для картриджей для 24с04, написал на микросях (ПИК), есть пара вопросиков
1 вопрос - при отключении I2C дебаггера перестает шиться читаться ЕЕПРОМ
2 вопрос - при записи в пустые кавычки, там где case, текста для вывода на ЛСД перестает работать еепром,
Проверял в протеусе.

Вот проэктик
Вложения:
Тип файла: rar I2C.rar (89.2 Кб, 50 просмотров)
Реклама:

Последний раз редактировалось russo_turisto; 28.05.2011 в 07:14.
russo_turisto вне форума  
Непрочитано 28.05.2011, 08:21  
russo_turisto
Прописка
 
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 45
Сказали Спасибо 38 раз(а) в 32 сообщении(ях)
russo_turisto на пути к лучшему
По умолчанию 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;                                                        //îáðàáîòêà äðóãèé êîìàíä
     }
   }                                                                            //êîíåö îñíîâíîãî áåñêîíå÷íîãî öèêëà
}
Миниатюры:
Нажмите на изображение для увеличения
Название: Безымянный.JPG
Просмотров: 92
Размер:	69.0 Кб
ID:	22120  
russo_turisto вне форума  
Непрочитано 29.05.2011, 08:30  
DrAG0n_
Частый гость
 
Регистрация: 01.06.2010
Сообщений: 34
Сказал спасибо: 1
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
DrAG0n_ на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

Подтяжки по 4.7К с обеих линий на +5V не забыл?
DrAG0n_ вне форума  
Непрочитано 29.05.2011, 21:37  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

Сообщение от russo_turisto Посмотреть сообщение
unsigned short ByteRS;
Попробуйте добавить volatile
Код:
volatile unsigned short ByteRS;
В протеусе тип резисторов замените на Digital.
CodeNameHawk вне форума  
Непрочитано 30.05.2011, 11:54  
petr5555
Почётный гражданин KAZUS.RUN
 
Регистрация: 16.02.2010
Сообщений: 1,422
Сказал спасибо: 0
Сказали Спасибо 130 раз(а) в 116 сообщении(ях)
petr5555 на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

А зачем мучиться, есть же готовые устройства!
Поищите в Гугле READER 24xx - это автономный копировщик.
Или просто возмите PonyProg.
petr5555 вне форума  
Непрочитано 30.05.2011, 13:13  
russo_turisto
Прописка
 
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 45
Сказали Спасибо 38 раз(а) в 32 сообщении(ях)
russo_turisto на пути к лучшему
По умолчанию 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;
 }
Вложения:
Тип файла: rar I2C.rar (86.1 Кб, 37 просмотров)
russo_turisto вне форума  
Непрочитано 30.05.2011, 15:25  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

Сообщение от russo_turisto Посмотреть сообщение
Вопрос по подпрограмме чтения и записи ЕЕПРОМа, у меня для чтения и записи каждого байта выполняется инициализация, старт передача адреса, стоп и повторяется для следующего байта, очень долготекущий процесс.
Можно писать в SEEPROM по страницам.Насколько я помню размер страницы для 24c04 равен 16 байт. Для записи: старт условие,адрес устройства с режимом write,субадрес,16 байт данных,стоп_условие,задерж� �а 10mS на запись. Нюанс: адрес записываемых данных должен совпадать с началом страницы,иначе запишутся только данные до конца текущей страницы.

Для чтения: старт,адрес устройства с режимом write,субадрес,старт,адрес устройства с режимом read,сколько хочеш данных(не забывай про ACK),последний байт безACK(хотя на это можно и забить),стоп

Последний раз редактировалось heady69; 30.05.2011 в 15:37.
heady69 вне форума  
Сказали "Спасибо" heady69
russo_turisto (01.06.2011)
Непрочитано 30.05.2011, 17:55  
petr5555
Почётный гражданин KAZUS.RUN
 
Регистрация: 16.02.2010
Сообщений: 1,422
Сказал спасибо: 0
Сказали Спасибо 130 раз(а) в 116 сообщении(ях)
petr5555 на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

Дело в том, что запись в 24Схх - это действительно долгий процесс.
Пишется память побайтно с задержкой 10 миллисек.
При чтении отсутствует обязательная задержка и оно происходит намного
быстрее.
petr5555 вне форума  
Непрочитано 31.05.2011, 09:44  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

Сообщение от petr5555 Посмотреть сообщение
Пишется память побайтно с задержкой 10 миллисек
Читайте даташит. Для 24с32-64 (которыми в основном я пользуюсь) размер страницы 32 байта. Т.е. на запись 32-х байт одна задержка на 10mS. С.м. Page Write Mode.

Последний раз редактировалось heady69; 31.05.2011 в 09:50.
heady69 вне форума  
Непрочитано 31.05.2011, 16:03  
petr5555
Почётный гражданин KAZUS.RUN
 
Регистрация: 16.02.2010
Сообщений: 1,422
Сказал спасибо: 0
Сказали Спасибо 130 раз(а) в 116 сообщении(ях)
petr5555 на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

Сообщение от heady69 Посмотреть сообщение
Читайте даташит. Для 24с32-64 (которыми в основном я пользуюсь) размер страницы 32 байта. Т.е. на запись 32-х байт одна задержка на 10mS. С.м. Page Write Mode.
Человек спрашивал про память 24С04.
А у памяти 24С32-64 задержка кстати 5 mS.
petr5555 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ВИТАЯ ПАРА +220В И КАК ЗАШИТЬ ЕЕПРОМ Gladkih Микроконтроллеры, АЦП, память и т.д 26 24.12.2008 20:31
pic16f628 , I2C и ЕЕПРОМ 24С08 stepashka Микроконтроллеры, АЦП, память и т.д 13 07.03.2008 07:14
Стабилитрон на входе МК. Глюки... zelanez Микроконтроллеры, АЦП, память и т.д 60 24.01.2008 03:12
как записать массив 50 на 16 в еепром atmega128& sma-etu Микроконтроллеры, АЦП, память и т.д 0 15.02.2007 16:05


Часовой пояс GMT +4, время: 23:51.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.