|
Точный подсчёт времени, как реализовать? |
|
|
|
Aug 7 2006, 12:28
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(singlskv @ Aug 7 2006, 14:50)  Цитата(singlskv @ Aug 7 2006, 12:03)  А что мы посчитаем если прерывание по захвату выставит флаг в момент обработки прерывания по переполнению ?
Я не очень точно там выразился, смотри мой последний пост. Угу,в принципе не вижу смысла проверять ,пускай себе катится по прерыванию. А лучше всего растянуть переполнение на более чем 30сек,как я уже писал - поставить кварц типа 1.024Мгц,2.048Мгц, или внешний такт с той же тысячной и не мучатся со всем этим.
|
|
|
|
|
Aug 7 2006, 12:54
|

кекс
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 7 2006, 12:58
|
дятел
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Aug 7 2006, 13:22
|
дятел
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 7 2006, 14:49
|

кекс
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 7 2006, 15:32
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Aug 7 2006, 18:49)  singlskv
дык почитайте ветку дальше.. приведите пример кода и я Вам покажу пример когда Ваш код будет работать неправильно Цитата(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
|
|
|
|
|
Aug 7 2006, 19:43
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Был неправ tst r5 действительно решает проблемму, только, чтобы все было коректно нужно после опроса "переполнения" в TIFR сбрасывать флаг.
|
|
|
|
|
Aug 7 2006, 20:12
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Aug 8 2006, 00:04)  Цитата(singlskv @ Aug 7 2006, 22:43)  только, чтобы все было коректно нужно после опроса "переполнения" в TIFR сбрасывать флаг.
Согласен, спасибо! И Вам спасибо! мне почему-то показалось что это невозможно, но "tst r5" расставило все по местам...
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|