Помогите разобраться с R8830
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SL555 24 мая 2006 г. 10:56

Здравствуйте
Есть такая проблема с контроллером RTU-188MX на котором установлен камень R8830
Написал программу для работы с COM1 обмен данными осуществляется по протоколу ModBus. Все работает прекрасно. Теперь решили сделать работу по прерываниям, но
прерывания не возникает вот программа:

#include
#include
#include
#include

#define COM2 1
#define Set 0xff10
#define DEL 0xFF18
#define OUT 0xFF14
#define RdyIn 0x0100
#define RdyOut 0x6000
#define MskRg 0xff28
#define EOIRg 0xff22
#define Vector 0x0011
#define _CPPARGS ...
void interrupt handler(_CPPARGS);
void interrupt (*oldhandler)(_CPPARGS);
int GLOBAL=0;

int main()

{
int status;
int vect=inportb(MskRg)// Сохраняем начальное значение регистра
//------------------------------------------------------------------------------
//Настраиваем COM порт
_AX=0x61;
outportb(Set,0x61); // 8 Бит, без контроля четности

_AX=0x104
outportb(DEL,_AL); // Установка скорости 9600

// включение передатчика RS-485 COM1, на асме потому, что текст просто взят из //примера
asm mov dx,0FF7Ah
asm in ax,dx
asm and al,11101111b
asm out dx,al

do Ждем готовность выходного регистра
{ status=(inportb(0xff12))&0x40;
}
while(status==0);
_AX=0xFA; //Как готов выдаем 0xFA
outportb(OUT,_AL);


//Отключаем com1 в случае применения AH=0x84; _AL=0; _DX=COM2; asm int 0x14
// com1 данные не принимает
asm mov dx, 0xFF7A
asm in ax, dx
asm or al, 0x8
asm out dx,al


printf("IN= %x\n",inport(0xff16)); // Производим чтение входного регистра
_AX=Vector;
outportb(0xff22,_AL); // На всякий случай сбрасываем запрос возможного
//прерывания

//инициализируем новый вектор
oldhandler=getvect(Vector);
setvect(Vector,handler);

_AX=(inport(MskRg))&0x200; //Разрешаем прерывание от COM1
outportb(MskRg,_AL);

_AX=0;// //Задаем наивысший приоритет
outportb(0xff42,_AL);

do
{
} while(GLOBAL==0); //Бесконечный цикл

//Восстановление старого вектора
_AX=vect;
outportb(MskRg,_AL);
setvect(Vector,oldhandler);
return 0;
}

void interrupt handler(_CPPARGS)
{
prinft(“BIT=%x\n”,inport(0xff16);
GLOBAL=1;
_AX=Vector;
outportb(0xff22,_AL);
}

Для проверки написал программу обработки прерывания от таймера все работаем вот программа

#define _CPPARGS ...
#define Msk1 0x03FE // maska off timer 1
#define Vector 0x0012 // vector off timer1
#define MskRg 0xFF28 //Interrput control registor
#define TICON 0xFF5E
#define T1CNT 0xff58
#define TICMPA 0xFF5A
#define MaxCountA 0xF555
#define RdyOut 0x6000

#define EOIRg 0xFF22 // End interrput
void interrupt handler(_CPPARGS);
void interrupt(*oldhandler)(_CPPARGS);
int looping=1;


int main(void)
{


_AX=8;
outportb(0xff22,_AL);

// initialize the timer
// disable the timer, disable its interrupt

int set=inport(MskRg);
printf("set=%x\n",set);

_AX=0x4000;
outportb(TICON,_AL);

// reset the timer's count
_AX=0;
outportb(T1CNT,_AL);

// set max. count for the timer
_AX=MaxCountA;
outportb(TICMPA,_AL);


oldhandler=getvect(Vector);
setvect(Vector,handler);
_AX=(inport(MskRg))&Msk1;
outportb(MskRg,_AL);
//enable Timer 1 and its interrupt
asm mov dx,0xFF5E //; Timer 1 Mode and Control Register
asm mov ax,0xE001
asm out dx,al

do
{
}
while(looping==1);

printf("End\n");
_AX=set;
outportb(MskRg,_AL);
setvect(Vector,oldhandler);
_AX=8;
outportb(0xff22,_AL);
return 0;
}

void interrupt handler(_CPPARGS)
{

looping=0;
_AX=8;
outportb(0xff22,_AL);

}

#define Msk1 0x03FE // maska off timer 1
#define Vector 0x0012 // vector off timer1
#define MskRg 0xFF28 //Interrput control registor
#define TICON 0xFF5E
#define T1CNT 0xff58
#define TICMPA 0xFF5A
#define MaxCountA 0xF555
#define RdyOut 0x6000

#define EOIRg 0xFF22 // End interrput
void interrupt handler(_CPPARGS);
void interrupt(*oldhandler)(_CPPARGS);
int looping=1;


int main(void)
{


_AX=8;
outportb(0xff22,_AL);

// initialize the timer
// disable the timer, disable its interrupt

int set=inport(MskRg);
printf("set=%x\n",set);

_AX=0x4000;
outportb(TICON,_AL);

// reset the timer's count
_AX=0;
outportb(T1CNT,_AL);

// set max. count for the timer
_AX=MaxCountA;
outportb(TICMPA,_AL);


oldhandler=getvect(Vector);
setvect(Vector,handler);
_AX=(inport(MskRg))&Msk1;
outportb(MskRg,_AL);
//enable Timer 1 and its interrupt
asm mov dx,0xFF5E //; Timer 1 Mode and Control Register
asm mov ax,0xE001
asm out dx,al

do
{
}
while(looping==1);

printf("End\n");
_AX=set;
outportb(MskRg,_AL);
setvect(Vector,oldhandler);
_AX=8;
outportb(0xff22,_AL);
return 0;
}

void interrupt handler(_CPPARGS)
{

looping=0;
_AX=8;
outportb(0xff22,_AL);

}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru