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

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

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

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

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

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

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

 
Опции темы

Работа с еепром 24Схх Помогите разобраться

Непрочитано 07.09.2011, 13:25  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Работа с еепром 24Схх Помогите разобраться

Добрый день уважаемые. Возникла такая проблема. Написал код. Вроди все работает в симуляторе при условии что пишу в еепром до 10байт
если пишу более 10байт то данные считываются не корректно... в чем это проблема? симулятор тупит? выкладываю полный проект.
сейчас сделал так: набираю значение пароля (якобы) копирую в переменную и отправляю в 24Схх а потом считываю и смотрю на индикаторе...


вот так я читаю и записываю в микросхему
Код:
/**************************************************  *************************************
+ ×èòàåì ÿ÷åéêó èç 24ñ02.
+  ïàðàìåòðàõ óêàçûâàåòñÿ àäðåñ ÷èòàåìîé ÿ÷åéêè.
+ Ôóíêöèÿ âîçâðàùàåò ïðî÷èòàíîå èç ÿ÷åéêè.
**************************************************  **************************************/
unsigned char eep_read(unsigned char address) {
unsigned char data;                    //ïåðåìåííàÿ äëÿ ïðî÷èòàíûõ äàííûõ
i2c_start();                           //ïîñûëàåì êîìàíäó "ñòàðò" â øèíó i2c
i2c_write(EEPROM_BUS_ADDRESS);         //ïîñûëàåì â øèíó àäðåñ óñòðîéñòâà
i2c_write(address);                    //ïîñûëàåì â øèíó àäðåñ ÷èòàåìîé ÿ÷åéêè
i2c_start();                           //ñíîâà ïîñûëàåì "ñòàðò" â øèíó
i2c_write(EEPROM_BUS_ADDRESS | 1);     //íåçíàþ çà÷åì íî áåç ýòîãî íå ðàáîòàåò
data=i2c_read(0);                      //ïðèíèìàåì äàííûå ñ ëèíè è ñîõðàíÿåì â ïåðåìåííóþ
i2c_stop();                            //ïîñûëàåì êîìàíäó "ñòîï"
return data;                           //âîçâðîùàåì çíà÷åíèå ïðî÷èòàíîãî
} 

/**************************************************  *************************************
+ Çàïèñü äàííûõ â ÿ÷åéêó 24ñ02.
+  ïàðàìåòðàõ óêàçûâàåòñÿ àäðåñ çàïèñûâàåìîé ÿ÷åéêè (adress).
+ Òàêæå óêàçóåì â ïàðàìåòðàõ äàííûå êîòîðûå íàäî çàïèñàòü â ÿ÷åéêó.
**************************************************  **************************************/
void eep_write(unsigned char address, unsigned char data) {   
i2c_start();                           //ïîñûëàåì êîìàíäó "ñòàðò" â øèíó i2c
i2c_write(EEPROM_BUS_ADDRESS);         //ïîñûëàåì â øèíó àäðåñ óñòðîéñòâà
i2c_write(address);                    //ïîñûëàåì â øèíó àäðåñ çàïèñûâàåìîé ÿ÷åéêè
i2c_write(data);                       //ïîñûëàåì äàííûå äëÿ çàïèñè
i2c_stop();                            //ïîñûëàåì êîìàíäó "ñòîï"
} 

