IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Работа с таймером., Таймер высокого разрешения
Shub
сообщение 9.04.2004 9:30
Сообщение #1


Гость






И так такт таймера по умолчанию составляет 55 мс. Но в жизни есть такие чудесные моменты, когда требуется, что-нибудь периодически выполнять через 20 мс, 10 мс или даже 1 мс. В сети выложены примеры быстрых таймеров, но, честно говоря, что к чему в них я так понять и не смог. Из не проверенных данных я знаю, что изменить такт таймера с 55 мс на 10 мс условно говоря просто, вот только ни где не сказано как это сделать. Как получают более мелкие такты для меня большая загадка.
Просветите, пожалуйста.

Примеры перепрограммирования частот системного таймера находятся здесь:
http://pascal.sources.ru/datetime/index.htm

PS Я не программист, так балуюсь, С и Асм’у не обучен.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Shub
сообщение 20.04.2004 8:53
Сообщение #2


Гость






Так добавлю еще одну ссылку:
http://www.vcl.ru/html/dos/appar/ch5.htm

Важные выдержки оттуда:
Цитата
Кроме часов реального времени, любой компьютер (даже простейший IBM PC) содержит устройство, называемое системным таймером. Это устройство подключено к линии запроса на прерывание IRQ0 и вырабатывает прерывание INT 8h приблизительно 18,2 раза в секунду (точное значение - 1193180/65536 раз в секунду).

При инициализации BIOS устанавливает свой обработчик для прерывания таймера. Этот обработчик каждый раз увеличивает на 1 текущее значение четырехбайтовой переменной, располагающейся в области данных BIOS по адресу 0000:046Ch - счетчик тиков таймера. Если этот счетчик переполняется (прошло более 24 часов с момента запуска таймера), в ячейку 0000:0470h заносится 1.

Другое действие, выполняемое стандартным обработчиком прерывания таймера - контроль за работой двигателей НГМД. Если после последнего обращения к НГМД прошло более 2 секунд, обработчик прерывания выключает двигатель. Ячейка с адресом 0000:0440h содержит время, оставшееся до выключения двигателя. Это время постоянно уменьшается обработчиком прерывания таймера. Когда оно становится равно 0, обработчик выключает двигатель НГМД.


Цитата
Таймеру соответствуют четыре порта ввода/вывода со следующими адресами:

40h - канал 0;
41h - канал 1;
42h - канал 2;
43h - управляющий регистр.
Приведем формат управляющего регистра:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦  ¦ ¦
LT+T+T+T+T+-+T+T-
LT- LT- L=T=- L= BCD: 0 - двоичный счет;
  ¦ ¦    ¦        1 - двоично-десятичный счет.
  ¦ ¦    ¦
  ¦ ¦    L===== M: 000 - режим 0;
  ¦ ¦                001 - режим 1;
  ¦ ¦                X10 - режим 2;
  ¦ ¦                X11 - режим 3;
  ¦ ¦                100 - режим 4;
  ¦ ¦                101 - режим 5.
  ¦ ¦
  ¦ L========== RW:  00 - код команды CLC (запомнить CE);
  ¦                    01 - чтение/запись старшего байта;
  ¦                    10 - чтение/запись младшего байта;
  ¦                    11 - чтение/запись младшего, затем
  ¦                      старшего байта.
  ¦             
L============== SC:  00 - канал 0;
01 -    канал 1;
10 -    канал 2;
11 -    код команды RBC (чтение состояния канала).



Поле BCD определяет формат константы, использующейся для счета - двоичный или двоично-десятичный. В двоично-десятичном режиме константа задается в диапазоне 1-9999.

Поле M определяет режимы работы микросхемы 8254:

0 - прерывание от таймера;
1 - программируемый ждущий мультивибратор;
2 - программируемый генератор импульсов;
3 - генератор меандра;
4 - программно-запускаемый одновибратор;
5 - аппаратно-запускаемый одновибратор.
Мы будем рассматривать только режим 3, так как именно он используется в каналах 0 и 2.

Поле RW определяет способ загрузки констант через однобайтовый порт. Если в этом поле задано значение 00, это управляющее слово будет использоваться для фиксации текущего содержимого регистров счетчика CE в буферном регистре OL с целью чтения программой. Это код команды CLC - фиксация регистров. Код канала, для которого будет выполняться фиксация, должен быть указан в поле SC. Поля M и BCD при этом не используются.

Поле SC определяет номер канала, для которого предназначено управляющее слово. Если в этом поле задано значение 11, будет выполняться чтение состояния канала.

Приведем формат команды RBC чтения слова состояния канала:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
LT- ¦ ¦ ¦ ¦ ¦ L= равно 0.
  ¦  ¦ ¦ ¦ ¦ ¦
  ¦  ¦ ¦ ¦ ¦ L=== 1 - выбор канала 0.
  ¦  ¦ ¦ ¦ L===== 1 - выбор канала 1.
  ¦  ¦ ¦ L======= 1 - выбор канала 2.
  ¦  ¦ ¦
  ¦  ¦ L========= STAT: 0 - читать состояние каналов;
  ¦  ¦                  1 - не читать состояние каналов.
  ¦  ¦
  ¦  L=========== CNT:  0 - запомнить текущее содержимое CE;
  ¦                  1 - не запоминать содержимое CE.
  ¦
  L============== код команды RBC - 11.



С помощью этой команды вы можете выполнять операции чтения состояния каналов либо запоминание регистра счетчика CE каналов. Можно выполнять эти операции как для отдельных каналов, так и для всех каналов одновременно, если установить соответствующие биты (1, 2, 3) в 1.

Формат слова состояния канала напоминает формат регистра управляющего слова, за исключением двух старших разрядов 7 и 6:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦  ¦ ¦
LT+T+T+T+T+-+T+T-
¦ ¦ LT- L=T=- L= BCD: 0 - двоичный счет;
¦ ¦  ¦    ¦        1 - двоично-десятичный счет.
¦ ¦  ¦    ¦
¦ ¦  ¦    L===== M: 000 - режим 0;
¦ ¦  ¦                001 - режим 1;
¦ ¦  ¦                X10 - режим 2;
¦ ¦  ¦                X11 - режим 3;
¦ ¦  ¦                100 - режим 4;
¦ ¦  ¦                101 - режим 5.
¦ ¦  ¦
¦ ¦  L========== RW:  00 - код команды CLC (запомнить CE);
¦ ¦                01 - чтение/запись старшего байта;
¦ ¦                10 - чтение/запись младшего байта;
¦ ¦                11 - чтение/запись младшего, затем
¦ ¦                        старшего байта.
¦ ¦         
¦ L============= FN:  флаг перезагрузки констант;
L=============== OUT: состояние выхода OUT.




Разряд FN используется, в основном, в режимах 1 и 5 для определения, произошла ли загрузка константы из регистра CR в регистр счетчика CE.

Разряд OUT позволяет определить состояние выходной линии канала OUT в момент выполнения команды RBC.

Для программирования канала таймера необходимо выполнить следующую последовательность действий:

вывести в порт управляющего регистра с адресом 43h управляющее слово;
требуемое значение счетчика посылается в порт канала (адреса 40h...42h), причем вначале выводится младший, а затем старший байты значения счетчика.
Сразу после этого канал таймера начнет выполнять требуемую функцию.

Для чтения текущего содержимого счетчика CE необходимо выполнить следующее:

вывести в порт управляющего регистра код команды CLC (команда запоминания содержимого регистра CE);
вывести в порт управляющего регистра код команды запроса на чтение/запись в регистры канала (поле RW должно содержать 11);
двумя последовательными командами ввода из порта нужного канала ввести младший и старший байты текущего сосотояния счетчика CE.
Для чего вам может понадобиться перепрограммирование каналов таймера?

Если вам надо повысить точность измерения времени, выполняемого с помощью канала 0 таймера, вы можете увеличить частоту генерируемых этим каналом импульсов (стандартно 18,2 Гц). По окончании измерений режим работы канала необходимо восстановить для правильного функционирования системы.


Попробую поковыряться.

ЗЫ Попойму у Vesper'a так же опечатка в примере програмы:
Цитата
time:=meml[0:6C];
proces;
time:=meml[0:6C]-time;
if time<0 then time:=time+00B0;
writeln(time/18.2:6:2);
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Shub   Работа с таймером.   9.04.2004 9:30
Altair   А здесь можно узнать, как программировать таймер с...   16.04.2004 6:30
Shub   Спасибо, хоть там и много асма, но сообщения Vespe...   19.04.2004 10:30
Altair   Кстати очень интересную ссылку подкинул Shub, заме...   19.04.2004 14:02
Shub   Попробовал то, что предложил Vesper (имеется в вид...   19.04.2004 17:06
Altair   Хм .... Надо попробовать самому. Я тоже интерисую...   19.04.2004 17:45
Altair   Так, так .... читаем, что тут: http://www.dklab.r...   19.04.2004 18:53
Shub   Так добавлю еще одну ссылку: http://www.vcl.ru/htm...   20.04.2004 8:53
Shub   Мои попытки ускорить таймер потерпели фиаско. Port...   21.04.2004 16:56
Altair   Вот, что у Питера Нортона написано: Т.е. программ...   21.04.2004 19:52
Shub   Е-е-е, получилось. Значиться так: 43h - управляющ...   22.04.2004 9:57
Shub   Сорри, в моем примере надо вводить не 256, а 1, то...   22.04.2004 12:27
Altair   Shub, высший класс! А выше скорость не выйдет,...   22.04.2004 13:36
Guest   Спасибо :), я в курсе, что скорость выше не буде...   22.04.2004 14:17
Altair   нашел.... Пишем модуль для работы с системным тайм...   10.03.2005 22:29
xds   f = 1193180 Гц / c где с = коэффициент деления (ч...   11.03.2005 4:20
xds   Пример программирования таймера (используется для ...   11.03.2005 4:45
Aelita   А как переделать Вашу программу, если нужно еще в ...   14.11.2010 5:13
Lapp   А как переделать Вашу программу, если нужно еще в ...   14.11.2010 9:25
Aelita   Я работаю, как ни странно, под DOS32 (Free Pascal)...   15.11.2010 7:01
Lapp   Я работаю, как ни странно, под DOS32 (Free Pascal)...   15.11.2010 9:17
TarasBer   Что же это за код такой, что его работа так сильно...   15.11.2010 12:59


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 5:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"