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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Точный подсчёт времени, как реализовать?
bodja74
сообщение Aug 7 2006, 12:28
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(singlskv @ Aug 7 2006, 14:50) *
Цитата(singlskv @ Aug 7 2006, 12:03) *

А что мы посчитаем если прерывание по захвату выставит флаг в момент обработки прерывания
по переполнению ?

Я не очень точно там выразился, смотри мой последний пост.

Угу,в принципе не вижу смысла проверять ,пускай себе катится по прерыванию.
А лучше всего растянуть переполнение на более чем 30сек,как я уже писал - поставить
кварц типа 1.024Мгц,2.048Мгц, или внешний такт с той же тысячной и не мучатся со всем этим.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 7 2006, 12:46
Сообщение #17


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



ИМХО: при любой попытке "уточнить" значение измеряемого интервала
можно нарисовать временную диаграмму которая заставит ошибаться
алгоритм "уточнения".
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 7 2006, 12:54
Сообщение #18


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Aug 7 2006, 15:13) *
Цитата(defunct @ Jun 2 2006, 23:26) *

В таком виде как в примере - нельзя выполнять команды условного перехода и арифметические команды в основном цикле программы.

ну дык все правильно.
толко раскажите мне пожалуйста КАК не выполнять 2х/3х тактовые команды в основном
цикле программы ?

Речь там была не об этом. Абсолютно без разницы какой длины команды будут выполняться в основном цикле программы. Как видно из примера, в обработчиках прерываний у меня не сохраняется флаговый регистр SREG, соответственно арифметические операции и команды условных переходов в основном цикле программы могут выполняться некорректно.

Необходимо немного подправить пример - сохранять SREG на входе в обработчик прерываний и восстанавливать на выходе. А в остальном пример полностью рабочий.

PS: Также заметьте - тот пример был расчитан на обеспечение точности в 1mks, у Вас же речь идет о точности в 1ms (на три порядка меньше).

Сообщение отредактировал defunct - Aug 7 2006, 13:11
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 7 2006, 12:58
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(bodja74 @ Aug 7 2006, 16:28) *
Угу,в принципе не вижу смысла проверять ,пускай себе катится по прерыванию.
А лучше всего растянуть переполнение на более чем 30сек,как я уже писал - поставить
кварц типа 1.024Мгц,2.048Мгц, или внешний такт с той же тысячной и не мучатся со всем этим.

Ну, да это единственный метод, если нужна "абсолютная" точность.
Можно даже выбрать кварц 4,096 или 8,192 , но на время измерения
запрограммировать CLKPR на деление на 2,4 или 8, а делитель таймера на 1024.
Ну или просто режим CTC с прерыванием каждую ms, но при этом придется
забить на то что результаты отличающиеся на несколько мкс могут в итоге
отличаться на 1 ms.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 7 2006, 13:22
Сообщение #20


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Jun 2 2006, 23:26) *
Код
.def  AL = R24
.def  Const0 = R8
.def  Const1 = R9

....
   ldi  AL, 1
   mov  Const1, AL
   clr  Const0
...

loop:

   rjmp loop ; B=5 ICR=FFFD   "захват" здесь "переполнения" еще нет


; обработчик Input Capture:
TIM1_CAPT:
    in    R4, ICR1L;   "переполнение" уже есть
    in    R5, ICR1H
    mov   R6, R2
    mov   R7, R3
    tst   R5
    brne  _do_not_correct_result
    in    AL, TIFR
    andi  AL, (1 << TOV1)
    breq  _do_not_correct_result
    add   R6, Const1
    adc   R7, Const0
_do_not_correct_result:
; <-- 32-х битный результат в четверке регистров R7-R6-R5-R4 (MSB R7)
    reti
    

; обработчик Timer Overflow:
TIM1_OVF:
     add R2, Const1; Инкрементировать старшие 16 бит 32-х битного счетчика
     adс R3, Const0; учет переноса.
     reti
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 7 2006, 14:49
Сообщение #21


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



singlskv

дык почитайте ветку дальше..

Цитата
переполнение" уже есть

В коде же специально есть проверка для этого случая.
Код
...
    mov   R7, R3
    tst   R5
    brne  _do_not_correct_result ; <--- вот здесь принимается решение добавлять 0x10000 к результату или нет
...


Сообщение отредактировал defunct - Aug 7 2006, 15:20
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 7 2006, 15:32
Сообщение #22


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



smile.gif
Цитата(defunct @ Aug 7 2006, 18:49) *
singlskv

дык почитайте ветку дальше..

приведите пример кода и я Вам покажу пример когда Ваш код
будет работать неправильно smile.gif


Цитата(defunct @ Aug 7 2006, 18:49) *
singlskv

дык почитайте ветку дальше..

Цитата

переполнение" уже есть

В коде же специально есть проверка для этого случая.
Код
...
    mov   R7, R3
    tst   R5
    brne  _do_not_correct_result; <--- вот здесь принимается решение добавлять 0x10000 к результату или нет
...


просимулируйте Ваш код при R3:R2=5 b ICRH=FF ICRL=FD
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 7 2006, 16:01
Сообщение #23


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



2 defunct
кажется я понял откуда растут "уши" у нашего спора.
читаем datasheet:
When a capture is triggered, the
16-bit value of the counter (TCNT1) is written to the Input Capture Register (ICR1). The
Input Capture Flag (ICF1) is set at the same system clock as the TCNT1 value is copied
into ICR1 Register. If enabled (ICIE1 = 1), the Input Capture Flag generates an Input
Capture interrupt.
то есть значение таймера сохраняется в ICR ДО попадания в процедуру обработки
прерывания ICR, и любые попытки скоректировать значение счетчик могут привести
к ошибке.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 7 2006, 16:10
Сообщение #24


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Aug 7 2006, 18:32) *
просимулируйте Ваш код при R3:R2=5 b ICRH=FF ICRL=FD

Запутали Вы меня.

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

Потому что код этот работает должным образом. И учитывает ту ситуацию, которую вы приводите в пример.

Сообщение отредактировал defunct - Aug 7 2006, 20:05
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 7 2006, 19:43
Сообщение #25


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Был неправ cranky.gif
tst r5
действительно решает проблемму,
только, чтобы все было коректно нужно после опроса "переполнения" в TIFR
сбрасывать флаг.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 7 2006, 20:04
Сообщение #26


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Aug 7 2006, 22:43) *
только, чтобы все было коректно нужно после опроса "переполнения" в TIFR
сбрасывать флаг.

Согласен, спасибо!
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 7 2006, 20:12
Сообщение #27


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Aug 8 2006, 00:04) *
Цитата(singlskv @ Aug 7 2006, 22:43) *

только, чтобы все было коректно нужно после опроса "переполнения" в TIFR
сбрасывать флаг.

Согласен, спасибо!

И Вам спасибо!
мне почему-то показалось что это невозможно, но "tst r5" расставило все по местам...
Go to the top of the page
 
+Quote Post

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

 


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


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