Показать сообщение отдельно

  #26  
Старый 21.03.2008, 19:16
Animal
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме:
1260519

Репутация: 298
Отправить сообщение для Animal с помощью ICQ
Cool

Цитата:
Сообщение от Demius  
Ну что всё проект встал?
Ну почему же? Вот отчитываюсь по I-Button:
алгоритм вкратце:
определяем наличие ключа;
передаем команду чтения ROM;
читаем код семейства ключа (для 1990А =01h);
читаем шесть байт собственно ключа (начиная с младшего);
читаем контрольную сумму CRC.
Используемые функции:
Код:
boolean Touch_Present()            //
{  boolean present;                //1-ключ обнаружен, 0-нет.
   output_low(TOUCH_PIN);
   output_drive(Touch_Pin);
   delay_us(500);
   output_float(TOUCH_PIN);
   delay_us(5);
   if(!input(TOUCH_PIN))
   return(FALSE);
   delay_us(60);
   present=!input(TOUCH_PIN);
   delay_us(250);
   if(present) return(TRUE);
   else  return(FALSE);
}

void Touch_Write_Byte(unsigned int8 data) //передача байта ключу
{  unsigned int8 i;
   for(i=1;i<=8;++i) 
   {  output_low(TOUCH_PIN);
      output_drive(Touch_Pin);
      delay_us(10);
      if(shift_right(&data,1,0)) 
      {  output_high(TOUCH_PIN);
         delay_us(60);
      } 
      else 
      {  output_low(TOUCH_PIN);
         delay_us(60);
      }
      output_high(TOUCH_PIN);
      delay_us(10);
   }
}

unsigned int8 Touch_Read_Byte()           //чтение байта от ключа
{  BYTE i,data;
   for(i=1;i<=8;++i) 
   {  output_low(TOUCH_PIN);
      output_drive(Touch_Pin);
      delay_us(10);
      output_float(TOUCH_PIN);
      delay_us(10);
      shift_right(&data,1,input(TOUCH_PIN));
      delay_us(100);
   }
   return(data);
}
А вот сам модуль считывающий данные:
Код:
if(Touch_Present()==true)        //если обнаружен ключ
      {  Touch_Write_Byte(0x0F);       //передаем команду считывания ROM
         Fam=Touch_Read_Byte();        //читаем код семейства
         temp=0;
         do{Temp++;                    //читаем 6 байт серийного номера
            Data[Temp]=Touch_Read_Byte();
         }while(Temp!=6);
         CRC=Touch_Read_Byte();        //читаем контрольную сумму
В очередной раз не удивило, что у CCS стандартные функции для работы с тач-мемори оказались кривыми, пришлось доработать. CRC не считал, просто лень. Лучше два раза код считать для верности. Экспериментировал, пытаясь получить неверный код имитируя плохой контакт:сложновато, примерно на 20-ый раз код читается неверно. Вот вообщем-то и все...
Demius, а ты кроме GSM какие еще видишь продолжения проекта? Думаю GSM сам по себе проект не простой будет.

Последний раз редактировалось Animal; 21.03.2008 в 19:24..