skyrider
19.05.2005, 16:33
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
.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
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
.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