|
#define PORTwire1 PORTA
#define OW_PORT PORTA
#define OW_DDR DDRA
#define OW_BUS_MASK BIT(PA2)
#define OW_PIN PA2
#define CPU_CYCLE 1328
#define COMM_PER_MCS (1000 / CPU_CYCLE)
#define OW_DEL_A 6 * COMM_PER_MCS
#define OW_DEL_B 64 * COMM_PER_MCS
#define OW_DEL_C 60 * COMM_PER_MCS
#define OW_DEL_D 10 * COMM_PER_MCS
#define OW_DEL_E 9 * COMM_PER_MCS
#define OW_DEL_F 55 * COMM_PER_MCS
#define OW_DEL_G 0 * COMM_PER_MCS
#define OW_DEL_H 480 * COMM_PER_MCS
#define OW_DEL_I 70 * COMM_PER_MCS
#define OW_DEL_J 410 * COMM_PER_MCS
void OW_WriteBit1(void)
{
OW_DDR |= OW_BUS_MASK;
_delay_us(OW_DEL_A);
OW_DDR &= ~OW_BUS_MASK;
_delay_us(OW_DEL_B);
}
void OW_WriteBit0(void)
{
OW_DDR |= OW_BUS_MASK;
_delay_us(OW_DEL_C);
OW_DDR &= ~OW_BUS_MASK;
_delay_us(OW_DEL_D);
}
char OW_ReadBit(void)
{ char status;
OW_DDR |= OW_BUS_MASK;
_delay_us(OW_DEL_A);
OW_DDR &= ~OW_BUS_MASK;
_delay_us(OW_DEL_E);
status = OW_PIN & OW_BUS_MASK;
_delay_us(OW_DEL_F);
return status;
}
void OW_SendByte(char data)
{ char count;
count = 8;
do
{
if(data & 0x01)
{ OW_WriteBit1();
}
else
{ OW_WriteBit0();
}
data >>= 1;
}
while(--count);
}
char OW_DetectPresence(void)
{ char status;
OW_DDR |= OW_BUS_MASK;
_delay_us(OW_DEL_H);
OW_DDR &= ~OW_BUS_MASK;
_delay_us(OW_DEL_I);
status = OW_PIN & OW_BUS_MASK;
_delay_us(OW_DEL_J);
return status;
}
char OW_ReceiveByte(void)
{ char count, data;
count = 8;
do
{
data >>= 1;
if(OW_ReadBit())
{ data |= 0x80;
}
}
while(--count);
return data;
}
int main(void) {
char ch;
OW_PORT &= ~_BV(OW_PIN);
OW_DDR &= ~BIT(OW_PIN);
ch=OW_DetectPresence();
printstr_p(PSTR("=")); //çàïðîñ íà òåêóùèé SMSC
putchr(ch);
printstr_p(PSTR("="));
OW_SendByte(0xF0);
ch=OW_ReceiveByte();
putchr(ch);
ch=OW_ReceiveByte();
putchr(ch);