Harbinger прав, наверняка проблема с SFRPAGE!
В F120 блок регистров специального назначения (SFR) являет собой массив страниц, которые выбираются регистром SFRPAGE. Этого нет в F320/321 с которыми я работал, а посмотреть внимательно ДЩ на F120 не удосужился, деревня, блин.
Цитата
11.2.6.1.SFR Paging
The CIP-51 features SFR paging, allowing the device to map many SFR’s into the 0x80 to 0xFF memory
address space. The SFR memory space has 256 pages. In this way, each memory location from 0x80 to
0xFF can access up to 256 SFR’s. The C8051F12x family of devices utilizes five SFR pages: 0, 1, 2,
3, and F. SFR pages are selected using the Special Function Register Page Selection register,
SFRPAGE (see SFR Definition 11.3). The procedure for reading and writing an SFR is as follows:
1. Select the appropriate SFR page number using the SFRPAGE register.
2. Use direct accessing mode to read or write the special function register (MOV instruction).
В симуляторе Keil процесс работает как положено, поскольку Keil имитирует стандартный 8051, а не продвинутый F120. Пшик.
Вам следует использовать специфическую SFR-страницу каждый раз когда что-то конфигурируете и в случае с прерываниями (см ДЩ).
Вот в конце заголовочного файла c8051f120.h есть обьявления страниц:
Код
/* SFR PAGE DEFINITIONS */
#define CONFIG_PAGE 0x0F /* SYSTEM AND PORT CONFIGURATION PAGE */
#define LEGACY_PAGE 0x00 /* LEGACY SFR PAGE */
#define TIMER01_PAGE 0x00 /* TIMER 0 AND TIMER 1 */
#define CPT0_PAGE 0x01 /* COMPARATOR 0 */
#define CPT1_PAGE 0x02 /* COMPARATOR 1 */
#define UART0_PAGE 0x00 /* UART 0 */
#define UART1_PAGE 0x01 /* UART 1 */
#define SPI0_PAGE 0x00 /* SPI 0 */
#define EMI0_PAGE 0x00 /* EXTERNAL MEMORY INTERFACE */
#define ADC0_PAGE 0x00 /* ADC 0 */
#define ADC2_PAGE 0x02 /* ADC 2 */
#define SMB0_PAGE 0x00 /* SMBUS 0 */
#define TMR2_PAGE 0x00 /* TIMER 2 */
#define TMR3_PAGE 0x01 /* TIMER 3 */
#define TMR4_PAGE 0x02 /* TIMER 4 */
#define DAC0_PAGE 0x00 /* DAC 0 */
#define DAC1_PAGE 0x01 /* DAC 1 */
#define PCA0_PAGE 0x00 /* PCA 0 */
#define PLL0_PAGE 0x0F /* PLL 0 */
#define MAC0_PAGE 0x03 /* MAC 0 */
т.е. Вам в начале программы нужно вместо
Код
SFRPAGE = CONFIG_PAGE;
поставить страницу, где будут доступны регистры конфигурации компаратора:
Код
SFRPAGE = CPT0_PAGE;
тоже самое придется сделать и в процедурах инициализации портов, только подсунуть правильную таблицу (если этого не делает сам силабовский конфигуратор для вашего МК). Только сейчас обратил внимание как это делается в Port_init() в тестовых программах F12x_UART0_Interrupt.c, которые обсуждались ранее.