us delay rutine ATmega16

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
Hej

Jeg sidder og tumler lidt med at skrive en delayrutine som virker fra 1 til
2^16us med paramenter 1 til 2^16. Jeg ønsker at skive den i C og bruger
AVR-GCC C compiler. Er der nogen som har sådan en rutine klar eller et godt
hint til hvordan jeg kan lave den???

Det er ikke lykkes mig at lave et delay på kun 1us med en rutine, der også
kan forsinke flere us.
jeg bruger 4MHz krystal



--
Mvh
Martin Nielsen



Re: us delay rutine ATmega16
Hej Martin

Det er også meget begrænset hvad du kan opnå på 4 maskin cycles ...

Hvis du skal bruge noget der minder om 1uS delay får du meget mere ud af at
bruge en assembler kommando i stil med

#asm("nop");

fire gange efter hinanden  skal det laves større kan du feks gøre noget i
denne stil ...
(du skal kigge i AVR Studio for at se hvor mange cycles der bruges i FOR
løkken samt CALL og RETURN for din funktion m.v. og erstatte mit 8 tal med
det ...)

void delay_us ( unsigned int delay )
{
    // vær sikker på at man ikke kalder et for lille delay !
    if ( delay > 8 )
    {
    delay-=8;        // kompenser for call, return og for løkke
    for ( ; delay != 0 ; delay-- )
    #asm("nop");
    }
    else
    exit;        // gør noget ...
}




Re: us delay rutine ATmega16

Quoted text here. Click to load it

I avr gcc include filen delay.h er denne:

/* 16-bit count, 4 cycles/loop */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
    asm volatile (
        "1: sbiw %0,1" "\n\t"
        "brne 1b"
        : "=w" (__count)
        : "0" (__count)
    );
}

Den laver et delay på 4 cycles , men der er et call overhead på , så den dur ikk
ved kun et us vil jeg formode.

Carsten

Site Timeline