Сообщение от
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 сам по себе проект не простой будет.
