Проблема с еепром 24С08

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Проблема с еепром 24С08

Сообщение Artos »

Добрый вечер уважаемые форумчане! Третий день бьюсь с проблемой и не могу ничего поделать :(
Изучил i2C . наверное целый месяц читал описание работы шины и смотрел кучу примеров в интернете. В итоге родилась такая библиотека для 24схх

Код: Выделить всё

// назначаем ноги I2C протокола
 #define SCL     DDRD.5 // шина I2C
 #define SDA     DDRD.6 //
 #define SCL_IN  PIND.5 //
 #define SDA_IN  PIND.6 // 
 #define WP      DDRD.7    
 #define EEPROM_BUS_ADDRESS 0xA0 
 
 unsigned char xx, i2c_repeat_;
 
 // ======================
void i2c_dly()
{
   
           for(xx=2000;xx>0;xx--)
             {
               #asm("nop") 
               //#asm("nop")
             } 
}

// ======================

void i2c_start_()
 {
   SDA = 0;   //1          // последовательность стартовых битов i2c 
   i2c_dly();
   SCL = 0;   //1
   i2c_dly();
   SDA = 1;   //0
   i2c_dly();
   SCL = 1;   //0
   i2c_dly();
 }
// ======================
void i2c_stop_()
 {
   SDA = 1;             // последовательность завершающих битов i2c 
   i2c_dly();
   SCL = 0;
   i2c_dly();
   SDA = 0;
   i2c_dly(); 
 }
// ======================
    // Пишем в память
void i2c_tx(unsigned char d)
 {
   
 char z;
 i2c_repeat_=1;
 
 if (i2c_repeat_) 
 {
   for(z=8; z; z--) 
   { 
     
     i2c_dly();
     if(d&0x80) SDA = 0; // 1
     else SDA = 1;       // 0     
     i2c_dly();
     SCL = 0;  // 1 
      while(SCL_IN==0); // ждем высокого уровня
     i2c_dly();
     SCL = 1;   // лог.0
     
     i2c_dly(); //if (SDA_IN) { i2c_stop_; z=0; } // раб не может принимать данные
      d <<= 1;
   }
   
 
    
   SDA = 0; // 1
   SCL = 0; // 1 
   i2c_dly(); 
      if (SDA_IN==1) { i2c_repeat_=1; i2c_start_(); }          // повторяем байт если приняли 1 
      else { i2c_repeat_=0; }
 }
   i2c_dly();  
   SCL = 1; // 0
   
   i2c_dly();
   
   
    

 }
// ======================
   // читаем память

unsigned char i2c_rx(volatile unsigned char ack)
 {
   
 char z, d=0;
   SDA = 0; // лог.1
   //SCL = 1; // log.0
    i2c_dly(); 
   for(z=0; z<8; z++) 
   {
     d <<= 1; 
     if(SDA_IN) d |=1; 
     
     SCL = 0; // лог.1 
      while(SCL_IN==0); // ждем высокого уровня
     i2c_dly();
     SCL = 1;   //лог.0
      
       i2c_dly();
   } 
   if(ack) SDA = 1;
   else SDA = 0; 
   i2c_dly();
   SCL = 0; //1
   i2c_dly();             // отсылаем (N)ACK бит 
   SCL = 1; //0
   i2c_dly();
   SDA = 0; //1
   i2c_dly();    
    
   return d;
 }


// ======================

void i2c_init_()
{
  WP=1;
  SDA=0;
  SCL=0;

  
  delay_ms(1);
  i2c_start_();
  delay_ms(1);
  i2c_stop_();
  delay_ms(1);
  
  SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly(); 
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
   SCL=1;      //0
  i2c_dly();
  SCL=0;      //1 
  i2c_dly();
  
  //return;  
  WP=0;
}

 // ======================
 
 
 void eep_write_(unsigned char adress, unsigned char data)
 {   
          WP=1;
          i2c_start_();              // отсылка стартовой последовательности 
          i2c_tx(EEPROM_BUS_ADDRESS);             // I2C адрес 24С с нулевым битом чтения/записи  
          
          i2c_tx(adress);             // отсылка адреса байта памяти 
          i2c_tx(data);             // запись данных
          i2c_stop_();               // отсылка завершающей последовательности 
          WP=0;
                             
 } 
 
  void eep_write_1byte_page(unsigned char adress, unsigned char data)
 {   
          WP=1;
          i2c_start_();              // отсылка стартовой последовательности 
          i2c_tx(EEPROM_BUS_ADDRESS);             // I2C адрес 24С с нулевым битом чтения/записи  
          //i2c_tx(0);                   // 9 бит адреса
          i2c_tx(adress);             // отсылка адреса байта памяти 
          i2c_tx(data);             // запись данных  
          WP=0;                    
 } 
 

//читаем с памяти
unsigned char eep_read_(unsigned char address) 
 {              
          unsigned char data;
          WP=1; 
          i2c_start_();              // отсылка стартовой последовательности
          i2c_tx(EEPROM_BUS_ADDRESS);             // I2C адрес 24C с нулевым битом чтения/записи 
          //i2c_tx(0);                   // 9 бит адреса
          i2c_tx(address);             // адрес ячейки памяти 
          i2c_start_();                // отсылка стартовой последовательности (делаем restart)
          i2c_tx(EEPROM_BUS_ADDRESS | 1);             // I2C адрес 24С с установленым битом чтения/записи 
          data = i2c_rx(1);  // получение значения и отсылка подтверждения. 
                           // Адрес внутреннего регистра увеличится на единицу автоматически.
                           // внимание ! Мы не подтверждаем получение последнего байта.
         // i2c_stop_();               // отсылка завершающей последовательности 
                                      //посылаем команду "стоп"
          return data;                           //возврощаем значение прочитаного 
          
          WP=0;
 }  
 
unsigned char eep_read_page() 
 {        
          unsigned char data; 
          WP=1;
          data = i2c_rx(1);  // получение значения и отсылка подтверждения. 
          return data;                           //возврощаем значение прочитаного 
          WP=0;
 }  
 
void eep_write_page(unsigned char data) // запись страници
 {        
          WP=1;
          i2c_tx(data);             // запись данных
          WP=0;
 } 
Прикол в том что в протеусе набросал схемку на мега8 контроллере и написал простую программку (для того чтоб убедиться в работе алгоритма) Так вот простая программа работает отлично. Память корректно считывается и корректно записываются данные.

А вот уже когда перенес функцию в другой проект, тут уже начались глюки.... :( и при чем не могу понять в какой последовательности... то есть память через раз правильно читается/пишется и то не все данные правильно читаются/пишутся.

Прикрепляю проект и исходник той простой программки на всяк случай.

Так вот вопрос к профессионалам и специалистам , в чем это глюк? Это протеус лагает? или у меня в функциях косяк?

вот так я ее применяю для записи и чтения страницы:

Код: Выделить всё


// чтение 

left = eep_read_(0x00);  // левый канал громкости
        right = eep_read_page(); // правый канал громкости
        left1 = eep_read_page();     // 1
        left2 = eep_read_page();     // 2  левый канал 1,2,3 входа
        left3 = eep_read_page();     // 3
        right1 = eep_read_page();    // 1
        right2 = eep_read_page();    // 2  правый канал 1,2,3 входа
        right3 = eep_read_page();    // 3
        
        volume_mode = eep_read_page(); // алгоритм громкости    
        menu = eep_read_page();
        pwm1 = eep_read_page();         // ШИМ день
        pwm2 = eep_read_page();         // ШИМ ночь
        sel_input = eep_read_page();   // переменная для упр. реле входов
        sel_output = eep_read_page(); // переменная для упр. реле выходов
        auto_return = eep_read_page();  // флаг активации авто выхода 
        high_end_mode = eep_read_page(); // флаг эко режима
           
        i2c_stop_();
        delay_ms(50);  
            
        flags_pass = eep_read_(16);
        pass0 = eep_read_page(); // пароль для входа
        pass1 = eep_read_page();
        pass2 = eep_read_page(); 
        order = eep_read_page(); // наушники/АС
        light_night = eep_read_page();  // яркость ночь константа для АЦП
        light_day = eep_read_page();    // яркость день константа для АЦП
        enable = eep_read_page(); // флаг активации детект. ночь / день
         
        i2c_stop_();
        delay_ms(50);
        
// Запись

 #asm("cli")

    eep_write_1byte_page(0x00,left);
      eep_write_page(right);
        eep_write_page(left1);   
         eep_write_page(left2);  
           eep_write_page(left3);
             eep_write_page(right1);   
              eep_write_page(right2);  
                eep_write_page(right3);  
         
     eep_write_page(volume_mode);
      eep_write_page(menu);
        eep_write_page(pwm1);   
         eep_write_page(pwm2);  
           eep_write_page(sel_input);
             eep_write_page(sel_output);   
              eep_write_page(auto_return);  
                eep_write_page(high_end_mode);  
         i2c_stop_(); 
          delay_ms(50);
         
    eep_write_1byte_page(16,flags_pass);
      eep_write_page(pass0);
        eep_write_page(pass1);   
         eep_write_page(pass2);  
           eep_write_page(order);
             eep_write_page(light_night);   
              eep_write_page(light_day);  
                eep_write_page(enable);  

          
          eep_write_page(EEP_CORRECT);
        
        i2c_stop_(); 
         delay_ms(50);
         
     #asm("sei")

Быть может Вы меня будете ругать за то что я выкладываю всю функцию... но иначе никак , так как я не могу определить проблему.
Платы получу еще не скоро с завода чтоб попробовать в железе код. Проект в котором не работает код заточен под мега168. Что еще заметил:
Протеус 3.14здит по поводу скорости работы тактовой частоты 168 меги. Она реально раз в 50 медленнее работает чем надо....

Меня интересует: правильно ли я написал функцию ?
С ув. Артем
Вложения
Пример работы с еепром 24Схх.rar
(396.33 КБ) 260 скачиваний
Реклама
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Если я правильно понял, вся Ваша ошибка относится к выбору адресации.
В свое время тоже голову чуть не сломал, а все очень просто. Микросхема имеет 1024байт. Строка максимальног адреса 256байт. Следовательно в микрухе присутствует 4-ре банка памяти. Которые и необходимо учитывать при адресации.
Реклама
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Все дело в том что я адресуюсь в первом банке пока что.
А как адрес банков размещен? Что то в с даташита не понял..
я пока что пользую 24 байта памяти.
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

С точки зрения процессора на шину в данном случае подвешена не одна микруха 24с08 а четыре 24с02, поэтому у первой отсутствуют две управляющие адресом ноги (А1 и А2). Из выше изложенного следует, чтобы изменить банк необходимо при
инициализации старта в адресе устройства менять два последних бита.
Тобиш Вот так:
банк 1 адреса от 0-255 байт, адрес b1010000
банк 2 адреса от 256-511 байт, адрес b1010001
банк 3 адреса от 512-767 байт, адрес b1010010
банк 4 адреса от 768-1024 байт, адрес b1010011
И еще для избежания траблов, при чтении одиночных байт, для меньшей путаницы, не стоит загоняться внутренним счетчиком, а также страничной записью данных, потому как длинна страниц у разных производителей и в разных модификациях могут различаться.
Удачи!
Реклама
Эиком - электронные компоненты и радиодетали
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Как раз приходится загоняться записью/чтением страницы ... Так как если писать/читать по байтово - надо выдерживать довольно большую паузу, что в некоторых случаях не допустимо..
Или есть какой то альтернативный вариант чтения/записи который подходит к любому типу 24Схх памяти ?
PS: Спасибо большое за информацию по банкам памяти! В даташите видел какие биты. Но точно там указано какой где банк не было...
Реклама
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Урааааааа! Заработал код! Был мой глюк. Протеус молодец!!! Довольно правдоподобно отрабатывает I2C :)
Но вопрос все же остался открытым по поводу альтернативной записи данных всего банка..
Только что снова пересматривал даташит. То самый оптимальный вариант по скорости выполнения - это запись всей страницы , а страница в разных "памятей" отличается размером.
Реклама
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

При постраничной записи, в конце каждой страницы, тоже необходимо учитывать паузы на запись! Другой альтернативы по записи целого банка к сожалению нет. А вот при чтении, страницы побоку.
А если Вам критична скорость, обратите внимание на SPI Flash. По цене приблизительно одинаково, а вот по скорости и объему отличется в разы.
Удачи!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с еепром 24С08

Сообщение ChipKiller »

Artos писал(а):....Только что снова пересматривал даташит
... в datasheet_е все подробно расписано. А еще на сайте Atmel есть исходники для работы с I2C, так что велосипед изобретать не нужно. Линейка 24с02..24с16 отлична по адресации от 24с32..24с256. У первой группы для адресации часть бит адреса ячейки памяти, содержится в байте адреса устройства, т.е. самой микросхемы.
PS.Где то полгода назад сам наступил на эти грабли заменив в схеме 24с64 на 24с16, а адрес памяти выставлял по-старому во 2 и 3-ем байте :) .
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Здравствуйте, не хочу плодить кучу веток..
Подскажите пожалуйста как сравнить один массив с другим и выполнить условие?

Код: Выделить всё

if (mass[0] == mass1[0] && mass[1] == mass1[1] && mass[2] == mass1[2])
{
  // что то тут происходит
}
Можно это как то написать проще?

С ув. Артем
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Что то подозрение что компилятор тупит не реально! Рррррр...

Код: Выделить всё

 if (cmd_rc==0)   // команда не поступила
                          {
                            dig0 = 11; // - 
                            dig1 = 11; // -
                            dig2 = 11; // -
                            

                              
                             for(d=0;d<12;d++) // алгоритм определения поступившей команды
                            {
                                if (data_ir[d]>0)
                                {
                                 cmd_rc=1; 
                                 mass_flags=1;
                                  d=12;    // выходим из цикла
                                }
                                else
                                {
                                 cmd_rc=0;
                                }
                            }  
                          }
                          else               // команда поступила
                          {
                            dig0 = 20; // C
                            dig1 = 19; // P
                            dig2 = 0; // 0   
                            
                             if (start==0 && mass_flags==1) 
                             {
                                     for(d=0; d<12; d++)
                                     {
                                      data_ir_eep0[d]= data_ir[d]; // команда Вкл.Откл. питание 
                                      data_ir[d]=0; // стираем буффер   
                                     }
                                     mass_flags=0; 
                             }     
                             
                             if(++timer_led_shou > 20) {timer_led_shou=0; cmd_rc=0; }  // выходим в захват команды
                              
                          }
при захвате команды выполняется копирование массива и сразу стирание буфера. После стирания последнего байта массива
сбрасывается флаг и стартует программный таймер времени индикации , после происходит возврат и отображение "---"
но этого не происходит.... код зацикливается. Получается что буфер не стирается почему то........ :kill: :dont_know: :shock:

Кто скажет у меня ошибка или компилятор тупит? :))
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Да в си давно неписал, а массивы сравнивать можно в цикле, предварительно создав переменную флаг.
поэтому чтобы не вспоминать синтаксис С образец аля BASIC

а = true
FOR I = 1 to J && J-длинна массивов
IF maasiv1 <> massiv2
a = false
exit
ENDIF
ENDFOR
IF a=true && Если массивы одинаковы
........
ELSE && Если не одинаковы
........
ENDIF
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с еепром 24С08

Сообщение ChipKiller »

__Oleg__ писал(а):Да в си давно неписал, а массивы сравнивать можно в цикле, предварительно создав переменную флаг.
... можно завести пару указателей и счетчик.

Код: Выделить всё

 while(count--){ if(*src++==*dest++){.....} }
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Спасибо за примеры ;) Реально классный пример предыдущий. Его и применил :)

Все таки моя ошибка была... Я не активировал прерывание по переполнению 2 таймера. И ожидал что оно произойдет :))
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Добрый день уважаемые!
Уже эта память мне весь мозг вынесла.... :(

Память применяю 24С08 данные пишу в поле А0 и так же пишу в поле А2

Вот пишутся данные нормально в поле А2, но вот когда я читаю их - читаются в конце (где то 4 последняя часть данных) одни FFh.
Есть ли требования какие по чтению с памяти кроме скорости на шине ? Число байт в поле 256?
С ув. Артем
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с еепром 24С08

Сообщение ChipKiller »

Artos писал(а): ....пишутся данные нормально....
... откуда такая уверенность? Во всех ваших функциях чтения/записи нет анализа занятости шины. Т.е. вместо void i2c_start_() и аналогичных, лучше использовать BOOL i2c_start_()....
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Программу отлаживаете в Proteus или железе?
Пользуетесь вышеописанной процедурой приема передачи I2C?
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

__Oleg__ писал(а):Программу отлаживаете в Proteus или железе?
Пользуетесь вышеописанной процедурой приема передачи I2C?
Уже проблема решилась :))