void epp_save() { //Ñîõðàíåíèå äàííûõ â ååïðîì 



   
   
   
    eep_write(0x01,temp1); // Çàïèñü äàííûõ òåìï â Ååïðîì
    eep_write(0x02,temp2);
    eep_write(0x03,temp3); 
    eep_write(0x04,temp4);
    eep_write(0x05,temp5);
    eep_write(0x06,temp6);
   
    
    eep_write(0x07,term_set_LR); 
    eep_write(0x08,term_set_P); 
    eep_write(0x09,delta_LR);
    eep_write(0x0A,delta_P);
    eep_write(0x0B,term_max_LR); 
    eep_write(0x0C,term_max_P);
    eep_write(0x0D,term_max_delta_LR);
    eep_write(0x0E,term_max_delta_P);
    
    eep_write(0x0F,error_calendar_current0);
    
    eep_write(0x10,EPP_SING);// ñèãíàòóðà ñîîòâåòñòâèÿ Ååïðîì
    
    eep_write(0x11,error_calendar_current1);
    
    eep_write(0x12,error_calendar_volt_out0);
    eep_write(0x13,error_calendar_volt_out1);
    
    eep_write(0x14,error_calendar_volt_in0);
    eep_write(0x15,error_calendar_volt_in1);
    
    eep_write(0x16,error_calendar_temperature_left0);
    eep_write(0x17,error_calendar_temperature_left1);
    
    eep_write(0x18,error_calendar_temperature_right0); 
    eep_write(0x19,error_calendar_temperature_right1);
    
    eep_write(0x1A,error_calendar_temperature_P0);
    eep_write(0x1B,error_calendar_temperature_P1);
    
    eep_write(0x1C,error_temperature_sensor0);
    eep_write(0x1D,error_temperature_sensor1);
    
    eep_write(0x1E,control_pass0);
    eep_write(0x1F,control_pass1);
    eep_write(0x20,control_pass2);
    eep_write(0x21,control_pass3);
    //eep_write(0x22,control_pass0);
    //eep_write(0x23,control_pass3);
   
} 

void epp_load() { //Çàãðóçêà äàííûõ ñ ååïðîì
        
     

    if (eep_read(0x10)==EPP_SING) { //Åñëè ñèãíàòóðà ïðÿâåëüíàÿá ÷èòàåì äàííûå ñ ååïðîì 
        temp1=eep_read(0x01); // çàãðóçêà èç ååïðîì ïðè âûõîäå èç ìåíþ
        temp2=eep_read(0x02);
        temp3=eep_read(0x03);
        temp4=eep_read(0x04); // óïðàâëåíèå ðåæèìàìè
        temp5=eep_read(0x05);
        temp6=eep_read(0x06);
        
        term_set_LR=eep_read(0x07); // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        term_set_P=eep_read(0x08);  // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        delta_LR=eep_read(0x09);    // ÷èòàåì äåëüòó
        delta_P=eep_read(0x0A);     // ÷èòàåì äåëüòó
        term_max_LR=eep_read(0x0B); // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        term_max_P=eep_read(0x0C);  // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        term_max_delta_LR=eep_read(0x0D);  // ÷èòàåì äåëüòó
        term_max_delta_P=eep_read(0x0E);   // ÷èòàåì äåëüòó  
        
        
        error_calendar_current0 = eep_read(0x0F); // ÷èòàåì êîëè÷åñòâî îøèáîê ïî òîêó â ïåðâîì áàéòå
        error_calendar_current1 = eep_read(0x11); // ÷èòàåì êîëè÷åñòâî îøèáîê ïî òîêó âî âòîðîì áàéòå
        
        error_calendar_volt_out0 = eep_read(0x12); // ÷èòàåì êîëè÷åñòâî îøèáîê ïî âûõîäíîìó íàïðÿæåíèþ â ïåðâîì áàéòå
        error_calendar_volt_out1 = eep_read(0x13); // ÷èòàåì êîëè÷åñòâî îøèáîê ïî âûõîäíîìó íàïðÿæåíèþ âî âòîðîì áàéòå
        
        error_calendar_volt_in0 = eep_read(0x14);  // ÷èòàåì êîëè÷åñòâî îøèáîê ïî íàïðÿæåíèþ íà âõîäå â ïåðâîì áàéòå
        error_calendar_volt_in1 = eep_read(0x15);  // ÷èòàåì êîëè÷åñòâî îøèáîê ïî íàïðÿæåíèþ íà âõîäå âî âòîðîì áàéòå
        
        
        
        error_calendar_temperature_left0 = eep_read(0x16);
        error_calendar_temperature_left1 = eep_read(0x17);
        
        error_calendar_temperature_right0 = eep_read(0x18);
        error_calendar_temperature_right1 = eep_read(0x19);
        
        error_calendar_temperature_P0 = eep_read(0x1A);
        error_calendar_temperature_P1 = eep_read(0x1B); 
        
        error_temperature_sensor0 = eep_read(0x1C); 
        error_temperature_sensor1 = eep_read(0x1D);
        
        control_pass0 = eep_read(0x1E);
        control_pass1 = eep_read(0x1F);
        control_pass2 = eep_read(0x20);
        control_pass3 = eep_read(0x21); 
        //control_pass0 = eep_read(0x22);
        //control_pass3 = eep_read(0x23);

   }else{
        temp1=1; // åñëè ñèãíàòóðà áèòàÿ 
        temp2=1; // ãðóçèì åäèíèöè.
        temp3=1;
        temp4=1;
        temp5=1;
        temp6=1;
       
        term_set_LR=0; // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        term_set_P=0;  // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        delta_LR=0;    // ÷èòàåì äåëüòó
        delta_P=0;     // ÷èòàåì äåëüòó
        term_max_LR=0; // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        term_max_P=0;  // ÷èòàåì óñòàíîâëåííóþ òåìïåðàòóðó
        term_max_delta_LR=0;  // ÷èòàåì äåëüòó
        term_max_delta_P=0;   // ÷èòàåì äåëüòó  
        
        
        error_calendar_current0=0; // ÷èòàåì êîëè÷åñòâî îøèáîê ïî òîêó â ïåðâîì áàéòå
        error_calendar_current1=0; // ÷èòàåì êîëè÷åñòâî îøèáîê ïî òîêó âî âòîðîì áàéòå
        
        error_calendar_volt_out0=0; // ÷èòàåì êîëè÷åñòâî îøèáîê ïî âûõîäíîìó íàïðÿæåíèþ â ïåðâîì áàéòå
        error_calendar_volt_out1=0; // ÷èòàåì êîëè÷åñòâî îøèáîê ïî âûõîäíîìó íàïðÿæåíèþ âî âòîðîì áàéòå
        
        error_calendar_volt_in0=0;  // ÷èòàåì êîëè÷åñòâî îøèáîê ïî íàïðÿæåíèþ íà âõîäå â ïåðâîì áàéòå
        error_calendar_volt_in1=0;  // ÷èòàåì êîëè÷åñòâî îøèáîê ïî íàïðÿæåíèþ íà âõîäå âî âòîðîì áàéòå
        
        
        
        error_calendar_temperature_left0=0;
        error_calendar_temperature_left1=0;
        
        error_calendar_temperature_right0=0;
        error_calendar_temperature_right1=0;
        
        error_calendar_temperature_P0=0;
        error_calendar_temperature_P1=0; 
        
        error_temperature_sensor0=0;
        error_temperature_sensor1=0;
        
        control_pass0=0;
        control_pass1=0;
        control_pass2=0;
        control_pass3=0;
        
    }  
}
вот так отправляю данные и потом смотрю

Код:
void pass()
{

 switch(a)
 {
  case 0:
        if (BTN_PLUS==0 && flags_button==0){ pass3++; flags_button=1; timer_pass=0; }
        
        if (BTN_MINUS==0 && flags_button==0){ pass3--; flags_button=1; timer_pass=0; }
        if (BTN_MENU==0 && flags_button==0) { a=1; flags_button=1; timer_pass=0; }
        if (BTN_MENU & BTN_PLUS & BTN_MINUS) flags_button=0;
        
        if (pass3 › 9 && pass3 ‹ 20) pass3 = 0;
        if (pass3 › 250) pass3 = 9;
        
        if (timer_pass ‹ 10)
         {
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[pass3]; 
          led_buff[3]=led_table[11]; //13  
          led_buff[4]=led_table[11];
          led_buff[5]=led_table[11];
         
         } else {
         
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[10]; 
          led_buff[3]=led_table[11]; //13  
          led_buff[4]=led_table[11];
          led_buff[5]=led_table[11];
         
         }
         
         if (++timer_pass › 20)
         {
          timer_pass=0;
         }
  break;
  case 1:
        if (BTN_PLUS==0 && flags_button==0) { pass2++; flags_button=1; timer_pass=0;}
        if (BTN_MINUS==0 && flags_button==0){ pass2--; flags_button=1; timer_pass=0; }
        if (BTN_MENU==0 && flags_button==0){ a=2; flags_button=1; timer_pass=0;}
        if (BTN_MENU & BTN_PLUS & BTN_MINUS) flags_button=0;
        
        if (pass2 › 9 && pass2 ‹ 20) pass2 = 0;
        if (pass2 › 250) pass2 = 9;
        
         if (timer_pass ‹ 10)
         {
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[11]; 
          led_buff[3]=led_table[pass2]; //13  
          led_buff[4]=led_table[11];
          led_buff[5]=led_table[11];
         
         } else {
         
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[11]; 
          led_buff[3]=led_table[10]; //13  
          led_buff[4]=led_table[11];
          led_buff[5]=led_table[11];
         
         }
         
         if (++timer_pass › 20)
         {
          timer_pass=0;
         }
  break;
  case 2:
        if (BTN_PLUS==0 && flags_button==0) { pass1++; flags_button=1; timer_pass=0; }
        if (BTN_MINUS==0 && flags_button==0) { pass1--; flags_button=1; timer_pass=0;}
        if (BTN_MENU==0 && flags_button==0){ a=3; flags_button=1; timer_pass=0; }
        if (BTN_MENU & BTN_PLUS & BTN_MINUS) flags_button=0;
        
        if (pass1 › 9 && pass1 ‹ 20) pass1 = 0;
        if (pass1 › 250) pass1 = 9;
        
         if (timer_pass ‹ 10)
         {
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[11]; 
          led_buff[3]=led_table[11]; //13  
          led_buff[4]=led_table[pass1];
          led_buff[5]=led_table[11];
         
         } else {
         
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[11]; 
          led_buff[3]=led_table[11]; //13  
          led_buff[4]=led_table[10];
          led_buff[5]=led_table[11];
         
         }
         
         if (++timer_pass › 20)
         {
          timer_pass=0;
         }
  break;
  case 3:
        if (BTN_PLUS==0 && flags_button==0){ pass0++; flags_button=1; timer_pass=0;}
        if (BTN_MINUS==0 && flags_button==0){ pass0--; flags_button=1; timer_pass=0;}
        if (BTN_MENU==0 && flags_button==0){ a=0; flags_button=1; timer_pass=0; }
        if (BTN_MENU & BTN_PLUS & BTN_MINUS) flags_button=0;
        
        if (pass0 › 9 && pass0 ‹ 20) pass0 = 0;
        if (pass0 › 250) pass0 = 9;
        
         if (timer_pass ‹ 10)
         {
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[11]; 
          led_buff[3]=led_table[11]; //13  
          led_buff[4]=led_table[11];
          led_buff[5]=led_table[pass0];
         
         } else {
         
          led_buff[0]=led_table[19]; //13   
          led_buff[1]=led_table[13];
          led_buff[2]=led_table[11]; 
          led_buff[3]=led_table[11]; //13  
          led_buff[4]=led_table[11];
          led_buff[5]=led_table[10];
         
         }
         
         if (++timer_pass › 20)
         {
          timer_pass=0;
         }
  break;
  case 4:
       
          led_buff[5]=led_table[control_pass0]; //13   
          led_buff[4]=led_table[control_pass1];
          led_buff[3]=led_table[control_pass2]; 
          led_buff[2]=led_table[control_pass3]; //13  
          led_buff[1]=led_table[10];
          led_buff[0]=led_table[10];
  
     while(b)
     {  
       epp_load();
       b--;
     }
  
  break;
 } 
 
 
  if (BTN_PLUS==0 && BTN_MINUS==0)
 {
  control_pass0 = pass0;
  control_pass1 = pass1;
  control_pass2 = pass2;
  control_pass3 = pass3;
  timer_eep=100;
  a=4;
  b=1;
  flags_button=1;
  }
  
  if (BTN_PLUS & BTN_MINUS & BTN_MENU)
  {
   flags_button=0;
  }
  
  if (BTN_PLUS==0 & a==4 & flags_button==0)
  {
   flags_button=1;
   a=0;
  }
  
          
 
 
}
Вложения:
Тип файла: rar Atmega128 AMPL самая свежая версия_.rar (414.6 Кб, 47 просмотров)
Реклама:

Последний раз редактировалось artyomugr; 07.09.2011 в 13:54.
artyomugr вне форума  
Непрочитано 07.09.2011, 13:47  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Какая именно 24с? В младшие за раз пишется только 8 байт, читается неограниченно вся память по кольцу
niXto вне форума  
Непрочитано 07.09.2011, 13:51  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

пробую 24с02,24с01,24с04 все так себя ведут.
Так я помоему пишу по байтово, должно по идее работать...
artyomugr вне форума  
Непрочитано 07.09.2011, 14:05  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Сообщение от artyomugr Посмотреть сообщение
пробую 24с02,24с01,24с04 все так себя ведут.
Так я помоему пишу по байтово, должно по идее работать...
После записи страницы (для 24с02== 8 байт 24с04\08 ==16 байт) сделай задержку на запись ~10mS.Если побайтово-лучше после каждого байта.В твоей программе лучше использовать постраничную запись т.к. пишеш много за один раз. Установи EEPROM_BUS_ADDRESS, адрес начала записи,потом просто отпрать от ‹=8 или ‹=16 (в зависимости от типа микросхемы)данных,потом stop- микросхема начнет запись(~10mS).
При постраничной записи лучше выравнивать адрес записываемых данных с началом страницы.

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

Не все схемы пишутся постранично.
Если писать побайтно, то обязательно
надо после записи байта делать задержку 10 mS.
petr5555 вне форума  
Непрочитано 07.09.2011, 17:45  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Можно и не делать, микросхема просто не будет отзываться (9й бит) пока не запишется
niXto вне форума  
Непрочитано 08.09.2011, 12:06  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Вчера весь вечер сидел над кодом.... перепробовал все. Не корректно сохраняются данные в еепром, или не правильно читаются, и при каждой новой симуляции данные которые не верные меняются. Например сначала не сохранялся первый байт и третий , потом второй и третий и т.д.... я в шоке. Где мне можно подробно на русском почитать о еепром 24сХХ ? либо простой пример чтения записи в микросхему большого обьема данных.
С ув. Артем
artyomugr вне форума  
Непрочитано 08.09.2011, 12:55  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Код:
/*
**************************************************  *
*
*               I2C Library
* постраничная запись\чтение 24c16
**************************************************  **
*/
#include ‹INTRINS.H›
#include "I2C_LIB.H"
#include "lcd_lib.h"

bit i2c_busy, no_ack, bus_fault;

unsigned char data iic_buffer [16];

unsigned char bdata a;

sbit LSB=a ^ 0;
sbit MSB=a ^ 7;


void main(void) 
{

	unsigned char chip_adress ;	
	unsigned char page_number;

	lcd_init();

	

	chip_adress =0xA0;	
	page_number =1;

	iic_buffer[0]='S';
	iic_buffer[7]='L';
	iic_buffer[15]='A';


	write_I2C_page (chip_adress,page_number,iic_buffer);

	iic_buffer[0]=0;
	iic_buffer[7]=0;
	iic_buffer[15]=0;


	read_I2C_page (chip_adress,page_number,iic_buffer);

	lcd_putchar( iic_buffer[15] );


	while (1);	
	 }

/*
*************************************
* Delay for write SEEPROM
*************************************
*/
void WR_Delay(unsigned char j)
{
	unsigned char i;
	for(;j›0;j--)
		{
		for(i=0;i‹125;i++)
		{;}
	}
}

/*
************************************
*       Sending Stop Condition
************************************
*/

void send_stop()
{
	sda = 0;
	scl = 1;
	HOLD;
	sda = 1;
	i2c_busy = 0;
}

/*
************************************
*      I2C Start Condition
*
*     NOTE: need to use it.
************************************
*/

void master(unsigned char slave_addr)
{
	i2c_busy = 1;
	no_ack = 0;
	bus_fault = 0;
	sda =1;
	scl =1;

	if(!scl||!sda)
		bus_fault = 1;
	else
	{
		sda = 0;  //start condition
		HOLD;
		scl = 0;
		HOLD;
		send_byte(slave_addr);
	}
}

/*
************************************
*     Sending a byte on I2C Bus
************************************
*/

void send_byte(unsigned char i2c_data)
{
	unsigned char i;
	a=i2c_data;
	for(i=0;i‹8;i++)
	{
		scl=0;
		HOLD;
		sda=MSB;
		a‹‹=1;
		_nop_();
		scl=1;
		HOLD;
		scl=0;
	}
	sda = 1;
	scl = 1;
	HOLD;
	if(!sda)
		scl = 0;
	else
	{
		no_ack = 1;
	 }
		HOLD;
}

/*
**************************************************  **
*      Write page  data on I2C bus
*   записывает страницу (16 байт)  из буфера 
*	Принимает :  unsigned char slave_add-адрес микросхемы
*   			 unsigned char page_number-номер страницы
				 unsigned char* адрес буфера данных	
*   Возвращает: ничего   
*
**************************************************  ***
*/
			
