orgua / OneWireHub

OneWire slave device emulator
GNU General Public License v3.0
343 stars 86 forks source link

Support for ATtiny816 / 1-series ATtiny #131

Open chris-b-tanner opened 11 months ago

chris-b-tanner commented 11 months ago

I am struggling to get the ATtiny816 to respond as a OneWire device to an ESP32 master. Running the DS18B20 example.

Background info: The bus and master physically work. I have another real DS18B20 on the same OneWire bus and it's seen fine by the host (an ESP32); the reset pulse from the ESP32 looks a strong low on a 'scope. I've tested the ATtiny without this separate device on the bus as well. I can run the DS18B20 emulation code fine on an ATtiny85, so it's something related to the ATtiny816. 4k7 pullup is on the ESP32 end. I'm using PlatformIO, but I don't suspect that makes a difference. Nothing else is hooked up to the ATtiny apart from a 1uF cap from VCC to GND and the debug LED. The DS18B20 emulation code runs on the ATtiny816, with the LED/blink at exactly 1s, but nothing on OneWire. I've confirmed the OneWire pin I'm using on the ATtiny (10 / PB4) can be manipulated fine from the code, and it receives the low pulse into the calibration code. The ATtiny816 runs the calibration code with a serial output, but I had to edit to while (repetitions++ < 5) in order for it to come out of the other end with a value_ipl (which strangely gives me 11 not 13 which is the default for the AVR) No response on OneWire for IPL at either 11, 12 or 13

I have set fuses to use both 16Mhz and 20Mhz internal clock.

OneWireHub version 3.0.0 PlatformIO config:


platform = atmelmegaavr
platform_packages = platformio/tool-avrdude
board = attiny816
build_flags = -DCLOCK_SOURCE=6
framework = arduino
board_build.f_cpu = 16000000L
upload_protocol = serialupdi
lib_deps = orgua/OneWireHub
chris-b-tanner commented 10 months ago

I have managed to get the calibration code running (previously my OneWire master was only running a bus search a few times; not enough for the calibration code), and I'm getting 10 instructions per loop. Updating platform.h to this value for the AVR doesn't make the device show on the OneWire bus with the DS18B20 example. My fuses are set to 16MHz internal clock.

Some debug Serial.println() from the calibration script:

time_for_reset > 488
loops_for_reset > 779
microsecondsToClockCycles(1) > 16
instructions per loop > 10