us delay rutine ATmega16

May 02, 2004 2 Replies

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


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 ... }

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required