zalg 0 29 февраля, 2012 Опубликовано 29 февраля, 2012 · Жалоба МК 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, может быть это как нибудь влияет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Hellper 0 1 марта, 2012 Опубликовано 1 марта, 2012 · Жалоба из прерывания от таймера 1 программа выходит ? Вроде, надо руками флаг прерывания сбрасывать. как проверяете вход в прерывание ? выбросите из программы все, кроме работы с и2с и посмотрите отладчиком корректность работы после инициализации. возьмите примеры инициализации от производителя. на сайте электроснаба есть русская документация на мк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 1 марта, 2012 Опубликовано 1 марта, 2012 · Жалоба А почему бы не определить прямым признаком (точка останова в прерывании) попадаете вы туда или нет. Может вы оттуда просто не выходите??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
max_ 0 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба а так не пробовали: STA = 1; // Initiate SMBus Transfer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ros-shev 0 15 марта, 2012 Опубликовано 15 марта, 2012 · Жалоба В кейле очень хороший дебагер, попробуйте понаставить в критических местах точек прерывания. Косвенные методы зачастую оказываются недественными - попробуйте посмотреть состояния переменных в реальном времени (в режиме отладки нажмите пкм на переменной >добавить в watch list, как-то так). плюс не видна работа с сфр-страницами, 120-многостраничный. Вообще надо взять за правило - как только применяете какую-то новую сфр - перед этим включите нужную старницу, мозгов в этом камне достаточно, чтобы перегрузить надо постараться. Естественно исключая прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться