On Wed, 24 Sep 2014, Joerg Wunsch wrote:

What you can do is:

#include <stdint.h>

static void
delay_us(uint8_t us)
{
 while (--us != 0)
   _delay_us(1);
}

To reduce the computational damage somewhat:
static void
delay_us(uint8_t us)
{
    #define cyclesforus(us) \
       ((us)*(uint16_t)((uint64_t)(F_CPU)*0x100/1000000)/0x100)

    #define kase(x) case x: \
        __builtin_avr_delay_cycles(cyclesforus(x)-cyclesforus(x-1))
    switch (us & 0x0F) {
    kase(15); kase(14); kase(13); kase(12);
    kase(11); kase(10); kase( 9); kase( 8);
    kase( 7); kase( 6); kase( 5); kase( 4);
    kase( 3); kase( 2); kase( 1); case 0: ;
    }
    if(us & 0x10) _delay_us(0x10);
    if(us & 0x20) _delay_us(0x20);
    if(us & 0x40) _delay_us(0x40);
    if(us & 0x80) _delay_us(0x80);
}
....
  delay_us(42);
  delay_us(43);

While this is quite customary to do in the millisecond range
(using _delay_ms(1)), it's questionable though whether your
call and computational overhead would not rather twice the
delays in the microsecond range.

--
Michael   [email protected]
"SCSI is NOT magic. There are *fundamental technical
reasons* why it is necessary to sacrifice a young
goat to your SCSI chain now and then."   --   John Woods

_______________________________________________
AVR-chat mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/avr-chat

Reply via email to