Нужна помощь по изменению временных интервалов в библиотеке OneWire

gena
Offline
Зарегистрирован: 04.11.2012

 

 Подскажите, где в библиотеке “OneWire” используемой в среде “Arduino-0023” нужно делать изменения, что бы можно было изменять интервалы A, B, C, D (см. рисунок). http://s49.radikal.ru/i125/1303/5e/5541b366cd87.gif

maksim
Offline
Зарегистрирован: 12.02.2012

В файле \libraries\OneWire\OneWire.cpp есть две функции передачи и приема бита:

void OneWire::write_bit(uint8_t v)
{
	IO_REG_TYPE mask=bitmask;
	volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;

	if (v & 1) {
		noInterrupts();
		DIRECT_WRITE_LOW(reg, mask);
		DIRECT_MODE_OUTPUT(reg, mask);	// drive output low
		delayMicroseconds(10);                            // интервал В 
		DIRECT_WRITE_HIGH(reg, mask);	// drive output high
		interrupts();
		delayMicroseconds(55);
	} else {
		noInterrupts();
		DIRECT_WRITE_LOW(reg, mask);
		DIRECT_MODE_OUTPUT(reg, mask);	// drive output low
		delayMicroseconds(65);
		DIRECT_WRITE_HIGH(reg, mask);	// drive output high
		interrupts();
		delayMicroseconds(5);                               // интервал А
	}
}

//
// Read a bit. Port and bit is used to cut lookup time and provide
// more certain timing.
//
uint8_t OneWire::read_bit(void)
{
	IO_REG_TYPE mask=bitmask;
	volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
	uint8_t r;

	noInterrupts();
	DIRECT_MODE_OUTPUT(reg, mask);
	DIRECT_WRITE_LOW(reg, mask);
	delayMicroseconds(3);                               // интервал D
	DIRECT_MODE_INPUT(reg, mask);	// let pin float, pull up will raise
	delayMicroseconds(10);
	r = DIRECT_READ(reg, mask);
	interrupts();
	delayMicroseconds(53);
	return r;
}

Интерваны А и В выделены - 10 строка интервал В, 21 интервал А.

А вот на интервалы C и D вы никак повлиять не можете, потому как их генерят устройства подключенные к шине.

gena
Offline
Зарегистрирован: 04.11.2012

  Насчёт интервала "С" согласен, он по протоколу формируется ведомым устройством, а вот по интервалу "D" осмелюсь возразить - я думаю что его формирует микроконтроллер и задача этого интервала в синхронизации ведомого ведущим (во нагородил). Другими словами синхронизация очередного тайм-слота.

maksim
Offline
Зарегистрирован: 12.02.2012

Да, так оно и есть, D это строка 38. Подредактировал.

gena
Offline
Зарегистрирован: 04.11.2012

  И ещё. Я неправильно указал, что библиотека "OneWire" взята из среды Arduino-0023. Это я её туда поместил, а вот где взя - уже не вспомню. Поэтому что бы не было разночтений, не отправите ли мне ту библиотеку  "OneWire" (желательно всю) на которую ссылаетесь, или ссылку на неё.

maksim
Offline
Зарегистрирован: 12.02.2012
gena
Offline
Зарегистрирован: 04.11.2012

 О, а у меня совсем другая (2008 года). Буду разбираться. Спасибо.