реклама на сайте
подробности

 
 
> как определить точное время задержки?, ASM AVR
coolibin
сообщение Apr 6 2008, 05:18
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



как определить точное время задержки? Например, сколько времени будет выполнятся такой код:
Код
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

?
и ещё маленький вопросик, а можно как либо прервать выполнение этого кода без внесения изменений, чтобы программа не возвращалась к нему, например, вызывается задержка->произошло какое то событие->задержка вызывается заново.


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
tazik
сообщение Apr 6 2008, 06:22
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



Проще всего загнать этот код в АВР-студио и посмотреть 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

Сообщение отредактировал tazik - Apr 6 2008, 06:46
Go to the top of the page
 
+Quote Post
coolibin
сообщение Apr 6 2008, 08:07
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Цитата(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


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
tazik
сообщение Apr 6 2008, 08:16
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



Пожалуйста smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 19:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01451 секунд с 7
ELECTRONIX ©2004-2016