Hi @all

da ich mit verschiedenen AVR und unterschiedlichen Taktfrequenzen arbeite, habe ich eine kleine Routine geschrieben die unabhängig von Prozessortakt (1-20 MHz) arbeitet. Sie arbeitet nicht 100% us genau, aber im Bereich 1-255 ms zuverlässig und sollte für die meisten Anwendungen ausreichend sein.

Für Anregungen und Verbesserungsvorschläge wäre ich dankbar

VG
Skyrider

Code:
.def temp		= r16


.equ cputakt	= 8000000				;arbeitet im Bereich von (1 - 20 MHz)
.set count_ms	= cputakt / 4000 - 1
	;ergibt in wait_ms ca.1ms vom Aufruf aus

.include "tiny2313.inc"				;Startroutine für den Tiny2313



.MACRO wait_ms

	ldi		temp, @0				;Lade temp mit Zähler (in ms)
	rcall	delay_ms				;Aufruf Verzögerungschleife

.ENDMACRO



start:
	
	wait_ms(5)						;Verzögerung um 5ms
	wait_ms(20)						;nochmal 20ms
							

loop:
	rjmp	loop					;tu nix Schleife

; ********************************************************************
; delay_ms 	  verzögert um x ms
; Parameter : Zeit in ms (1-255) in temp, in Z-Register keine Änderung
; Rückgabe  : keine
; ********************************************************************

delay_ms:
	push	ZL						;Z auf den Stack retten
	push	ZH
delay_ms_1:
	ldi		ZH, HIGH(count_ms)		;Lade höherwertiges Byte nach Z
	ldi		ZL, LOW(count_ms)		;Lade niederwertiges Byte nach Z
delay_ms_2:
	sbiw 	ZL,1					;subtrahiere 1 von Z
	brne 	delay_ms_2				;solange bis Z = 0
	dec 	temp					;temp um 1 herunterzählen
	brne	delay_ms_1				;solange bis temp = 0
	pop 	ZH						;Z vom Stack zurückholen
	pop 	ZL
	ret

OVF1_event:
	reti