[an error occurred while processing this directive]
|
Вот пример базиса для 1-Wire (работающий).
Могу конкретно для DS18S20 пример выслать - на две ноги - не важно подставишь базис - заработает на одной :)
/* Для одноногой 1-Wire */
#define MLANIO 0x40 /* на самом деле, какой нужно? */
#define TRPULSELOW 245
#define TRPULSEHIGH1 70
#define TRPULSEHIGH2 254
void delay(char del) /* ~~1 mks/ 1 del */
{
TIFR=0x02; TCNT0=del; TCCR0=0x02;
do {} while (!(TIFR & 0x02));
TCCR0=0; _WDR();
}
char mLAN_TouchReset(void)
{
char ret=1;
PORTD&=~MLANIO;
delay(-TRPULSELOW); delay(-TRPULSELOW);
PORTD|=MLANIO;
DDRD&=~MLANIO;
delay(-TRPULSEHIGH1);
if (!(PIND & MLANIO))
ret=0; // Presence Pulse eсть !
delay(-TRPULSEHIGH2); delay(-TRPULSEHIGH2); DDRD|=MLANIO;
return (ret);
}
unsigned char mLAN_rd_byte(void)
{
unsigned char i,mLANbt;
mLANbt=0;
for (i=0; (i < 8); i++)
{mLANbt>>=1;
_CLI();
PORTD&=~MLANIO;
delay(-1);
PORTD|=MLANIO;
delay(-4);
DDRD&=~MLANIO;
delay(-4);
if (PIND & MLANIO) mLANbt|=0x80;
_SEI();
delay(-52);
DDRD|=MLANIO;
delay(-1);
}
return(mLANbt);
}
void mLAN_wr_byte(unsigned char mLANbt)
{
unsigned char i;
for (i=0; (i < 8); i++)
{_CLI();
PORTD&=~MLANIO;
delay(-1);
if (mLANbt & 1) PORTD|=MLANIO;
_SEI();
mLANbt>>=1;
delay(-57);
PORTD|=MLANIO;
delay(-1);
}
}
а в MAIN:
инициализация:
PORTD=0xff /* ежели угодно */; DDRD=MLANIO; // MLANIO - на выход по желаемому пину.
E-mail: info@telesys.ru