Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как определить точное время задержки?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
coolibin
как определить точное время задержки? Например, сколько времени будет выполнятся такой код:
Код
Wait:
    ldi        Cnt2,    10
    Wait_out:
        ldi        Cnt1,    100
        Wait_mid:
            ldi        Cnt0,    100
            Wait_in:
                nop
                dec        Cnt0
                brne    Wait_in
            dec        Cnt1
            brne    Wait_mid
        dec        Cnt2
        brne    Wait_out
    ret

?
и ещё маленький вопросик, а можно как либо прервать выполнение этого кода без внесения изменений, чтобы программа не возвращалась к нему, например, вызывается задержка->произошло какое то событие->задержка вызывается заново.
tazik
Проще всего загнать этот код в АВР-студио и посмотреть Cycle Counter до и после выполнения этой подпрограммы. Получилось 404051 циклов, включая вызов подпрограммы командой rjmp и возвращение из нее

Точно можно, конечно, посчитать и вручную, но это не совсем удобно. Например для циклов переменных Cnt0 и Cnt1 получится что-то вроде такой штуки [[[(1+1+2)*99+(1+1+1)]+1+1+2]*99]+[[(1+1+2)*99+(1+1+1)]+1+1+1]

.include "2313def.inc"

.def temp_h=r16
.def Cnt0=r17
.def Cnt1=r18
.def Cnt2=r19

.org 0x00
rjmp start

;===================================
;Подпрограмма задержки

Wait:
ldi Cnt2,10
Wait_out:
ldi Cnt1,100
Wait_mid:
ldi Cnt0,100
Wait_in:
nop
dec Cnt0
brne Wait_in
dec Cnt1
brne Wait_mid
dec Cnt2
brne Wait_out
ret

;===================================

start:
ldi temp_h,low(RAMEND)
out spl,temp_h

main_loop:
rcall Wait
rjmp main_loop

Если хочется предусмотреть выход из задержки:

....
dec Cnt0
sbis PINB.2 проверка - если бит в нуле, то выход.
ret
brne Wait_in
...

... как здесь отступы делать?.. wacko.gif
coolibin
Цитата(tazik @ Apr 6 2008, 09:22) *
Проще всего загнать этот код в АВР-студио и посмотреть Cycle Counter до и после выполнения этой подпрограммы. Получилось 404051 циклов, включая вызов подпрограммы командой rjmp и возвращение из нее

Точно можно, конечно, посчитать и вручную, но это не совсем удобно. Например для циклов переменных Cnt0 и Cnt1 получится что-то вроде такой штуки [[[(1+1+2)*99+(1+1+1)]+1+1+2]*99]+[[(1+1+2)*99+(1+1+1)]+1+1+1]

.include "2313def.inc"

.def temp_h=r16
.def Cnt0=r17
.def Cnt1=r18
.def Cnt2=r19

.org 0x00
rjmp start

;===================================
;Подпрограмма задержки

Wait:
ldi Cnt2,10
Wait_out:
ldi Cnt1,100
Wait_mid:
ldi Cnt0,100
Wait_in:
nop
dec Cnt0
brne Wait_in
dec Cnt1
brne Wait_mid
dec Cnt2
brne Wait_out
ret

;===================================

start:
ldi temp_h,low(RAMEND)
out spl,temp_h

main_loop:
rcall Wait
rjmp main_loop

Если хочется предусмотреть выход из задержки:

....
dec Cnt0
sbis PINB.2 проверка - если бит в нуле, то выход.
ret
brne Wait_in
...

... как здесь отступы делать?.. wacko.gif

Огромное спасибо! идея ясна, просто не знал что в АВРстуди есть Cycle Counter
tazik
Пожалуйста smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.