При отладке прерываний возникла проблема, что при GLINTD=1 основная программа работает нормально, флаг прерывания от Т1 устанавливается, в прерывание естественно не заходит. Если разрешить прерывания GLINTD = 0 основная программа вообще не работает (один короткий импульс в начале), в прерывание, судя по сигнализации, тоже не заходит. В чем может быть проблема. Программа ниже.
//тестовая прорамма
//от RC генератора 2856 кГц
//проверка прерывания от Т1
#include <1886VE5.h>
//переменные
unsigned char zz,pz,zv,rabota,selector,cvstv,vzstv,dpstv,skna,lz,lzv;
unsigned char temp_zz,temp_pz,temp_zv,temp_rabota,temp_selector,temp_cvstv,temp_vzstv,temp_dpstv,temp_skna,temp_lz,temp_lzv;
unsigned char temp; //временно
void buttons(void);
#define BUTTON 255 //количество считываний состояния переключателя
#include "int17xxx.h"
#pragma origin 0x20
interrupt iServer(void) {
multi_interrupt_entry_and_save
PERIPHERAL_service:
//Проверка входа в прерывание
PORTD.2 = 1; //похоже, что в прерывание не входи, порт не устанавливается
TMR0_service:
T0CKI_service:
INT_service:
interrupt_exit_and_restore
}
void init() {
GLINTD = 0x01; //глобальный запрет прерываний
/*Настройка портов ввода-вывода*/
DDRA = 0xFF; //PORTA все входы
DDRC = 0xFF; //PORTC все входы
DDRD = 0x00; //PORTD все выходы
DDRE = 0xFF; //PORTE все входы
PORTD = 0x00;
/*Настройка прерываний и таймера 1*/
PR1 = 0xFF; //период счета таймера
PIR1 = 0x00;
PIE1 = 0x10; //разрешение прерывания от Таймера 1
INTSTA = 0x08; //разрешение периферийных прерываний
TCON1 = 0x00;
TCON2 = 0x00;
temp_zz = 0;
temp = 0; //временно
}
void main(void) {
init();
GLINTD = 0x00
TCON2 = 0x01; //запуск таймера
while (1) {
if (T1IF) {PORTD.5 = 1;} //этот флаг есть, запрос на прерываение формируется
if (T1IF==0) PORTD.5 = 0;
//это просто генератор для проверки
temp++;
if (temp <= 100) {PORTD.0 = 1;} //если GLINTD = 0 генератор не работает при включени один
if (temp > 100) {PORTD.0 = 0;} //импульс длительностью 2,4мкс, затем просто высокий уровень с порта
if (temp == 255) {temp = 0;} //Если GLINTD = 1 генератор работает, в прерывание естественно не входит
#asm
nop;
nop;
#endasm
}
}
|