Вот полный текст для работы с DS1990A
#define ONEWIRE 0x08 // BIT Какой пин использовать
#define ONEPIN (*(volatile unsigned char *)0x30) // PIN register
#define ONEDDR (*(volatile unsigned char *)0x31) // Data Direction Register
#define ONEPORT (*(volatile unsigned char *)0x32) // PORT
unsigned char one_wire_byte[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void OneWireReadROM(void);
unsigned char OneWireReset(void);
unsigned char OneWireReadByte(void);
void OneWireWriteByte(unsigned char);
unsigned char iButtonCRC( unsigned char *code);
void OneWireReadROM(void) {
OneWireWriteByte(0x33);
one_wire_byte[0] = OneWireReadByte();
one_wire_byte[1] = OneWireReadByte();
one_wire_byte[2] = OneWireReadByte();
one_wire_byte[3] = OneWireReadByte();
one_wire_byte[4] = OneWireReadByte();
one_wire_byte[5] = OneWireReadByte();
one_wire_byte[6] = OneWireReadByte();
one_wire_byte[7] = OneWireReadByte();
one_wire_byte[8] = iButtonCRC(one_wire_byte);
}
unsigned char OneWireReset(void)
{
ONEPORT &= ~(ONEWIRE); // Normal input no pull up
if (!(ONEPIN & ONEWIRE)) return 0; // detect 0V on buss error
ONEDDR |= ONEWIRE; // out at 0
_delay_loop_2(462); // 500 us
ONEDDR &= ~(ONEWIRE); // Set to input
_delay_loop_2(64); // 70 us
if ((ONEPIN & ONEWIRE) == 0)
{
_delay_loop_2(462); // 500 us
return(1);
}
_delay_loop_2(462); // 500 us
return(0);
}
//********************************************************************************
*********
void OneWireWriteByte(unsigned char data)
{
unsigned char i;
ONEPORT &= ~(ONEWIRE);
for (i=0;i<=7;i++)
{
ONEDDR |= ONEWIRE;
if (data & 0x01)
{ // Send 1
_delay_loop_2(1); // 7 us
ONEDDR &= ~(ONEWIRE);
_delay_loop_2(32); // 70 us
}
else
{ // Send 0
_delay_loop_2(32); // 70 us
ONEDDR &= ~(ONEWIRE);
_delay_loop_2(1); // 7 us
}
data>>=1;
}
}
//********************************************************************************
*********
unsigned char OneWireReadByte(void)
{
unsigned char data = 0;
unsigned char i;
ONEPORT &= ~(ONEWIRE); // Output '0' or input without pullup
for (i=0;i<=7;i++)
{
ONEDDR |= ONEWIRE; // Set output to '0'
asm("nop");
ONEDDR &= ~(ONEWIRE); // Set to input
asm("nop");
data >>=1;
if (ONEPIN & ONEWIRE) data |= 0x80;
else data &= 0x7f;
_delay_loop_2(32); // 70 us
}
return data;
}
//********************************************************************************
*********
unsigned char iButtonCRC( unsigned char *code)
{
unsigned char j, i, Data, tmp, CRC = 0;
for (j = 0; j < 7; j++)
{
Data = code[j];
for (i = 0; i < 8; i++)
{
tmp = 1 & (Data ^ CRC);
CRC >>= 1;
Data >>= 1;
if ( 0 != tmp ) CRC ^= 0x8c;
}
}
return CRC;
}
int main(void)
{
if(OneWireReset()=1) // Есть ключ
{
OneWireReadROM()
if(one_wire_byte[7]=one_wire_byte[8]) // CRC OK
{
// Делаем что нужно
}
}
}
Помоему здесь все проще и понятней