From f7a67ccf3f44ecc8c18f9b07b2baa2219f3b6f8d Mon Sep 17 00:00:00 2001 From: Mike Playle Date: Thu, 1 Feb 2018 22:09:28 +0000 Subject: [PATCH] Set AVR_IOPORT_OUTPUT when setting/clearing outputs in response to a compare match --- simavr/sim/avr_timer.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/simavr/sim/avr_timer.c b/simavr/sim/avr_timer.c index 96b40e1..ef199fc 100644 --- a/simavr/sim/avr_timer.c +++ b/simavr/sim/avr_timer.c @@ -83,23 +83,27 @@ avr_timer_comp( uint8_t mode = avr_regbit_get(avr, p->comp[comp].com); avr_irq_t * irq = &p->io.irq[TIMER_IRQ_OUT_COMP + comp]; + uint32_t flags = 0; + if (p->comp[comp].com_pin.reg) // we got a physical pin + flags |= AVR_IOPORT_OUTPUT; + AVR_LOG(avr, LOG_TRACE, "Timer comp: irq %p, mode %d @%d\n", irq, mode, when); switch (mode) { case avr_timer_com_normal: // Normal mode OCnA disconnected break; case avr_timer_com_toggle: // Toggle OCnA on compare match if (p->comp[comp].com_pin.reg) // we got a physical pin avr_raise_irq(irq, - AVR_IOPORT_OUTPUT | + flags | (avr_regbit_get(avr, p->comp[comp].com_pin) ? 0 : 1)); else // no pin, toggle the IRQ anyway avr_raise_irq(irq, p->io.irq[TIMER_IRQ_OUT_COMP + comp].value ? 0 : 1); break; case avr_timer_com_clear: - avr_raise_irq(irq, 0); + avr_raise_irq(irq, flags | 0); break; case avr_timer_com_set: - avr_raise_irq(irq, 1); + avr_raise_irq(irq, flags | 1); break; } -- 2.39.5