Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подсчет времени задержки
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
hooky-mars
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 замереять время которое прошло между теми или иными частями кода?
tazik
В АВРСтудио при отладке Processor->CycleCounter
domowoj
Если во время задержки процессор ни чем больше не занят, то
лучше всего в п/п задержки делать просто декремент определенного числа,
соответствующ. нужной задержке.

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

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

Полностью согласен с domowoj
hooky-mars
Цитата(domowoj @ Apr 20 2008, 14:52) *
Если во время задержки процессор ни чем больше не занят, то
лучше всего в п/п задержки делать просто декремент определенного числа,
соответствующ. нужной задержке.

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

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

Просто я хотел сделать что-то универсальное. Т.к. Пишу программу опроса датчиков по 1-Wire, а там разные задежки (15,1,480, 120 и т.д.). Вопрос возник из за того, что после посылки RESET нет PRESENCE. Пишу в AVRStudio, а опрос датчиков симулирую в Proteus`е. Из Ваших ответо воидно, что дело не в задержке..... Спасибо!

Более полный код выглядит так:
Код
.org 0
    rjmp init
.org    $008            ;Overflow1 Interrupt Vector
    rjmp    Tim0int
........
    ldi r16,4
    out TIMSK, r16    
...........
    ldi r17,$F8
    ldi r16, $7F
    call delay     
delay:
.............
Tim0int:
..........
bloodden
Подозреваю, что Вы "1" используете для синхры. Это мало. ИМХО. Я юзал 5-10 мкс и работало. Может это и есть Ваша проблема.
Да и +- трамвайная остановка там. В разумных пределах конечно.
MTh
Писал на асме работу с 1-wire, задержку делал под расчетный кварц... не заморачиваясь с таймерами... могу поделиться...
Igor26
Цитата
как подсчитать время задержки.

Эти считают правильно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.