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

 
 
 
Reply to this topicStart new topic
> c8051f120 прерывания SMBus в Keil, Не вызывается обработчик прерывания
zalg
сообщение Feb 29 2012, 12:38
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 15-09-10
Пользователь №: 59 507



МК c8051f120, среда разработки Keil
Обмен по SMBus ( i2c ) работает при опросе флага SI:
Код
while(1){
        if( (SMB0CN & 0x08) == 0x08 ){
            if( SMB0STA == 0x80 ){
                i2c = SMB0DAT;
                printf( " i2c data = %X\n", i2c );
            }
            if( SMB0STA == 0xA8 ){
                SMB0DAT = 0xA5;
            }
        SMB0CN &= ~(0x08);    
        }
}


При попытке перенести эти действия в прерывания, программа перестает работать, вернее просто не попадает в обработчик прерываний, что я определяю по косвенным признакам: например переменная temp не меняет своего значения

Вот текст обработчика:
Код
void I2C_ISR( void ) interrupt 7 using 1 {
            if( SMB0STA == 0xA8 ){
                SMB0DAT = 0xA5;
            }
                        temp = 0x06;
}


И инициализация прерываний, которую я произвожу прямо перед основным циклом программы
Код
void Interrupts_Init()
{
    IE        = 0x88; //разрешить глоабльные прерывания и прерывания по Timer1
    EIE1      = 0x02;//разрешить прерывания SMBus
  
}


Хочу заметить, что так же произвожу обмен по UART с помощью функции printf, может быть это как нибудь влияет
Go to the top of the page
 
+Quote Post
Hellper
сообщение Mar 1 2012, 09:44
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



из прерывания от таймера 1 программа выходит ? Вроде, надо руками флаг прерывания сбрасывать.
как проверяете вход в прерывание ?


выбросите из программы все, кроме работы с и2с и посмотрите отладчиком корректность работы после инициализации.
возьмите примеры инициализации от производителя. на сайте электроснаба есть русская документация на мк.


--------------------
Go to the top of the page
 
+Quote Post
редактор
сообщение Mar 1 2012, 11:50
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



А почему бы не определить прямым признаком (точка останова в прерывании) попадаете вы туда или нет. Может вы оттуда просто не выходите???


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
max_
сообщение Mar 7 2012, 09:47
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 51
Регистрация: 21-07-04
Из: Таганрог
Пользователь №: 348



а так не пробовали:
STA = 1; // Initiate SMBus Transfer
Go to the top of the page
 
+Quote Post
ros-shev
сообщение Mar 15 2012, 15:52
Сообщение #5





Группа: Новичок
Сообщений: 3
Регистрация: 15-03-12
Пользователь №: 70 821



В кейле очень хороший дебагер, попробуйте понаставить в критических местах точек прерывания. Косвенные методы зачастую оказываются недественными - попробуйте посмотреть состояния переменных в реальном времени (в режиме отладки нажмите пкм на переменной >добавить в watch list, как-то так). плюс не видна работа с сфр-страницами, 120-многостраничный. Вообще надо взять за правило - как только применяете какую-то новую сфр - перед этим включите нужную старницу, мозгов в этом камне достаточно, чтобы перегрузить надо постараться. Естественно исключая прерывания.
Go to the top of the page
 
+Quote Post

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

 


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


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