После небольшой модернизации программы начала вылетать ошибка стека ("Err_SP.GIF"). Начал разбираться и пришел вот к чему.
В программе MAIN в самом начале есть команда:
SBIW R29:R28, 20
Здесь уменшается р-р Y на 20. (0x80 - 20 = 0x6C). Впоследствии этот р-р используется для адресации стека.
При входе в п/п прерывания таймера сохраняются 20 р-ров ("ISR_Save.GIF").
В результате указатель стека получается равным 0x58, чего быть не должно. В дальнейшем при первом же вызове п/п в этом месте
37 ADC_7741[N_chan_7741][step7741]=TCNT1;
\ 0000003A B44C IN R4, 0x2C
\ 0000003C B45D IN R5, 0x2D
\ 0000003E .... LDI R26, LOW(ADC_7741)
\ 00000040 .... LDI R27, (ADC_7741) >> 8
\ 00000042 9140.... LDS R20, N_chan_7741
\ 00000046 E050 LDI R21, 0
\ 00000048 E00A LDI R16, 10
\ 0000004A E010 LDI R17, 0
\ 0000004C ....
RCALL ?S_EC_MUL_L02указатель стека обнуляется и начинают выдаваться вышеуказанные ошибки.
Посмотрел предыдущую версию программы. Там нет команды
SBIW R29:R28, 20
Почему она появилась?
В рабочей версии программы использовал свою п/п обработки прерывания I2C.
В программе с ошибками обработка прерываний I2C от ATMEL.
В прицепе два варианта программы.
IAR 4.30A
Proteus 7.10.0
Сообщение отредактировал IF_P - Aug 30 2013, 15:15
Эскизы прикрепленных изображений
Прикрепленные файлы
Norm.RAR ( 58.78 килобайт )
Кол-во скачиваний: 11
Err.RAR ( 76.88 килобайт )
Кол-во скачиваний: 11