Пример #1
0
/******************************************************************
Timing issue when using runtime-bus-selection (!OW_ONE_BUS):
   The master should sample at the end of the 15-slot after initiating
   the read-time-slot. The variable bus-settings need more
   cycles than the constant ones so the delays had to be shortened 
   to achive a 15uS overall delay 
   Setting/clearing a bit in I/O Register needs 1 cyle in OW_ONE_BUS
 but around 14 cyles in configureable bus (us-Delay is 4 cyles per uS) 
*********************************************************************/
uint8_t 
ow_bit_io( uint8_t b )
{	uint8_t sreg;

	sreg=SREG;
	/*TRY it*///
	CLI();
	OW_DIR_OUT(); /* drive bus low*/

	// delay_us(1); /* Recovery-Time wuffwuff was 1*/
	usecsleep(1,1); 
	//timer1_Delay(1);
	if ( b ) OW_DIR_IN(); /* if bit is 1 set bus high (by ext. pull-up)*/
	/* wuffwuff delay was 15uS-1 see comment above*/
	// delay_us(15-1-OW_CONF_DELAYOFFSET);
	usecsleep(1,15-1-OW_CONF_DELAYOFFSET); 
	//timer1_Delay(15-1-OW_CONF_DELAYOFFSET);
        
	if( OW_GET_IN() == 0 ) b = 0;  /* sample at end of read-timeslot*/
	//   delay_us(60-15);
	usecsleep(1,60-15);
	//timer1_Delay(60-15);
	OW_DIR_IN();
	/*TRY it*///SREG=sreg; /* sei();*/
	SEI();
	return b;
}
Пример #2
0
/*********************************
*RESET
-*********************************/
uint8_t 
ow_reset(void)
{	uint8_t err;
	uint8_t sreg;

	OW_OUT_LOW(); // disable internal pull-up (maybe on from parasite)
	OW_DIR_OUT(); // pull OW-Pin low for 480us
	
	//   delay_us(480);
	usecsleep(2,240);
	//timer1_Delay(480);
	sreg=SREG;
	/*TRY it*///
	CLI();
	/* set Pin as input - wait for clients to pull low*/
	OW_DIR_IN(); /* input*/

	//   delay_us(66);
	usecsleep(2,33);
	//timer1_Delay(480);
	err = OW_GET_IN();		/* no presence detect*/
	/* nobody pulled to low, still high*/
	/*TRY it*///SREG=sreg; /* 
	SEI();

	/* after a delay the clients should release the line
	and input-pin gets back to high due to pull-up-resistor*/
  
	// delay_us(480-66);
	usecsleep(2,207); 
	//timer1_Delay(480-66);
	if( OW_GET_IN() == 0 )/* short circuit*/ err = 1;
	return err;
}
Пример #3
0
usec_t AdaptiveSleep::sleepUntil(usec_t base, usec_t inc) {
	usec_t now = getusecs();
	usec_t diff = now - base;

	if (diff >= inc)
		return diff - inc;

	diff = inc - diff;

	if (diff > oversleep + oversleepVar) {
		diff -= oversleep + oversleepVar;
		usecsleep(diff);
		const usec_t ideal = now + diff;
		now = getusecs();

		{
			usec_t curOversleep = now - ideal;
			if (negate(curOversleep) < curOversleep)
				curOversleep = 0;

			oversleepVar = (oversleepVar * 15 + absdiff(curOversleep, oversleep) + 8) >> 4;
			oversleep = (oversleep * 15 + curOversleep + 8) >> 4;
		}

		noSleep = 60;
	} else if (--noSleep == 0) {
Пример #4
0
usec_t AdaptiveSleep::sleepUntil(usec_t base, usec_t inc) {
	usec_t now = getusecs();
	usec_t diff = now - base;
	if (diff >= inc)
		return diff - inc;

	diff = inc - diff;
	if (diff > oversleep_ + oversleepVar_) {
		diff -= oversleep_ + oversleepVar_;
		usecsleep(diff);
		usec_t const sleepTarget = now + diff;
		now = getusecs();

		usec_t curOversleep = now - sleepTarget;
		if (curOversleep > usec_t(-1) / 2)
			curOversleep = 0;

		oversleepVar_ = (oversleepVar_ * 15 + absdiff(curOversleep, oversleep_) + 8) >> 4;
		oversleep_ = (oversleep_ * 15 + curOversleep + 8) >> 4;
		noSleep_ = 60;
	} else if (--noSleep_ == 0) {