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

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

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

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

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

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

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

 
Опции темы
Непрочитано 27.05.2011, 15:32  
russo_turisto
Прописка
 
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 48
Сказали Спасибо 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
Сказал спасибо: 48
Сказали Спасибо 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
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Копировщик ЕЕПРОМ

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

А зачем мучиться, есть же готовые устройства!
Поищите в Гугле READER 24xx - это автономный копировщик.
Или просто возмите PonyProg.
petr5555 вне форума  
Непрочитано 30.05.2011, 13:13  
russo_turisto
Прописка
 
Регистрация: 16.01.2007
Адрес: Astana KZ
Сообщений: 243
Сказал спасибо: 48
Сказали Спасибо 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.RU
 
Регистрация: 16.02.2010
Сообщений: 1,409
Сказал спасибо: 0
Сказали Спасибо 128 раз(а) в 114 сообщении(ях)
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.RU
 
Регистрация: 16.02.2010
Сообщений: 1,409
Сказал спасибо: 0
Сказали Спасибо 128 раз(а) в 114 сообщении(ях)
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, время: 18:53.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot