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

 
 
 
Reply to this topicStart new topic
> Подсчет времени задержки
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
tazik
сообщение Apr 20 2008, 10:44
Сообщение #2


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

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



В АВРСтудио при отладке Processor->CycleCounter
Go to the top of the page
 
+Quote Post
domowoj
сообщение Apr 20 2008, 10:52
Сообщение #3


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

Группа: Участник
Сообщений: 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
Сообщение #4


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

Группа: Свой
Сообщений: 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
hooky-mars
сообщение Apr 20 2008, 12:04
Сообщение #5





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



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


Сообщение отредактировал hooky-mars - Apr 20 2008, 12:07
Go to the top of the page
 
+Quote Post
bloodden
сообщение Apr 20 2008, 21:31
Сообщение #6


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



Подозреваю, что Вы "1" используете для синхры. Это мало. ИМХО. Я юзал 5-10 мкс и работало. Может это и есть Ваша проблема.
Да и +- трамвайная остановка там. В разумных пределах конечно.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
MTh
сообщение Apr 21 2008, 00:42
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771



Писал на асме работу с 1-wire, задержку делал под расчетный кварц... не заморачиваясь с таймерами... могу поделиться...

Сообщение отредактировал MTh - Apr 21 2008, 00:45
Go to the top of the page
 
+Quote Post
Igor26
сообщение Apr 21 2008, 06:21
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата
как подсчитать время задержки.

Эти считают правильно.
Прикрепленные файлы
Прикрепленный файл  TimerAVR.zip ( 672.57 килобайт ) Кол-во скачиваний: 64
 
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 1st July 2025 - 22:33
Рейтинг@Mail.ru


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