![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
Shub |
![]() ![]()
Сообщение
#1
|
Гость ![]() |
И так такт таймера по умолчанию составляет 55 мс. Но в жизни есть такие чудесные моменты, когда требуется, что-нибудь периодически выполнять через 20 мс, 10 мс или даже 1 мс. В сети выложены примеры быстрых таймеров, но, честно говоря, что к чему в них я так понять и не смог. Из не проверенных данных я знаю, что изменить такт таймера с 55 мс на 10 мс условно говоря просто, вот только ни где не сказано как это сделать. Как получают более мелкие такты для меня большая загадка.
Просветите, пожалуйста. Примеры перепрограммирования частот системного таймера находятся здесь: http://pascal.sources.ru/datetime/index.htm PS Я не программист, так балуюсь, С и Асм’у не обучен. |
![]() ![]() |
Shub |
![]()
Сообщение
#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); |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 5:08 |