void write_I2C_page(unsigned char slave_add, unsigned char page_number,unsigned char *write_buff)
{
	unsigned int sub_add;	 	//адрес данных в микросхеме
	unsigned char bytes_count;
	unsigned char i;

	sub_add =  16 * page_number;	//считаем адрес в seeprom

	i = sub_add ››8;
	i ‹‹=1;						//сдвигаем на r/w bit
	slave_add |= i;				//составляем slave_add+старший байт адреса
	master(slave_add);		   	//start
	send_byte(sub_add);			//младший

	if(no_ack)
		send_stop();
	else
	{
		for(bytes_count =0;bytes_count ‹16;bytes_count++)
		{
			send_byte(*write_buff++);
			if(no_ack)
				break;
		}
		send_stop();
		WR_Delay(20); //need for SEEPROM
	}
}

/*
*********************************************
*      Recieve a single byte from I2C Bus
*
*    Note: if you are going to recieve
*          a single byte then the passing
*          argument should be 1.
*
*********************************************
*/

unsigned char recv_byte(unsigned char cnt) {

	unsigned char i,rcv_data;
		sda =1;
		HOLD;
		for(i=0;i‹8;i++) {
			HOLD;
			scl=1;
			HOLD;
			LSB=sda;
			if(i‹7)
				a‹‹=1;
			HOLD;
			scl=0;
			HOLD;	
		}
	if(cnt==1)
		sda = 1;
	else
		sda = 0;
	scl =1;
	HOLD;
	scl = 0;
/*	sda = 1; don't work with I2C simul!! possible bug in simulation !? */
	HOLD;
	rcv_data = a;  
	return rcv_data;
}

/*
**************************************************  **
*     Read page data on I2C bus
*   читает страницу (16 байт) в буфер 
*	Принимает :  unsigned char slave_add-адрес микросхемы
*   			 unsigned char page_number-номер страницы
				 unsigned char* адрес буфера данных	
*   Возвращает: ничего   
**************************************************  ***
*/

void read_I2C_page(unsigned char slave_add, unsigned char page_number, unsigned char *read_buff)
{
	unsigned int sub_add;
	unsigned char byte_count;
	unsigned char i;
	sub_add = 16 * page_number;	 //считаем адрес в seeprom
	sda = 1;
	scl = 1;
	i = sub_add ››8;
	i ‹‹=1;						//сдвигаем на r/w bit
	slave_add |= i;				//составляем slave_add+старший байт адреса
	master(slave_add);		   	//start
	send_byte(sub_add);			//младший
	sda = 1;
	scl = 1;
	master(slave_add+1);
	if(no_ack)
	{
		send_stop();
		goto exit;
	}
	for(byte_count =0;byte_count ‹16;byte_count++)	{
		read_buff[byte_count]=recv_byte(16-byte_count);
		}
	send_stop();
	exit:;
}
heady69 вне форума  
Непрочитано 08.09.2011, 13:20  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Спасибо Вам большое за код. Но чтото я его плохо понимаю...
Я недавно начал изучать программирование, по этому пока слабенько умею читать код...
Вы не могли бы взглянуть на мой исходник, что я не так делаю... почему код не работает так как надо? Все таки хочу писать и читать по байтово мне как новичку проще понимать код
С ув. Артем
artyomugr вне форума  
Непрочитано 08.09.2011, 13:52  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
Плохо Re: Работа с еепром 24Схх Помогите разобраться

Если хотите, что-бы ошибку нашли в Вашем коде, то его и следовало-бы привести. Т.е. собственно eep_write и eep_read вместо всей этой байды с кривыми каментами в пером посте.
ForcePoint вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с микроконтроллером igor140329 Микроконтроллеры, АЦП, память и т.д 7 07.03.2011 03:27
Немецкая схемотехника. Помогите разобраться Luzkov TTL и CMOS логика 23 05.01.2011 11:13
[Решено] Помогите разобраться barbuss Proteus 2 26.10.2010 23:45
Помогите разобраться ,АЦП Тину 13, что то не так... Botan Микроконтроллеры, АЦП, память и т.д 2 14.09.2010 18:31
Помогите разобраться с транзисторами в Proteus`е EsterniTY Proteus 2 05.08.2004 00:18


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


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