использовать таймер 1 или как написать программу с разноуровневыми прерываниями
внутри стоит Am188, есть своя операционка, которая использует таймер 0 для формирования меток 1мс, и таймер 2, для формирования меток 18.2 мс - системное прерывание (в Дос-е это прерывание 1Сh). Хочется для разгрузки основного цикла программы задействовать таймер 1. но пока безрезультатно. Может у кого есть опыт программирования в ДОС, как реализовать прерывние с разным уровнем приоритета...
Компилятор Borland C++ 3.1
#include
#include
#include
#include "def186.h"
#include "lib\7188x.h"
//
// Interrupt Controller
//
static unsigned char TmpLed = 0;
void interrupt far MyTimer1(void)
{
outpw(CTL_OFF+OFFS_TMR1_MAXA,40000); //set max. count for the timer
outpw(OFFS_INT_EOI,EOITYPE_TMR1);
if (TmpLed)
LedOn();
else
LedOff();
TmpLed ^= 0xff;
}
unsigned long far *IntVect=(unsigned long far *)0x00000000L;
unsigned long SavedVect11, SavedVect14;
void InstallIsr(void)
{
unsigned int TmpInt;
TmpInt = inpw(CTL_OFF+OFFS_RELC_REG);
TmpInt &=~ 0x4000; //-Configures the interrupt controller for slave mode when set
// to 1 and for master mode when set to 0.
outpw(CTL_OFF+OFFS_RELC_REG,TmpInt); //Timer 1 Mode and Control Register timer and its interrupt disabled
outpw(CTL_OFF+OFFS_TMR1_CTL,0x4000); //Timer 1 Mode and Control Register timer and its interrupt disabled
outpw(CTL_OFF+OFFS_TMR1_CNT,0x0000); //reset the timer's count
outpw(CTL_OFF+OFFS_TMR1_MAXA,40000); //set max. count for the timer 1ms
IntVect[0x12]=(unsigned long)MyTimer1;
outpw(CTL_OFF+OFFS_TMR1_CTL,0xE001); //enable Timer 1 and its interrupt
outpw(INT_MASK, inpw(INT_MASK)&(~0x0001)); /* Включить прерывания Timer */
//
// !!! после этой строчки программа становится неуправляемой
//
}
int main()
{
InstallIsr();
while(1){}
return 0;
}
=========================================
А вот можно ли сделаать программные прерывания (необходимо иметь 1мс. таймер и желательно иметь таймер порядка 10- 50мс для того чтобы работать с дискретными выходами)
кинь описуху .
описуху на что?
на контроллер
Теперь дальше. Прерывание 1Ch - это пользовательский вызов. Таймер 0 вызывает прерывание 08h, а оно /по окончании работы/ вызывает 1Ch. Нормально обработчик этого прерывания состоит из одной команды IRET.
На обычных машинках от таймера можно взять только канал 0 /через прерывание/. Остальные - только опросом. В контроллерах все три канала выведены на контроллер прерываний и их можно использовать /все три/. Работа таймеров в принципе проста: канал 2 формирует прерывания и служит делителем частоты для остальных каналов: 0 и 1.
Ежели шибко надо, пиши - вышлю кусок кода /один нюанс - Си для меня иностранный язык, а пишу на Turbo Pascal 7.0/.