Пользуюсь функциями указанными выше. Отлаживаю в железе. Что в железе не пахало что в Протеусе.
Я пытался писать в поле больше чем 256 байт :)

У меня еще помимо 24С08 памяти используется универсальный протокол декодера ДУ, вот с ним пока что вообще чудеса.... :(
Кто плотно колупал технологию "Инфракрасного дистанционного управления"? Вот получилось сделать универсальный декодер. Но проблема есть с программированием команд с ДУ.. Чтоб запрограммировать команду надо хорошо прицелиться в приемник :)) почему так - не пойму....
Последний раз редактировалось Artos Вт окт 23, 2012 19:10:46, всего редактировалось 1 раз.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

ChipKiller писал(а):
Artos писал(а): ....пишутся данные нормально....
... откуда такая уверенность? Во всех ваших функциях чтения/записи нет анализа занятости шины. Т.е. вместо void i2c_start_() и аналогичных, лучше использовать BOOL i2c_start_()....
А почему лучше их использовать?

У меня функция четко отрабатывается тем более когда я начинаю писать/читать память, я запрещаю все прерывания. Память пишется исключительно!

А скажите пожалуйста, что будет если отключить питание в момент записи данных в память? Данные повредятся? Память пишется 10мс?
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Вопрос немного не в тему...

