Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Imterrupt + port (c8051f310)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Kolia
Добрый день.

Возникла такая проблемка. Есть функция для работы 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
}
TBI
Если Вам так необходимо выполнение функции именно после срабатывания прерывания от таймера, то на мой взгляд, проще в обработчике прерывания устанавливить флаг разрешения выполнения функции, а в основном цикле опрашивать этот флаг. Вообще то не рекомендуется запускать большие функции в процедурах обработчиках прерываний. Возможно у Вас стек переполняется или еще что-нибудь.
Kolia
Нет, со стеком все в порядке. Таймер работает с частотой 1 кГц. И помимо этой функции там еще много чего налеплено, но остальное работает нормально. Проблемка именно с этой функцией. А в процедуре main я ее не хочу писать, потому что там налеплено много медленно работающих функций (частота 50 Гц) и большой длительности. А мне нужно с частотой 1 кГц.
TBI
Если я правильно понял, то 0xB0.4 это выход P3.4 контроллера. Посмотрите в отладчике пошагово уровни выходного напряжения на выводе этого порта, а также выходы других портов.
Kolia
Так я в отладчике и смотрел:
в прерывании P3^2 и P3^3 изменяются а P3^4 не изменяется crying.gif
Палыч
Цитата(Kolia @ Jan 17 2008, 12:07) *
почему-то в interrupt не работает SETB 0xB0.4 и CLR 0xB0.4 , и 0xB0.4 всегда == 0.
Отчего Вы решиле. что эти команды не работают? Возможно ноль "навалился" на эту ногу извне. Для проверки, хорошо бы, повесить её (ногу) в воздухе и посмотреть уровень на ней. Кстати, Ваш вариант проверки с переносом вызова в main немного не такой, как в штатном варианте: в таймере вызов - периодический, в main - однократный (но на работоспособность команд это не должно ни коим образом сказаться).
TBI
Цитата(Kolia @ Jan 17 2008, 13:20) *
Так я в отладчике и смотрел:
в прерывании P3^2 и P3^3 изменяются а P3^4 не изменяется crying.gif


А если в основном цикле, то физически P3^4 изменяет свои уровни или нет? Посмотрите инициализацию порта P3. Вывод P3.4 должен быть цифровым выходом и определен как push-pull.
Kolia
Ура разобрался. Енто у меня прерывание запускалось раньше инициализации контроллера и поэтому получилась такая ляпа 07.gif .

Пору прощения за то, что побеспокоил вас такой ерундой laughing.gif
TBI
Цитата(Kolia @ Jan 17 2008, 14:48) *
Ура разобрался. Енто у меня прерывание запускалось раньше инициализации контроллера и поэтому получилась такая ляпа 07.gif .

Пору прощения за то, что побеспокоил вас такой ерундой laughing.gif


Ладно, будешь должен smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.