Возникла такая проблемка. Есть функция для работы c MAX500. При ее запуске из цикла main() все работает как надо, а при вызове из interrupt TIMER2() 5 ни в какую не хочет работать.
В отладчике смотрел, почему-то в interrupt не работает SETB 0xB0.4 и CLR 0xB0.4 , и 0xB0.4 всегда == 0.
Программа написана в Keil uVision3 v3.31, c51 v8.01, a51 v8.00, BL51 v6.00


Пример функции для работы c MAX500
Код
sbit SDA = P3^2;
sbit SCL = P3^3;
sbit LDAC= P3^4;
//Микросхема управляется ч/з оптроны поэтому настроена выходы
//как SDA,SCL - как цифровые входы (при записи 0 порттянет к 0, при 1- Z состояние)
//LDAC - цифровой выход.
#define b_UNIT 1
#define b_ZERO 0
#define T_delay 10
void _delay(unsigned int c)//подпрограмма задержки для формирования импульса (С=1 : delay~15 mks)
{
while (--c){
_nop_();
}
}
void MAX500_write(unsigned int a)
{
unsigned char i;
//Dac_i2c_start();
//NEW
LDAC = b_UNIT;
_delay(T_delay);_delay(T_delay);_delay(T_delay);
//NEW
// SEND START -->>
SDA = b_ZERO;
_delay(T_delay);
SCL = b_ZERO;
_delay(T_delay);
// <<--
// SEND DATA -->>
for(i=0; i<10; i++){
if(a&0x0200)
SDA = b_UNIT;
else
SDA = b_ZERO;
_delay(T_delay);
SCL = b_UNIT;
_delay(T_delay);
SCL = b_ZERO;
_delay(T_delay);
a=a<<1;
}
// <<--
//Dac_i2c_stop();
// SEND STOP -->>
SCL = b_ZERO;
SDA = b_ZERO;
_delay(T_delay);
SCL = b_UNIT;
_delay(T_delay);
SDA = b_UNIT;
_delay(T_delay);
// <<--
// LOAD DATA TO DAC -->>
LDAC = b_ZERO;
_delay(T_delay);
LDAC = b_UNIT;
_delay(T_delay);
// <<--
}
sbit SCL = P3^3;
sbit LDAC= P3^4;
//Микросхема управляется ч/з оптроны поэтому настроена выходы
//как SDA,SCL - как цифровые входы (при записи 0 порттянет к 0, при 1- Z состояние)
//LDAC - цифровой выход.
#define b_UNIT 1
#define b_ZERO 0
#define T_delay 10
void _delay(unsigned int c)//подпрограмма задержки для формирования импульса (С=1 : delay~15 mks)
{
while (--c){
_nop_();
}
}
void MAX500_write(unsigned int a)
{
unsigned char i;
//Dac_i2c_start();
//NEW
LDAC = b_UNIT;
_delay(T_delay);_delay(T_delay);_delay(T_delay);
//NEW
// SEND START -->>
SDA = b_ZERO;
_delay(T_delay);
SCL = b_ZERO;
_delay(T_delay);
// <<--
// SEND DATA -->>
for(i=0; i<10; i++){
if(a&0x0200)
SDA = b_UNIT;
else
SDA = b_ZERO;
_delay(T_delay);
SCL = b_UNIT;
_delay(T_delay);
SCL = b_ZERO;
_delay(T_delay);
a=a<<1;
}
// <<--
//Dac_i2c_stop();
// SEND STOP -->>
SCL = b_ZERO;
SDA = b_ZERO;
_delay(T_delay);
SCL = b_UNIT;
_delay(T_delay);
SDA = b_UNIT;
_delay(T_delay);
// <<--
// LOAD DATA TO DAC -->>
LDAC = b_ZERO;
_delay(T_delay);
LDAC = b_UNIT;
_delay(T_delay);
// <<--
}
Так вызывается из main
Код
void main(void){
//Инициализация
MAX500_write(0x0000);
MAX500_write(0x0055);
while(1);
}
//Инициализация
MAX500_write(0x0000);
MAX500_write(0x0055);
while(1);
}
Так вызывается из interrupt
Код
void Timer2_ISR (void) interrupt 5 //using 3
{
//
static data word TF=0;
unsigned char key;
//
ET2=0; TMR2CN &=~0x80; //disable interrupts; clear TF2
MAX500_write(0x0000);
MAX500_write(0x0055);
ET2=1; //enable interrupts
}
{
//
static data word TF=0;
unsigned char key;
//
ET2=0; TMR2CN &=~0x80; //disable interrupts; clear TF2
MAX500_write(0x0000);
MAX500_write(0x0055);
ET2=1; //enable interrupts
}