Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Точный таймер для MS DOS Точный таймер для MS DOSпод Octagon PC 510

 Ответить Ответить Страница  <12
Автор
Сообщение
ingvar Смотреть выпадающим
Новичок
Новичок


Присоединился: 17 Апрель 2007
Категория: Russian Federation
Online Status: Offline
Публикации: 15
Свойства публикации Свойства публикации   Ответить, цитируя автора - ingvar Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Точный таймер для MS DOS Точный таймер для MS DOSпод Octagon PC 510
    Опубликовано: 16 Ноябрь 2009 19:07
Можно организовать счетчик-таймер с помощью последовательного порта. Мы включали порт на непрерывную передачу, устанавливали свой обработчик прерывания. В теле обработчика опрашивали дискретные сигналы (например с LPT). Если установить скорость передачи 115200, то опрашивать дискретный ввод можно примерно с интервалом 0,1 мс. У нас это давно под MS-DOS работает уверенно. Правда при этом теряется один COM-порт.




jer
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Ноябрь 2009 21:51
Первоначально опубликовано ingvar

Можно организовать счетчик-таймер с помощью последовательного порта.


Я делал и обратное - вешал обработчик последовательных портов на прерывание от таймера, когда работал с несколькими мультиплексорами, чтобы избежать эффекта потери прерываний.
Инженер-системотехник
+7 (916) 477 3925
Наверх
lemkzuka Смотреть выпадающим
Новичок
Новичок


Присоединился: 14 Октябрь 2008
Категория: Kazakhstan
Online Status: Offline
Публикации: 19
Свойства публикации Свойства публикации   Ответить, цитируя автора - lemkzuka Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 27 Ноябрь 2009 11:38
получилось через 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
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 27 Ноябрь 2009 12:18
Первоначально опубликовано lemkzuka


void interrupt handler(void)
{
   cnt2=cnt2+1;
   oldhandler();
}


А что будет с системным временем? Oldhandler надо вызывать один раз в 55 мс.
Инженер-системотехник
+7 (916) 477 3925
Наверх
lemkzuka Смотреть выпадающим
Новичок
Новичок


Присоединился: 14 Октябрь 2008
Категория: Kazakhstan
Online Status: Offline
Публикации: 19
Свойства публикации Свойства публикации   Ответить, цитируя автора - lemkzuka Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 28 Ноябрь 2009 10:52
нормально всё с системным временем...
В теле цикла, как раз выводятся текущие секунды, чтобы убедится, что за секунду происходит указанное число прерываний.

Первоначально опубликовано lemkzuka


...
       if (cnt2 >= 2048) //over second
       {
          gettime(&t); //get time
          tt1 = t.ti_sec; //get second
          printf("%2d --> %ld %ld\n",tt1,cnt,cnt2);
...
Наверх
 Ответить Ответить Страница  <12

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz