-
Notifications
You must be signed in to change notification settings - Fork 0
/
wait.asm
77 lines (65 loc) · 3.06 KB
/
wait.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
;------------------------------------------------------------------------------
; Busy-wait loops utilities module
; For F_CPU >= 4MHz
; http://avr-mcu.dxp.pl
; (c) Radoslaw Kwiecien, 2008
;
; Перевод StarXXX, http://hardisoft.ru, 2009
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Модуль временных задержек
;
; !!! Для работы модуля необходимо объявить константу F_CPU равную тактовой частоте в герцах !!!
;
; !!! задержки действительны для тактовой частоты >= 4 МГц !!!
; задержки приблизительны! Чем больше задержка, тем точнее,
; т.е. при частоте 4МГц задержка в 1 микросекунду, учитывая время вызова подпрограммы и возврата из нее составит 2,5 микросекунды
; задержка в 10 микросекунд составит 11,5 микросекунд
; задержка в 100 мкс на самом деле будет 101,5 мкс
; тоесть, к каждой задержке добавится 1,5 мкс - это время на вызов подпрограммы и на выход из нее
;------------------------------------------------------------------------------
#ifndef F_CPU
#error "F_CPU must be defined!"
#endif
#if F_CPU < 4000000
#warning "F_CPU too low, possible wrong delay"
#endif
#define CYCLES_PER_US (F_CPU/1000000) ; количество такотв на микросекунду
#define C4PUS (CYCLES_PER_US/4) ; 4 такта на одну микросекунду
#define DVUS(x) (C4PUS*x) ; вычисляет величину для указанного времени в микросекундах, которую нужно передать Wait4xCycles чтобы получить желаемую задержку
;--------------------------------------------------------------------------------------------------------------
; Подпрограмма задержки. В цикле отъедается 4 такта на каждую итерацию, кроме последней. В последней - 3 такта.
; Итого, для получения нужной задержки в микросекундах надо вызывать эту функцию предварительно
; обработав параметр макросом DVUS:
; ldi XH, HIGH(DVUS(500))
; ldi XL, LOW(DVUS(500))
; rcall Wait4xCycles ; пауза 500 микросекунд
;--------------------------------------------------------------------------------------------------------------
; Input : XH:XL - number of CPU cycles to wait (divided by four)
;--------------------------------------------------------------------------------------------------------------
Wait4xCycles:
sbiw XH:XL, 1 ; 2 такта
brne Wait4xCycles ; 1/2
ret ; 4
;------------------------------------------------------------------------------
; Подпрограмма генерирует необходимую задержку в милисекундах
; На входе: r16 = количество милисекунд
;------------------------------------------------------------------------------
; Input : r16 - number of miliseconds to wait
;------------------------------------------------------------------------------
WaitMiliseconds:
push r16
WaitMsLoop:
ldi XH,HIGH(DVUS(500))
ldi XL,LOW(DVUS(500))
rcall Wait4xCycles
ldi XH,HIGH(DVUS(500))
ldi XL,LOW(DVUS(500))
rcall Wait4xCycles
dec r16
brne WaitMsLoop
pop r16
ret
;------------------------------------------------------------------------------
; End of file
;------------------------------------------------------------------------------