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

 
 
> Подсчет времени задержки
hooky-mars
сообщение Apr 20 2008, 10:08
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 19-04-08
Пользователь №: 36 906



Saluer!
Не могу найти инфу как подсчитать время задержки.
На пример, мне на до сделать задежку на 480(примерно) мкс. Частота Atmega8 4 МГц.
Делаю так:
Код
    ldi r17, $F8
    ldi r16, $7F
    call delay
    ..............
delay:
    push r18
    push r19
    in  r18,SREG        
    cli
    out TCNT1H,r17
    out TCNT1L,r16
    sei
    clt
    ldi r19,1
    out TCCR1B,r19    
Dwait:  
    brtc Dwait          
    out SREG, r18
    pop r19
    pop r18
    ret
Tim0int:
    cli                
    set                    
    ldi r19,0            
    out TCCR1B,r19
    sei                  
    reti

Таймер суммирующий.
FFFF(16)-480(10)*4=F87F(16)
Но у меня есть подозрение, что задержка посчиатнна не верно. Подскожите, как правильно её просчитать?

Да! И можно ли в AVRStudio замереять время которое прошло между теми или иными частями кода?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
domowoj
сообщение Apr 20 2008, 10:52
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Если во время задержки процессор ни чем больше не занят, то
лучше всего в п/п задержки делать просто декремент определенного числа,
соответствующ. нужной задержке.

Если уж применяете таймер, то Есть реж. CTC и регистры OCR1x.
Запускаете таймер, в регистр OCR1 - нужное число , "засыпаете" и по прерыванию
от таймера выходите из реж. спячки. Программа короче, а такты выхода из sleep можно учесть.
Или не "засыпаете" , а занимаетесь чем-либо еще.

AVRStudio считает время вып. программы.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
tazik
сообщение Apr 20 2008, 11:28
Сообщение #3


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

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



В принципе, Вы все посчитали правильно. Получается задержка 490 мкс.
Давайте обратим внимание на следующие моменты:
1) Вы запускаете TIMER1, а прерывание обрабатываете от TIMER0.
2) Из приведенного фрагмента не ясно, проинициализирован ли указатель стека
3) Опять же в коде нет строчек разрешения прерываний по переполнению T1 - регистр TIMSK
4) В обработчике прерывания можно, но не нужно работать с командами cli и sei - флаг и автоматически сбрасывается при появлении события прерывания и автоматически устанавливается командой reti (можно было бы заменить на sei + ret)
5) Нерационально используются ресурсы контроллера. Пока идет выполение подпрограммы задержки, контроллер все равно занят ожиданием таймера и ничего делать не может. То есть нет никакого смысла использовать таким образом аппаратные прерывания.

Полностью согласен с domowoj

Сообщение отредактировал tazik - Apr 20 2008, 11:36
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 17:37
Рейтинг@Mail.ru


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