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

 
 
 
Closed TopicStart new topic
> 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
TBI
сообщение Jan 17 2008, 09:31
Сообщение #2


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

Группа: Свой
Сообщений: 170
Регистрация: 11-05-07
Пользователь №: 27 656



Если Вам так необходимо выполнение функции именно после срабатывания прерывания от таймера, то на мой взгляд, проще в обработчике прерывания устанавливить флаг разрешения выполнения функции, а в основном цикле опрашивать этот флаг. Вообще то не рекомендуется запускать большие функции в процедурах обработчиках прерываний. Возможно у Вас стек переполняется или еще что-нибудь.
Go to the top of the page
 
+Quote Post
Kolia
сообщение Jan 17 2008, 09:43
Сообщение #3


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

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



Нет, со стеком все в порядке. Таймер работает с частотой 1 кГц. И помимо этой функции там еще много чего налеплено, но остальное работает нормально. Проблемка именно с этой функцией. А в процедуре main я ее не хочу писать, потому что там налеплено много медленно работающих функций (частота 50 Гц) и большой длительности. А мне нужно с частотой 1 кГц.
Go to the top of the page
 
+Quote Post
TBI
сообщение Jan 17 2008, 10:08
Сообщение #4


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

Группа: Свой
Сообщений: 170
Регистрация: 11-05-07
Пользователь №: 27 656



Если я правильно понял, то 0xB0.4 это выход P3.4 контроллера. Посмотрите в отладчике пошагово уровни выходного напряжения на выводе этого порта, а также выходы других портов.
Go to the top of the page
 
+Quote Post
Kolia
сообщение Jan 17 2008, 10:20
Сообщение #5


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

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



Так я в отладчике и смотрел:
в прерывании P3^2 и P3^3 изменяются а P3^4 не изменяется crying.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 17 2008, 10:31
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Kolia @ Jan 17 2008, 12:07) *
почему-то в interrupt не работает SETB 0xB0.4 и CLR 0xB0.4 , и 0xB0.4 всегда == 0.
Отчего Вы решиле. что эти команды не работают? Возможно ноль "навалился" на эту ногу извне. Для проверки, хорошо бы, повесить её (ногу) в воздухе и посмотреть уровень на ней. Кстати, Ваш вариант проверки с переносом вызова в main немного не такой, как в штатном варианте: в таймере вызов - периодический, в main - однократный (но на работоспособность команд это не должно ни коим образом сказаться).
Go to the top of the page
 
+Quote Post
TBI
сообщение Jan 17 2008, 11:27
Сообщение #7


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

Группа: Свой
Сообщений: 170
Регистрация: 11-05-07
Пользователь №: 27 656



Цитата(Kolia @ Jan 17 2008, 13:20) *
Так я в отладчике и смотрел:
в прерывании P3^2 и P3^3 изменяются а P3^4 не изменяется crying.gif


А если в основном цикле, то физически P3^4 изменяет свои уровни или нет? Посмотрите инициализацию порта P3. Вывод P3.4 должен быть цифровым выходом и определен как push-pull.
Go to the top of the page
 
+Quote Post
Kolia
сообщение Jan 17 2008, 11:48
Сообщение #8


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

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



Ура разобрался. Енто у меня прерывание запускалось раньше инициализации контроллера и поэтому получилась такая ляпа 07.gif .

Пору прощения за то, что побеспокоил вас такой ерундой laughing.gif
Go to the top of the page
 
+Quote Post
TBI
сообщение Jan 17 2008, 12:10
Сообщение #9


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

Группа: Свой
Сообщений: 170
Регистрация: 11-05-07
Пользователь №: 27 656



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

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


Ладно, будешь должен smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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