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







Zitieren


Lesezeichen