us delay rutine ATmega16

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

Reply to
Martin Nielsen
Loading thread data ...

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

Reply to
Lasse Madsen

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

Reply to
Carsten

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.