Перейти к содержанию
    

c8051f120 прерывания SMBus в Keil

МК 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, может быть это как нибудь влияет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

как проверяете вход в прерывание ?

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...