Точный таймер для MS DOS Точный таймер для MS DOSпод Octagon PC 510 |
Ответить | Страница <12 |
Автор | |
Новичок Присоединился: 17 Апрель 2007 Категория: Russian Federation Online Status: Offline Публикации: 15 |
Опубликовано: 16 Ноябрь 2009 19:07 |
Можно организовать счетчик-таймер с помощью последовательного порта. Мы включали порт на непрерывную передачу, устанавливали свой обработчик прерывания. В теле обработчика опрашивали дискретные сигналы (например с LPT). Если установить скорость передачи 115200, то опрашивать дискретный ввод можно примерно с интервалом 0,1 мс. У нас это давно под MS-DOS работает уверенно. Правда при этом теряется один COM-порт.
|
|
jer
|
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
|
Я делал и обратное - вешал обработчик последовательных портов на прерывание от таймера, когда работал с несколькими мультиплексорами, чтобы избежать эффекта потери прерываний. |
|
Инженер-системотехник
+7 (916) 477 3925 |
|
Новичок Присоединился: 14 Октябрь 2008 Категория: Kazakhstan Online Status: Offline Публикации: 19 |
|
получилось через RTC - частоту можно ставить от 2 Гц до 8 кГц (т.е. степень двойки делителя от 15 до 3). :
#include <dos.h> #include <conio.h> #include <bios.h> #define INTR 0x70 /* The clock tick interrupt */ unsigned long cnt=0; unsigned long cnt2=0; void interrupt (*oldhandler)(); void interrupt handler(void) { cnt2=cnt2+1; oldhandler(); } void main(void) { unsigned char ch; struct time t; int tt1; //INIT RTC+TIMER AND SET 2048 Hz oldhandler = getvect(INTR); //get old vector setvect(INTR, handler); //set new vector outportb(0x70, 0x0A); outportb(0x71, 0x25); //set new freq 32768/(2^5) outportb(0x70, 0x0B); outportb(0x71, inportb(0x71) | 0x40); //enable timer outportb(0x70, 0x0B); outportb(0x71, inportb(0x71) & 0xBF); //disable timer setvect(INTR, oldhandler); //set old vector //restart !!!! oldhandler = getvect(INTR); //get old vector setvect(INTR, handler); //set new vector outportb(0x70, 0x0A); outportb(0x71, 0x25); //set new freq outportb(0x70, 0x0B); outportb(0x71, inportb(0x71) | 0x40); //enable timer do { if (bioskey(1)) {bioskey(0); ch = 1; } cnt = cnt + 1; if (cnt2 >= 2048) //over second { gettime(&t); //get time tt1 = t.ti_sec; //get second printf("%2d --> %ld %ld\n",tt1,cnt,cnt2); cnt2 = 0; cnt = 0; } } while (ch != 1); /* Quit when any key is pressed */ outportb(0x70, 0x0B); outportb(0x71, inportb(0x71) & 0xBF); //disable timer setvect(INTR, oldhandler); //set old vector return; } |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
|
А что будет с системным временем? Oldhandler надо вызывать один раз в 55 мс. |
|
Инженер-системотехник
+7 (916) 477 3925 |
|
Новичок Присоединился: 14 Октябрь 2008 Категория: Kazakhstan Online Status: Offline Публикации: 19 |
|
нормально всё с системным временем...
В теле цикла, как раз выводятся текущие секунды, чтобы убедится, что за секунду происходит указанное число прерываний.
|
|
Ответить | Страница <12 |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |