реклама на сайте
подробности

 
 
> Imterrupt + port (c8051f310)
Kolia
сообщение Jan 17 2008, 09:07
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Добрый день.

Возникла такая проблемка. Есть функция для работы 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

help.gif help.gif


Пример функции для работы 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);
// <<--                                                                        
}


Так вызывается из main
Код
void  main(void){
//Инициализация

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
}
Go to the top of the page
 
+Quote Post



Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 05:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01567 секунд с 7
ELECTRONIX ©2004-2016