/****************************************************************** 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; }
/********************************* *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; }
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) {
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) {