Есть такой код:

Код: Выделить всё

void decode_ir_data()
 { 
    tim_system_rc=0x06; 
     

  if(ir && start==0) //  старт бит установлен? нет!
  {
   if (timer_ir > MIN_S && timer_ir < MAX_S) // это старт бит?
    {
     start=0x01;   // да! 
     timer_ir=0;

    } 
  } 
  
     if (ir && start)
     { 
      
              
           if (cnt_bit_high <= 8)
            {
             
               if (timer_ir >= MIN_DATA && timer_ir <= MAX_DATA) // короткий импульс высокого уровня 
                {
                  
                 data_ir[0] |=1; 
                 timer_ir=0; 
                  
                } 
                
               if (timer_ir >= MIN_DATA_2 && timer_ir <= MAX_DATA_2) // средний импульс высокого уровня 
                {
                 
                  data_ir[1] |=1;
                  timer_ir=0;
                 
                }
                
                
                 data_ir[0] <<=1; 
                 data_ir[1] <<=1;
                   
                 
            } else if (cnt_bit_high > 8 && cnt_bit_high <= 16)  
                    {
                       if (timer_ir >= MIN_DATA && timer_ir <= MAX_DATA) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[2] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2 && timer_ir <= MAX_DATA_2) // средний импульс высокого уровня 
                        {
                         
                          data_ir[3] |=1;
                          timer_ir=0;
                         
                        }
                        
                     
                        
                         data_ir[2] <<=1; 
                         data_ir[3] <<=1;
                            
                    } else if (cnt_bit_high > 16 && cnt_bit_high <= 24)  
                    {
                       if (timer_ir >= MIN_DATA && timer_ir <= MAX_DATA) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[4] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2 && timer_ir <= MAX_DATA_2) // средний импульс высокого уровня 
                        {
                         
                          data_ir[5] |=1;
                          timer_ir=0;
                         
                        }
                        
                       
                        
                         data_ir[4] <<=1; 
                         data_ir[5] <<=1;
                          
                    } else if (cnt_bit_high > 24 && cnt_bit_high <= 32)  
                    {
                       if (timer_ir >= MIN_DATA && timer_ir <= MAX_DATA) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[6] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2 && timer_ir <= MAX_DATA_2) // средний импульс высокого уровня 
                        {
                         
                          data_ir[7] |=1;
                          timer_ir=0;
                         
                        }
                        
                         
                        
                         data_ir[6] <<=1; 
                         data_ir[7] <<=1;
                          
                    } else if (cnt_bit_high > 32 && cnt_bit_high <= 40)  
                    {
                       if (timer_ir >= MIN_DATA && timer_ir <= MAX_DATA) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[8] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2 && timer_ir <= MAX_DATA_2) // средний импульс высокого уровня 
                        {
                         
                          data_ir[9] |=1;
                          timer_ir=0;
                         
                        }
                        
                       
                        
                         data_ir[8] <<=1; 
                         data_ir[9] <<=1;
                         
                           
                    } else if (cnt_bit_high > 40 && cnt_bit_high <= 48)  
                    {
                       if (timer_ir >= MIN_DATA && timer_ir <= MAX_DATA) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[10] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2 && timer_ir <= MAX_DATA_2) // средний импульс высокого уровня 
                        {
                         
                          data_ir[11] |=1;
                          timer_ir=0;
                         
                        }
                        
                       
                        
                         data_ir[10] <<=1; 
                         data_ir[11] <<=1;
                          
                    }
           
           cnt_bit_high++;
        

      }
          
      if (ir==0 && start)
     { 
         
        if (cnt_bit_low <= 8)
         { 
           if (timer_ir >= MIN_DATA_ && timer_ir <= MAX_DATA_) // короткий импульс низкого уровня 
            {
             data_ir[12] |=1;
              timer_ir=0;
            } 
            
           if (timer_ir >= MIN_DATA_2_ && timer_ir <= MAX_DATA_2_) // средний импульс низкого уровня 
            {
             data_ir[13] |=1;
              timer_ir=0;
            }
            
           
            
             data_ir[12] <<=1; 
             data_ir[13] <<=1;
            
                   
         } else if (cnt_bit_low > 8 && cnt_bit_low <= 16)  
                    {
                       if (timer_ir >= MIN_DATA_ && timer_ir <= MAX_DATA_) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[14] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2_ && timer_ir <= MAX_DATA_2_) // средний импульс высокого уровня 
                        {
                         
                          data_ir[15] |=1;
                          timer_ir=0;
                         
                        }
                        
                      
                        
                         data_ir[14] <<=1; 
                         data_ir[15] <<=1;
                         
                    } else if (cnt_bit_low > 16 && cnt_bit_low <= 24)  
                    {
                       if (timer_ir >= MIN_DATA_ && timer_ir <= MAX_DATA_) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[16] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2_ && timer_ir <= MAX_DATA_2_) // средний импульс высокого уровня 
                        {
                         
                          data_ir[17] |=1;
                          timer_ir=0;
                         
                        }
                        
                       
                        
                         data_ir[16] <<=1; 
                         data_ir[17] <<=1;
                          
                    } else if (cnt_bit_low > 24 && cnt_bit_low <= 32)  
                    {
                       if (timer_ir >= MIN_DATA_ && timer_ir <= MAX_DATA_) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[18] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2_ && timer_ir <= MAX_DATA_2_) // средний импульс высокого уровня 
                        {
                         
                          data_ir[19] |=1;
                          timer_ir=0;
                         
                        }
                        
                       
                        
                         data_ir[18] <<=1; 
                         data_ir[19] <<=1;
                            
                    } else if (cnt_bit_low > 32 && cnt_bit_low <= 40)  
                    {
                       if (timer_ir >= MIN_DATA_ && timer_ir <= MAX_DATA_) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[20] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2_ && timer_ir <= MAX_DATA_2_) // средний импульс высокого уровня 
                        {
                         
                          data_ir[21] |=1;
                          timer_ir=0;
                         
                        }
                        
                       
                        
                         data_ir[20] <<=1; 
                         data_ir[21] <<=1;
                            
                    } else if (cnt_bit_low > 40 && cnt_bit_low <= 48)  
                    {
                       if (timer_ir >= MIN_DATA_ && timer_ir <= MAX_DATA_) // короткий импульс высокого уровня 
                        {
                          
                         data_ir[22] |=1; 
                         timer_ir=0; 
                          
                        } 
                        
                       if (timer_ir >= MIN_DATA_2_ && timer_ir <= MAX_DATA_2_) // средний импульс высокого уровня 
                        {
                         
                          data_ir[23] |=1;
                          timer_ir=0;
                         
                        }
                        
                       
                         data_ir[22] <<=1; 
                         data_ir[23] <<=1;
                          
                    } 
                    
                    cnt_bit_low++;
     }   
     
  timer_vol=0;

 }

Он детектирует команды с пульта и загоняет в переменные.

Можно ли как то написать оптимальнее? Чтоб проц быстрее обработал команду с пульта?

Подозреваю что проц слишком долго "думает" и по сему команды срабатывают не устойчиво.

И еще вопрос сколько тактов приблизительно потребуется на исполнение этого кода?

Заранее очень благодарен за помощь!!
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Artos писал(а): А скажите пожалуйста, что будет если отключить питание в момент записи данных в память? Данные повредятся? Память пишется 10мс?
Запись происходит постранично, даже если записываешь 1 байт, по алгоритму:
- содержимое страницы памяти считывается в буфер (регистры микросхемы)
- страница в памяти микросхемы стирается
- в сохраненный в буфер (старые данные) подставляются новые (полученные от мастера)
- запись буфера непосредственно в память микросхемы
Выводы делайте сами. :dont_know:
Ответить

Вернуться в «Периферия»