Чтобы воспроизвести, нужно запустить какой нибудь таймер с
прерываниями почаще и REPEAT взять не самый короткий (20...30) и
после цикла проверить следующий за массивом адрес. Ставим там бряк
и зацикливаем все вместе. При удачной интерференции или подобранном
периоде таймера ошибка возникает практически мгновенно. Тестовый
код:
;=========================
.include "p24FJ256GA702.inc"
;=========================
config __FSEC,BSEN_OFF & GSS_DISABLED & GWRP_OFF & CSS_DISABLED
config __FOSCSEL,IESO_ON & FNOSC_PRIPLL & PLLMODE_PLL4X
config __FOSC,POSCMD_XT & SOSCSEL_OFF
config __FWDT,FWDTEN_ON_SWDTEN & WINDIS_OFF & WDTCMX_LPRC & FWPSA_PR128 & WDTPS_PS32768
config __FPOR,BOREN_ON
config __FICD,JTAGEN_OFF & ICS_PGD1
config __FDEVOPT1, ALTI2C1_ALTI2CDIS
;=========================
.global __reset
.global __T2Interrupt
;=========================
.section buf1,near,bss
array: .space 128
test: .space 2
;=========================
.text
__reset:
mov #__SP_init, W15
mov #__SPLIM_init, W0
mov W0, SPLIM
nop
;=========================
; clear [array] & test
mov #array, W0
repeat #63
clr [W0++]
clr test
;=========================
; init TMR2 & interrupt from TMR2 enable
clr TMR2
clr T2CON
mov #120, W0
mov W0, PR2
bclr IFS0, #T2IF
bset IEC0, #T2IE
bset T2CON, #TON
;=========================
Loop:
mov #array, W1
repeat #63
inc [W1], [W1++]
nop
cp0 test
bra Z, Loop
nop
nop
bra $ ; error (test corrupt) trap
;=========================
__T2Interrupt:
push.s
bclr IFS0, #T2IF
nop
pop.s
retfie
;----------------------------------------------
; if interrupt disable, no error...
.end