ioport: Restore PIN to PORT values when DDR is set to output
[simavr] / simavr / sim / avr_timer.c
index beee10d..6e1d8cc 100644 (file)
@@ -173,9 +173,11 @@ static void avr_timer_tcnt_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t
 //     printf("%s-%c %d/%d -- cycles %d/%d\n", __FUNCTION__, p->name, tcnt, p->tov_top, (uint32_t)cycles, (uint32_t)p->tov_cycles);
 
        // this reset the timers bases to the new base
-       p->tov_base = 0;
-       avr_cycle_timer_register(avr, p->tov_cycles - cycles, avr_timer_tov, p);
-       avr_timer_tov(avr, avr->cycle - cycles, p);
+       if (p->tov_cycles > 1) {
+               avr_cycle_timer_register(avr, p->tov_cycles - cycles, avr_timer_tov, p);
+               p->tov_base = 0;
+               avr_timer_tov(avr, avr->cycle - cycles, p);
+       }
 
 //     tcnt = ((avr->cycle - p->tov_base) * p->tov_top) / p->tov_cycles;
 //     printf("%s-%c new tnt derive to %d\n", __FUNCTION__, p->name, tcnt);    
@@ -191,8 +193,8 @@ static void avr_timer_configure(avr_timer_t * p, uint32_t clock, uint32_t top)
 
        p->tov_cycles = frequency / t; // avr_hz_to_cycles(frequency, t);
 
-       if (p->trace_flags)
-               printf("%s-%c TOP %.2fHz = %d cycles\n", __FUNCTION__, p->name, t, (int)p->tov_cycles);
+       AVR_LOG(p->io.avr, LOG_TRACE, "TIMER: %s-%c TOP %.2fHz = %d cycles\n",
+                       __FUNCTION__, p->name, t, (int)p->tov_cycles);
 
        for (int compi = 0; compi < AVR_TIMER_COMP_COUNT; compi++) {
                if (!p->comp[compi].r_ocr)
@@ -205,8 +207,7 @@ static void avr_timer_configure(avr_timer_t * p, uint32_t clock, uint32_t top)
 
                if (ocr && ocr <= top) {
                        p->comp[compi].comp_cycles = frequency / fc; // avr_hz_to_cycles(p->io.avr, fa);
-                       if (p->trace_flags /*& (1 << compi)*/)
-                               printf("%s-%c %c %.2fHz = %d cycles\n", __FUNCTION__, p->name,
+                       AVR_LOG(p->io.avr, LOG_TRACE, "TIMER: %s-%c %c %.2fHz = %d cycles\n", __FUNCTION__, p->name,
                                        'A'+compi, fc, (int)p->comp[compi].comp_cycles);
                }
        }
@@ -244,7 +245,7 @@ static void avr_timer_reconfigure(avr_timer_t * p)
 
        uint8_t cs = avr_regbit_get_array(avr, p->cs, ARRAY_SIZE(p->cs));
        if (cs == 0) {
-               printf("%s-%c clock turned off\n", __FUNCTION__, p->name);              
+               AVR_LOG(avr, LOG_TRACE, "TIMER: %s-%c clock turned off\n", __FUNCTION__, p->name);
                return;
        }
 
@@ -272,8 +273,8 @@ static void avr_timer_reconfigure(avr_timer_t * p)
                        avr_timer_configure(p, f, (1 << p->mode.size) - 1);
                        break;
                default:
-                       printf("%s-%c unsupported timer mode wgm=%d (%d)\n", __FUNCTION__, p->name,
-                                       mode, p->mode.kind);
+                       AVR_LOG(avr, LOG_WARNING, "TIMER: %s-%c unsupported timer mode wgm=%d (%d)\n",
+                                       __FUNCTION__, p->name, mode, p->mode.kind);
        }       
 }
 
@@ -292,13 +293,7 @@ static void avr_timer_write_ocr(struct avr_t * avr, avr_io_addr_t addr, uint8_t
                        target = oi;
                        break;
                }
-       uint16_t otrace = p->trace_flags;
 
-       if (target != -1) {
-               p->trace_flags = 1 << target;
-       } else {
-               p->trace_flags = 0;
-       }
        switch (p->mode.kind) {
                case avr_timer_wgm_normal:
                        avr_timer_reconfigure(p);
@@ -322,11 +317,10 @@ static void avr_timer_write_ocr(struct avr_t * avr, avr_io_addr_t addr, uint8_t
                        avr_raise_irq(p->io.irq + TIMER_IRQ_OUT_PWM1, _timer_get_ocr(p, AVR_TIMER_COMPB));
                        break;
                default:
-                       printf("%s-%c mode %d UNSUPPORTED\n", __FUNCTION__, p->name, p->mode.kind);
+                       AVR_LOG(avr, LOG_WARNING, "TIMER: %s-%c mode %d UNSUPPORTED\n", __FUNCTION__, p->name, p->mode.kind);
                        avr_timer_reconfigure(p);
                        break;
        }
-       p->trace_flags = otrace;
 }
 
 static void avr_timer_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
@@ -488,5 +482,4 @@ void avr_timer_init(avr_t * avr, avr_timer_t * p)
        }
        avr_register_io_write(avr, p->r_tcnt, avr_timer_tcnt_write, p);
        avr_register_io_read(avr, p->r_tcnt, avr_timer_tcnt_read, p);
-       p->trace_flags = 0xf;
 }