1-wire без delay
- Войдите на сайт для отправки комментариев
Пт, 12/02/2021 - 01:39
вот мучает меня все время вот какой вопрос. есть библиотека для работы с 1wire. если посмотреть в ее функцию отправки данных -
void OneWire::write_bit(uint8_t v)
{
IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask;
volatile IO_REG_TYPE *reg IO_REG_BASE_ATTR = 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);
}
}
можно увидеть что биты формируются при помощи делеев. как то мне кажется это не правильным и должно это делаться через? таймер?
Напиши свой, кто ж тебе мешает то ?
Раз тебе жалко 65-70микросекунд.
Только учти, что прерывания в момент приема/передачи , должны быть выключены (привет таймерам)
Это называется delay-фобия.
Вот так и СМИ людям мозги засирают.(
можно увидеть что биты формируются при помощи делеев. как то мне кажется это не правильным и должно это делаться через? таймер?
закомментируй делеи и проверь - нужны они там или нет.
"Правильно" это видимо в прерывании таймера. Только нужно руководствоваться не правилами, а целью. Что хотите получить в результате ?
ну 5 и 10 мксек и так нормально, а 55-65 на таймере выглядит получше. Но если после каждого вызова write_bit прокрутить луп, а не отправлять все сообщение подряд, то сойдет.
вот мучает меня все время
Не чешите - пройдёт.