Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

использовать таймер 1 или как написать программу с разноуровневыми прерываниями

23K
27 ноября 2006 года
AlHakim
2 / / 27.11.2006
Пром. контроллер ICP CON I-7188XC Можно ли использовать таймер 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мс для того чтобы работать с дискретными выходами)
252
28 ноября 2006 года
koderAlex
1.4K / / 07.09.2005
кинь описуху .
23K
28 ноября 2006 года
AlHakim
2 / / 27.11.2006
описуху на что?
252
29 ноября 2006 года
koderAlex
1.4K / / 07.09.2005
на контроллер
24K
11 декабря 2006 года
Степа
2 / / 11.12.2006
Для начала поищите в сети описание на процессор R8820 фирмы RDC Semiconductor. Это аналог Am188. Во всяком случае в BIOS I-8000 все утыкано магическими числами "7188", а он у нас собран именно на том проце. Дока обзывается R8820.pdf. В ней все просто разжевано.

Теперь дальше. Прерывание 1Ch - это пользовательский вызов. Таймер 0 вызывает прерывание 08h, а оно /по окончании работы/ вызывает 1Ch. Нормально обработчик этого прерывания состоит из одной команды IRET.

На обычных машинках от таймера можно взять только канал 0 /через прерывание/. Остальные - только опросом. В контроллерах все три канала выведены на контроллер прерываний и их можно использовать /все три/. Работа таймеров в принципе проста: канал 2 формирует прерывания и служит делителем частоты для остальных каналов: 0 и 1.

Ежели шибко надо, пиши - вышлю кусок кода /один нюанс - Си для меня иностранный язык, а пишу на Turbo Pascal 7.0/.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог